UNPKG

@sports-alliance/sports-lib

Version:

A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc

111 lines (110 loc) 5.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const grade_calculator_1 = require("./grade-calculator"); const floor = (value, decimals) => { const pow = Math.pow(10, decimals); return Math.floor(value * pow) / pow; }; describe('GradeCalculator', () => { it('should align and squash distance & altitude along time', done => { // Given const timeData = [0, null, 2, 3, 4, 5, 6, 7, 8, 9]; const distanceData = [0, null, 20, null, 40, 56, null, 73, 85, 99]; const altitudeData = [100, null, 102, 303, null, 205, null, 207, 308, 109]; const expectedSquashedAlignTime = [0, 2, 3, 4, 5, 7, 8, 9]; const expectedSquashedAlignDistance = [0, 20, 20, 40, 56, 73, 85, 99]; const expectedSquashedAlignAltitude = [100, 102, 303, 303, 205, 207, 308, 109]; // When const [squashedAlignedTime, squashedAlignedDist, squashedAlignedAlt] = grade_calculator_1.GradeCalculator.squashAlignStreams(timeData, distanceData, altitudeData); // Then expect(squashedAlignedDist.length).toEqual(squashedAlignedTime.length); expect(squashedAlignedAlt.length).toEqual(squashedAlignedTime.length); expect(squashedAlignedTime).toEqual(expectedSquashedAlignTime); expect(squashedAlignedDist).toEqual(expectedSquashedAlignDistance); expect(squashedAlignedAlt).toEqual(expectedSquashedAlignAltitude); done(); }); describe('Grade compute', () => { it('should calculate grade on flat terrain', done => { // Given const timeData = [0, null, 2, 3, 4, 5, 6, 7, 8, 9]; const distanceData = [10, null, 20, null, 30, 35, null, 45, 50, 55]; const altitudeData = [10, null, 10, 10, 10, 10, null, 10, 10, 10]; const gradeData = [0, null, 0, 0, 0, 0, null, 0, 0, 0]; // When const gradeStream = grade_calculator_1.GradeCalculator.computeGradeStream(timeData, distanceData, altitudeData); // Then expect(gradeStream.length).toEqual(timeData.length); expect(gradeStream.length).toEqual(gradeData.length); expect(gradeStream).toEqual(gradeData); done(); }); it('should calculate grade on hilly terrain', done => { // Given const timeData = [0, null, 2, 3, 4, 5, 6, 7, 8, 9]; const distanceData = [10, null, 20, null, 30, 35, null, 45, 50, 55]; const altitudeData = [10, null, 10, 11, 13, 16, null, 15, 14, 13]; const expectedGradeData = [0, null, 30, 20, 13.3, -10, null, -20, -20, 0]; // When const gradeStream = grade_calculator_1.GradeCalculator.computeGradeStream(timeData, distanceData, altitudeData, 10, 50); // Then expect(gradeStream.length).toEqual(timeData.length); expect(gradeStream.length).toEqual(expectedGradeData.length); expect(gradeStream).toEqual(expectedGradeData); done(); }); it('should calculate point-indexed grade from distance and altitude', () => { const distanceData = [10, null, 20, null, 30, 35, null, 45, 50, 55]; const altitudeData = [10, null, 10, 11, 13, 16, null, 15, 14, 13]; const expectedGradeData = [0, null, 30, 20, 13.3, -10, null, -20, -20, 0]; const gradeStream = grade_calculator_1.GradeCalculator.computeGradeStreamByDistance(distanceData, altitudeData, 10, 50); expect(gradeStream).toEqual(expectedGradeData); }); it('should return a null point-indexed grade stream when distance and altitude cannot be aligned', () => { const gradeStream = grade_calculator_1.GradeCalculator.computeGradeStreamByDistance([null, null], [null, null]); expect(gradeStream).toEqual([null, null]); }); it('should not backfill point-indexed grade from future distance or altitude samples', () => { const gradeStream = grade_calculator_1.GradeCalculator.computeGradeStreamByDistance([null, 10, 20], [5, 6, 8], 10, 50); expect(gradeStream).toEqual([null, 20, 0]); }); }); describe('Grade adjusted speed', () => { it('should model grade adjusted pace at grade of -32', () => { // Given const speedMeterSeconds = 10; const grade = -30; // When const gradeAdjustedSpeed = grade_calculator_1.GradeCalculator.estimateAdjustedSpeed(speedMeterSeconds, grade); // Then expect(floor(gradeAdjustedSpeed, 1)).toEqual(15); }); it('should model grade adjusted pace at grade of 0', () => { // Given const speedMeterSeconds = 10; const grade = 0; // When const gradeAdjustedSpeed = grade_calculator_1.GradeCalculator.estimateAdjustedSpeed(speedMeterSeconds, grade); // Then expect(floor(gradeAdjustedSpeed, 1)).toEqual(10); }); it('should model grade adjusted pace at grade of 6', () => { // Given const speedMeterSeconds = 10; const grade = 6; // When const gradeAdjustedSpeed = grade_calculator_1.GradeCalculator.estimateAdjustedSpeed(speedMeterSeconds, grade); // Then expect(floor(gradeAdjustedSpeed, 1)).toEqual(12.4); }); it('should model grade adjusted pace at grade of 28', () => { // Given const speedMeterSeconds = 10; const grade = 28; // When const gradeAdjustedSpeed = grade_calculator_1.GradeCalculator.estimateAdjustedSpeed(speedMeterSeconds, grade); // Then expect(floor(gradeAdjustedSpeed, 1)).toEqual(29.7); }); }); });