package ride_test import ( "fmt" "strings" "testing" "time" "github.com/martinlehoux/biking_home/ride" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func gpxWithPoints(t *testing.T, points string) ride.Ride { t.Helper() data := parserTestGPXPrefix + points + parserTestGPXSuffix parsed, err := (ride.GPXRideParser{}).Parse(strings.NewReader(data)) require.NoError(t, err) return parsed } func trackPoint(lat, lon string, timestamp string) string { return `` + `100` + `` + `` } func metricTrackPoint(lat, lon, timestamp string, cadence, power int) string { return `` + `100` + `` + `` + `` + fmt.Sprint(cadence) + `` + `` + fmt.Sprint(power) + `` + `` + `` } func TestMovingTimeCountsSteadyRiding(t *testing.T) { parsed := gpxWithPoints(t, trackPoint("43.0", "5.0", "2026-01-01T10:00:00Z")+ trackPoint("43.009", "5.0", "2026-01-01T10:01:00Z")+ trackPoint("43.018", "5.0", "2026-01-01T10:02:00Z"), ) assert.Equal(t, 2*time.Minute, ride.MovingTime(parsed)) } func TestMovingTimeExcludesSlowInterval(t *testing.T) { parsed := gpxWithPoints(t, trackPoint("43.0", "5.0", "2026-01-01T10:00:00Z")+ trackPoint("43.0005", "5.0", "2026-01-01T10:10:00Z")+ trackPoint("43.009", "5.0", "2026-01-01T10:12:00Z"), ) assert.Equal(t, 2*time.Minute, ride.MovingTime(parsed)) } func TestMovingTimeExcludesLunchBreak(t *testing.T) { parsed := gpxWithPoints(t, trackPoint("43.0", "5.0", "2026-01-01T10:00:00Z")+ trackPoint("43.0001", "5.0", "2026-01-01T10:30:00Z")+ trackPoint("43.009", "5.0", "2026-01-01T10:31:00Z"), ) assert.Equal(t, time.Minute, ride.MovingTime(parsed)) } func TestMovingTimeCountsEffortMetricsWhenGPSSpeedIsLow(t *testing.T) { data := parserTestGPXMetricsPrefix + metricTrackPoint("43.0", "5.0", "2026-01-01T10:00:00Z", 0, 0) + metricTrackPoint("43.000001", "5.0", "2026-01-01T10:01:00Z", 80, 0) + metricTrackPoint("43.000002", "5.0", "2026-01-01T10:02:00Z", 0, 50) + metricTrackPoint("43.000003", "5.0", "2026-01-01T10:03:00Z", 0, 10) + metricTrackPoint("43.000004", "5.0", "2026-01-01T10:04:00Z", 0, 0) + parserTestGPXSuffix parsed, err := (ride.GPXRideParser{}).Parse(strings.NewReader(data)) require.NoError(t, err) assert.Equal(t, 2*time.Minute, ride.MovingTime(parsed)) } func TestMovingTimeWithoutTimestamps(t *testing.T) { data := parserTestGPXPrefix + `100` + `100` + parserTestGPXSuffix parsed, err := (ride.GPXRideParser{}).Parse(strings.NewReader(data)) require.NoError(t, err) assert.Equal(t, time.Duration(0), ride.MovingTime(parsed)) } func TestMovingTimeAlgorithmVersion(t *testing.T) { assert.Equal(t, "v2", ride.MovingTimeAlgorithmVersion) }