feat(tick) добавлена функция tick описывающая логику взаимодействия сущностей игры во времени
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import { CONTAINER_HEIGHT, CONTAINER_WIDTH } from '../../config';
|
||||
import { Game } from '../../game';
|
||||
import { tick } from './tick';
|
||||
|
||||
describe('tick', () => {
|
||||
it('Возвращает корректное значние при неверных типах аргументов', () => {
|
||||
expect(tick(null, 1, 1, 1)).toBeNull();
|
||||
expect(tick(1, null, 1, 1)).toBeNull();
|
||||
expect(tick(1, 1, null, 1)).toBeNull();
|
||||
expect(tick(1, 1, 1, null)).toBeNull();
|
||||
});
|
||||
|
||||
it('Возвращает корректное значние и не изменяет свойства game при неверых размерах контейнера', () => {
|
||||
const game = new Game(1, 1);
|
||||
const ballX = game.ball.x;
|
||||
const ballY = game.ball.y;
|
||||
expect(tick(game, -1, -1, 1)).toBeNull();
|
||||
expect(game.ball.x).toBe(ballX);
|
||||
expect(game.ball.y).toBe(ballY);
|
||||
});
|
||||
|
||||
it('Возвращает корректное значние и не изменяет свойства game при неверном значении времени', () => {
|
||||
const game = new Game(1, 1);
|
||||
const ballX = game.ball.x;
|
||||
const ballY = game.ball.y;
|
||||
expect(tick(game, 1, 1, -1)).toBeNull();
|
||||
expect(game.ball.x).toBe(ballX);
|
||||
expect(game.ball.y).toBe(ballY);
|
||||
});
|
||||
|
||||
it('Меняет направление мяча при столкновении со стеной', () => {
|
||||
const game = new Game(1, 1);
|
||||
game.ball.x = 0;
|
||||
game.ball.horizontalSpeed = -10;
|
||||
tick(game, CONTAINER_WIDTH, CONTAINER_HEIGHT, 1);
|
||||
expect(game.ball.x).toBe(10);
|
||||
expect(game.ball.horizontalSpeed).toBe(10);
|
||||
});
|
||||
|
||||
it('Меняет направление мяча при столкновении с потолком', () => {
|
||||
const game = new Game(0, 0);
|
||||
game.ball.y = 0;
|
||||
game.ball.verticalSpeed = -10;
|
||||
tick(game, CONTAINER_WIDTH, CONTAINER_HEIGHT, 1);
|
||||
expect(game.ball.y).toBe(game.ball.radius);
|
||||
expect(game.ball.verticalSpeed).toBe(10);
|
||||
});
|
||||
|
||||
it('Убивает кирпич при столкновении и отражает мяч', () => {
|
||||
const game = new Game(1, 1);
|
||||
const brick = game.bricks[0][0];
|
||||
|
||||
game.ball.x = brick.x + 1;
|
||||
game.ball.y = brick.y + brick.height + game.ball.radius + 1;
|
||||
game.ball.horizontalSpeed = 0;
|
||||
game.ball.verticalSpeed = -10;
|
||||
|
||||
tick(game, CONTAINER_WIDTH, CONTAINER_HEIGHT, 0.1);
|
||||
|
||||
expect(brick.alive).toBe(false);
|
||||
expect(game.ball.verticalSpeed).toBe(10);
|
||||
});
|
||||
|
||||
it('Убивает только один кирпич за тик', () => {
|
||||
const game = new Game(2, 1);
|
||||
const [firstBrick, secondBrick] = game.bricks[0];
|
||||
|
||||
game.ball.x = firstBrick.x + 1;
|
||||
game.ball.y = firstBrick.y + firstBrick.height + game.ball.radius + 1;
|
||||
game.ball.horizontalSpeed = 0;
|
||||
game.ball.verticalSpeed = -10;
|
||||
|
||||
tick(game, CONTAINER_WIDTH, CONTAINER_HEIGHT, 0.1);
|
||||
|
||||
const killedCount = game.bricks[0].filter((b) => !b.alive).length;
|
||||
expect(killedCount).toBe(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user