step-sequence-generator
Version:
A step sequence generator for figure skating programs
166 lines (165 loc) • 8.93 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const StepTracker_1 = require("./StepTracker");
const start_coordinates_1 = require("../../shared/constants/start-coordinates");
const vector_angles_1 = require("../../shared/constants/vector-angles");
const vectors_track_1 = require("../../shared/constants/vectors-track");
const utils_1 = require("./utils");
const vector_key_enum_1 = require("../../shared/enums/vector-key.enum");
const VectorKeyChanceRatioMapGenerator_1 = require("../chance-ratio-map-generator/VectorKeyChanceRatioMapGenerator");
const WeightCalculator_1 = require("../roulette/weight-calculator/WeightCalculator");
const Roulette_1 = require("../roulette/Roulette");
const NumberGenerator_1 = require("../roulette/number-generator/NumberGenerator");
(0, vitest_1.describe)('StepTracker', () => {
let stepTracker;
(0, vitest_1.beforeEach)(() => {
const vectorKeyChanceRatioMapGenerator = new VectorKeyChanceRatioMapGenerator_1.VectorKeyChanceRatioMapGenerator();
const roulette = new Roulette_1.Roulette({
weightCalc: new WeightCalculator_1.WeightCalculator(),
numberGenerator: new NumberGenerator_1.NumberGenerator(),
});
stepTracker = new StepTracker_1.StepTracker({
standardStartCoordinates: start_coordinates_1.START_COORDINATES,
vectorsTrack: vectors_track_1.VECTORS_TRACK,
vectorAngles: vector_angles_1.VECTOR_ANGLES,
vectorKeyChanceRatioMapGenerator,
roulette: roulette,
});
});
(0, vitest_1.describe)('implementation', () => {
(0, vitest_1.it)('должен корректно создаваться', () => {
(0, vitest_1.expect)(stepTracker).toBeDefined();
});
});
(0, vitest_1.describe)('getStartCoordinates', () => {
(0, vitest_1.it)('должен вернуть стартовые координаты', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const sequenceTrackerAny = stepTracker;
vitest_1.vi.spyOn(sequenceTrackerAny, 'getRandom').mockReturnValue(0);
const expected = (0, utils_1.createCoordinates)(5, 5);
const result = stepTracker.getStartCoordinates();
(0, vitest_1.expect)(result).toBeDefined();
(0, vitest_1.expect)(result).toStrictEqual(expected);
});
});
(0, vitest_1.describe)('getAllowedVectorKeys', () => {
(0, vitest_1.it)('должен вернуть массив ключей', () => {
const input = vector_key_enum_1.VectorKey.NORTH;
const expected = ['north', 'north_east', 'east', 'west', 'north_west'];
const result = stepTracker['getAllowedVectorKeys'](input);
(0, vitest_1.expect)(result).toStrictEqual(expected);
});
(0, vitest_1.describe)('проверка фильтрации доступных ключей', () => {
const mockKeysList = Object.values(vector_key_enum_1.VectorKey);
vitest_1.it.each(mockKeysList)('при key = %s должен вернуть 5 ключей', (key) => {
const result = stepTracker['getAllowedVectorKeys'](key);
console.debug(key, result);
(0, vitest_1.expect)(result.length).toEqual(5);
});
});
});
(0, vitest_1.describe)('getNextMovementVector', () => {
(0, vitest_1.it)('должен вернуть Vector количество раз в соответствии с ratioMap', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const sequenceTrackerAny = stepTracker;
vitest_1.vi.spyOn(sequenceTrackerAny, 'getRandom').mockReturnValue(1);
const mockVectors = [vector_key_enum_1.VectorKey.NORTH, vector_key_enum_1.VectorKey.EAST, vector_key_enum_1.VectorKey.WEST];
const mockRatioMap = new Map([
[vector_key_enum_1.VectorKey.NORTH, 1],
[vector_key_enum_1.VectorKey.EAST, 98],
[vector_key_enum_1.VectorKey.WEST, 1],
]);
const counter = new Map();
for (let i = 0; i < 10000; i++) {
const result = sequenceTrackerAny['getNextMovementVector'](mockVectors, mockRatioMap);
if (!counter.has(result)) {
counter.set(result, 0);
}
else {
const amount = (counter.get(result) || 0) + 1;
counter.set(result, amount);
}
}
const northAmount = counter.get(vector_key_enum_1.VectorKey.NORTH);
const eastAmount = counter.get(vector_key_enum_1.VectorKey.EAST);
const westAmount = counter.get(vector_key_enum_1.VectorKey.WEST);
(0, vitest_1.expect)(northAmount).approximately(90, 150);
(0, vitest_1.expect)(westAmount).approximately(90, 150);
(0, vitest_1.expect)(eastAmount).approximately(9000, 1000);
});
(0, vitest_1.it)('должен выбросить ошибку при vectors.length = 0', () => {
(0, vitest_1.expect)(() => stepTracker['getNextMovementVector']([], new Map())).toThrowError('vectors.length should be more than 0');
});
});
(0, vitest_1.describe)('calcCoordinate', () => {
(0, vitest_1.it)('должен вернуть определенный результат калькуляции', () => {
const mockCursor = -1;
const mockCoord = 37;
const mockDistance = 2;
const expected = 35;
const result = stepTracker['calcCoordinate']({
cursor: mockCursor,
coord: mockCoord,
distance: mockDistance,
});
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('getNewCoordinates', () => {
(0, vitest_1.it)('должен вернуть координаты', () => {
const mock_vectorCursor = { x: 1, y: 1 };
const mock_currentCoordinates = { x: 29, y: 27 };
const mock_distance = 2;
const expected = { x: 31, y: 29 };
const result = stepTracker['getNewCoordinates']({
vectorCursor: mock_vectorCursor,
currentCoordinates: mock_currentCoordinates,
distance: mock_distance,
});
(0, vitest_1.expect)(result).toEqual(expected);
});
// todo разобраться с этим тестом
const mockCurrentCoordinatesList = [
{ x: 59, y: 28 },
{ x: 29, y: 29 },
];
vitest_1.it.each(mockCurrentCoordinatesList)('должен вернуть null при %s', (mock_currentCoordinates) => {
const mock_vectorCursor = { x: 1, y: 1 };
const mock_distance = 2;
const expected = null;
const result = stepTracker['getNewCoordinates']({
vectorCursor: mock_vectorCursor,
currentCoordinates: mock_currentCoordinates,
distance: mock_distance,
});
(0, vitest_1.expect)(result).toEqual(expected);
});
});
(0, vitest_1.describe)('filterVectorKeys', () => {
(0, vitest_1.it)('должен вернуть отфильтрованный массив', () => {
const key = vector_key_enum_1.VectorKey.NORTH;
const mockTried = new Set([key]);
const mockAllowed = ['north_west', 'north_east', 'north'];
const expected = ['north_west', 'north_east'];
const result = stepTracker['filterVectorKeys'](mockTried, mockAllowed);
(0, vitest_1.expect)(result).toStrictEqual(expected);
});
(0, vitest_1.describe)('getNextPosition', () => {
(0, vitest_1.it)('должен выбросить ошибку, если availableVectorKeys = []', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const sequenceTrackerAny = stepTracker;
vitest_1.vi.spyOn(sequenceTrackerAny, 'getAllowedVectorKeys').mockReturnValue([]);
const mockCurrentVector = vector_key_enum_1.VectorKey.NORTH;
const mockCurrentCoordinates = { x: 1, y: 1 };
const distance = 1;
(0, vitest_1.expect)(() => stepTracker.getNextPosition({
currentVectorKey: mockCurrentVector,
currentCoordinates: mockCurrentCoordinates,
currentAcrVectorIndex: -1,
distance,
})).toThrowError('Unable to find next coordinates within bounds.');
});
});
});
});