diff --git a/src/entities/brick/layBricks/layBricks.js b/src/entities/brick/layBricks/layBricks.js new file mode 100644 index 0000000..9dc722b --- /dev/null +++ b/src/entities/brick/layBricks/layBricks.js @@ -0,0 +1,41 @@ +import { Brick } from '../brick'; + +/** + * Ложит кирпичи по заданым размерам + * @param {number} columnAmount количество кирпичей по оси X, неотрицателное, целое число + * @param {number} rowAmount количество кирпичей по оси Y, неотрицателное, целое число + * @param {number} brickWidth ширина кирпича, неотрицателное число + * @param {number} brickHeight длина кирпича, неотрицателное число + * @returns {Brick[][]} массив с массивами кирпичей + */ +export function layBricks(columnAmount, rowAmount, brickWidth, brickHeight) { + try { + const someArgsArentNumbers = [columnAmount, rowAmount, brickWidth, brickHeight].some( + (arg) => typeof arg !== 'number', + ); + if (someArgsArentNumbers) { + throw new Error('Параметры кладки кирпичей должны являться числами'); + } + + const someArgsLessThanZero = [columnAmount, rowAmount, brickWidth, brickHeight].some((arg) => arg < 0); + if (someArgsLessThanZero) { + throw new Error('Параметры кладки кирпичей должны являться положительными целыми числами'); + } + + const rowsOrColumnsAreFloat = [columnAmount, rowAmount].some((amount) => amount % 1 !== 0); + if (rowsOrColumnsAreFloat) { + throw new Error('Размеры рядов и колонок должны являться целыми числами'); + } + + const bricks = Array.from({ length: rowAmount }).map((_, rowIndex) => + Array.from({ length: columnAmount }).map( + (_, columnIndex) => new Brick(columnIndex * brickWidth, rowIndex * brickHeight, brickWidth, brickHeight), + ), + ); + + return bricks; + } catch (err) { + console.error(err); + return null; + } +} diff --git a/src/entities/brick/layBricks/layBricks.test.js b/src/entities/brick/layBricks/layBricks.test.js new file mode 100644 index 0000000..7e665bb --- /dev/null +++ b/src/entities/brick/layBricks/layBricks.test.js @@ -0,0 +1,59 @@ +import { expect } from 'vitest'; +import { layBricks } from './layBricks'; + +describe('layBricks', () => { + it('Возвращает корректное значение в случае неверного типа параметра', () => { + const wrongType = 'wrong'; + + expect(layBricks(wrongType, 1, 1, 1)).toBeNull(); + expect(layBricks(1, wrongType, 1, 1)).toBeNull(); + expect(layBricks(1, 1, wrongType, 1)).toBeNull(); + expect(layBricks(1, 1, 1, wrongType)).toBeNull(); + }); + + it('Возвращает корректное значение в случае неверных размеров кирпича', () => { + const wrongWidth = -1; + const wrongHeight = -1; + + expect(layBricks(1, 1, wrongWidth, 1)).toBeNull(); + expect(layBricks(1, 1, 1, wrongHeight)).toBeNull(); + }); + + it('Возвращает корректное значение в случае неверных значений рядов и колонок', () => { + const negativeRow = -1; + const negativeColumn = -1; + const decimalRow = 1.5; + const decimalColumn = 1.5; + + expect(layBricks(negativeRow, 1, 1, 1)).toBeNull(); + expect(layBricks(1, negativeColumn, 1, 1)).toBeNull(); + expect(layBricks(decimalRow, 1, 1, 1)).toBeNull(); + expect(layBricks(1, decimalColumn, 1, 1)).toBeNull(); + }); + + it('Возвращает массив корректных размеров', () => { + const columnAmount = 10; + const rowAmount = 5; + + const bricks = layBricks(columnAmount, rowAmount, 1, 1); + expect(bricks.length).toEqual(rowAmount); + for (const row of bricks) { + expect(row.length).toEqual(columnAmount); + } + }); + + it('Задает корректные координаты кирпичам', () => { + const bricks = layBricks(3, 3, 1, 1); + const columnAmount = 10; + const rowAmount = 5; + + const brickss = layBricks(columnAmount, rowAmount, 1, 1); + + for (let i = 0; i < rowAmount; i++) { + for (let j = 0; j < columnAmount; j++) { + expect(brickss[i][j].x).toEqual(j); + expect(brickss[i][j]?.y).toEqual(i); + } + } + }); +});