@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
JavaScript
"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]);
});
});