UNPKG

step-sequence-generator

Version:

A step sequence generator for figure skating programs

166 lines (165 loc) 8.93 kB
"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.'); }); }); }); });