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

625 lines 57.5 kB
"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', () => { });
        });
    });
});