@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
625 lines • 57.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const activity_utilities_1 = require("./activity.utilities");
const data_vo2_max_1 = require("../../data/data.vo2-max");
const data_moving_time_1 = require("../../data/data.moving-time");
const data_total_grit_1 = require("../../data/data.total-grit");
const data_heart_rate_max_1 = require("../../data/data.heart-rate-max");
const data_heart_rate_min_1 = require("../../data/data.heart-rate-min");
const data_rpe_1 = require("../../data/data.rpe");
const data_power_max_1 = require("../../data/data.power-max");
const data_power_min_1 = require("../../data/data.power-min");
const data_power_avg_1 = require("../../data/data.power-avg");
const data_power_watts_per_kg_1 = require("../../data/data.power-watts-per-kg");
const data_speed_max_1 = require("../../data/data.speed-max");
const data_speed_min_1 = require("../../data/data.speed-min");
const data_cadence_max_1 = require("../../data/data.cadence-max");
const data_cadence_min_1 = require("../../data/data.cadence-min");
const data_altitude_max_1 = require("../../data/data.altitude-max");
const data_altitude_min_1 = require("../../data/data.altitude-min");
const data_altitude_avg_1 = require("../../data/data.altitude-avg");
const data_temperature_max_1 = require("../../data/data.temperature-max");
const data_temperature_min_1 = require("../../data/data.temperature-min");
const data_jump_count_1 = require("../../data/data.jump-count");
const data_jump_event_1 = require("../../data/data.jump-event");
const data_jump_stats_1 = require("../../data/data.jump-stats");
const data_total_flow_1 = require("../../data/data.total-flow");
const data_air_power_avg_1 = require("../../data/data.air-power-avg");
const data_air_power_max_1 = require("../../data/data.air-power-max");
const data_air_power_min_1 = require("../../data/data.air-power-min");
const data_vertical_speed_avg_1 = require("../../data/data.vertical-speed-avg");
const data_vertical_speed_max_1 = require("../../data/data.vertical-speed-max");
const data_vertical_speed_min_1 = require("../../data/data.vertical-speed-min");
const data_ground_contact_time_avg_1 = require("../../data/data.ground-contact-time-avg");
const data_ground_contact_time_max_1 = require("../../data/data.ground-contact-time-max");
const data_ground_contact_time_min_1 = require("../../data/data.ground-contact-time-min");
const data_vertical_oscillation_avg_1 = require("../../data/data.vertical-oscillation-avg");
const data_vertical_oscillation_max_1 = require("../../data/data.vertical-oscillation-max");
const data_vertical_oscillation_min_1 = require("../../data/data.vertical-oscillation-min");
const data_pace_max_1 = require("../../data/data.pace-max");
const data_pace_min_1 = require("../../data/data.pace-min");
const data_grade_adjusted_pace_max_1 = require("../../data/data.grade-adjusted-pace-max");
const data_grade_adjusted_pace_min_1 = require("../../data/data.grade-adjusted-pace-min");
const data_swim_pace_max_1 = require("../../data/data.swim-pace-max");
const data_swim_pace_min_1 = require("../../data/data.swim-pace-min");
const data_grade_adjusted_speed_max_1 = require("../../data/data.grade-adjusted-speed-max");
const data_grade_adjusted_speed_min_1 = require("../../data/data.grade-adjusted-speed-min");
const data_leg_stiffness_avg_1 = require("../../data/data.leg-stiffness-avg");
const data_leg_stiffness_max_1 = require("../../data/data.leg-stiffness-max");
const data_leg_stiffness_min_1 = require("../../data/data.leg-stiffness-min");
const data_vertical_ratio_avg_1 = require("../../data/data.vertical-ratio-avg");
const data_vertical_ratio_max_1 = require("../../data/data.vertical-ratio-max");
const data_vertical_ratio_min_1 = require("../../data/data.vertical-ratio-min");
const data_evpe_avg_1 = require("../../data/data.evpe-avg");
const data_evpe_max_1 = require("../../data/data.evpe-max");
const data_evpe_min_1 = require("../../data/data.evpe-min");
const data_ehpe_avg_1 = require("../../data/data.ehpe-avg");
const data_ehpe_max_1 = require("../../data/data.ehpe-max");
const data_ehpe_min_1 = require("../../data/data.ehpe-min");
const data_satellite_5_best_snr_avg_1 = require("../../data/data.satellite-5-best-snr-avg");
const data_satellite_5_best_snr_max_1 = require("../../data/data.satellite-5-best-snr-max");
const data_satellite_5_best_snr_min_1 = require("../../data/data.satellite-5-best-snr-min");
const data_number_of_satellites_avg_1 = require("../../data/data.number-of-satellites-avg");
const data_number_of_satellites_max_1 = require("../../data/data.number-of-satellites-max");
const data_number_of_satellites_min_1 = require("../../data/data.number-of-satellites-min");
const data_weight_1 = require("../../data/data.weight");
describe('ActivityUtilities', () => {
describe('getSummaryStatsForActivities', () => {
// Helper to create a mock activity
const createMockActivity = (stats, events = []) => {
return {
getDuration: () => ({ getValue: () => 100 }),
getPause: () => ({ getValue: () => 0 }),
getDistance: () => ({ getValue: () => 1000 }),
getAllEvents: () => events,
getStatsAsArray: () => [],
getStat: (type) => {
if (stats[type])
return stats[type];
return null;
}
};
};
const createJumpEvent = (timestamp, values) => {
var _a, _b;
return new data_jump_event_1.DataJumpEvent(timestamp, {
distance: (_a = values.distance) !== null && _a !== void 0 ? _a : 0,
height: values.height,
score: (_b = values.score) !== null && _b !== void 0 ? _b : 0,
hang_time: values.hang_time,
speed: values.speed,
rotations: values.rotations
});
};
const getSummaryValue = (stats, type) => {
return stats.find(s => s.getType() === type).getValue();
};
describe('Sum Aggregations', () => {
it('should sum Moving Time', () => {
const a1 = createMockActivity({ [data_moving_time_1.DataMovingTime.type]: new data_moving_time_1.DataMovingTime(100) });
const a2 = createMockActivity({ [data_moving_time_1.DataMovingTime.type]: new data_moving_time_1.DataMovingTime(200) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_moving_time_1.DataMovingTime.type).getValue()).toBe(300);
});
it('should sum Total Grit', () => {
const a1 = createMockActivity({ [data_total_grit_1.DataTotalGrit.type]: new data_total_grit_1.DataTotalGrit(50) });
const a2 = createMockActivity({ [data_total_grit_1.DataTotalGrit.type]: new data_total_grit_1.DataTotalGrit(60) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_total_grit_1.DataTotalGrit.type).getValue()).toBe(110);
});
it('should sum Total Flow', () => {
const a1 = createMockActivity({ [data_total_flow_1.DataTotalFlow.type]: new data_total_flow_1.DataTotalFlow(10) });
const a2 = createMockActivity({ [data_total_flow_1.DataTotalFlow.type]: new data_total_flow_1.DataTotalFlow(20) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_total_flow_1.DataTotalFlow.type).getValue()).toBe(30);
});
it('should sum Jump Count', () => {
const a1 = createMockActivity({ [data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(5) });
const a2 = createMockActivity({ [data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(3) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_jump_count_1.DataJumpCount.type).getValue()).toBe(8);
});
it('should handle missing values in sum', () => {
const a1 = createMockActivity({ [data_moving_time_1.DataMovingTime.type]: new data_moving_time_1.DataMovingTime(100) });
const a2 = createMockActivity({}); // Missing
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_moving_time_1.DataMovingTime.type).getValue()).toBe(100);
});
});
describe('Jump Aggregations', () => {
it('recomputes jump min/max/avg from raw jump events for all families', () => {
const a1 = createMockActivity({
[data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(10),
[data_jump_stats_1.DataJumpDistanceAvg.type]: new data_jump_stats_1.DataJumpDistanceAvg(999)
}, [
createJumpEvent(1, { distance: 2, hang_time: 0.4, speed: 6, rotations: 1, score: 50, height: 0.8 }),
createJumpEvent(2, { distance: 4, hang_time: 0.6, speed: 8, rotations: 0, score: 70, height: 1.2 })
]);
const a2 = createMockActivity({
[data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(1),
[data_jump_stats_1.DataJumpDistanceAvg.type]: new data_jump_stats_1.DataJumpDistanceAvg(123)
}, [createJumpEvent(3, { distance: 3, hang_time: 0.5, speed: 7, rotations: 2, score: 80, height: 1 })]);
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceMin.type)).toBe(2);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceMax.type)).toBe(4);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceAvg.type)).toBeCloseTo(3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeMin.type)).toBeCloseTo(0.4, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeMax.type)).toBeCloseTo(0.6, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeAvg.type)).toBeCloseTo(0.5, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedMin.type)).toBe(6);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedMax.type)).toBe(8);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedAvg.type)).toBeCloseTo(7, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsMin.type)).toBe(0);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsMax.type)).toBe(2);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsAvg.type)).toBeCloseTo(1, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreMin.type)).toBe(50);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreMax.type)).toBe(80);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreAvg.type)).toBeCloseTo(200 / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightMin.type)).toBeCloseTo(0.8, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightMax.type)).toBeCloseTo(1.2, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightAvg.type)).toBeCloseTo(1, 10);
});
it('falls back to activity jump stats and weights averages by jump count', () => {
const a1 = createMockActivity({
[data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(2),
[data_jump_stats_1.DataJumpDistanceMin.type]: new data_jump_stats_1.DataJumpDistanceMin(2),
[data_jump_stats_1.DataJumpDistanceMax.type]: new data_jump_stats_1.DataJumpDistanceMax(4),
[data_jump_stats_1.DataJumpDistanceAvg.type]: new data_jump_stats_1.DataJumpDistanceAvg(3),
[data_jump_stats_1.DataJumpHangTimeMin.type]: new data_jump_stats_1.DataJumpHangTimeMin(0.3),
[data_jump_stats_1.DataJumpHangTimeMax.type]: new data_jump_stats_1.DataJumpHangTimeMax(0.5),
[data_jump_stats_1.DataJumpHangTimeAvg.type]: new data_jump_stats_1.DataJumpHangTimeAvg(0.4),
[data_jump_stats_1.DataJumpSpeedMin.type]: new data_jump_stats_1.DataJumpSpeedMin(5),
[data_jump_stats_1.DataJumpSpeedMax.type]: new data_jump_stats_1.DataJumpSpeedMax(9),
[data_jump_stats_1.DataJumpSpeedAvg.type]: new data_jump_stats_1.DataJumpSpeedAvg(7),
[data_jump_stats_1.DataJumpRotationsMin.type]: new data_jump_stats_1.DataJumpRotationsMin(0),
[data_jump_stats_1.DataJumpRotationsMax.type]: new data_jump_stats_1.DataJumpRotationsMax(2),
[data_jump_stats_1.DataJumpRotationsAvg.type]: new data_jump_stats_1.DataJumpRotationsAvg(1),
[data_jump_stats_1.DataJumpScoreMin.type]: new data_jump_stats_1.DataJumpScoreMin(40),
[data_jump_stats_1.DataJumpScoreMax.type]: new data_jump_stats_1.DataJumpScoreMax(80),
[data_jump_stats_1.DataJumpScoreAvg.type]: new data_jump_stats_1.DataJumpScoreAvg(60),
[data_jump_stats_1.DataJumpHeightMin.type]: new data_jump_stats_1.DataJumpHeightMin(0.8),
[data_jump_stats_1.DataJumpHeightMax.type]: new data_jump_stats_1.DataJumpHeightMax(1.2),
[data_jump_stats_1.DataJumpHeightAvg.type]: new data_jump_stats_1.DataJumpHeightAvg(1)
});
const a2 = createMockActivity({
[data_jump_count_1.DataJumpCount.type]: new data_jump_count_1.DataJumpCount(1),
[data_jump_stats_1.DataJumpDistanceMin.type]: new data_jump_stats_1.DataJumpDistanceMin(1),
[data_jump_stats_1.DataJumpDistanceMax.type]: new data_jump_stats_1.DataJumpDistanceMax(1),
[data_jump_stats_1.DataJumpDistanceAvg.type]: new data_jump_stats_1.DataJumpDistanceAvg(1),
[data_jump_stats_1.DataJumpHangTimeMin.type]: new data_jump_stats_1.DataJumpHangTimeMin(0.6),
[data_jump_stats_1.DataJumpHangTimeMax.type]: new data_jump_stats_1.DataJumpHangTimeMax(0.6),
[data_jump_stats_1.DataJumpHangTimeAvg.type]: new data_jump_stats_1.DataJumpHangTimeAvg(0.6),
[data_jump_stats_1.DataJumpSpeedMin.type]: new data_jump_stats_1.DataJumpSpeedMin(4),
[data_jump_stats_1.DataJumpSpeedMax.type]: new data_jump_stats_1.DataJumpSpeedMax(4),
[data_jump_stats_1.DataJumpSpeedAvg.type]: new data_jump_stats_1.DataJumpSpeedAvg(4),
[data_jump_stats_1.DataJumpRotationsMin.type]: new data_jump_stats_1.DataJumpRotationsMin(3),
[data_jump_stats_1.DataJumpRotationsMax.type]: new data_jump_stats_1.DataJumpRotationsMax(3),
[data_jump_stats_1.DataJumpRotationsAvg.type]: new data_jump_stats_1.DataJumpRotationsAvg(3),
[data_jump_stats_1.DataJumpScoreMin.type]: new data_jump_stats_1.DataJumpScoreMin(30),
[data_jump_stats_1.DataJumpScoreMax.type]: new data_jump_stats_1.DataJumpScoreMax(30),
[data_jump_stats_1.DataJumpScoreAvg.type]: new data_jump_stats_1.DataJumpScoreAvg(30),
[data_jump_stats_1.DataJumpHeightMin.type]: new data_jump_stats_1.DataJumpHeightMin(0.5),
[data_jump_stats_1.DataJumpHeightMax.type]: new data_jump_stats_1.DataJumpHeightMax(0.5),
[data_jump_stats_1.DataJumpHeightAvg.type]: new data_jump_stats_1.DataJumpHeightAvg(0.5)
});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceMin.type)).toBe(1);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceMax.type)).toBe(4);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpDistanceAvg.type)).toBeCloseTo((3 * 2 + 1 * 1) / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeMin.type)).toBeCloseTo(0.3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeMax.type)).toBeCloseTo(0.6, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeAvg.type)).toBeCloseTo((0.4 * 2 + 0.6 * 1) / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedMin.type)).toBe(4);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedMax.type)).toBe(9);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpSpeedAvg.type)).toBeCloseTo((7 * 2 + 4 * 1) / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsMin.type)).toBe(0);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsMax.type)).toBe(3);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsAvg.type)).toBeCloseTo((1 * 2 + 3 * 1) / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreMin.type)).toBe(30);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreMax.type)).toBe(80);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpScoreAvg.type)).toBeCloseTo((60 * 2 + 30 * 1) / 3, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightMin.type)).toBeCloseTo(0.5, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightMax.type)).toBeCloseTo(1.2, 10);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHeightAvg.type)).toBeCloseTo((1 * 2 + 0.5 * 1) / 3, 10);
});
it('emits zero jump averages when effective sample count is greater than zero', () => {
const a1 = createMockActivity({}, [createJumpEvent(1, { distance: 2, score: 40, rotations: 0, hang_time: 0 })]);
const a2 = createMockActivity({}, [createJumpEvent(2, { distance: 3, score: 50, rotations: 0, hang_time: 0 })]);
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpRotationsAvg.type)).toBe(0);
expect(getSummaryValue(stats, data_jump_stats_1.DataJumpHangTimeAvg.type)).toBe(0);
});
});
describe('Max Aggregations', () => {
it('should find Max Heart Rate', () => {
const a1 = createMockActivity({ [data_heart_rate_max_1.DataHeartRateMax.type]: new data_heart_rate_max_1.DataHeartRateMax(180) });
const a2 = createMockActivity({ [data_heart_rate_max_1.DataHeartRateMax.type]: new data_heart_rate_max_1.DataHeartRateMax(190) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_heart_rate_max_1.DataHeartRateMax.type).getValue()).toBe(190);
});
it('should find Max Power', () => {
const a1 = createMockActivity({ [data_power_max_1.DataPowerMax.type]: new data_power_max_1.DataPowerMax(300) });
const a2 = createMockActivity({ [data_power_max_1.DataPowerMax.type]: new data_power_max_1.DataPowerMax(400) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_power_max_1.DataPowerMax.type).getValue()).toBe(400);
});
it('should find Max Speed', () => {
const a1 = createMockActivity({ [data_speed_max_1.DataSpeedMax.type]: new data_speed_max_1.DataSpeedMax(30) });
const a2 = createMockActivity({ [data_speed_max_1.DataSpeedMax.type]: new data_speed_max_1.DataSpeedMax(40) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_speed_max_1.DataSpeedMax.type).getValue()).toBe(40);
});
it('should find Max Cadence', () => {
const a1 = createMockActivity({ [data_cadence_max_1.DataCadenceMax.type]: new data_cadence_max_1.DataCadenceMax(90) });
const a2 = createMockActivity({ [data_cadence_max_1.DataCadenceMax.type]: new data_cadence_max_1.DataCadenceMax(100) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_cadence_max_1.DataCadenceMax.type).getValue()).toBe(100);
});
it('should find Max Altitude', () => {
const a1 = createMockActivity({ [data_altitude_max_1.DataAltitudeMax.type]: new data_altitude_max_1.DataAltitudeMax(1000) });
const a2 = createMockActivity({ [data_altitude_max_1.DataAltitudeMax.type]: new data_altitude_max_1.DataAltitudeMax(1500) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_altitude_max_1.DataAltitudeMax.type).getValue()).toBe(1500);
});
it('should find Max Temperature', () => {
const a1 = createMockActivity({ [data_temperature_max_1.DataTemperatureMax.type]: new data_temperature_max_1.DataTemperatureMax(25) });
const a2 = createMockActivity({ [data_temperature_max_1.DataTemperatureMax.type]: new data_temperature_max_1.DataTemperatureMax(30) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_temperature_max_1.DataTemperatureMax.type).getValue()).toBe(30);
});
it('should find Max Air Power', () => {
const a1 = createMockActivity({ [data_air_power_max_1.DataAirPowerMax.type]: new data_air_power_max_1.DataAirPowerMax(120) });
const a2 = createMockActivity({ [data_air_power_max_1.DataAirPowerMax.type]: new data_air_power_max_1.DataAirPowerMax(140) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_air_power_max_1.DataAirPowerMax.type).getValue()).toBe(140);
});
it('should find Max Vertical Speed', () => {
const a1 = createMockActivity({ [data_vertical_speed_max_1.DataVerticalSpeedMax.type]: new data_vertical_speed_max_1.DataVerticalSpeedMax(2.8) });
const a2 = createMockActivity({ [data_vertical_speed_max_1.DataVerticalSpeedMax.type]: new data_vertical_speed_max_1.DataVerticalSpeedMax(3.1) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_speed_max_1.DataVerticalSpeedMax.type).getValue()).toBe(3.1);
});
it('should find Max Ground Contact Time', () => {
const a1 = createMockActivity({ [data_ground_contact_time_max_1.DataGroundContactTimeMax.type]: new data_ground_contact_time_max_1.DataGroundContactTimeMax(280) });
const a2 = createMockActivity({ [data_ground_contact_time_max_1.DataGroundContactTimeMax.type]: new data_ground_contact_time_max_1.DataGroundContactTimeMax(320) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ground_contact_time_max_1.DataGroundContactTimeMax.type).getValue()).toBe(320);
});
it('should find Max Vertical Oscillation', () => {
const a1 = createMockActivity({ [data_vertical_oscillation_max_1.DataVerticalOscillationMax.type]: new data_vertical_oscillation_max_1.DataVerticalOscillationMax(8) });
const a2 = createMockActivity({ [data_vertical_oscillation_max_1.DataVerticalOscillationMax.type]: new data_vertical_oscillation_max_1.DataVerticalOscillationMax(10) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_oscillation_max_1.DataVerticalOscillationMax.type).getValue()).toBe(10);
});
it('should find Max Pace', () => {
const a1 = createMockActivity({ [data_pace_max_1.DataPaceMax.type]: new data_pace_max_1.DataPaceMax(250) });
const a2 = createMockActivity({ [data_pace_max_1.DataPaceMax.type]: new data_pace_max_1.DataPaceMax(260) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_pace_max_1.DataPaceMax.type).getValue()).toBe(260);
});
it('should find Max Grade Adjusted Pace', () => {
const a1 = createMockActivity({ [data_grade_adjusted_pace_max_1.DataGradeAdjustedPaceMax.type]: new data_grade_adjusted_pace_max_1.DataGradeAdjustedPaceMax(240) });
const a2 = createMockActivity({ [data_grade_adjusted_pace_max_1.DataGradeAdjustedPaceMax.type]: new data_grade_adjusted_pace_max_1.DataGradeAdjustedPaceMax(265) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_grade_adjusted_pace_max_1.DataGradeAdjustedPaceMax.type).getValue()).toBe(265);
});
it('should find Max Swim Pace', () => {
const a1 = createMockActivity({ [data_swim_pace_max_1.DataSwimPaceMax.type]: new data_swim_pace_max_1.DataSwimPaceMax(130) });
const a2 = createMockActivity({ [data_swim_pace_max_1.DataSwimPaceMax.type]: new data_swim_pace_max_1.DataSwimPaceMax(145) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_swim_pace_max_1.DataSwimPaceMax.type).getValue()).toBe(145);
});
it('should find Max Grade Adjusted Speed', () => {
const a1 = createMockActivity({ [data_grade_adjusted_speed_max_1.DataGradeAdjustedSpeedMax.type]: new data_grade_adjusted_speed_max_1.DataGradeAdjustedSpeedMax(4.5) });
const a2 = createMockActivity({ [data_grade_adjusted_speed_max_1.DataGradeAdjustedSpeedMax.type]: new data_grade_adjusted_speed_max_1.DataGradeAdjustedSpeedMax(5.1) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_grade_adjusted_speed_max_1.DataGradeAdjustedSpeedMax.type).getValue()).toBe(5.1);
});
it('should find Max Leg Stiffness', () => {
const a1 = createMockActivity({ [data_leg_stiffness_max_1.DataLegStiffnessMax.type]: new data_leg_stiffness_max_1.DataLegStiffnessMax(8.8) });
const a2 = createMockActivity({ [data_leg_stiffness_max_1.DataLegStiffnessMax.type]: new data_leg_stiffness_max_1.DataLegStiffnessMax(9.2) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_leg_stiffness_max_1.DataLegStiffnessMax.type).getValue()).toBe(9.2);
});
it('should find Max Vertical Ratio', () => {
const a1 = createMockActivity({ [data_vertical_ratio_max_1.DataVerticalRatioMax.type]: new data_vertical_ratio_max_1.DataVerticalRatioMax(8.2) });
const a2 = createMockActivity({ [data_vertical_ratio_max_1.DataVerticalRatioMax.type]: new data_vertical_ratio_max_1.DataVerticalRatioMax(9.1) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_ratio_max_1.DataVerticalRatioMax.type).getValue()).toBe(9.1);
});
it('should find Max EVPE', () => {
const a1 = createMockActivity({ [data_evpe_max_1.DataEVPEMax.type]: new data_evpe_max_1.DataEVPEMax(4.1) });
const a2 = createMockActivity({ [data_evpe_max_1.DataEVPEMax.type]: new data_evpe_max_1.DataEVPEMax(5.4) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_evpe_max_1.DataEVPEMax.type).getValue()).toBe(5.4);
});
it('should find Max EHPE', () => {
const a1 = createMockActivity({ [data_ehpe_max_1.DataEHPEMax.type]: new data_ehpe_max_1.DataEHPEMax(3.7) });
const a2 = createMockActivity({ [data_ehpe_max_1.DataEHPEMax.type]: new data_ehpe_max_1.DataEHPEMax(4.2) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ehpe_max_1.DataEHPEMax.type).getValue()).toBe(4.2);
});
it('should find Max Satellite 5 Best SNR', () => {
const a1 = createMockActivity({ [data_satellite_5_best_snr_max_1.DataSatellite5BestSNRMax.type]: new data_satellite_5_best_snr_max_1.DataSatellite5BestSNRMax(32.5) });
const a2 = createMockActivity({ [data_satellite_5_best_snr_max_1.DataSatellite5BestSNRMax.type]: new data_satellite_5_best_snr_max_1.DataSatellite5BestSNRMax(34.2) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_satellite_5_best_snr_max_1.DataSatellite5BestSNRMax.type).getValue()).toBe(34.2);
});
it('should find Max Number of Satellites', () => {
const a1 = createMockActivity({ [data_number_of_satellites_max_1.DataNumberOfSatellitesMax.type]: new data_number_of_satellites_max_1.DataNumberOfSatellitesMax(9) });
const a2 = createMockActivity({ [data_number_of_satellites_max_1.DataNumberOfSatellitesMax.type]: new data_number_of_satellites_max_1.DataNumberOfSatellitesMax(11) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_number_of_satellites_max_1.DataNumberOfSatellitesMax.type).getValue()).toBe(11);
});
it('should handle missing values in max', () => {
const a1 = createMockActivity({ [data_heart_rate_max_1.DataHeartRateMax.type]: new data_heart_rate_max_1.DataHeartRateMax(180) });
const a2 = createMockActivity({});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_heart_rate_max_1.DataHeartRateMax.type).getValue()).toBe(180);
});
it('should handle missing values in max VO2', () => {
const a1 = createMockActivity({ [data_vo2_max_1.DataVO2Max.type]: new data_vo2_max_1.DataVO2Max(50) });
const a2 = createMockActivity({});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vo2_max_1.DataVO2Max.type).getValue()).toBe(50);
});
it('should find Max VO2 Max', () => {
const a1 = createMockActivity({ [data_vo2_max_1.DataVO2Max.type]: new data_vo2_max_1.DataVO2Max(50) });
const a2 = createMockActivity({ [data_vo2_max_1.DataVO2Max.type]: new data_vo2_max_1.DataVO2Max(60) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vo2_max_1.DataVO2Max.type).getValue()).toBe(60);
});
});
describe('Min Aggregations', () => {
it('should find Min Heart Rate', () => {
const a1 = createMockActivity({ [data_heart_rate_min_1.DataHeartRateMin.type]: new data_heart_rate_min_1.DataHeartRateMin(50) });
const a2 = createMockActivity({ [data_heart_rate_min_1.DataHeartRateMin.type]: new data_heart_rate_min_1.DataHeartRateMin(45) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_heart_rate_min_1.DataHeartRateMin.type).getValue()).toBe(45);
});
it('should find Min Power', () => {
const a1 = createMockActivity({ [data_power_min_1.DataPowerMin.type]: new data_power_min_1.DataPowerMin(100) });
const a2 = createMockActivity({ [data_power_min_1.DataPowerMin.type]: new data_power_min_1.DataPowerMin(0) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_power_min_1.DataPowerMin.type).getValue()).toBe(0);
});
it('should find Min Speed', () => {
const a1 = createMockActivity({ [data_speed_min_1.DataSpeedMin.type]: new data_speed_min_1.DataSpeedMin(10) });
const a2 = createMockActivity({ [data_speed_min_1.DataSpeedMin.type]: new data_speed_min_1.DataSpeedMin(5) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_speed_min_1.DataSpeedMin.type).getValue()).toBe(5);
});
it('should find Min Cadence', () => {
const a1 = createMockActivity({ [data_cadence_min_1.DataCadenceMin.type]: new data_cadence_min_1.DataCadenceMin(60) });
const a2 = createMockActivity({ [data_cadence_min_1.DataCadenceMin.type]: new data_cadence_min_1.DataCadenceMin(50) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_cadence_min_1.DataCadenceMin.type).getValue()).toBe(50);
});
it('should find Min Altitude', () => {
const a1 = createMockActivity({ [data_altitude_min_1.DataAltitudeMin.type]: new data_altitude_min_1.DataAltitudeMin(100) });
const a2 = createMockActivity({ [data_altitude_min_1.DataAltitudeMin.type]: new data_altitude_min_1.DataAltitudeMin(-10) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_altitude_min_1.DataAltitudeMin.type).getValue()).toBe(-10);
});
it('should handle missing values in min', () => {
const a1 = createMockActivity({ [data_heart_rate_min_1.DataHeartRateMin.type]: new data_heart_rate_min_1.DataHeartRateMin(50) });
const a2 = createMockActivity({});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_heart_rate_min_1.DataHeartRateMin.type).getValue()).toBe(50);
});
it('should find Min Temperature', () => {
const a1 = createMockActivity({ [data_temperature_min_1.DataTemperatureMin.type]: new data_temperature_min_1.DataTemperatureMin(14) });
const a2 = createMockActivity({ [data_temperature_min_1.DataTemperatureMin.type]: new data_temperature_min_1.DataTemperatureMin(10) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_temperature_min_1.DataTemperatureMin.type).getValue()).toBe(10);
});
it('should find Min Air Power', () => {
const a1 = createMockActivity({ [data_air_power_min_1.DataAirPowerMin.type]: new data_air_power_min_1.DataAirPowerMin(80) });
const a2 = createMockActivity({ [data_air_power_min_1.DataAirPowerMin.type]: new data_air_power_min_1.DataAirPowerMin(72) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_air_power_min_1.DataAirPowerMin.type).getValue()).toBe(72);
});
it('should find Min Vertical Speed', () => {
const a1 = createMockActivity({ [data_vertical_speed_min_1.DataVerticalSpeedMin.type]: new data_vertical_speed_min_1.DataVerticalSpeedMin(-1.8) });
const a2 = createMockActivity({ [data_vertical_speed_min_1.DataVerticalSpeedMin.type]: new data_vertical_speed_min_1.DataVerticalSpeedMin(-2.4) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_speed_min_1.DataVerticalSpeedMin.type).getValue()).toBe(-2.4);
});
it('should find Min Ground Contact Time', () => {
const a1 = createMockActivity({ [data_ground_contact_time_min_1.DataGroundContactTimeMin.type]: new data_ground_contact_time_min_1.DataGroundContactTimeMin(260) });
const a2 = createMockActivity({ [data_ground_contact_time_min_1.DataGroundContactTimeMin.type]: new data_ground_contact_time_min_1.DataGroundContactTimeMin(240) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ground_contact_time_min_1.DataGroundContactTimeMin.type).getValue()).toBe(240);
});
it('should find Min Vertical Oscillation', () => {
const a1 = createMockActivity({ [data_vertical_oscillation_min_1.DataVerticalOscillationMin.type]: new data_vertical_oscillation_min_1.DataVerticalOscillationMin(6) });
const a2 = createMockActivity({ [data_vertical_oscillation_min_1.DataVerticalOscillationMin.type]: new data_vertical_oscillation_min_1.DataVerticalOscillationMin(5) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_oscillation_min_1.DataVerticalOscillationMin.type).getValue()).toBe(5);
});
it('should find Min Pace', () => {
const a1 = createMockActivity({ [data_pace_min_1.DataPaceMin.type]: new data_pace_min_1.DataPaceMin(320) });
const a2 = createMockActivity({ [data_pace_min_1.DataPaceMin.type]: new data_pace_min_1.DataPaceMin(305) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_pace_min_1.DataPaceMin.type).getValue()).toBe(305);
});
it('should ignore non-finite Min Pace values', () => {
const a1 = createMockActivity({ [data_pace_min_1.DataPaceMin.type]: new data_pace_min_1.DataPaceMin(Infinity) });
const a2 = createMockActivity({ [data_pace_min_1.DataPaceMin.type]: new data_pace_min_1.DataPaceMin(305) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_pace_min_1.DataPaceMin.type).getValue()).toBe(305);
});
it('should find Min Grade Adjusted Pace', () => {
const a1 = createMockActivity({ [data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type]: new data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin(315) });
const a2 = createMockActivity({ [data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type]: new data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin(298) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type).getValue()).toBe(298);
});
it('should ignore non-finite Min Grade Adjusted Pace values', () => {
const a1 = createMockActivity({ [data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type]: new data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin(Infinity) });
const a2 = createMockActivity({ [data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type]: new data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin(298) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_grade_adjusted_pace_min_1.DataGradeAdjustedPaceMin.type).getValue()).toBe(298);
});
it('should find Min Swim Pace', () => {
const a1 = createMockActivity({ [data_swim_pace_min_1.DataSwimPaceMin.type]: new data_swim_pace_min_1.DataSwimPaceMin(125) });
const a2 = createMockActivity({ [data_swim_pace_min_1.DataSwimPaceMin.type]: new data_swim_pace_min_1.DataSwimPaceMin(118) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_swim_pace_min_1.DataSwimPaceMin.type).getValue()).toBe(118);
});
it('should find Min Grade Adjusted Speed', () => {
const a1 = createMockActivity({ [data_grade_adjusted_speed_min_1.DataGradeAdjustedSpeedMin.type]: new data_grade_adjusted_speed_min_1.DataGradeAdjustedSpeedMin(2.7) });
const a2 = createMockActivity({ [data_grade_adjusted_speed_min_1.DataGradeAdjustedSpeedMin.type]: new data_grade_adjusted_speed_min_1.DataGradeAdjustedSpeedMin(2.4) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_grade_adjusted_speed_min_1.DataGradeAdjustedSpeedMin.type).getValue()).toBe(2.4);
});
it('should find Min Leg Stiffness', () => {
const a1 = createMockActivity({ [data_leg_stiffness_min_1.DataLegStiffnessMin.type]: new data_leg_stiffness_min_1.DataLegStiffnessMin(7.5) });
const a2 = createMockActivity({ [data_leg_stiffness_min_1.DataLegStiffnessMin.type]: new data_leg_stiffness_min_1.DataLegStiffnessMin(7.1) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_leg_stiffness_min_1.DataLegStiffnessMin.type).getValue()).toBe(7.1);
});
it('should find Min Vertical Ratio', () => {
const a1 = createMockActivity({ [data_vertical_ratio_min_1.DataVerticalRatioMin.type]: new data_vertical_ratio_min_1.DataVerticalRatioMin(7.8) });
const a2 = createMockActivity({ [data_vertical_ratio_min_1.DataVerticalRatioMin.type]: new data_vertical_ratio_min_1.DataVerticalRatioMin(7.3) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_ratio_min_1.DataVerticalRatioMin.type).getValue()).toBe(7.3);
});
it('should find Min EVPE', () => {
const a1 = createMockActivity({ [data_evpe_min_1.DataEVPEMin.type]: new data_evpe_min_1.DataEVPEMin(4.2) });
const a2 = createMockActivity({ [data_evpe_min_1.DataEVPEMin.type]: new data_evpe_min_1.DataEVPEMin(3.9) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_evpe_min_1.DataEVPEMin.type).getValue()).toBe(3.9);
});
it('should find Min EHPE', () => {
const a1 = createMockActivity({ [data_ehpe_min_1.DataEHPEMin.type]: new data_ehpe_min_1.DataEHPEMin(3.1) });
const a2 = createMockActivity({ [data_ehpe_min_1.DataEHPEMin.type]: new data_ehpe_min_1.DataEHPEMin(3.4) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ehpe_min_1.DataEHPEMin.type).getValue()).toBe(3.1);
});
it('should find Min Satellite 5 Best SNR', () => {
const a1 = createMockActivity({ [data_satellite_5_best_snr_min_1.DataSatellite5BestSNRMin.type]: new data_satellite_5_best_snr_min_1.DataSatellite5BestSNRMin(30.4) });
const a2 = createMockActivity({ [data_satellite_5_best_snr_min_1.DataSatellite5BestSNRMin.type]: new data_satellite_5_best_snr_min_1.DataSatellite5BestSNRMin(31.8) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_satellite_5_best_snr_min_1.DataSatellite5BestSNRMin.type).getValue()).toBe(30.4);
});
it('should find Min Number of Satellites', () => {
const a1 = createMockActivity({ [data_number_of_satellites_min_1.DataNumberOfSatellitesMin.type]: new data_number_of_satellites_min_1.DataNumberOfSatellitesMin(9) });
const a2 = createMockActivity({ [data_number_of_satellites_min_1.DataNumberOfSatellitesMin.type]: new data_number_of_satellites_min_1.DataNumberOfSatellitesMin(8) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_number_of_satellites_min_1.DataNumberOfSatellitesMin.type).getValue()).toBe(8);
});
});
describe('Average Aggregations', () => {
it('should derive and average PowerWattsPerKg from average power and weight', () => {
const a1 = createMockActivity({
[data_power_avg_1.DataPowerAvg.type]: new data_power_avg_1.DataPowerAvg(280),
[data_weight_1.DataWeight.type]: new data_weight_1.DataWeight(70)
});
const a2 = createMockActivity({
[data_power_avg_1.DataPowerAvg.type]: new data_power_avg_1.DataPowerAvg(350),
[data_weight_1.DataWeight.type]: new data_weight_1.DataWeight(70)
});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_power_watts_per_kg_1.DataPowerWattsPerKg.type).getValue()).toBe(4.5);
});
it('should prefer existing PowerWattsPerKg stats when available', () => {
const a1 = createMockActivity({
[data_power_avg_1.DataPowerAvg.type]: new data_power_avg_1.DataPowerAvg(100),
[data_weight_1.DataWeight.type]: new data_weight_1.DataWeight(100),
[data_power_watts_per_kg_1.DataPowerWattsPerKg.type]: new data_power_watts_per_kg_1.DataPowerWattsPerKg(4.2)
});
const a2 = createMockActivity({
[data_power_avg_1.DataPowerAvg.type]: new data_power_avg_1.DataPowerAvg(100),
[data_weight_1.DataWeight.type]: new data_weight_1.DataWeight(100),
[data_power_watts_per_kg_1.DataPowerWattsPerKg.type]: new data_power_watts_per_kg_1.DataPowerWattsPerKg(4.8)
});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_power_watts_per_kg_1.DataPowerWattsPerKg.type).getValue()).toBe(4.5);
});
it('should average Air Power', () => {
const a1 = createMockActivity({ [data_air_power_avg_1.DataAirPowerAvg.type]: new data_air_power_avg_1.DataAirPowerAvg(90) });
const a2 = createMockActivity({ [data_air_power_avg_1.DataAirPowerAvg.type]: new data_air_power_avg_1.DataAirPowerAvg(110) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_air_power_avg_1.DataAirPowerAvg.type).getValue()).toBe(100);
});
it('should average Vertical Speed', () => {
const a1 = createMockActivity({ [data_vertical_speed_avg_1.DataVerticalSpeedAvg.type]: new data_vertical_speed_avg_1.DataVerticalSpeedAvg(0.4) });
const a2 = createMockActivity({ [data_vertical_speed_avg_1.DataVerticalSpeedAvg.type]: new data_vertical_speed_avg_1.DataVerticalSpeedAvg(0.8) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_speed_avg_1.DataVerticalSpeedAvg.type).getValue()).toBeCloseTo(0.6, 5);
});
it('should average Altitude', () => {
const a1 = createMockActivity({ [data_altitude_avg_1.DataAltitudeAvg.type]: new data_altitude_avg_1.DataAltitudeAvg(1000) });
const a2 = createMockActivity({ [data_altitude_avg_1.DataAltitudeAvg.type]: new data_altitude_avg_1.DataAltitudeAvg(1200) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_altitude_avg_1.DataAltitudeAvg.type).getValue()).toBe(1100);
});
it('should average Leg Stiffness', () => {
const a1 = createMockActivity({ [data_leg_stiffness_avg_1.DataLegStiffnessAvg.type]: new data_leg_stiffness_avg_1.DataLegStiffnessAvg(8.2) });
const a2 = createMockActivity({ [data_leg_stiffness_avg_1.DataLegStiffnessAvg.type]: new data_leg_stiffness_avg_1.DataLegStiffnessAvg(8.8) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_leg_stiffness_avg_1.DataLegStiffnessAvg.type).getValue()).toBe(8.5);
});
it('should average Vertical Ratio', () => {
const a1 = createMockActivity({ [data_vertical_ratio_avg_1.DataVerticalRatioAvg.type]: new data_vertical_ratio_avg_1.DataVerticalRatioAvg(8.1) });
const a2 = createMockActivity({ [data_vertical_ratio_avg_1.DataVerticalRatioAvg.type]: new data_vertical_ratio_avg_1.DataVerticalRatioAvg(8.5) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_ratio_avg_1.DataVerticalRatioAvg.type).getValue()).toBe(8.3);
});
it('should average EVPE', () => {
const a1 = createMockActivity({ [data_evpe_avg_1.DataEVPEAvg.type]: new data_evpe_avg_1.DataEVPEAvg(4.4) });
const a2 = createMockActivity({ [data_evpe_avg_1.DataEVPEAvg.type]: new data_evpe_avg_1.DataEVPEAvg(4.8) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_evpe_avg_1.DataEVPEAvg.type).getValue()).toBe(4.6);
});
it('should average EHPE', () => {
const a1 = createMockActivity({ [data_ehpe_avg_1.DataEHPEAvg.type]: new data_ehpe_avg_1.DataEHPEAvg(3.5) });
const a2 = createMockActivity({ [data_ehpe_avg_1.DataEHPEAvg.type]: new data_ehpe_avg_1.DataEHPEAvg(4.1) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ehpe_avg_1.DataEHPEAvg.type).getValue()).toBe(3.8);
});
it('should average Satellite 5 Best SNR', () => {
const a1 = createMockActivity({ [data_satellite_5_best_snr_avg_1.DataSatellite5BestSNRAvg.type]: new data_satellite_5_best_snr_avg_1.DataSatellite5BestSNRAvg(31.2) });
const a2 = createMockActivity({ [data_satellite_5_best_snr_avg_1.DataSatellite5BestSNRAvg.type]: new data_satellite_5_best_snr_avg_1.DataSatellite5BestSNRAvg(33.2) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_satellite_5_best_snr_avg_1.DataSatellite5BestSNRAvg.type).getValue()).toBe(32.2);
});
it('should average Number of Satellites', () => {
const a1 = createMockActivity({ [data_number_of_satellites_avg_1.DataNumberOfSatellitesAvg.type]: new data_number_of_satellites_avg_1.DataNumberOfSatellitesAvg(9) });
const a2 = createMockActivity({ [data_number_of_satellites_avg_1.DataNumberOfSatellitesAvg.type]: new data_number_of_satellites_avg_1.DataNumberOfSatellitesAvg(11) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_number_of_satellites_avg_1.DataNumberOfSatellitesAvg.type).getValue()).toBe(10);
});
it('should average Ground Contact Time', () => {
const a1 = createMockActivity({ [data_ground_contact_time_avg_1.DataGroundContactTimeAvg.type]: new data_ground_contact_time_avg_1.DataGroundContactTimeAvg(250) });
const a2 = createMockActivity({ [data_ground_contact_time_avg_1.DataGroundContactTimeAvg.type]: new data_ground_contact_time_avg_1.DataGroundContactTimeAvg(300) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_ground_contact_time_avg_1.DataGroundContactTimeAvg.type).getValue()).toBe(275);
});
it('should average Vertical Oscillation', () => {
const a1 = createMockActivity({ [data_vertical_oscillation_avg_1.DataVerticalOscillationAvg.type]: new data_vertical_oscillation_avg_1.DataVerticalOscillationAvg(10) });
const a2 = createMockActivity({ [data_vertical_oscillation_avg_1.DataVerticalOscillationAvg.type]: new data_vertical_oscillation_avg_1.DataVerticalOscillationAvg(12) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
expect(stats.find(s => s.getType() === data_vertical_oscillation_avg_1.DataVerticalOscillationAvg.type).getValue()).toBe(11);
});
it('should keep Vertical Oscillation average when value is zero', () => {
const a1 = createMockActivity({ [data_vertical_oscillation_avg_1.DataVerticalOscillationAvg.type]: new data_vertical_oscillation_avg_1.DataVerticalOscillationAvg(0) });
const a2 = createMockActivity({});
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
const verticalOscillation = stats.find(s => s.getType() === data_vertical_oscillation_avg_1.DataVerticalOscillationAvg.type);
expect(verticalOscillation).toBeDefined();
expect(verticalOscillation === null || verticalOscillation === void 0 ? void 0 : verticalOscillation.getValue()).toBe(0);
});
it('should correctly aggregate RPE (Subjective)', () => {
const a1 = createMockActivity({ [data_rpe_1.DataRPE.type]: new data_rpe_1.DataRPE(5) });
const a2 = createMockActivity({ [data_rpe_1.DataRPE.type]: new data_rpe_1.DataRPE(7) });
const stats = activity_utilities_1.ActivityUtilities.getSummaryStatsForActivities([a1, a2]);
// (5 + 7) / 2 = 6, ceil(6) = 6
expect(stats.find(s => s.getType() === data_rpe_1.DataRPE.type).getValue()).toBe(6);
});
it('should handle missing values in average', () => { });
});
});
});