From 825cf388b55a6c8441e02149749bb6e2968477c0 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Thu, 27 Aug 2026 11:21:17 +0200 Subject: 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. --- ride/difficulty_example_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ride/difficulty_example_test.go (limited to 'ride/difficulty_example_test.go') diff --git a/ride/difficulty_example_test.go b/ride/difficulty_example_test.go new file mode 100644 index 0000000..bd87f58 --- /dev/null +++ b/ride/difficulty_example_test.go @@ -0,0 +1,25 @@ +package ride_test + +import ( + "testing" + + "github.com/martinlehoux/biking_home/climb" + "github.com/martinlehoux/biking_home/ride" + "github.com/stretchr/testify/assert" +) + +func TestCotacolExampleRide(t *testing.T) { + r, err := ride.ParseFile(parser, "../examples/2022-07-21.Pogacar.gpx") + assert.NoError(t, err) + assert.InDelta(t, 3049.0, climb.Cotacol(r.Distances, r.Elevations), 1) +} + +func TestCotacolHautacamClimbfinderReference(t *testing.T) { + r, err := ride.ParseFile(parser, "../examples/2022-07-21.Pogacar.gpx") + assert.NoError(t, err) + detected := climb.Detect(r.Route, nil, climb.ClimbSlopeMinimum) + assert.Len(t, detected, 6) + hautacam := detected[5].Climb + assert.InDelta(t, 128.6, hautacam.Distances[0]/1000, 0.1) + assert.InDelta(t, 930.0, hautacam.DifficultyScore(), 10) +} -- cgit v1.3