aboutsummaryrefslogtreecommitdiff
path: root/internal/ridetest/ride.go
blob: 50a84cd71a479be0b00c3e8531e67e77c5606d69 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

// Package ridetest builds ride.Ride test fixtures from a compact string DSL. It
// reuses routetest to sample the route geometry and layers ride timestamps and
// telemetry on top.
//
// Grammar: see routetest.
package ridetest

import (
	"github.com/martinlehoux/biking_home/internal/routetest"
	"github.com/martinlehoux/biking_home/ride"
)

// Option is re-exported from routetest so existing ridetest callers keep
// working unchanged.
type Option = routetest.Option

var (
	Sampling       = routetest.Sampling
	StartCoord     = routetest.StartCoord
	Heading        = routetest.Heading
	StartTime      = routetest.StartTime
	StartElevation = routetest.StartElevation
)

// Ride parses a ride description into a ride.Ride.
//
// Example: "2km at 7% | 1km at -7%".
func Ride(dsl string, opts ...Option) (ride.Ride, error) {
	built, err := routetest.Build(dsl, opts...)
	if err != nil {
		return ride.Ride{}, err
	}
	return ride.FromColumnsWithMetrics(built.Distances, built.Elevations, built.Coords, built.Timestamps, built.HeartRates, built.Cadences, built.Powers), nil
}

// MustRide is like Ride but panics on a malformed description; use it inside
// tests where the description is a static program constant.
func MustRide(dsl string, opts ...Option) ride.Ride {
	ride, err := Ride(dsl, opts...)
	if err != nil {
		panic(err)
	}
	return ride
}