Skip to content

Commit 51e93e3

Browse files
authored
Merge pull request #8 from Vivino/handle_full_week
When we have a full week, take sorting by year into account
2 parents 31f640c + 1fcd0ed commit 51e93e3

2 files changed

Lines changed: 115 additions & 88 deletions

File tree

openhours.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,18 @@ import (
99
"time"
1010
)
1111

12+
const (
13+
Monday int = iota + 1
14+
Tuesday
15+
Wednesday
16+
Thursday
17+
Friday
18+
Saturday
19+
Sunday
20+
)
21+
1222
var (
13-
weekDays = map[string]int{"su": 0, "mo": 1, "tu": 2, "we": 3, "th": 4, "fr": 5, "sa": 6}
23+
weekDays = map[string]int{"mo": Monday, "tu": Tuesday, "we": Wednesday, "th": Thursday, "fr": Friday, "sa": Saturday, "su": Sunday}
1424

1525
// Errors
1626
ErrInvalidFormat error = errors.New("invalid format")
@@ -20,11 +30,11 @@ var (
2030
type OpenHours []time.Time
2131

2232
func newDate(day, hour, min, sec, nsec int, loc *time.Location) time.Time {
23-
return time.Date(2017, 1, day, hour, min, sec, nsec, loc)
33+
return time.Date(2018, 1, day, hour, min, sec, nsec, loc)
2434
}
2535

2636
func newDateFromTime(t time.Time) time.Time {
27-
return newDate(int(t.Weekday()), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
37+
return newDate(t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
2838
}
2939

3040
// Match returns true if the time t is in the open hours
@@ -115,15 +125,13 @@ func (o OpenHours) Add(from, to time.Time) OpenHours {
115125
return o
116126
}
117127

118-
var weekdays = map[int]string{0: "Sunday", 1: "Monday", 2: "Tuesday", 3: "Wednesday", 4: "Thursday", 5: "Friday", 6: "Saturday"}
119-
120128
func (o OpenHours) String() []string {
121129
str := []string{}
122130
if len(o) == 0 {
123131
return str
124132
}
125133
for i := 1; i <= len(o)-1; i += 2 {
126-
str = append(str, fmt.Sprintf("%s %s - %s", weekdays[o[i-1].Day()], o[i-1].Format("15:04"), o[i].Format("15:04")))
134+
str = append(str, fmt.Sprintf("%s %s - %s", o[i-1].Weekday(), o[i-1].Format("15:04"), o[i].Format("15:04")))
127135
}
128136
return str
129137
}
@@ -161,7 +169,12 @@ func simplifyDays(str string) []int {
161169
to += 7
162170
}
163171
for i := from; i <= to; i++ {
164-
days[i%7] = struct{}{}
172+
switch i % 7 {
173+
case 0:
174+
days[7] = struct{}{}
175+
default:
176+
days[i%7] = struct{}{}
177+
}
165178
}
166179
continue
167180
}
@@ -247,7 +260,10 @@ func merge(o []time.Time) []time.Time {
247260
if o[i].Day() == o[j].Day() {
248261
return o[i].Hour() < o[j].Hour()
249262
}
250-
return o[i].Day() < o[j].Day()
263+
if o[i].Year() == o[j].Year() {
264+
return o[i].Day() < o[j].Day()
265+
}
266+
return o[i].Year() < o[j].Year()
251267
})
252268
for i := 0; i < len(o); i += 2 {
253269
for j := i + 2; j < len(o); j += 2 {

openhours_test.go

Lines changed: 91 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var l *time.Location
1212

1313
func init() {
1414
var err error
15-
l, err = time.LoadLocation("Europe/London") // is a good test example since i know when the two clock change occur
15+
l, err = time.LoadLocation("Europe/London") // is a good test example since i know when the two clock changes occur
1616
if err != nil {
1717
panic("could not load location")
1818
}
@@ -49,16 +49,16 @@ func Test_simplifyDays(t *testing.T) {
4949
args string
5050
want []int
5151
}{
52-
{"simple", "mo", []int{1}},
53-
{"double with error", "mo,mardi", []int{1}},
54-
{"double with error", "mo,mardi", []int{1}},
55-
{"double", "we,fr", []int{3, 5}},
56-
{"range", "we-fr", []int{3, 4, 5}},
57-
{"range with double", "mo,we-fr,su", []int{0, 1, 3, 4, 5}},
52+
{"weird range", "fr-mo", []int{Monday, Friday, Saturday, Sunday}},
53+
{"simple", "mo", []int{Monday}},
54+
{"double with error", "mo,mardi", []int{Monday}},
55+
{"double with error", "mo,mardi", []int{Monday}},
56+
{"double", "we,fr", []int{Wednesday, Friday}},
57+
{"range", "we-fr", []int{Wednesday, Thursday, Friday}},
58+
{"range with double", "mo,we-fr,su", []int{Monday, Wednesday, Thursday, Friday, Sunday}},
5859
{"error -", "mo-pl", []int{}},
59-
{"error ,", "pl,mo", []int{1}},
60-
{"weird range", "fr-mo", []int{0, 1, 5, 6}},
61-
{"dupicate days", "mo-tu,tu,tu-fr,fr", []int{1, 2, 3, 4, 5}},
60+
{"error ,", "pl,mo", []int{Monday}},
61+
{"duplicate days", "mo-tu,tu,tu-fr,fr", []int{Monday, Tuesday, Wednesday, Thursday, Friday}},
6262
}
6363
for _, tt := range tests {
6464
t.Run(tt.name, func(t *testing.T) {
@@ -110,17 +110,18 @@ func Test_feature_simple(t *testing.T) {
110110
t.Error(err)
111111
}
112112
tests := []struct {
113+
name string
113114
args time.Time
114115
want bool
115116
}{
116-
{time.Date(2019, 3, 4, 8, 0, 0, 0, l), true}, // special case start = true
117-
{time.Date(2019, 3, 4, 17, 59, 0, 0, l), true},
118-
{time.Date(2019, 3, 4, 18, 0, 0, 0, l), false}, // special case end = false
119-
{time.Date(2019, 3, 4, 7, 0, 0, 0, l), false},
120-
{time.Date(2019, 3, 4, 19, 0, 0, 0, l), false},
117+
{"before", newDate(Monday, 7, 0, 0, 0, l), false},
118+
{"start", newDate(Monday, 8, 0, 0, 0, l), true}, // special case start = true
119+
{"during", newDate(Monday, 17, 59, 0, 0, l), true},
120+
{"end", newDate(Monday, 18, 0, 0, 0, l), false}, // special case end = false
121+
{"after", newDate(Monday, 19, 0, 0, 0, l), false},
121122
}
122123
for _, tt := range tests {
123-
t.Run(tt.args.String(), func(t *testing.T) {
124+
t.Run(tt.name, func(t *testing.T) {
124125
if got := o.Match(tt.args); got != tt.want {
125126
t.Errorf("simplifyHour() got = %v, want %v", got, tt.want)
126127
}
@@ -137,16 +138,16 @@ func Test_feature_two(t *testing.T) {
137138
args time.Time
138139
want bool
139140
}{
140-
{time.Date(2019, 3, 4, 8, 0, 0, 0, l), true}, // special case start = true
141-
{time.Date(2019, 3, 4, 9, 0, 0, 0, l), true},
142-
{time.Date(2019, 3, 4, 13, 0, 0, 0, l), true}, // special case start = true
143-
{time.Date(2019, 3, 4, 15, 0, 0, 0, l), true},
144-
{time.Date(2019, 3, 4, 12, 30, 0, 0, l), false}, // between
145-
{time.Date(2019, 3, 4, 17, 59, 0, 0, l), false},
146-
{time.Date(2019, 3, 4, 17, 0, 0, 0, l), false}, // special case end = false
147-
{time.Date(2019, 3, 4, 12, 0, 0, 0, l), false}, // special case end = false
148-
{time.Date(2019, 3, 4, 7, 0, 0, 0, l), false},
149-
{time.Date(2019, 3, 4, 19, 0, 0, 0, l), false},
141+
{newDate(Monday, 8, 0, 0, 0, l), true}, // special case start = true
142+
{newDate(Monday, 9, 0, 0, 0, l), true},
143+
{newDate(Monday, 13, 0, 0, 0, l), true}, // special case start = true
144+
{newDate(Monday, 15, 0, 0, 0, l), true},
145+
{newDate(Monday, 12, 30, 0, 0, l), false}, // between
146+
{newDate(Monday, 17, 59, 0, 0, l), false},
147+
{newDate(Monday, 17, 0, 0, 0, l), false}, // special case end = false
148+
{newDate(Monday, 12, 0, 0, 0, l), false}, // special case end = false
149+
{newDate(Monday, 7, 0, 0, 0, l), false},
150+
{newDate(Monday, 19, 0, 0, 0, l), false},
150151
}
151152
for _, tt := range tests {
152153
t.Run(tt.args.String(), func(t *testing.T) {
@@ -168,12 +169,12 @@ func TestOpenHours_NextDur(t *testing.T) {
168169
want bool
169170
want1 time.Duration
170171
}{
171-
{"1 hour before start", time.Date(2019, 3, 4, 7, 0, 0, 0, l), false, time.Hour},
172-
{"at start", time.Date(2019, 3, 4, 8, 0, 0, 0, l), true, 10 * time.Hour},
173-
{"1 hour after start", time.Date(2019, 3, 4, 9, 0, 0, 0, l), true, 9 * time.Hour},
174-
{"1 hour before end", time.Date(2019, 3, 4, 17, 0, 0, 0, l), true, time.Hour},
175-
{"at end", time.Date(2019, 3, 4, 18, 0, 0, 0, l), false, time.Hour*24*7 - time.Hour*10},
176-
{"1 day after start (closed)", time.Date(2019, 3, 5, 8, 0, 0, 0, l), false, time.Hour * 24 * 6},
172+
{"1 hour before start", newDate(Monday, 7, 0, 0, 0, l), false, time.Hour},
173+
{"at start", newDate(Monday, 8, 0, 0, 0, l), true, 10 * time.Hour},
174+
{"1 hour after start", newDate(Monday, 9, 0, 0, 0, l), true, 9 * time.Hour},
175+
{"1 hour before end", newDate(Monday, 17, 0, 0, 0, l), true, time.Hour},
176+
{"at end", newDate(Monday, 18, 0, 0, 0, l), false, time.Hour*24*7 - time.Hour*10},
177+
{"1 day after start (closed)", newDate(Tuesday, 8, 0, 0, 0, l), false, time.Hour * 24 * 6},
177178
}
178179
for _, tt := range tests {
179180
t.Run(tt.name, func(t *testing.T) {
@@ -199,17 +200,17 @@ func TestOpenHours_Special_NextDur(t *testing.T) {
199200
want bool
200201
want1 time.Duration
201202
}{
202-
{"2 h before (3 if there was no clock change)", time.Date(2019, 3, 31, 0, 0, 0, 0, l), false, time.Hour * 2},
203-
{"4 h before (3 if there was no clock change)", time.Date(2019, 10, 27, 0, 0, 0, 0, l), false, time.Hour * 4},
203+
{"2 h before (3 if there was no clock change)", newDate(Sunday, 1, 0, 0, 0, l), false, time.Hour * 2},
204+
{"4 h before (3 if there was no clock change)", newDate(Saturday, 23, 0, 0, 0, l), false, time.Hour * 4},
204205
}
205206
for _, tt := range tests {
206207
t.Run(tt.name, func(t *testing.T) {
207208
got, got1 := o.NextDur(tt.args)
208209
if got != tt.want {
209-
t.Errorf("OpenHours.NextDur() got = %v, want %v", got, tt.want)
210+
t.Errorf("OpenHours.NextDur() got = %v, want %v have %v", got, tt.want, o)
210211
}
211212
if got1 != tt.want1 {
212-
t.Errorf("OpenHours.NextDur() got1 = %v, want %v", got1, tt.want1)
213+
t.Errorf("OpenHours.NextDur() got1 = %v, want %v have %v", got1, tt.want1, o)
213214
}
214215
})
215216
}
@@ -222,24 +223,33 @@ func TestNew(t *testing.T) {
222223
args2 *time.Location
223224
want OpenHours
224225
}{
225-
{"empty", "", l, []time.Time{newDate(0, 0, 0, 0, 0, l), newDate(7, 0, 0, 0, 0, l)}},
226-
{"empty ;", ";", l, []time.Time{newDate(0, 0, 0, 0, 0, l), newDate(7, 0, 0, 0, 0, l)}},
227-
{"all day ;", "su-sa 00:00-24:00;", l, []time.Time{newDate(0, 0, 0, 0, 0, l), newDate(7, 0, 0, 0, 0, l)}},
228-
{"empty and no tz", "", nil, []time.Time{newDate(0, 0, 0, 0, 0, time.UTC), newDate(7, 0, 0, 0, 0, time.UTC)}},
226+
{"empty", "", l, []time.Time{newDate(Monday, 0, 0, 0, 0, l), newDate(Sunday, 24, 0, 0, 0, l)}},
227+
{"empty ;", ";", l, []time.Time{newDate(Monday, 0, 0, 0, 0, l), newDate(Sunday, 24, 0, 0, 0, l)}},
228+
{"all day ;", "su-sa 00:00-24:00;", l, []time.Time{newDate(Monday, 0, 0, 0, 0, l), newDate(Sunday, 24, 0, 0, 0, l)}},
229+
{"empty and no tz", "", nil, []time.Time{newDate(Monday, 0, 0, 0, 0, time.UTC), newDate(Sunday, 24, 0, 0, 0, time.UTC)}},
229230
{"order on same sentence", "mo,tu 10:00-11:00", nil, NewMust("tu,mo 10:00-11:00", nil)},
230231
{"order on different sentences", "mo 10:00-11:00;tu 10:00-12:00", nil, NewMust("tu 10:00-12:00;mo 10:00-11:00", nil)},
231232
{"complex = simple", "su-sa 00:00-12:00,12:00-24:00", l, NewMust("", l)},
232233
{"complex = simple", "su-sa 00:00-12:00;su-sa 12:00-24:00", l, NewMust("", l)},
233234
{"time windows order does not matter anymore", "mo-su 00:00-24:00", l, NewMust("", l)},
234-
{"one day", "mo 10:00-15:00", l, []time.Time{newDate(1, 10, 0, 0, 0, l), newDate(1, 15, 0, 0, 0, l)}},
235-
{"two days", "mo 10:00-15:00;fr 08:00-14:00", l, []time.Time{newDate(1, 10, 0, 0, 0, l), newDate(1, 15, 0, 0, 0, l), newDate(5, 8, 0, 0, 0, l), newDate(5, 14, 0, 0, 0, l)}},
235+
{"one day", "mo 10:00-15:00", l, []time.Time{newDate(Monday, 10, 0, 0, 0, l), newDate(Monday, 15, 0, 0, 0, l)}},
236+
{"two days", "mo 10:00-15:00;fr 08:00-14:00", l, []time.Time{newDate(Monday, 10, 0, 0, 0, l), newDate(Monday, 15, 0, 0, 0, l), newDate(Friday, 8, 0, 0, 0, l), newDate(Friday, 14, 0, 0, 0, l)}},
236237
{"week with break", "Tu-Th 10:30-13:00,14:00-24:00", l, []time.Time{
237-
newDate(2, 10, 30, 0, 0, l), newDate(2, 13, 0, 0, 0, l),
238-
newDate(2, 14, 0, 0, 0, l), newDate(2, 24, 0, 0, 0, l),
239-
newDate(3, 10, 30, 0, 0, l), newDate(3, 13, 0, 0, 0, l),
240-
newDate(3, 14, 0, 0, 0, l), newDate(3, 24, 0, 0, 0, l),
241-
newDate(4, 10, 30, 0, 0, l), newDate(4, 13, 0, 0, 0, l),
242-
newDate(4, 14, 0, 0, 0, l), newDate(4, 24, 0, 0, 0, l),
238+
newDate(Tuesday, 10, 30, 0, 0, l), newDate(Tuesday, 13, 0, 0, 0, l),
239+
newDate(Tuesday, 14, 0, 0, 0, l), newDate(Tuesday, 24, 0, 0, 0, l),
240+
newDate(Wednesday, 10, 30, 0, 0, l), newDate(Wednesday, 13, 0, 0, 0, l),
241+
newDate(Wednesday, 14, 0, 0, 0, l), newDate(Wednesday, 24, 0, 0, 0, l),
242+
newDate(Thursday, 10, 30, 0, 0, l), newDate(Thursday, 13, 0, 0, 0, l),
243+
newDate(Thursday, 14, 0, 0, 0, l), newDate(Thursday, 24, 0, 0, 0, l),
244+
}},
245+
{"", "Mo-Sa 10:00-21:00; Su 12:00-19:00", l, []time.Time{
246+
newDate(Monday, 10, 0, 0, 0, l), newDate(Monday, 21, 0, 0, 0, l),
247+
newDate(Tuesday, 10, 0, 0, 0, l), newDate(Tuesday, 21, 0, 0, 0, l),
248+
newDate(Wednesday, 10, 0, 0, 0, l), newDate(Wednesday, 21, 0, 0, 0, l),
249+
newDate(Thursday, 10, 0, 0, 0, l), newDate(Thursday, 21, 0, 0, 0, l),
250+
newDate(Friday, 10, 0, 0, 0, l), newDate(Friday, 21, 0, 0, 0, l),
251+
newDate(Saturday, 10, 0, 0, 0, l), newDate(Saturday, 21, 0, 0, 0, l),
252+
newDate(Sunday, 12, 0, 0, 0, l), newDate(Sunday, 19, 0, 0, 0, l),
243253
}},
244254
}
245255
for _, tt := range tests {
@@ -266,8 +276,8 @@ func TestOpenHours_NextDate(t *testing.T) {
266276
want bool
267277
want1 time.Time
268278
}{
269-
{"2 h before (3 if there was no clock change)", time.Date(2019, 3, 31, 0, 0, 0, 0, l), false, time.Date(2019, 3, 31, 3, 0, 0, 0, l)},
270-
{"4 h before (3 if there was no clock change)", time.Date(2019, 10, 27, 0, 0, 0, 0, l), false, time.Date(2019, 10, 27, 3, 0, 0, 0, l)},
279+
{"2 h before (3 if there was no clock change)", newDate(Sunday, 1, 0, 0, 0, l), false, newDate(Sunday, 3, 0, 0, 0, l)},
280+
{"4 h before (3 if there was no clock change)", newDate(Saturday, 23, 0, 0, 0, l), false, newDate(Sunday, 3, 0, 0, 0, l)},
271281
}
272282
for _, tt := range tests {
273283
t.Run(tt.name, func(t *testing.T) {
@@ -282,8 +292,8 @@ func TestOpenHours_NextDate(t *testing.T) {
282292
}
283293
}
284294

285-
func pDate(year int, month time.Month, day, hour, min, sec, nsec int, loc *time.Location) *time.Time {
286-
t := time.Date(year, month, day, hour, min, sec, nsec, loc)
295+
func pDate(day, hour, min, sec, nsec int, loc *time.Location) *time.Time {
296+
t := newDate(day, hour, min, sec, nsec, loc)
287297
return &t
288298
}
289299

@@ -298,19 +308,19 @@ func TestOpenHours_When(t *testing.T) {
298308
args args
299309
want *time.Time
300310
}{
301-
{"at start of open and have time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 10, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 10, 0, 0, 0, l)},
302-
{"before start of open and have time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 9, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 10, 0, 0, 0, l)},
303-
{"at end of open and have time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 15, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 18, 10, 0, 0, 0, l)},
304-
{"after end of open and have time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 16, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 18, 10, 0, 0, 0, l)},
305-
{"between open and have time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 11, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 11, 0, 0, 0, l)},
306-
{"between open and no time", NewMust("mo 10:00-15:00", l), args{time.Date(2019, 3, 11, 14, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 18, 10, 0, 0, 0, l)},
307-
{"no time", NewMust("mo 10:00-11:00", l), args{time.Date(2019, 3, 11, 14, 0, 0, 0, l), time.Hour * 4}, nil},
308-
{"at start of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 10, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 10, 0, 0, 0, l)},
309-
{"before start of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 9, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 10, 0, 0, 0, l)},
310-
{"at end of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 15, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 15, 8, 0, 0, 0, l)},
311-
{"after end of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 16, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 15, 8, 0, 0, 0, l)},
312-
{"between open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 11, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 11, 11, 0, 0, 0, l)},
313-
{"between open and no time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{time.Date(2019, 3, 11, 14, 0, 0, 0, l), time.Hour * 4}, pDate(2019, 3, 15, 8, 0, 0, 0, l)},
311+
{"at start of open and have time", NewMust("mo 10:00-15:00", l), args{newDate(Monday, 11, 0, 0, 0, l), time.Hour * 4}, pDate(1, 11, 0, 0, 0, l)},
312+
{"before start of open and have time", NewMust("mo 10:00-15:00", l), args{newDate(Monday, 9, 0, 0, 0, l), time.Hour * 4}, pDate(1, 10, 0, 0, 0, l)},
313+
{"at end of open and have time", NewMust("mo 10:00-15:00", l), args{newDate(Monday, 15, 0, 0, 0, l), time.Hour * 4}, pDate(8, 10, 0, 0, 0, l)},
314+
{"after end of open and have time", NewMust("mo 10:00-15:00", l), args{newDate(Monday, 16, 0, 0, 0, l), time.Hour * 4}, pDate(8, 10, 0, 0, 0, l)},
315+
{"between open and have time", NewMust("mo 10:00-15:00", l), args{newDate(Tuesday, 11, 0, 0, 0, l), time.Hour * 4}, pDate(8, 10, 0, 0, 0, l)},
316+
{"between open and no time", NewMust("mo 10:00-15:00", l), args{newDate(Monday, 14, 0, 0, 0, l), time.Hour * 4}, pDate(8, 10, 0, 0, 0, l)},
317+
{"no time", NewMust("mo 10:00-11:00", l), args{newDate(Monday, 14, 0, 0, 0, l), time.Hour * 4}, nil},
318+
{"at start of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 10, 0, 0, 0, l), time.Hour * 4}, pDate(1, 10, 0, 0, 0, l)},
319+
{"before start of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 9, 0, 0, 0, l), time.Hour * 4}, pDate(1, 10, 0, 0, 0, l)},
320+
{"at end of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 15, 0, 0, 0, l), time.Hour * 4}, pDate(5, 8, 0, 0, 0, l)},
321+
{"after end of open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 16, 0, 0, 0, l), time.Hour * 4}, pDate(5, 8, 0, 0, 0, l)},
322+
{"between open and have time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 11, 0, 0, 0, l), time.Hour * 4}, pDate(1, 11, 0, 0, 0, l)},
323+
{"between open and no time +fri", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), args{newDate(Monday, 14, 0, 0, 0, l), time.Hour * 4}, pDate(5, 8, 0, 0, 0, l)},
314324
}
315325
for _, tt := range tests {
316326
t.Run(tt.name, func(t *testing.T) {
@@ -334,9 +344,9 @@ func TestOpenHours_Add(t *testing.T) {
334344
}{
335345
{
336346
"at start of open and have time",
337-
OpenHours{}.Add(time.Date(2019, 3, 11, 10, 0, 0, 0, l), time.Date(2019, 3, 11, 10, 30, 0, 0, l)), // mo 10:00-10:30
338-
args{time.Date(2019, 3, 11, 9, 0, 0, 0, l), time.Second},
339-
pDate(2019, 3, 11, 10, 0, 0, 0, l),
347+
OpenHours{}.Add(newDate(11, 10, 0, 0, 0, l), newDate(11, 10, 30, 0, 0, l)), // mo 10:00-10:30
348+
args{newDate(11, 9, 0, 0, 0, l), time.Second},
349+
pDate(11, 10, 0, 0, 0, l),
340350
},
341351
}
342352
for _, tt := range tests {
@@ -353,8 +363,8 @@ func TestOpenHours_Bugs(t *testing.T) {
353363
if err != nil {
354364
t.Error(err)
355365
}
356-
when := o.When(time.Date(2020, 4, 26, 9, 0, 0, 0, time.UTC), time.Hour)
357-
want := time.Date(2020, 4, 26, 9, 0, 0, 0, time.UTC)
366+
when := o.When(newDate(Sunday, 9, 0, 0, 0, time.UTC), time.Hour)
367+
want := newDate(Sunday, 9, 0, 0, 0, time.UTC)
358368
if when == nil || !want.Equal(*when) {
359369
t.Errorf("OpenHours.When() = %v, want %v", when, want)
360370
}
@@ -382,6 +392,7 @@ func TestOpenHours_String(t *testing.T) {
382392
{"empty", OpenHours{}, []string{}},
383393
{"simple", NewMust("mo 10:00-15:00", l), []string{"Monday 10:00 - 15:00"}},
384394
{"two", NewMust("mo 10:00-15:00;fr 08:00-14:00", l), []string{"Monday 10:00 - 15:00", "Friday 08:00 - 14:00"}},
395+
{"full week", NewMust("mo-su 09:00-17:00", l), []string{"Monday 09:00 - 17:00", "Tuesday 09:00 - 17:00", "Wednesday 09:00 - 17:00", "Thursday 09:00 - 17:00", "Friday 09:00 - 17:00", "Saturday 09:00 - 17:00", "Sunday 09:00 - 17:00"}},
385396
}
386397
for _, tt := range tests {
387398
t.Run(tt.name, func(t *testing.T) {
@@ -401,17 +412,17 @@ func TestOpenHours_ClosingAfterMidnight(t *testing.T) {
401412
now time.Time
402413
want bool
403414
}{
404-
{o1, "before", time.Date(2019, 3, 4, 21, 0, 0, 0, l), false},
405-
{o1, "start", time.Date(2019, 3, 4, 22, 0, 0, 0, l), true},
406-
{o1, "between", time.Date(2019, 3, 4, 23, 0, 0, 0, l), true},
407-
{o1, "end", time.Date(2019, 3, 5, 2, 0, 0, 0, l), false},
408-
{o1, "after", time.Date(2019, 3, 5, 3, 0, 0, 0, l), false},
415+
{o1, "1before", newDate(Monday, 21, 0, 0, 0, l), false},
416+
{o1, "1start", newDate(Monday, 22, 0, 0, 0, l), true},
417+
{o1, "1between", newDate(Monday, 23, 0, 0, 0, l), true},
418+
{o1, "1end", newDate(Tuesday, 2, 0, 0, 0, l), false},
419+
{o1, "1after", newDate(Tuesday, 3, 0, 0, 0, l), false},
409420
// using the 26:00 = 02:00 next day notation
410-
{o2, "before", time.Date(2019, 3, 4, 21, 0, 0, 0, l), false},
411-
{o2, "start", time.Date(2019, 3, 4, 22, 0, 0, 0, l), true},
412-
{o2, "between", time.Date(2019, 3, 4, 23, 0, 0, 0, l), true},
413-
{o2, "end", time.Date(2019, 3, 5, 2, 0, 0, 0, l), false},
414-
{o2, "after", time.Date(2019, 3, 5, 3, 0, 0, 0, l), false},
421+
{o2, "2before", newDate(Monday, 21, 0, 0, 0, l), false},
422+
{o2, "2start", newDate(Monday, 22, 0, 0, 0, l), true},
423+
{o2, "2between", newDate(Monday, 23, 0, 0, 0, l), true},
424+
{o2, "2end", newDate(Tuesday, 2, 0, 0, 0, l), false},
425+
{o2, "2after", newDate(Tuesday, 3, 0, 0, 0, l), false},
415426
}
416427
for _, tt := range tests {
417428
t.Run(tt.name, func(t *testing.T) {

0 commit comments

Comments
 (0)