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

204 lines (203 loc) 9.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const importer_json_1 = require("./importer.json"); const activity_types_1 = require("../../../../activities/activity.types"); const data_avg_vam_1 = require("../../../../data/data.avg-vam"); const data_jump_stats_1 = require("../../../../data/data.jump-stats"); const data_max_hr_setting_1 = require("../../../../data/data.max-hr-setting"); const data_avg_respiration_rate_1 = require("../../../../data/data.avg-respiration-rate"); const data_distance_1 = require("../../../../data/data.distance"); const data_ibi_1 = require("../../../../data/data.ibi"); const data_power_balance_left_1 = require("../../../../data/data.power-balance-left"); const data_power_balance_right_1 = require("../../../../data/data.power-balance-right"); const data_time_1 = require("../../../../data/data.time"); const ibi_stream_1 = require("../../../../streams/ibi-stream"); describe('EventImporterJSON legacy type compatibility', () => { it('maps legacy stat keys to canonical types via DynamicDataLoader aliases', () => { var _a, _b, _c, _d, _e, _f; const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'legacy-json', startDate: 0, endDate: 1000, type: activity_types_1.ActivityTypes.Running, powerMeter: false, trainer: false, stats: { 'Avg VAM': 123, 'Jump Height Avg': 1.5, 'Max HR Setting': 190, 'Respiration Rate Avg': 16, 'Left Balance': 51, 'Right Balance': 49 }, streams: [], laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect((_a = activity.getStat(data_avg_vam_1.DataAvgVAM.type)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(123); expect((_b = activity.getStat(data_jump_stats_1.DataJumpHeightAvg.type)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(1.5); expect((_c = activity.getStat(data_max_hr_setting_1.DataMaxHRSetting.type)) === null || _c === void 0 ? void 0 : _c.getValue()).toBe(190); expect((_d = activity.getStat(data_avg_respiration_rate_1.DataAvgRespirationRate.type)) === null || _d === void 0 ? void 0 : _d.getValue()).toBe(16); expect((_e = activity.getStat(data_power_balance_left_1.DataPowerBalanceLeft.type)) === null || _e === void 0 ? void 0 : _e.getValue()).toBe(51); expect((_f = activity.getStat(data_power_balance_right_1.DataPowerBalanceRight.type)) === null || _f === void 0 ? void 0 : _f.getValue()).toBe(49); }); it('prefers canonical stat keys when legacy aliases collide with them', () => { var _a, _b; const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'mixed-json-balance-stats', startDate: 0, endDate: 1000, type: activity_types_1.ActivityTypes.Cycling, powerMeter: true, trainer: false, stats: { [data_power_balance_left_1.DataPowerBalanceLeft.type]: 61, 'Left Balance': 51, 'Right Balance': 49, [data_power_balance_right_1.DataPowerBalanceRight.type]: 39 }, streams: [], laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect((_a = activity.getStat(data_power_balance_left_1.DataPowerBalanceLeft.type)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(61); expect((_b = activity.getStat(data_power_balance_right_1.DataPowerBalanceRight.type)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(39); }); it('maps legacy balance stream keys to canonical power balance types', () => { const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'legacy-json-balance-streams', startDate: 0, endDate: 3000, type: activity_types_1.ActivityTypes.Cycling, powerMeter: true, trainer: false, stats: {}, streams: { 'Left Balance': [51, 52, 53], 'Right Balance': [49, 48, 47] }, laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect(activity.hasStreamData('Left Balance')).toBe(false); expect(activity.hasStreamData('Right Balance')).toBe(false); expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([51, 52, 53]); expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([49, 48, 47]); }); it('dedupes mixed legacy and canonical balance streams without throwing', () => { const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'mixed-json-balance-streams', startDate: 0, endDate: 3000, type: activity_types_1.ActivityTypes.Cycling, powerMeter: true, trainer: false, stats: {}, streams: { [data_power_balance_left_1.DataPowerBalanceLeft.type]: [61, 62, 63], 'Left Balance': [51, 52, 53], 'Right Balance': [49, 48, 47], [data_power_balance_right_1.DataPowerBalanceRight.type]: [39, 38, 37] }, laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([61, 62, 63]); expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([39, 38, 37]); }); it('dedupes mixed legacy and canonical array streams without throwing', () => { const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'mixed-json-balance-array-streams', startDate: 0, endDate: 3000, type: activity_types_1.ActivityTypes.Cycling, powerMeter: true, trainer: false, stats: {}, streams: [ { type: data_power_balance_left_1.DataPowerBalanceLeft.type, data: [61, 62, 63] }, { type: 'Left Balance', data: [51, 52, 53] }, { type: 'Right Balance', data: [49, 48, 47] }, { type: data_power_balance_right_1.DataPowerBalanceRight.type, data: [39, 38, 37] } ], laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([61, 62, 63]); expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([39, 38, 37]); }); it('ignores legacy object-form Time streams while preserving IBI streams', () => { const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({ name: 'legacy-json-streams', startDate: 0, endDate: 3000, type: activity_types_1.ActivityTypes.Running, powerMeter: false, trainer: false, stats: {}, streams: { [data_time_1.DataTime.type]: [0, 1, 2, 3], [data_distance_1.DataDistance.type]: [0, null, null, 30], [data_ibi_1.DataIBI.type]: [823, 823, 823] }, laps: [], creator: { name: 'test', devices: [] }, intensityZones: [], events: [] }); expect(activity.hasStreamData(data_time_1.DataTime.type)).toBe(false); expect(activity.getStream(data_distance_1.DataDistance.type).getData()).toEqual([0, null, null, 30]); expect(activity.getStream(data_ibi_1.DataIBI.type)).toBeInstanceOf(ibi_stream_1.IBIStream); expect(activity.generateTimeStream([data_ibi_1.DataIBI.type]).getData(true)).toEqual([1, 2]); }); it('preserves zero-valued device fields and timestamps when importing creator JSON', () => { var _a; const creator = importer_json_1.EventImporterJSON.getCreatorFromJSON({ name: 'test', devices: [ { type: 'bike computer', name: null, index: 0, batteryStatus: null, batteryLevel: 0, batteryVoltage: 0, manufacturer: null, serialNumber: null, product: 0, swInfo: null, hwInfo: null, antDeviceNumber: 0, antTransmissionType: 0, antNetwork: null, sourceType: null, antId: '0:0', cumOperatingTime: 0, timestamp: '2024-01-01T10:00:00.000Z' } ] }); expect(creator.devices[0]).toMatchObject({ type: 'bike computer', index: 0, batteryLevel: 0, batteryVoltage: 0, product: 0, antDeviceNumber: 0, antTransmissionType: 0, antId: '0:0', cumOperatingTime: 0 }); expect((_a = creator.devices[0].timestamp) === null || _a === void 0 ? void 0 : _a.toISOString()).toBe('2024-01-01T10:00:00.000Z'); }); });