step-sequence-generator
Version:
A step sequence generator for figure skating programs
303 lines (302 loc) • 17.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const StepCounter_1 = require("./StepCounter");
const turn_absolute_name_enum_1 = require("../../shared/enums/turn-absolute-name.enum");
const movement_enums_1 = require("../../shared/enums/movement-enums");
(0, vitest_1.describe)('StepCounter', () => {
let counter;
(0, vitest_1.beforeEach)(() => {
counter = new StepCounter_1.StepCounter();
});
(0, vitest_1.describe)('implementation', () => {
(0, vitest_1.it)('должен корректно создаваться', () => {
(0, vitest_1.expect)(counter).toBeDefined();
(0, vitest_1.expect)(counter).toBeInstanceOf(StepCounter_1.StepCounter);
});
});
// note turns methods
(0, vitest_1.describe)('turns methods', () => {
(0, vitest_1.describe)('reset должен всем свойствам в counter выставить 0', () => {
(0, vitest_1.beforeEach)(() => {
counter['turns'] = {
difficultAll: 6,
difficultOrigin: new Map([
[turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER, 2],
[turn_absolute_name_enum_1.TurnAbsoluteName.COUNTER, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.BRACKET, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.TWIZZLE, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.LOOP, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.CHOCTAW, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.UNKNOWN, 1],
]),
};
counter['lastStep'] = { name: 'test' };
counter['rotations'] = new Map([
[movement_enums_1.RotationDirectionString.NONE, 10],
[movement_enums_1.RotationDirectionString.COUNTERCLOCKWISE, 10],
[movement_enums_1.RotationDirectionString.CLOCKWISE, 10],
]);
counter['distance'] = 5;
counter['threeTurnsBlock'] = {
blockAmount: 2,
turns: new Map([
[turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.COUNTER, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.BRACKET, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.TWIZZLE, 1],
[turn_absolute_name_enum_1.TurnAbsoluteName.LOOP, 1],
]),
};
counter.reset();
});
(0, vitest_1.it)('lastStep должен быть null', () => {
(0, vitest_1.expect)(counter['lastStep']).toEqual(null);
});
(0, vitest_1.it)('turns.difficultAll должен быть 0', () => {
(0, vitest_1.expect)(counter['turns'].difficultAll).toEqual(0);
});
(0, vitest_1.it)('все turns.difficultOrigin должны быть 0', () => {
(0, vitest_1.expect)(counter['turns'].difficultOrigin).toStrictEqual(new Map([
[turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.COUNTER, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.BRACKET, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.TWIZZLE, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.LOOP, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.CHOCTAW, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.UNKNOWN, 0],
]));
});
(0, vitest_1.it)('все turns.rotations должны быть 0', () => {
(0, vitest_1.expect)(counter['rotations']).toStrictEqual(new Map([
[movement_enums_1.RotationDirectionString.NONE, 0],
[movement_enums_1.RotationDirectionString.COUNTERCLOCKWISE, 0],
[movement_enums_1.RotationDirectionString.CLOCKWISE, 0],
]));
});
(0, vitest_1.it)('distance должен быть 0', () => {
(0, vitest_1.expect)(counter['distance']).toEqual(0);
});
(0, vitest_1.it)('все свойства в threeTurnsBlock должны быть 0', () => {
(0, vitest_1.expect)(counter['threeTurnsBlock']).toStrictEqual({
blockAmount: 0,
turns: new Map([
[turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.COUNTER, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.BRACKET, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.TWIZZLE, 0],
[turn_absolute_name_enum_1.TurnAbsoluteName.LOOP, 0],
]),
});
});
});
(0, vitest_1.describe)('increaseDifficultAll', () => {
(0, vitest_1.it)('должен увеличить на единицу turns.difficultAll', () => {
counter['turns'].difficultAll = 1;
counter['increaseTurnsDifficultAll']();
const expected = 2;
const result = counter.difficultTurnsAllAmount;
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('increaseDifficultOrigin', () => {
(0, vitest_1.it)('должен увеличить на единицу одно свойство в turns.difficultOrigin', () => {
const turnAbsoluteName = turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER;
const currentDifficultOriginAmount = 1;
counter['increaseDifficultOrigin'](turnAbsoluteName, currentDifficultOriginAmount);
const expected = 2;
const result = counter['turns'].difficultOrigin.get(turnAbsoluteName);
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('getCurrentDifficultOriginAmount', () => {
(0, vitest_1.it)('должен вернуть значение свойства в counter.turns', () => {
const turnAbsoluteName = turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER;
counter['turns'].difficultOrigin.set(turnAbsoluteName, 1);
const result = counter['getCurrentDifficultOriginAmount'](turnAbsoluteName);
const expected = 1;
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('conditionIsMovementDifficult', () => {
(0, vitest_1.it)('должен вернуть true', () => {
const mockMovement = {
isDifficult: true,
};
const result = counter['conditionIsMovementDifficult'](mockMovement);
(0, vitest_1.expect)(result).toBeTruthy();
});
(0, vitest_1.it)('должен вернуть false', () => {
const mockMovement = { isDifficult: false };
const result = counter['conditionIsMovementDifficult'](mockMovement);
(0, vitest_1.expect)(result).toBeFalsy();
});
});
(0, vitest_1.describe)('conditionToIncreaseDifficultOrigin', () => {
(0, vitest_1.it)('должен вернуть true', () => {
const turnAbsoluteName = turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER;
counter['turns'].difficultOrigin.set(turnAbsoluteName, 1);
const result = counter['conditionToIncreaseDifficultOrigin'](turnAbsoluteName);
(0, vitest_1.expect)(result).toBeTruthy();
});
(0, vitest_1.it)('должен вернуть false', () => {
const turnAbsoluteName = turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER;
counter['turns'].difficultOrigin.set(turnAbsoluteName, 2);
const result = counter['conditionToIncreaseDifficultOrigin'](turnAbsoluteName);
(0, vitest_1.expect)(result).toBeFalsy();
});
});
});
// note rotations methods
(0, vitest_1.describe)('rotations methods', () => {
(0, vitest_1.describe)('mappingRotationDirection', () => {
const propList = [
[movement_enums_1.RotationDirection.COUNTERCLOCKWISE, movement_enums_1.RotationDirectionString.COUNTERCLOCKWISE],
[movement_enums_1.RotationDirection.NONE, movement_enums_1.RotationDirectionString.NONE],
[movement_enums_1.RotationDirection.CLOCKWISE, movement_enums_1.RotationDirectionString.CLOCKWISE],
];
vitest_1.it.each(propList)('должен преобразовывать %s в %s', (input, expected) => {
const result = counter['mappingRotationDirection'](input);
(0, vitest_1.expect)(result).toEqual(expected);
(0, vitest_1.expect)(Object.values(movement_enums_1.RotationDirectionString)).toContain(result);
});
(0, vitest_1.it)('должен выбросить ошибку, если передано неверное значение', () => {
const input = 'wrong value';
(0, vitest_1.expect)(() => counter['mappingRotationDirection'](input)).toThrowError('from mappingRotationDirection: Unrecognized RotationDirection');
});
});
(0, vitest_1.describe)('increaseRotations', () => {
(0, vitest_1.it)('должен увеличить counter.rotations на 180', () => {
const mockCurrentMovement = {
rotationDegree: movement_enums_1.RotationDegree.DEGREE_180,
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
counter['increaseRotations'](mockCurrentMovement, 180);
const expected = 360;
const result = counter['rotations'].get(movement_enums_1.RotationDirectionString.CLOCKWISE);
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('conditionToIncreaseRotations', () => {
(0, vitest_1.it)('должен вернуть true (проверка первого условия)', () => {
const mockCurrentMovement = {
rotationDegree: movement_enums_1.RotationDegree.DEGREE_360,
rotationDirection: movement_enums_1.RotationDirection.COUNTERCLOCKWISE,
};
const mockLastStep = {
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
counter['lastStep'] = mockLastStep;
const result = counter['conditionToIncreaseRotations'](mockCurrentMovement);
(0, vitest_1.expect)(result).toBeTruthy();
});
(0, vitest_1.it)('должен вернуть true (проверка второго условия)', () => {
const mockCurrentMovement = {
rotationDegree: movement_enums_1.RotationDegree.DEGREE_180,
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
const mockLastStep = {
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
counter['lastStep'] = mockLastStep;
const result = counter['conditionToIncreaseRotations'](mockCurrentMovement);
(0, vitest_1.expect)(result).toBeTruthy();
});
(0, vitest_1.it)('должен вернуть false (проверка первого условия)', () => {
const mockCurrentMovement = {
rotationDegree: movement_enums_1.RotationDegree.DEGREES_0,
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
const mockLastStep = {
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
counter['lastStep'] = mockLastStep;
const result = counter['conditionToIncreaseRotations'](mockCurrentMovement);
(0, vitest_1.expect)(result).toBeFalsy();
});
(0, vitest_1.it)('должен вернуть false (проверка второго условия)', () => {
const mockCurrentMovement = {
rotationDegree: movement_enums_1.RotationDegree.DEGREE_180,
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
};
const mockLastStep = {
rotationDirection: movement_enums_1.RotationDirection.COUNTERCLOCKWISE,
};
counter['lastStep'] = mockLastStep;
const result = counter['conditionToIncreaseRotations'](mockCurrentMovement);
(0, vitest_1.expect)(result).toBeFalsy();
});
});
});
// note public methods
(0, vitest_1.describe)('public methods', () => {
(0, vitest_1.describe)('update', () => {
let counterAny;
(0, vitest_1.beforeEach)(() => {
counterAny = counter;
});
(0, vitest_1.describe)('должен вызывать', () => {
const methodNameList = [
'conditionIsMovementDifficult',
'conditionToIncreaseDifficultOrigin',
'conditionToIncreaseRotations',
'increaseTurnsDifficultAll',
'increaseDifficultOrigin',
'increaseRotations',
'updateLastStep',
];
const mockMovement = {
isDifficult: true,
type: movement_enums_1.MovementCharacter.TURN,
rotationDirection: movement_enums_1.RotationDirection.CLOCKWISE,
rotationDegree: movement_enums_1.RotationDegree.DEGREE_360,
absoluteName: turn_absolute_name_enum_1.TurnAbsoluteName.ROCKER,
};
vitest_1.it.each(methodNameList)('метод %s', (methodName) => {
const spyFn = vitest_1.vi.spyOn(counterAny, methodName);
counter.update(mockMovement);
(0, vitest_1.expect)(spyFn).toHaveBeenCalled();
});
});
});
(0, vitest_1.describe)('difficultTurnsAllAmount', () => {
(0, vitest_1.it)('должен вернуть общее количество используемых сложных поворотов', () => {
counter['turns'].difficultAll = 10;
const expected = 10;
const result = counter.difficultTurnsAllAmount;
(0, vitest_1.expect)(result).toBe(expected);
});
(0, vitest_1.it)('должен вернуть 0 если сложные повороты не установлены', () => {
const expected = 0;
const result = counter.difficultTurnsAllAmount;
(0, vitest_1.expect)(result).toBe(expected);
});
});
// todo написать тест
(0, vitest_1.describe)('difficultTurnsOriginAmount', () => {
(0, vitest_1.it)('должен вернуть количество сложных поворотов при условии, что каждый тип учитывается не более двух раз', () => {
const test = 0;
});
});
(0, vitest_1.describe)('rotationAmount', () => {
(0, vitest_1.it)('должен вернуть объект с количеством поворотов в каждую сторону в градусах', () => {
counter['rotations'].set(movement_enums_1.RotationDirectionString.CLOCKWISE, 360);
counter['rotations'].set(movement_enums_1.RotationDirectionString.COUNTERCLOCKWISE, 720);
const expected = {
clockwise: 360,
counterclockwise: 720,
};
const result = counter.rotationAmount;
(0, vitest_1.expect)(result).toStrictEqual(expected);
});
(0, vitest_1.it)('должен вернуть объект с 0 для каждой стороны, если обороты не установлены', () => {
const expected = {
clockwise: 0,
counterclockwise: 0,
};
const result = counter.rotationAmount;
(0, vitest_1.expect)(result).toStrictEqual(expected);
});
});
});
});