summaryrefslogtreecommitdiff
path: root/ride/climb_test.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2024-07-28 17:50:29 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2024-07-28 17:50:29 +0200
commit203b9bdf17bd4742b5aab2c35df47b59af0652f1 (patch)
treeb6bc8ddee21bcaa022ef68b3769f61100117b190 /ride/climb_test.go
parent171366f337c3422331b84b6c7416e1b1d6bd36a0 (diff)
test: Add some test to fix behavior
Diffstat (limited to 'ride/climb_test.go')
-rw-r--r--ride/climb_test.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/ride/climb_test.go b/ride/climb_test.go
new file mode 100644
index 0000000..5acc3c4
--- /dev/null
+++ b/ride/climb_test.go
@@ -0,0 +1,82 @@
+package ride_test
+
+import (
+ "strconv"
+ "strings"
+ "testing"
+
+ "github.com/martinlehoux/biking_home/ride"
+ "github.com/martinlehoux/kagamigo/kcore"
+ "github.com/stretchr/testify/assert"
+ "github.com/tkrajina/gpxgo/gpx"
+)
+
+type RideBuilderSection struct {
+ slope float64
+ distance float64
+}
+
+type RideBuilder struct {
+ precision float64
+ sections []RideBuilderSection
+}
+
+// Example: 13.4km at 7.5%
+func (b RideBuilder) WithSection(input string) RideBuilder {
+ inputs := strings.Split(input, " ")
+ kcore.Assert(strings.HasSuffix(inputs[0], "km"), "wrong unit")
+ distanceKm, err := strconv.ParseFloat(strings.TrimSuffix(inputs[0], "km"), 64)
+ kcore.Expect(err, "faile to parse kms")
+ kcore.Assert(strings.HasSuffix(inputs[2], "%"), "wrong unit")
+ slopePercent, err := strconv.ParseFloat(strings.TrimSuffix(inputs[2], "%"), 64)
+ kcore.Expect(err, "failed to parse %")
+
+ b.sections = append(b.sections, RideBuilderSection{
+ slope: slopePercent / 100,
+ distance: distanceKm * 1000,
+ })
+
+ return b
+}
+
+func (b RideBuilder) Build() ride.Ride {
+ points := []ride.Point{ride.NewPoint(0, 0)}
+ distance := 0.0
+ elevation := 0.0
+ for _, section := range b.sections {
+ curSecDist := 0.0
+ for curSecDist < section.distance {
+ curSecDist += b.precision
+ elevation += b.precision * section.slope
+ points = append(points, ride.NewPoint(
+ distance+curSecDist,
+ elevation,
+ ))
+ }
+ distance += curSecDist
+ }
+ return ride.FromPoints(points)
+}
+
+func TestClimbThenFalseFlat(t *testing.T) {
+ r := RideBuilder{precision: 100}.WithSection("2km at 7%").WithSection("10km at 1%").Build()
+ climbs := r.AllClimbs()
+
+ assert.Len(t, climbs, 2)
+ assert.Equal(t, "0.0km-11.9km: 11.9km at 1.8% (40 pts - Cat 4)", r.String(climbs[0]))
+ assert.Equal(t, "", r.String(climbs[1]))
+}
+
+func TestPogacar20220721(t *testing.T) {
+ gpxContent, err := gpx.ParseFile("../examples/2022-07-21.Pogacar.gpx")
+ assert.NoError(t, err)
+ r := ride.FromGPX(gpxContent)
+ climbs := r.AllClimbs()
+
+ assert.Len(t, climbs, 5)
+ assert.Equal(t, "0.6km-5.6km: 5.0km at 3.5% (62 pts - Cat 4)", r.String(climbs[0]))
+ assert.Equal(t, "60.0km-76.4km: 16.4km at 7.2% (854 pts - HC)", r.String(climbs[1]))
+ assert.Equal(t, "83.8km-85.9km: 2.1km at 5.4% (59 pts - Cat 4)", r.String(climbs[2]))
+ assert.Equal(t, "99.2km-109.3km: 10.2km at 8.4% (710 pts - HC)", r.String(climbs[3]))
+ assert.Equal(t, "128.6km-142.2km: 13.6km at 7.8% (832 pts - HC)", r.String(climbs[4]))
+}