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. --- web/server_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'web/server_test.go') diff --git a/web/server_test.go b/web/server_test.go index 6a1c13f..a60d742 100644 --- a/web/server_test.go +++ b/web/server_test.go @@ -15,6 +15,7 @@ import ( "time" "github.com/jftuga/geodist" + "github.com/martinlehoux/biking_home/climb" "github.com/martinlehoux/biking_home/config" "github.com/martinlehoux/biking_home/internal/dbtest" "github.com/martinlehoux/biking_home/internal/ridetest" @@ -225,8 +226,8 @@ func TestBuildRideProfileIncludesOfficialClimbMatch(t *testing.T) { profile := buildRideProfile(parsed, nil, []official_climb.OfficialClimb{{ ID: 42, Name: "Col de Test", - StartCoord: parsed.Coords()[0], - EndCoord: parsed.Coords()[1], + StartCoord: parsed.Coords[0], + EndCoord: parsed.Coords[1], }}, official_climb.DefaultMatchPolicy()) require.Len(t, profile.Climbs, 1) @@ -242,8 +243,8 @@ func TestBuildRideProfileUsesOfficialClimbBoundaries(t *testing.T) { profile := buildRideProfile(parsed, nil, []official_climb.OfficialClimb{{ ID: 42, Name: "Col de Test", - StartCoord: parsed.Coords()[0], - EndCoord: parsed.Coords()[2], + StartCoord: parsed.Coords[0], + EndCoord: parsed.Coords[2], }}, official_climb.DefaultMatchPolicy()) require.Len(t, profile.Climbs, 1) @@ -370,7 +371,7 @@ func TestHandlerRendersAnalyticsChart(t *testing.T) { SET cotacol_score = CASE external_id WHEN ? THEN 20 ELSE 120 END, cotacol_algo_version = ?, average_speed_mps = CASE external_id WHEN ? THEN 7.0 ELSE 4.0 END - `, first.ExternalID, ride.CotacolAlgorithmVersion, second.ExternalID) + `, first.ExternalID, climb.CotacolAlgorithmVersion, second.ExternalID) require.NoError(t, err) req := httptest.NewRequest(http.MethodGet, "/analytics", nil) @@ -416,7 +417,7 @@ func TestHandlerFiltersAnalyticsByDistance(t *testing.T) { SET cotacol_score = CASE external_id WHEN ? THEN 20 ELSE 120 END, cotacol_algo_version = ?, average_speed_mps = CASE external_id WHEN ? THEN 7.0 ELSE 5.0 END - `, short.ExternalID, ride.CotacolAlgorithmVersion, long.ExternalID) + `, short.ExternalID, climb.CotacolAlgorithmVersion, long.ExternalID) require.NoError(t, err) req := httptest.NewRequest(http.MethodGet, "/analytics?distance_min=60", nil) -- cgit v1.3