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) 10.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const activity_parsing_options_1 = require("../activities/activity-parsing-options"); const activity_1 = require("../activities/activity"); const activity_types_1 = require("../activities/activity.types"); const creator_1 = require("../creators/creator"); const data_altitude_1 = require("../data/data.altitude"); const data_distance_1 = require("../data/data.distance"); const data_grade_1 = require("../data/data.grade"); const data_grade_adjusted_pace_1 = require("../data/data.grade-adjusted-pace"); const data_grade_adjusted_speed_1 = require("../data/data.grade-adjusted-speed"); const data_heart_rate_1 = require("../data/data.heart-rate"); const data_latitude_degrees_1 = require("../data/data.latitude-degrees"); const data_longitude_degrees_1 = require("../data/data.longitude-degrees"); const data_pace_1 = require("../data/data.pace"); const data_power_balance_left_1 = require("../data/data.power-balance-left"); const data_speed_1 = require("../data/data.speed"); const stream_1 = require("./stream"); const stream_selection_1 = require("./stream.selection"); describe('stream.selection', () => { it('should return null when includeTypes is not provided', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions()); expect(selection).toBeNull(); }); it('should return null when includeTypes is empty', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [] } })); expect(selection).toBeNull(); }); it('should throw when includeTypes contains unknown types', () => { expect(() => (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: ['Not A Stream'] } }))).toThrow('Unknown stream includeTypes'); }); it('should normalize includeTypes by trimming and deduplicating', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [` ${data_distance_1.DataDistance.type} `, data_distance_1.DataDistance.type, data_pace_1.DataPace.type, data_pace_1.DataPace.type] } })); expect(selection).not.toBeNull(); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet).toEqual(new Set([data_distance_1.DataDistance.type, data_pace_1.DataPace.type])); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_distance_1.DataDistance.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_pace_1.DataPace.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeed.type)).toBe(true); }); it('should normalize legacy includeType aliases to canonical stream types', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [' Left Balance ', data_power_balance_left_1.DataPowerBalanceLeft.type] } })); expect(selection).not.toBeNull(); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet).toEqual(new Set([data_power_balance_left_1.DataPowerBalanceLeft.type])); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_power_balance_left_1.DataPowerBalanceLeft.type)).toBe(true); }); it('should expand dependencies for pace requests', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_pace_1.DataPace.type] } })); expect(selection).not.toBeNull(); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet.has(data_pace_1.DataPace.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_pace_1.DataPace.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeed.type)).toBe(true); }); it('should expand deep dependencies for grade adjusted pace unit requests', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_grade_adjusted_pace_1.DataGradeAdjustedPaceMinutesPerMile.type] } })); expect(selection).not.toBeNull(); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet.has(data_grade_adjusted_pace_1.DataGradeAdjustedPaceMinutesPerMile.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_grade_adjusted_pace_1.DataGradeAdjustedPace.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_grade_adjusted_speed_1.DataGradeAdjustedSpeed.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeed.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_grade_1.DataGrade.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_distance_1.DataDistance.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_altitude_1.DataAltitude.type)).toBe(true); }); it('should expand unit-only speed requests to raw speed for import without widening output', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_speed_1.DataSpeedKilometersPerHour.type] } })); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet).toEqual(new Set([data_speed_1.DataSpeedKilometersPerHour.type])); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeedKilometersPerHour.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeed.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_distance_1.DataDistance.type)).toBe(false); }); it('should expand grade-adjusted speed unit requests through the full dependency chain', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_grade_adjusted_speed_1.DataGradeAdjustedSpeedKilometersPerHour.type] } })); expect(selection === null || selection === void 0 ? void 0 : selection.outputAllowSet).toEqual(new Set([data_grade_adjusted_speed_1.DataGradeAdjustedSpeedKilometersPerHour.type])); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_grade_adjusted_speed_1.DataGradeAdjustedSpeed.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_speed_1.DataSpeed.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_grade_1.DataGrade.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_distance_1.DataDistance.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_altitude_1.DataAltitude.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_latitude_degrees_1.DataLatitudeDegrees.type)).toBe(true); expect(selection === null || selection === void 0 ? void 0 : selection.importAllowSet.has(data_longitude_degrees_1.DataLongitudeDegrees.type)).toBe(true); }); it('should distinguish allowed dependency types from unrelated stream types during import filtering', () => { const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_speed_1.DataSpeedKilometersPerHour.type] } })); expect((0, stream_selection_1.isStreamTypeAllowedForImport)(data_speed_1.DataSpeed.type, selection)).toBe(true); expect((0, stream_selection_1.isStreamTypeAllowedForImport)(data_speed_1.DataSpeedKilometersPerHour.type, selection)).toBe(true); expect((0, stream_selection_1.isStreamTypeAllowedForImport)(data_heart_rate_1.DataHeartRate.type, selection)).toBe(false); expect((0, stream_selection_1.isStreamTypeAllowedForImport)(data_heart_rate_1.DataHeartRate.type, null)).toBe(true); }); it('should prune activities down to the requested output stream types only', () => { const activity = new activity_1.Activity(new Date(0), new Date(3000), activity_types_1.ActivityTypes.Running, new creator_1.Creator('Test')); activity.addStream(new stream_1.Stream(data_distance_1.DataDistance.type, [0, 10, 20, 30])); activity.addStream(new stream_1.Stream(data_heart_rate_1.DataHeartRate.type, [100, 101, 102, 103])); activity.addStream(new stream_1.Stream(data_speed_1.DataSpeedKilometersPerHour.type, [10, 11, 12, 13])); const selection = (0, stream_selection_1.getStreamSelectionFromOptions)(new activity_parsing_options_1.ActivityParsingOptions({ streams: { includeTypes: [data_distance_1.DataDistance.type, data_speed_1.DataSpeedKilometersPerHour.type] } })); (0, stream_selection_1.pruneActivityStreamsBySelection)(activity, selection); expect(activity.getAllStreams().map(stream => stream.type)).toEqual([data_distance_1.DataDistance.type, data_speed_1.DataSpeedKilometersPerHour.type]); }); });