import { expect } from 'vitest';
import { layBricks } from './layBricks';

describe('layBricks', () => {
  it('Возвращает корректное значение в случае неверного типа параметра', () => {
    const wrongType = 'wrong';

    expect(layBricks(wrongType, 1, 1)).toBeNull();
    expect(layBricks(1, wrongType, 1)).toBeNull();
    expect(layBricks(1, 1, wrongType)).toBeNull();
  });

  it('Возвращает корректное значение в случае неверных размеров кирпича', () => {
    const wrongWidth = -1;
    const wrongHeight = -1;

    expect(layBricks(1, wrongWidth, 1)).toBeNull();
    expect(layBricks(1, 1, wrongHeight)).toBeNull();
  });

  it('Возвращает корректное значение в случае некоректной карты уровня', () => {
    const levelMap = ['brick', 'brick'];

    expect(layBricks(levelMap, 1, 1)).toBeNull();
  });

  it('Возвращает корректное значение в случае некоректного отступа', () => {
    const levelMap = [
      [1, 1, 1, 1, 1],
      [1, 1, 1, 1, 1],
      [1, 1, 1, 1, 1],
    ];

    expect(layBricks(levelMap, 1, 1, -1)).toBeNull();
  });

  it('Возвращает массив корректных размеров', () => {
    const levelMap = [
      [1, 1, 1, 1, 1],
      [1, 1, 1, 1, 1],
      [1, 1, 1, 1, 1],
    ];

    const bricks = layBricks(levelMap, 1, 1);
    expect(bricks.length).toBe(levelMap.flat().length);

    const emptyLevelMap = [
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0],
    ];
    const emptyBricksArray = layBricks(emptyLevelMap, 1, 1);
    expect(emptyBricksArray.length).toBe(0);
  });

  it('Задает корректные координаты кирпичам', () => {
    const levelMap = [
      [1, 1],
      [1, 1],
    ];
    const brickWidth = 1;
    const brickHeight = 1;

    const bricks = layBricks(levelMap, brickWidth, brickHeight);
    let index = 0;

    for (let i = 0; i < levelMap.length; i++) {
      for (let j = 0; j < levelMap[i].length; j++) {
        if (levelMap[i][j] === 0) {
          continue;
        }
        expect(bricks[index].x).toBe(j * brickWidth);
        expect(bricks[index].y).toBe(i * brickHeight);
        index++;
      }
    }
  });

  it('Верно записывает тип кирпича', () => {
    const levelMap = [
      [2, 1, 3],
      [1, 2, 0],
    ];
    const brickWidth = 1;
    const brickHeight = 1;

    const bricks = layBricks(levelMap, brickWidth, brickHeight);
    let index = 0;

    for (let i = 0; i < levelMap.length; i++) {
      for (let j = 0; j < levelMap[i].length; j++) {
        if (levelMap[i][j] === 0) {
          continue;
        }
        expect(bricks[index].type).toBe(levelMap[i][j]);
        index++;
      }
    }
  });
});
