mirror of
https://github.com/taigrr/most-specific-period.git
synced 2026-04-01 19:28:41 -07:00
- Update go.mod to Go 1.26
- Fix help text typos ('menut' → 'menu', 'most-significant' → 'most-specific')
- Fix error comment typo ('ll' → 'all')
- Remove unnecessary fmt.Sprintf in test names
- Remove unused fmt imports from test files
- Add compile-time interface check for TimeWindow
279 lines
7.6 KiB
Go
279 lines
7.6 KiB
Go
package msp
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// (periods ...Period) (id string, err error) {
|
|
func TestGenerateTime(t *testing.T) {
|
|
now := time.Now()
|
|
testCases := []struct {
|
|
ts time.Time
|
|
testID string
|
|
result []string
|
|
periods []Period
|
|
}{
|
|
{
|
|
testID: "No choices",
|
|
ts: now,
|
|
result: []string{},
|
|
periods: []Period{},
|
|
},
|
|
{
|
|
testID: "Two Choices, shorter is second",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-5*time.Minute), now.Add(-2*time.Minute)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-2*time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-5 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-2 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "Two Choices, one is a year, other a minute",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-1*time.Hour*24*365), now.Add(-5*time.Minute)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-5*time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-1 * time.Hour * 24 * 365),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-5 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "Two Choices, shorter is first",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-5*time.Minute), now.Add(-2*time.Minute)),
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-2*time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-2 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-5 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "Two Choices, one in the past",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-2*time.Minute), now.Add(-time.Minute)),
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-2 * time.Minute),
|
|
EndTime: now.Add(-time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "Two Choices, one invalid",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-2*time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(time.Minute),
|
|
EndTime: now.Add(-time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-2 * time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "Two Choices, Identical periods",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(-time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "One choice",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Minute), now.Add(time.Minute)),
|
|
},
|
|
periods: []Period{TimeWindow{
|
|
StartTime: now.Add(-time.Minute),
|
|
EndTime: now.Add(time.Minute),
|
|
Identifier: "A",
|
|
}},
|
|
},
|
|
{
|
|
testID: "not in current point in time",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Hour*24*30), now.Add(-time.Hour*24*29)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(time.Hour*24*90), now.Add(time.Hour*24*120)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 30),
|
|
EndTime: now.Add(-time.Hour * 24 * 29),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(time.Hour * 24 * 90),
|
|
EndTime: now.Add(time.Hour * 24 * 120),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "three overlapping periods",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(-time.Hour*24*31), now.Add(-time.Hour*24*30)),
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Hour*24*30), now.Add(-time.Hour*24*29)),
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(-time.Hour*24*29), now.Add(time.Hour*24*90)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(time.Hour*24*90), now.Add(time.Hour*24*120)),
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(time.Hour*24*120), now.Add(time.Hour*24*140)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 30),
|
|
EndTime: now.Add(-time.Hour * 24 * 29),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(time.Hour * 24 * 90),
|
|
EndTime: now.Add(time.Hour * 24 * 120),
|
|
Identifier: "B",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 31),
|
|
EndTime: now.Add(time.Hour * 24 * 140),
|
|
Identifier: "C",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "multiple overlapping periods",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("D\t%s\t%s\n", now.Add(-time.Hour*24*150), now.Add(-time.Hour*24*65)),
|
|
fmt.Sprintf("E\t%s\t%s\n", now.Add(-time.Hour*24*65), now.Add(-time.Hour*24*31)),
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(-time.Hour*24*31), now.Add(-time.Hour*24*30)),
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Hour*24*30), now.Add(-time.Hour*24*29)),
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(-time.Hour*24*29), now.Add(time.Hour*24*90)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(time.Hour*24*90), now.Add(time.Hour*24*120)),
|
|
fmt.Sprintf("C\t%s\t%s\n", now.Add(time.Hour*24*120), now.Add(time.Hour*24*140)),
|
|
fmt.Sprintf("E\t%s\t%s\n", now.Add(time.Hour*24*140), now.Add(time.Hour*24*175)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 30),
|
|
EndTime: now.Add(-time.Hour * 24 * 29),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(time.Hour * 24 * 90),
|
|
EndTime: now.Add(time.Hour * 24 * 120),
|
|
Identifier: "B",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 31),
|
|
EndTime: now.Add(time.Hour * 24 * 140),
|
|
Identifier: "C",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 150),
|
|
EndTime: now.Add(time.Hour * 24 * 175),
|
|
Identifier: "D",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Hour * 24 * 65),
|
|
EndTime: now.Add(time.Hour * 24 * 175),
|
|
Identifier: "E",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testID: "periods with a gap in the middle",
|
|
ts: now,
|
|
result: []string{
|
|
fmt.Sprintf("A\t%s\t%s\n", now.Add(-time.Minute*10), now.Add(-time.Minute*5)),
|
|
fmt.Sprintf("B\t%s\t%s\n", now.Add(time.Minute*5), now.Add(time.Minute*10)),
|
|
},
|
|
periods: []Period{
|
|
TimeWindow{
|
|
StartTime: now.Add(-time.Minute * 10),
|
|
EndTime: now.Add(-time.Minute * 5),
|
|
Identifier: "A",
|
|
},
|
|
TimeWindow{
|
|
StartTime: now.Add(time.Minute * 5),
|
|
EndTime: now.Add(time.Minute * 10),
|
|
Identifier: "B",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.testID, func(t *testing.T) {
|
|
timeline := GenerateTimeline(tc.periods...)
|
|
if len(timeline) != len(tc.result) {
|
|
t.Fatalf("Time line had %d results, expected %d", len(timeline), len(tc.result))
|
|
}
|
|
for idx, period := range timeline {
|
|
if period.(TimeWindow).String()+"\n" != tc.result[idx] {
|
|
t.Errorf("Expected:\t%s\nHad:\t%s", period, tc.result[idx])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|