aboutsummaryrefslogtreecommitdiff
path: root/ride/ecs_test.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-27 11:21:17 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-27 11:21:17 +0200
commit825cf388b55a6c8441e02149749bb6e2968477c0 (patch)
treee3394cef97aa43df9775a1465d3c99f386ce3a9b /ride/ecs_test.go
parent366e7b0d671395c2ad32f85ee7706a592db69d15 (diff)
Extract climb detection into a dedicated climb package
Move climb detection, slope, and Cotacol scoring out of ride into a new climb package that operates on a geometry-only Route (distances, elevations, coords). Ride embeds climb.Route and keeps its timing and telemetry columns. - climb.Detect returns []DetectedClimb (Climb + ride-absolute Start). - Climb owns its sliced geometry; indices are local, with Start reported at the detection boundary for absolute position. - Detected bounds use core.Interval; freeRegions claim suppression fixed. - ride no longer builds slices: ClimbFromDist/ClimbFromIndexes/climbFrom and ride.Climb/Interval/Range are removed; rideanalysis, mountain_pass MatchClimb, and web views are rewired to climb types. - New internal/routetest builds climb.Route from the ride DSL; ridetest reuses it and adds timestamps and telemetry. - Tests moved to climb (synthetic detection and difficulty) and kept in ride for GPX-example integration; ride.comparison detection coverage retained. - mountain_pass.nearestCrossing now reuses geo.Nearest.
Diffstat (limited to 'ride/ecs_test.go')
-rw-r--r--ride/ecs_test.go43
1 files changed, 0 insertions, 43 deletions
diff --git a/ride/ecs_test.go b/ride/ecs_test.go
deleted file mode 100644
index 01c0628..0000000
--- a/ride/ecs_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package ride
-
-import (
- "testing"
- "time"
-
- "github.com/jftuga/geodist"
- "github.com/stretchr/testify/assert"
-)
-
-func TestRideExposesComponentGetters(t *testing.T) {
- distances := []float64{0, 500, 1000}
- elevations := []float64{0, 35, 70}
- coords := []geodist.Coord{{Lat: 43.0, Lon: 5.0}, {Lat: 43.1, Lon: 5.1}, {Lat: 43.2, Lon: 5.2}}
- timestamps := []time.Time{{}, time.Time{}.Add(time.Second), time.Time{}.Add(2 * time.Second)}
-
- r := FromColumns(distances, elevations, coords, timestamps)
-
- assert.Equal(t, distances, r.Distances())
- assert.Equal(t, elevations, r.Elevations())
- assert.Equal(t, coords, r.Coords())
- assert.Equal(t, timestamps, r.Timestamps())
-
- powers, ok := r.Powers()
- assert.False(t, ok, "no power component present")
- assert.Nil(t, powers)
- cadences, ok := r.Cadences()
- assert.False(t, ok, "no cadence component present")
- assert.Nil(t, cadences)
-}
-
-func TestDifficultyScoreReadsOnlyDistanceAndElevationComponents(t *testing.T) {
- // A 1 km climb at a steady 7%, sampled every 100 m.
- distances := make([]float64, 0, 11)
- elevations := make([]float64, 0, 11)
- for i := 0; i <= 10; i++ {
- distances = append(distances, float64(i*100))
- elevations = append(elevations, float64(i*7))
- }
-
- // Reference Cotacol value: 10 segments of 100 m at 7% => 49 pts.
- assert.InDelta(t, 49, difficultyScore(distances, elevations, 0, len(distances)-1), 0.5)
-}