1
2
3 package date
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import (
20 "bytes"
21 "encoding/binary"
22 "encoding/json"
23 "fmt"
24 "math"
25 "testing"
26 "time"
27 )
28
29 func ExampleUnixTime_MarshalJSON() {
30 epoch := UnixTime(UnixEpoch())
31 text, _ := json.Marshal(epoch)
32 fmt.Print(string(text))
33
34 }
35
36 func ExampleUnixTime_UnmarshalJSON() {
37 var myTime UnixTime
38 json.Unmarshal([]byte("1.3e2"), &myTime)
39 fmt.Printf("%v", time.Time(myTime))
40
41 }
42
43 func TestUnixTime_MarshalJSON(t *testing.T) {
44 testCases := []time.Time{
45 UnixEpoch().Add(-1 * time.Second),
46 time.Date(2017, time.April, 14, 20, 27, 47, 0, time.UTC),
47 UnixEpoch(),
48 time.Date(1800, 01, 01, 0, 0, 0, 0, time.UTC),
49 time.Date(2200, 12, 29, 00, 01, 37, 82, time.UTC),
50 }
51
52 for _, tc := range testCases {
53 t.Run(tc.String(), func(subT *testing.T) {
54 var actual, expected float64
55 var marshaled []byte
56
57 target := UnixTime(tc)
58 expected = float64(target.Duration().Nanoseconds()) / 1e9
59
60 if temp, err := json.Marshal(target); err == nil {
61 marshaled = temp
62 } else {
63 subT.Error(err)
64 return
65 }
66
67 dec := json.NewDecoder(bytes.NewReader(marshaled))
68 if err := dec.Decode(&actual); err != nil {
69 subT.Error(err)
70 return
71 }
72
73 diff := math.Abs(actual - expected)
74 subT.Logf("\ngot :\t%g\nwant:\t%g\ndiff:\t%g", actual, expected, diff)
75 if diff > 1e-9 {
76 subT.Fail()
77 }
78 })
79 }
80 }
81
82 func TestUnixTime_UnmarshalJSON(t *testing.T) {
83 testCases := []struct {
84 text string
85 expected time.Time
86 }{
87 {"1", UnixEpoch().Add(time.Second)},
88 {"0", UnixEpoch()},
89 {"1492203742", time.Date(2017, time.April, 14, 21, 02, 22, 0, time.UTC)},
90 {"-1", time.Date(1969, time.December, 31, 23, 59, 59, 0, time.UTC)},
91 {"1.5", UnixEpoch().Add(1500 * time.Millisecond)},
92 {"0e1", UnixEpoch()},
93 {"1.3e+2", UnixEpoch().Add(130 * time.Second)},
94 {"1.6E-10", UnixEpoch()},
95 {"2E-6", UnixEpoch().Add(2 * time.Microsecond)},
96 {"1.289345e9", UnixEpoch().Add(1289345000 * time.Second)},
97 {"1e-9", UnixEpoch().Add(time.Nanosecond)},
98 }
99
100 for _, tc := range testCases {
101 t.Run(tc.text, func(subT *testing.T) {
102 var rehydrated UnixTime
103 if err := json.Unmarshal([]byte(tc.text), &rehydrated); err != nil {
104 subT.Error(err)
105 return
106 }
107
108 if time.Time(rehydrated) != tc.expected {
109 subT.Logf("\ngot: \t%v\nwant:\t%v\ndiff:\t%v", time.Time(rehydrated), tc.expected, time.Time(rehydrated).Sub(tc.expected))
110 subT.Fail()
111 }
112 })
113 }
114 }
115
116 func TestUnixTime_JSONRoundTrip(t *testing.T) {
117 testCases := []time.Time{
118 UnixEpoch(),
119 time.Date(2005, time.November, 5, 0, 0, 0, 0, time.UTC),
120 UnixEpoch().Add(-6 * time.Second),
121 UnixEpoch().Add(800 * time.Hour),
122 UnixEpoch().Add(time.Nanosecond),
123 time.Date(2015, time.September, 05, 4, 30, 12, 9992, time.UTC),
124 }
125
126 for _, tc := range testCases {
127 t.Run(tc.String(), func(subT *testing.T) {
128 subject := UnixTime(tc)
129 var marshaled []byte
130 if temp, err := json.Marshal(subject); err == nil {
131 marshaled = temp
132 } else {
133 subT.Error(err)
134 return
135 }
136
137 var unmarshaled UnixTime
138 if err := json.Unmarshal(marshaled, &unmarshaled); err != nil {
139 subT.Error(err)
140 }
141
142 actual := time.Time(unmarshaled)
143 diff := actual.Sub(tc)
144 subT.Logf("\ngot :\t%s\nwant:\t%s\ndiff:\t%s", actual.String(), tc.String(), diff.String())
145
146 if diff > time.Duration(100) {
147 subT.Fail()
148 }
149 })
150 }
151 }
152
153 func TestUnixTime_MarshalBinary(t *testing.T) {
154 testCases := []struct {
155 expected int64
156 subject time.Time
157 }{
158 {0, UnixEpoch()},
159 {-15 * int64(time.Second), UnixEpoch().Add(-15 * time.Second)},
160 {54, UnixEpoch().Add(54 * time.Nanosecond)},
161 }
162
163 for _, tc := range testCases {
164 t.Run("", func(subT *testing.T) {
165 var marshaled []byte
166
167 if temp, err := UnixTime(tc.subject).MarshalBinary(); err == nil {
168 marshaled = temp
169 } else {
170 subT.Error(err)
171 return
172 }
173
174 var unmarshaled int64
175 if err := binary.Read(bytes.NewReader(marshaled), binary.LittleEndian, &unmarshaled); err != nil {
176 subT.Error(err)
177 return
178 }
179
180 if unmarshaled != tc.expected {
181 subT.Logf("\ngot: \t%d\nwant:\t%d", unmarshaled, tc.expected)
182 subT.Fail()
183 }
184 })
185 }
186 }
187
188 func TestUnixTime_BinaryRoundTrip(t *testing.T) {
189 testCases := []time.Time{
190 UnixEpoch(),
191 UnixEpoch().Add(800 * time.Minute),
192 UnixEpoch().Add(7 * time.Hour),
193 UnixEpoch().Add(-1 * time.Nanosecond),
194 }
195
196 for _, tc := range testCases {
197 t.Run(tc.String(), func(subT *testing.T) {
198 original := UnixTime(tc)
199 var marshaled []byte
200
201 if temp, err := original.MarshalBinary(); err == nil {
202 marshaled = temp
203 } else {
204 subT.Error(err)
205 return
206 }
207
208 var traveled UnixTime
209 if err := traveled.UnmarshalBinary(marshaled); err != nil {
210 subT.Error(err)
211 return
212 }
213
214 if traveled != original {
215 subT.Logf("\ngot: \t%s\nwant:\t%s", time.Time(original).String(), time.Time(traveled).String())
216 subT.Fail()
217 }
218 })
219 }
220 }
221
222 func TestUnixTime_MarshalText(t *testing.T) {
223 testCases := []time.Time{
224 UnixEpoch(),
225 UnixEpoch().Add(45 * time.Second),
226 UnixEpoch().Add(time.Nanosecond),
227 UnixEpoch().Add(-100000 * time.Second),
228 }
229
230 for _, tc := range testCases {
231 expected, _ := tc.MarshalText()
232 t.Run("", func(subT *testing.T) {
233 var marshaled []byte
234
235 if temp, err := UnixTime(tc).MarshalText(); err == nil {
236 marshaled = temp
237 } else {
238 subT.Error(err)
239 return
240 }
241
242 if string(marshaled) != string(expected) {
243 subT.Logf("\ngot: \t%s\nwant:\t%s", string(marshaled), string(expected))
244 subT.Fail()
245 }
246 })
247 }
248 }
249
250 func TestUnixTime_TextRoundTrip(t *testing.T) {
251 testCases := []time.Time{
252 UnixEpoch(),
253 UnixEpoch().Add(-1 * time.Nanosecond),
254 UnixEpoch().Add(1 * time.Nanosecond),
255 time.Date(2017, time.April, 17, 21, 00, 00, 00, time.UTC),
256 }
257
258 for _, tc := range testCases {
259 t.Run(tc.String(), func(subT *testing.T) {
260 unixTC := UnixTime(tc)
261
262 var marshaled []byte
263
264 if temp, err := unixTC.MarshalText(); err == nil {
265 marshaled = temp
266 } else {
267 subT.Error(err)
268 return
269 }
270
271 var unmarshaled UnixTime
272 if err := unmarshaled.UnmarshalText(marshaled); err != nil {
273 subT.Error(err)
274 return
275 }
276
277 if unmarshaled != unixTC {
278 t.Logf("\ngot: \t%s\nwant:\t%s", time.Time(unmarshaled).String(), tc.String())
279 t.Fail()
280 }
281 })
282 }
283 }
284
View as plain text