1 package ldmodel
2
3 import (
4 "fmt"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9 )
10
11 func TestParseRFC3339TimeUTC(t *testing.T) {
12 for _, test := range makeParseTimeTests() {
13 t.Run(fmt.Sprintf("input string: [%s], valid: %t", test.s, test.valid), func(t *testing.T) {
14 t1, ok := parseRFC3339TimeUTC(test.s)
15 t2, err := time.Parse(time.RFC3339Nano, test.s)
16 if test.valid {
17 if assert.True(t, ok, "parseRFC3339TimeUTC should have accepted this string") &&
18 assert.NoError(t, err, "time.Parse should have accepted this string") {
19 assert.Equal(t, t2.UTC(), t1)
20 }
21 } else {
22 if assert.False(t, ok, "parseRFC3339TimeUTC should have rejected this string") &&
23 assert.Error(t, err, "time.Parse should have rejected this string") {
24 assert.Equal(t, time.Time{}, t1)
25 }
26 }
27 })
28 }
29 }
30
31 type parseTimeTest struct {
32 s string
33 valid bool
34 }
35
36 func makeParseTimeTests() []parseTimeTest {
37 var ret []parseTimeTest
38
39 addGood := func(s string) {
40 ret = append(ret, parseTimeTest{s, true})
41 }
42 addBad := func(s string) {
43 ret = append(ret, parseTimeTest{s, false})
44 }
45
46 for _, goodSuffix := range []string{
47 "Z", ".123Z", ".123456789Z", "+08:00", "-08:00", "+07:30", "+99:00",
48
49 } {
50 addGood(fmt.Sprintf("2020-06-09T18:53:52%s", goodSuffix))
51 }
52
53 addGood("2020-06-09T1:53:52Z")
54
55 for _, badYear := range []string{"202", "20202", "202x", ""} {
56 addBad(fmt.Sprintf("%s-06-09T18:53:52Z", badYear))
57 }
58 for _, badMonth := range []string{"6", "006", "00", "13", "0x", ""} {
59 addBad(fmt.Sprintf("2020-%s-09T18:53:52Z", badMonth))
60 }
61 for _, badDay := range []string{"9", "009", "00", "32", "3x", ""} {
62 addBad(fmt.Sprintf("2020-06-%sT18:53:52Z", badDay))
63 }
64 for _, badHour := range []string{"018", "24", "1x", ""} {
65 addBad(fmt.Sprintf("2020-06-09T%s:53:52Z", badHour))
66 }
67 for _, badMinute := range []string{"5", "053", "60", "5x", ""} {
68 addBad(fmt.Sprintf("2020-06-09T18:%s:52Z", badMinute))
69 }
70 for _, badSecond := range []string{"5", "052", "61", "5x", ""} {
71 addBad(fmt.Sprintf("2020-06-09T18:53:%sZ", badSecond))
72 }
73 for _, badFraction := range []string{".123456789123456789Z", ".500x", "."} {
74 addBad(fmt.Sprintf("2020-06-09T18:53:52%sZ", badFraction))
75 }
76 for _, badTimeZone := range []string{
77 "/07:00", "-0:00", "-007:00", "-2x:00", "-:00", "-07:0", "07:000", "07:60", "07:0x", "07:",
78 } {
79 addBad(fmt.Sprintf("2020-06-09T18:53:52%s", badTimeZone))
80 }
81
82
83 addBad("🤨2020-06-09T18:53:52Z")
84
85 return ret
86 }
87
88 var parseTimeTests = []parseTimeTest{
89
90 {"2020-06-09T18:53:52.500xZ", false},
91 {"2020-06-09T18:53:52.Z", false},
92
93
94 {"2020-06-09T18:53:52/07:00", false},
95 {"2020-06-09T18:53:52-0:00", false},
96 {"2020-06-09T18:53:52-007:00", false},
97 {"2020-06-09T18:53:52-24:00", false},
98 {"2020-06-09T18:53:52-2x:00", false},
99 {"2020-06-09T18:53:52-:00", false},
100 }
101
View as plain text