diff --git a/tariff/combined.go b/tariff/combined.go index db3a70e6c..55807c12b 100644 --- a/tariff/combined.go +++ b/tariff/combined.go @@ -29,6 +29,8 @@ func (t *combined) Rates() (api.Rates, error) { rates = append(rates, rr...) } + rates.Sort() + var res api.Rates partitions := lo.PartitionBy(rates, func(r api.Rate) time.Time { diff --git a/tariff/combined_test.go b/tariff/combined_test.go index d470d38dc..81689dc0a 100644 --- a/tariff/combined_test.go +++ b/tariff/combined_test.go @@ -41,6 +41,27 @@ func TestCombined(t *testing.T) { assert.Equal(t, api.Rates{rate(1, 1), rate(2, 4), rate(3, 3)}, rr) } +func TestCombinedUnsorted(t *testing.T) { + clock := clock.NewMock() + rate := func(start int, val float64) api.Rate { + return api.Rate{ + Start: clock.Now().Add(time.Duration(start) * time.Hour), + End: clock.Now().Add(time.Duration(start+1) * time.Hour), + Value: val, + } + } + + // b covers a disjoint range not adjacent to a's rates after concatenation + a := &tariff{api.Rates{rate(1, 1), rate(2, 2)}} + b := &tariff{api.Rates{rate(3, 3)}} + c := &tariff{api.Rates{rate(1, 10), rate(2, 20)}} + comb := &combined{[]api.Tariff{a, b, c}} + + rr, err := comb.Rates() + require.NoError(t, err) + assert.Equal(t, api.Rates{rate(1, 11), rate(2, 22), rate(3, 3)}, rr) +} + func BenchmarkCombined(bench *testing.B) { clock := clock.NewMock() rate := func(start int, val float64) api.Rate {