Repository navigation
Expand file tree
/
Copy pathdatetime_test.go
More file actions
415 lines (408 loc) · 28.4 KB
/
Copy pathdatetime_test.go
File metadata and controls
415 lines (408 loc) · 28.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
package gnata_test
import (
"strings"
"testing"
)
// fromMillisCases format 2018-04-01T13:45:30.123Z, a Sunday in ISO week 13.
var fromMillisCases = []exprCase{
{expr: `$fromMillis(1522590330123, "[Y,2]")`, want: `"18"`},
// "NaN" in jsonata-js (README known difference #11).
{expr: `$fromMillis(1522590330123, "[Y,2-]")`, want: `"18"`},
{expr: `$fromMillis(1522590330123, "[Y,*-x]")`, want: `"2018"`},
{expr: `$fromMillis(1522590330123, "[Y,2-2]")`, want: `"18"`},
{expr: `$fromMillis(1522590330123, "[Y,0]")`, want: `"2018"`},
{expr: `$fromMillis(1522540800000, "[D,+3]")`, want: `"001"`},
{expr: `$fromMillis(1522590330123, "[Y0001,2]")`, want: `"2018"`},
{expr: `$fromMillis(1522590330123, "[Y9,999,*]")`, want: `"2,018"`},
{expr: `$fromMillis(1522590330123, "[YW]")`, want: `"TWO THOUSAND AND EIGHTEEN"`},
{expr: `$fromMillis(1522590330123, "[Yw]")`, want: `"two thousand and eighteen"`},
{expr: `$fromMillis(1522590330123, "[YA]")`, want: `"BYP"`},
{expr: `$fromMillis(1522590330123, "[Ya]")`, want: `"byp"`},
{expr: `$fromMillis(1522590330123, "[X]")`, want: `"2018"`},
{expr: `$fromMillis(1522590330123, "[MI]")`, want: `"IV"`},
{expr: `$fromMillis(1522590330123, "[Mi]")`, want: `"iv"`},
{expr: `$fromMillis(1522590330123, "[MNn,3-3]")`, want: `"Apr"`},
{expr: `$fromMillis(1522590330123, "[M01,2-2]")`, want: `"04"`},
{expr: `$fromMillis(1522590330123, "[DI]")`, want: `"I"`},
{expr: `$fromMillis(1522590330123, "[DWo]")`, want: `"FIRST"`},
{expr: `$fromMillis(1522590330123, "[Dw]")`, want: `"one"`},
{expr: `$fromMillis(1522590330123, "[DW]")`, want: `"ONE"`},
{expr: `$fromMillis(1522590330123, "[D1o]")`, want: `"1st"`},
{expr: `$fromMillis(1522590330123, "[D01,2o]")`, want: `"01"`},
{expr: `$fromMillis(1522590330123, "[Y,*-2]")`, want: `"18"`},
{expr: `$fromMillis(0, "[Y0.0,*-8]")`, want: `"0.0.0.0.1.9.7.0"`},
{expr: `$fromMillis(1522590330123, "[Y0.0,2-2]")`, want: `"1.8"`},
{expr: `$fromMillis(1522590330123, "[Y0,000,*-6]")`, want: `"002,018"`},
{expr: `$fromMillis(1522590330123, "[Y0,00,*-7]")`, want: `"0,00,20,18"`},
{expr: `$fromMillis(1522590330123, "[Y#0.0.0,*-3]")`, want: `"0.1.8"`},
{expr: `$fromMillis(1522590330123, "[Y0.0#,*-2]")`, want: `"18"`},
{expr: `$fromMillis(1522590330123, "[Y٠.٠,*-4]")`, want: `"٢.٠.١.٨"`},
{expr: `$fromMillis(1522590330123, "[Y,2-4]")`, want: `"2018"`},
{expr: `$fromMillis(1522590330123, "[Ww]")`, want: `"thirteen"`},
{expr: `$fromMillis(1522590330123, "[Hwo]")`, want: `"thirteenth"`},
{expr: `$fromMillis(1522590330123, "[mI]")`, want: `"XLV"`},
{expr: `$fromMillis(1522590330123, "[sWw]")`, want: `"Thirty"`},
{expr: `$fromMillis(1522590330123, "[Fw]")`, want: `"seven"`},
{expr: `$fromMillis(1522590330123, "[hA]")`, want: `"A"`},
{expr: `$fromMillis(1522590330123, "[xn]")`, want: `"march"`},
{expr: `$fromMillis(1522590330123, "[xNn,3-3]")`, want: `"Mar"`},
{expr: `$fromMillis(1522590330123, "[MNn,*-3]")`, want: `"Apr"`},
{expr: `$fromMillis(1522590330123, "[MNn,3]")`, want: `"April"`},
{expr: `$fromMillis(1522590330123, "[MN,*-3]")`, want: `"APR"`},
{expr: `$fromMillis(1522590330123, "[Fn,*-2]")`, want: `"su"`},
{expr: `$fromMillis(1522590330123, "[DN]")`, code: "D3133"},
{expr: `$fromMillis(1522590330123, "[Q]")`, code: "D3132"},
{expr: `$fromMillis(0, "[Z010101]", "+0530")`, code: "D3134"},
{expr: `$fromMillis(0, "[Z0:0-000]", "+0530")`, code: "D3134"},
{expr: `$fromMillis(1522590330123, "[DN] [Q]")`, code: "D3132"},
{expr: `$fromMillis(1522590330123, "[dWo]")`, want: `"NINETY-FIRST"`},
{expr: `$fromMillis(1522590330123, "[dw]")`, want: `"ninety-one"`},
{expr: `$fromMillis(1522590330123, "[dW]")`, want: `"NINETY-ONE"`},
{expr: `$fromMillis(1522590330123, "[d1o]")`, want: `"91st"`},
{expr: `$fromMillis(1522590330123, "[FNn,3]")`, want: `"Sunday"`},
{expr: `$fromMillis(1522590330123, "[FNn,3-3]")`, want: `"Sun"`},
{expr: `$fromMillis(1522590330123, "[FN]")`, want: `"SUNDAY"`},
{expr: `$fromMillis(1522590330123, "[F1]")`, want: `"7"`},
{expr: `$fromMillis(1522590330123, "[w]")`, want: `"5"`},
{expr: `$fromMillis(1522590330123, "[xNn]")`, want: `"March"`},
{expr: `$fromMillis(1522590330123, "[xN]")`, want: `"MARCH"`},
{expr: `$fromMillis(1522590330123, "[x1]")`, want: `"3"`},
{expr: `$fromMillis(1522590330123, "[h]")`, want: `"1"`},
{expr: `$fromMillis(1522590330123, "[P]")`, want: `"pm"`},
{expr: `$fromMillis(1522590330123, "[PN]")`, want: `"PM"`},
{expr: `$fromMillis(1522590330123, "[E]")`, want: `"ISO"`},
{expr: `$fromMillis(1522590330123, "[C]")`, want: `"ISO"`},
{expr: `$fromMillis(1522590330123, "[Do]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[Mt]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[Fc]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[D١,3]")`, want: `"٠٠١"`},
{expr: `$fromMillis(1522590330123, "[M١,3]")`, want: `"٠٠٤"`},
{expr: `$fromMillis(1522590330123, "[Y,10000]") ~> $length`, want: `10000`},
{expr: `$fromMillis(1522590330123, "[Y,10001]")`, code: "D3010"},
{expr: `$fromMillis(1522590330123, "[Y,*-99999999999999999999]")`, code: "D3010"},
{expr: `$fromMillis(1522590330123, "[Y,5000][D,5001]")`, code: "D3010"},
{expr: `$fromMillis(1522590330123, "[Y0,10001-1]")`, want: `"8"`},
{expr: `$fromMillis(1522590330123, "[Y,3-0]")`, want: `"0"`},
{expr: `$fromMillis(1522590330123, "[Db]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[MNn,10001]")`, want: `"April"`},
{expr: `$fromMillis(1522590330123, "[YI,10001]")`, want: `"MMXVIII"`},
{expr: `$fromMillis(1522590330123, "[Ec]")`, want: `"ISO"`},
{expr: `$fromMillis(1522590330123, "[Y#,2]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[D#,3]")`, code: "D3130"},
{expr: `$fromMillis(1522590330123, "[D#1,2]")`, want: `"01"`},
{expr: `$fromMillis(1522590330123, "[f000000000000]")`, want: `"123000000000"`},
{expr: `$fromMillis(1522590330123, "[f,3]")`, want: `"123"`},
{expr: `$fromMillis(1522590330123, "[f,5]")`, want: `"12300"`},
{expr: `$fromMillis(1522590330123, "[f,2-2]")`, want: `"12"`},
{expr: `$fromMillis(1522590330123, "[f01]")`, want: `"12"`},
{expr: `$fromMillis(1522590330123, "[f001o]")`, want: `"123"`},
{expr: `$fromMillis(1522590330123, "[f١٠٠]")`, want: `"١٢٣"`},
{expr: `$fromMillis(1522590330123, "[]")`, code: "D3132"},
{expr: `$fromMillis(1522590330123, "[[x]]")`, want: `"[x]"`},
{expr: `$fromMillis(1522590330123, "a]b")`, want: `"a]b"`},
{expr: `$fromMillis(1522590330123, "[Z]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(1522590330123, "[Z0]", "+0530")`, want: `"+5:30"`},
{expr: `$fromMillis(1522590330123, "[Z0]", "-0500")`, want: `"-5"`},
{expr: `$fromMillis(1522590330123, "[Z01:01]", "+05:30")`, want: `"+05:30"`},
{expr: `$fromMillis(1522590330123, "[Z0101]", "-0500")`, want: `"-0500"`},
{expr: `$fromMillis(0, "[Z0000]", "+0530")`, want: `"+0530"`},
{expr: `$fromMillis(0, "[Z0000]", "-0530")`, want: `"-0530"`},
{expr: `$fromMillis(0, "[Z000]", "+0530")`, want: `"+530"`},
{expr: `$fromMillis(0, "[z0000]", "+0530")`, want: `"GMT+0530"`},
{expr: `$fromMillis(0, "[Z00]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z0:00]", "+0530")`, want: `"+5:30"`},
{expr: `$fromMillis(0, "[Z01:01:01]", "+0530")`, want: `"+00:05:30"`},
{expr: `$fromMillis(0, "[Z0:0-0]", "+0530")`, want: `"+5:3-0"`},
{expr: `$fromMillis(0, "[Z0000]", "+0000")`, want: `"+0000"`},
{expr: `$fromMillis(0, "[Z01;01]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z01;01]", "+0100")`, want: `"+01"`},
{expr: `$fromMillis(0, "[Z01.01]", "+0530")`, want: `"+05.30"`},
{expr: `$fromMillis(0, "[Z,6]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z01:01,2-3]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z#0:00]", "+0530")`, want: `"+5:30"`},
{expr: `$fromMillis(0, "[Z01:01o]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z01:01a]", "+0530")`, want: `"+05:30"`},
{expr: `$fromMillis(0, "[Z01:01t]", "+0000")`, want: `"Z"`},
{expr: `$fromMillis(0, "[z01:01t]", "+0000")`, want: `"Z"`},
{expr: `$fromMillis(0, "[Z01;01t]", "+0000")`, want: `"Z"`},
{expr: `$fromMillis(0, "[Z0t]", "+0000")`, want: `"Z"`},
{expr: `$fromMillis(0, "[Z01t,2]", "+0000")`, want: `"Z"`},
{expr: `$fromMillis(0, "[Z0000t]", "+0100")`, want: `"+0100"`},
{expr: `$fromMillis(0, "[Zt]", "+0000")`, code: "D3134"},
{expr: `$fromMillis(0, "[Zo]", "+0530")`, code: "D3134"},
{expr: `$fromMillis(0, "[ZN]", "+0530")`, code: "D3134"},
{expr: `$fromMillis(0, "[Z;01]", "+0530")`, code: "D3134"},
{expr: `$fromMillis(1522590330123, "[z]", "+0100")`, want: `"GMT+01:00"`},
{expr: `$fromMillis(1522590330123, "[Z]", "Europe/London")`, want: `"+01:00"`},
{expr: `$fromMillis(-1)`, want: `"1969-12-31T23:59:59.999Z"`},
{expr: `$fromMillis(-1500, "[s01].[f001]")`, want: `"58.500"`},
{expr: `$fromMillis()`, want: undefined},
{expr: `$fromMillis(1522590330123, "[Z]", "Bogus/Zone")`, code: "D3137"},
{expr: `$fromMillis(1522590330123, "[Z]", "+05")`, code: "D3137"},
{expr: `$fromMillis(1522590330123, "[Z]", "+ab:cd")`, code: "D3137"},
{expr: `$fromMillis(1522590330123, "[Z]", 5)`, code: "T0410"},
{expr: `$fromMillis(1, 5)`, code: "T0410"},
}
func TestFromMillisPictures(t *testing.T) {
runExprCases(t, fromMillisCases)
}
// toMillisCases parse into epoch milliseconds; 1514764800000 is 2018-01-01T00:00Z
// and 1522540800000 is 2018-04-01T00:00Z.
var toMillisCases = []exprCase{
{expr: `$toMillis("[2018]", "[[[Y]]]")`, want: `1514764800000`},
{expr: `$toMillis("2018", "[][Y]")`, code: "D3132"},
{expr: `$toMillis("MMXVIII", "[YI]")`, want: `1514764800000`},
{expr: `$toMillis("two thousand and eighteen", "[Yw]")`, want: `1514764800000`},
{expr: `$toMillis("nineteen hundred and four", "[Yw]")`, want: `-2082844800000`},
{expr: `$toMillis("one thousand nine hundred and eighty-four", "[Yw]")`, want: `441763200000`},
{expr: `$toMillis("20180401", "[Y0001][M01][D01]")`, want: `1522540800000`},
{expr: `$toMillis("20180401", "[Y,4][M,2][D,2]")`, want: `1522540800000`},
{expr: `$toMillis("2018041", "[Y,4][M,2][D,2]")`, want: `1522540800000`},
{expr: `$toMillis("20180401", "[Y,*-4][M01][D01]")`, want: `1522540800000`},
{expr: `$toMillis("20184", "[Y,2-][M01]")`, want: `1522540800000`},
{expr: `$toMillis("201804", "[Y,2-][M01]")`, want: `574659964800000`},
{expr: `$toMillis("201804", "[Y,*-x][M01]")`, want: `574659964800000`},
{expr: `$toMillis("201804", "[Y,*-0][M01]")`, want: `574659964800000`},
{expr: `$toMillis("201804", "[Y,4-*][M01]")`, want: `1522540800000`},
{expr: `$toMillis("20180401", "[Y,+4][M01][D01]")`, want: `1522540800000`},
{expr: `$toMillis("201804", "[Y,*-+4][M]")`, want: `1522540800000`},
{expr: `$toMillis("2018 041", "[Y] [M,+2][D]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 IV", "[Y]-[M]-[D] [FI]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 four", "[Y]-[M]-[D] [Fw]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 d", "[Y]-[M]-[D] [Fa]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 4", "[Y]-[M]-[D] [FI]")`, want: undefined},
{expr: `$toMillis("2018 04IV", "[Y] [M,2][DI]")`, want: `1522800000000`},
{expr: `$toMillis("2018 4IV", "[Y] [M,2][DI]")`, want: undefined},
{expr: `$toMillis("201804011", "[Y0001][M01][D01]")`, want: `1523404800000`},
{expr: `$toMillis("02018-4", "[Y0001]-[M01]")`, want: `1522540800000`},
{expr: `$toMillis("2018-004", "[Y]-[M01]")`, want: `1522540800000`},
{expr: `$toMillis("2018 0401", "[Y] [M,2][D]")`, want: `1522540800000`},
{expr: `$toMillis("72018-04-01", "[F1][Y]-[M]-[D]")`, want: `1522540800000`},
{expr: `$toMillis("2018 IV1", "[Y] [MI][D]")`, want: `1522540800000`},
{expr: `$toMillis("2018 04th1", "[Y] [M01o][D]")`, want: `1522540800000`},
{expr: `$toMillis("2018-1-1 1:2:3.1234", "[Y]-[M]-[D] [H]:[m]:[s].[f001]")`, want: `1514768523123`},
{expr: `$toMillis("2018-1-1 1:2:3.12345678901234567890", "[Y]-[M]-[D] [H]:[m]:[s].[f]")`, want: `1514768523123`},
{expr: `$toMillis("2018-1-1 1:2:3.5", "[Y]-[M]-[D] [H]:[m]:[s].[fI]")`, want: `1514768523500`},
{expr: `$toMillis("2018-1-1 1:2:3.X", "[Y]-[M]-[D] [H]:[m]:[s].[fI]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:30:051231", "[Y]-[M]-[D] [H01]:[m01]:[s01][f001][H]")`, want: `1522546205123`},
{expr: `$toMillis("2018-04-01 10:30:05.12345", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][m01][D]")`, want: `1522924445120`},
{expr: `$toMillis("2018-04-01 10:30:05.12345IV", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][m01][DI]")`, want: `1522838705123`},
{expr: `$toMillis("2018-04-01 10:30:05.123", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][m01][D]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:30:05.1234th10", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][D1o][H]")`, want: `1522837805123`},
{expr: `$toMillis("201804th1", "[Y,*-x][M01o][D]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 10:30:05.1235", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][f]")`, want: `1522578605500`},
{expr: `$toMillis("2018-04-01 10:30:05+00005", "[Y]-[M]-[D] [H01]:[m01]:[s01][Z0101][f]")`, want: `1522578605500`},
{expr: `$toMillis("2018-04-01T10:30:05.123455", "[Y]-[M]-[D]T[H01]:[m01]:[s01].[f][m01]5")`, want: `1522577105123`},
{expr: `$toMillis("2018-04-01 10:30+02:300", "[Y]-[M]-[D] [H01]:[m01][Z]0")`, want: `1522569600000`},
{expr: `$toMillis("2018-04-01 10:300", "[Y]-[M]-[D] [H01]:[m]0")`, want: `1522578600000`},
{expr: `$toMillis("2018-04-01 10:30:05.1205x", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]0[s]x")`, want: `1522578605120`},
{expr: `$toMillis("2018-04-01 10:30:05.12x", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]0x")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:30:05.12050x", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]0[s]x")`, want: `1522578650120`},
{expr: `$toMillis("2018-04-01 10:30:05.12535", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]5[m]")`, want: `1522578905120`},
{expr: `$toMillis("2018-04-01 10:3055", "[Y]-[M]-[D] [H01]:[m]5[s]")`, want: `1522578605000`},
{expr: `$toMillis("2018-04-01 10:30:05.123٤", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]")`, want: undefined},
{expr: `$toMillis("2018 ٤", "[Y] [F1]")`, want: undefined},
{expr: `$toMillis("2018 04 1st", "[Y] [M01] [F1o]")`, want: `1522540800000`},
{expr: `$toMillis("2018 13th", "[Y] [W1o]")`, want: `1514764800000`},
{expr: `$toMillis("2018 1", "[Y] [F1o]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:30:05.555511", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f][f]5[f]")`, want: `1522578605110`},
{expr: `$toMillis("2018-04-01 10:30:05.55353635", "[Y]-[M]-[D] [H01]:[m01]:[s01].[f]5[m]5[s]")`, want: `1522580615500`},
{expr: `$toMillis("2018-04-01T10:30:05.312453511", "[Y]-[M]-[D]T[H]:[m]:[s].[f][D]5[m]")`, want: `1522750265312`},
{expr: `$toMillis("2018-04-01 10+54545", "[Y]-[M]-[D] [H][Z0101][m]5[s]")`, want: `1522559085000`},
{expr: `$toMillis("2018-04-01T+0151500034", "[Y]-[M]-[D]T[Z0101][H01][d]")`, want: `1519458000000`},
{expr: `$toMillis("2018 IVIII", "[Y] [MI][DI]")`, want: `1527811200000`},
{expr: `$toMillis("AX` + strings.Repeat("M", 66) + `", "[MA]X[YI]")`, want: `2020591612800000`},
// A picture far longer than any real one matches without deep recursion.
{expr: `$toMillis("` + strings.Repeat("1-", 50_000) + `", "` + strings.Repeat("[D]-", 50_000) + `")`, want: `1790812800000`},
// Word numbers read a bounded window, so this stays linear.
{expr: `$toMillis("` + strings.Repeat("one ", 4000) + `x", "` + strings.Repeat("[Fw] ", 2000) + `y")`, want: undefined},
// Exhausts the step budget (README known difference #34).
{expr: `$toMillis("` + strings.Repeat("I", 1600) + `x", "` + strings.Repeat("[MI]I", 800) + `y")`, want: undefined},
{expr: `$toMillis("A` + strings.Repeat("M", 20) + ` 2018", "[MA] [Y]")`, want: `null`},
{expr: `$toMillis("2018-04-01T10:00+05:30", "[Y]-[M]-[D]T[H]:[m][Z01:01;c]")`, want: `1522557000000`},
{expr: `$toMillis("2018-04-01T10:00+05", "[Y]-[M]-[D]T[H]:[m][Z01;01]")`, want: `1522558800000`},
{expr: `$toMillis("2018-04-01T10:00+05;30", "[Y]-[M]-[D]T[H]:[m][Z01;01]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+0530", "[Y]-[M]-[D]T[H]:[m][Z01;01]")`, want: `1522557000000`},
{expr: `$toMillis("2018-04-01T10:00GMT+05;30", "[Y]-[M]-[D]T[H]:[m][z01;01]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+05:30", "[Y]-[M]-[D]T[H]:[m][Z01:01;01]")`, want: `1522557000000`},
// 2019-01-01 and 2017-12-31 where jsonata-js gives 2018-01-01 (README
// known difference #35).
{expr: `$toMillis("2018-366", "[Y]-[d]")`, want: `1546300800000`},
{expr: `$toMillis("2018-000", "[Y]-[d]")`, want: `1514678400000`},
{
expr: `$toMillis("10:30:05.5` + strings.Repeat("0", 70) + `", "[H01]:[m01]:[s01].[f]` + strings.Repeat("0", 70) + `") % 86400000`,
want: `37805500`,
},
{
expr: `$toMillis("10:30:05.5` + strings.Repeat("0", 69) + `51", "[H01]:[m01]:[s01].[f][s,70][H]") % 86400000`,
want: `5405500`,
},
{expr: `$toMillis("2018 cab", "[Y] [Ma][Da]")`, want: `1719878400000`},
{expr: `$toMillis("275760-09-13", "[Y]-[M]-[D]")`, want: `8640000000000000`},
{expr: `$toMillis("275760-09-13T00:00-01:00", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `8640000003600000`},
{expr: `$toMillis("2018-04-01 10:99999999", "[Y]-[M]-[D] [H]:[m]")`, want: `7522576740000`},
{expr: `$toMillis("275760-09-14", "[Y]-[M]-[D]")`, want: `null`},
{expr: `$toMillis("275760-09-14T00:00+01:00", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `null`},
{expr: `$toMillis("2018-04-9999999999", "[Y]-[M]-[D]")`, want: `null`},
{expr: `$toMillis("2018-04-01 99999999999999999", "[Y]-[M]-[D] [H]")`, want: `null`},
{expr: `$toMillis("2018-04-01 99999999999999999999pm", "[Y]-[M]-[D] [h][P]")`, want: `null`},
{expr: `$toMillis("2018-04-99999999999999999999999", "[Y]-[M]-[D]")`, want: `null`},
{expr: `$toMillis("2018 04TH1", "[Y] [M01o][D]")`, want: `1522540800000`},
{expr: `$toMillis("2018-4 1nd", "[Y]-[M] [D1o]")`, want: `1522540800000`},
{expr: `$toMillis("2018 041", "[Y] [M01o][D]")`, want: undefined},
{expr: `$toMillis("20180401", "[Y0001o][M01][D01]")`, want: undefined},
{expr: `$toMillis("2018-4 1", "[Y]-[M] [D1o]")`, want: undefined},
{expr: `$toMillis("2018-4 1s", "[Y]-[M] [D1o]")`, want: undefined},
{expr: `$toMillis("2018 April", "[Y] [MNn]")`, want: `1522540800000`},
{expr: `$toMillis("2018 Apr", "[Y] [MNn,3-3]")`, want: `1522540800000`},
{expr: `$toMillis("2018 April", "[Y] [MNn,3-3]")`, want: `1522540800000`},
{expr: `$toMillis("2018 Mayday", "[Y] [MNn,3-3]")`, want: `1525132800000`},
{expr: `$toMillis("2018 Apr", "[Y] [MNn,*-3x]")`, want: `1522540800000`},
{expr: `$toMillis("2018 Apr", "[Y] [MNn,*-+3]")`, want: `1522540800000`},
{expr: `$toMillis("2018 April", "[Y] [MNn,3]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 10am", "[Y]-[M]-[D] [h][P1]")`, want: `1522576800000`},
{expr: `$toMillis("2018-04-01 10pm", "[Y]-[M]-[D] [h][P01]")`, want: `1522620000000`},
{expr: `$toMillis("1AprT2018", "[D][MNn,3-3]T[Y]")`, want: `1522540800000`},
{expr: `$toMillis("1 Apra 2018", "[D] [MNn,3-3]a [Y]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01 SundayT", "[Y]-[M]-[D] [FNn]T")`, want: `1522540800000`},
{
expr: `$toMillis("2018-04-01 Sunday` + strings.Repeat("x", 64) + `", "[Y]-[M]-[D] [FNn]` + strings.Repeat("x", 64) + `")`,
want: `1522540800000`,
},
{expr: `$toMillis("May 2020", "[Mn,3-3] [Y]")`, want: `1588291200000`},
{expr: `$toMillis("2020-c-01", "[Y]-[Mao]-[D]")`, want: `1583020800000`},
{expr: `$toMillis("2026-01-01 12 gmt+01:00", "[Y]-[M]-[D] [H] [z]")`, want: `1767265200000`},
{expr: `$toMillis(s, "[FNn][Z]")`, data: `{"s":"` + strings.Repeat("a", 200_000) + `"}`, want: undefined},
{expr: `$exists($toMillis(s, "[FNn][Da]"))`, data: `{"s":"` + strings.Repeat("a", 200_000) + `"}`, want: `true`},
{expr: `$toMillis("2018-04-01", "[Y]-[M]-[D#]")`, code: "D3130"},
{expr: `$toMillis("2018 1", "[Y] [D#,3]")`, code: "D3130"},
{expr: `$toMillis("1", "[Db]")`, code: "D3130"},
{expr: `$toMillis("2018-04-01 1am", "[Y]-[M]-[D] [h][P#]")`, want: `1522544400000`},
{expr: `$toMillis("2018-04-01SundaySun", "[Y]-[M]-[D][FNn][FNn,3-3]")`, want: `1522540800000`},
{expr: `$toMillis("1 Apré", "[D] [MNn,3-3]")`, want: undefined},
{expr: `$toMillis("1 Apr", "[D] [MNn]r")`, want: undefined},
{expr: `$toMillis("2018", "[Y,20000]")`, want: `1514764800000`},
// Year 18, not 1918 as in jsonata-js (README known difference #12).
{expr: `$toMillis("18", "[Y01]")`, want: `-61599139200000`},
{expr: `$toMillis("2018 x", "[Y] [fN]")`, want: undefined},
{expr: `$toMillis("2018-04-1st", "[Y]-[M01]-[D1o,2]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-one", "[Y]-[M01]-[Dw,2]")`, want: `1522540800000`},
{expr: `$toMillis("2018 IV", "[Y] [MI,2]")`, want: `1522540800000`},
{expr: `$toMillis("2018 d", "[Y] [Ma,1]")`, want: `1522540800000`},
{expr: `$toMillis("2018-1-1 13 pm", "[Y]-[M]-[D] [h] [P]")`, want: `1514854800000`},
{expr: `$toMillis("2018 x", "[Y] [MI]")`, want: `1538352000000`},
{expr: `$toMillis("2018-4 1st", "[Y]-[M] [D1o]")`, want: `1522540800000`},
{expr: `$toMillis("2018-4 first", "[Y]-[M] [Dwo]")`, want: `1522540800000`},
{expr: `$toMillis("2018-4 twenty-first", "[Y]-[M] [Dwo]")`, want: `1524268800000`},
{expr: `$toMillis("2018-4 thirtieth", "[Y]-[M] [Dwo]")`, want: `1525046400000`},
{expr: `$toMillis("2018-4 d", "[Y]-[M] [Da]")`, want: `1522800000000`},
{expr: `$toMillis("2018-4 ab", "[Y]-[M] [DA]")`, want: `1524873600000`},
{expr: `$toMillis("2018-4 x", "[Y]-[M] [DI]")`, want: `1523318400000`},
{expr: `$toMillis("2018-091", "[Y]-[d]")`, want: `1522540800000`},
{expr: `$toMillis("2018-091+01:00", "[Y]-[d001][Z]")`, want: `1522537200000`},
{expr: `$toMillis("2018-1-1 1:2:3.5", "[Y]-[M]-[D] [H]:[m]:[s].[f1]")`, want: `1514768523500`},
{expr: `$toMillis("2018-1-1 1:2:3.123456", "[Y]-[M]-[D] [H]:[m]:[s].[f000001]")`, want: `1514768523123`},
{expr: `$toMillis("2018-1-1 12 am", "[Y]-[M]-[D] [h] [P]")`, want: `1514764800000`},
{expr: `$toMillis("2018-1-1 12 pm", "[Y]-[M]-[D] [h] [P]")`, want: `1514808000000`},
{expr: `$toMillis("2018-1-1 1 PM", "[Y]-[M]-[D] [h] [P]")`, want: `1514811600000`},
{expr: `$toMillis("2018-1-1 1", "[Y]-[M]-[D] [h]")`, code: "D3136"},
{expr: `$toMillis("2018 91 10", "[Y] [d] [H]")`, want: `1522576800000`},
{expr: `$toMillis("2018-4-1 Blah", "[Y]-[M]-[D] [FNn]")`, want: `1522540800000`},
{expr: `$toMillis("2018 13", "[Y] [W]")`, want: `1514764800000`},
{expr: `$toMillis("04-01", "[M]-[D]") = $toMillis($now("[Y]") & "-04-01", "[Y]-[M]-[D]")`, want: `true`},
{expr: `$toMillis("Sunday 2018-04-01", "[FNn] [Y]-[M]-[D]")`, want: `1522540800000`},
{expr: `$toMillis("Sun 2018-04-01", "[FNn,3-3] [Y]-[M]-[D]")`, want: `1522540800000`},
{expr: `$toMillis("7 2018-04-01", "[F1] [Y]-[M]-[D]")`, want: `1522540800000`},
{expr: `$toMillis("2018-04-01T10:00+05:30", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `1522557000000`},
{expr: `$toMillis("2018-04-01T10:00-0500", "[Y]-[M]-[D]T[H]:[m][Z0101]")`, want: `1522594800000`},
{expr: `$toMillis("2018-04-01T10:00Z", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `1522576800000`},
{expr: `$toMillis("2018-04-01T10:00GMT+01:00", "[Y]-[M]-[D]T[H]:[m][z]")`, want: `1522573200000`},
{expr: `$toMillis("2018-04-01T10:00GMT-02", "[Y]-[M]-[D]T[H]:[m][z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00GMT-0200", "[Y]-[M]-[D]T[H]:[m][z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00GMT", "[Y]-[M]-[D]T[H]:[m][z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00GMTZ", "[Y]-[M]-[D]T[H]:[m][z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00GMT-02", "[Y]-[M]-[D]T[H]:[m][z0101]")`, want: `1522584000000`},
{expr: `$toMillis("2018-04-01T10:00GMT-0200", "[Y]-[M]-[D]T[H]:[m][z0101]")`, want: `1522584000000`},
{expr: `$toMillis("2018-04-01T10:00GMT-02:00", "[Y]-[M]-[D]T[H]:[m][z0101]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02:", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+053", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+05300", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+053", "[Y]-[M]-[D]T[H]:[m][Z0101]")`, want: `1522558620000`},
{expr: `$toMillis("2018-04-01T10:00-02", "[Y]-[M]-[D]T[H]:[m][Z0101]")`, want: `1522584000000`},
{expr: `$toMillis("2018-04-01 10+02:005", "[Y]-[M]-[D] [H][Z][m]")`, want: `1522569900000`},
{expr: `$toMillis("2018-04-01 10GMT+02:005", "[Y]-[M]-[D] [H][z][m]")`, want: `1522569900000`},
{expr: `$toMillis("2018-04-01 10+02:3005", "[Y]-[M]-[D] [H][Z][m01]")`, want: `1522551900000`},
{expr: `$toMillis("2018-04-01 10+05305", "[Y]-[M]-[D] [H][Z0101][m]")`, want: `1522557300000`},
{expr: `$toMillis("2018-04-01 10+02:5", "[Y]-[M]-[D] [H][Z][m]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02:00", "[Y]-[M]-[D]T[H]:[m][Z0101]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02.00", "[Y]-[M]-[D]T[H]:[m][Z01.01]")`, want: `1522584000000`},
{expr: `$toMillis("2018-04-01T10:00-0200", "[Y]-[M]-[D]T[H]:[m][ZN]")`, want: `1522584000000`},
{expr: `$toMillis("2018-04-01T10:00-02:00", "[Y]-[M]-[D]T[H]:[m][ZN]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02:00", "[Y]-[M]-[D]T[H]:[m][Z#:#]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+123:05", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `1522133700000`},
{expr: `$toMillis("2018-04-01T10:00+1:005", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `1522572900000`},
{expr: `$toMillis("2018-04-01T10:00+596523:00", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `-624906000000`},
// The next four differ from jsonata-js (README known differences #4 and #15).
{expr: `$toMillis("2018-04-01T10:00+596524:00", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00+99999999999999999999:00", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10+05:10000000005", "[Y]-[M]-[D] [H][Z][m]")`, want: undefined},
{expr: `$toMillis("2018-04-01T10:00-02:30", "[Y]-[M]-[D]T[H]:[m][Z]")`, want: `1522585800000`},
{expr: `$toMillis("13:45", "[H]:[m]") % 86400000`, want: `49500000`},
{expr: `$toMillis("2018", "[Y")`, code: "D3135"},
{expr: `$toMillis("2018xyz", "[Y]")`, want: undefined},
{expr: `$toMillis("-2018", "[Y]")`, want: undefined},
{expr: `$toMillis("2018-4 xx", "[Y]-[M] [Dw]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:00x", "[Y]-[M]-[D] [H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-04-01 10:00+x", "[Y]-[M]-[D] [H]:[m][Z]")`, want: undefined},
{expr: `$toMillis("2018-4-1 1", "[Y]-[M]-[D] [FNn]")`, want: undefined},
{expr: `$toMillis("2018", "[Y]-")`, want: undefined},
{expr: `$toMillis("2018x", "[Y]-")`, want: undefined},
{expr: `$toMillis("x", "[Y]")`, want: undefined},
{expr: `$toMillis("2018-x", "[Y]-[M]")`, want: undefined},
{expr: `$toMillis("2018-x", "[Y]-[MNn]")`, want: undefined},
{expr: `$toMillis("2018-04-x", "[Y]-[M]-[D]")`, want: undefined},
{expr: `$toMillis("2018-4 xst", "[Y]-[M] [D1o]")`, want: undefined},
{expr: `$toMillis("2018-4 2", "[Y]-[M] [Da]")`, want: undefined},
{expr: `$toMillis("2018-x", "[Y]-[d]")`, want: undefined},
{expr: `$toMillis("2018 x", "[Y] [H]")`, want: undefined},
{expr: `$toMillis("2018 x", "[Y] [h]")`, want: undefined},
{expr: `$toMillis("2018 1:x", "[Y] [H]:[m]")`, want: undefined},
{expr: `$toMillis("2018 1:2:x", "[Y] [H]:[m]:[s]")`, want: undefined},
{expr: `$toMillis("2018 1:2:3.x", "[Y] [H]:[m]:[s].[f]")`, want: undefined},
{expr: `$toMillis("2018 1", "[Y] [h] [P]")`, want: undefined},
{expr: `$toMillis("2018 1 a", "[Y] [h] [P]")`, want: undefined},
{expr: `$toMillis("2018 1 xm", "[Y] [h] [P]")`, want: undefined},
{expr: `$toMillis()`, want: undefined},
{expr: `$toMillis("2018-4 1st", "[Y] [D1o]")`, want: undefined},
{expr: `$toMillis("2018 1", "[Y] [D]")`, code: "D3136"},
{expr: `$toMillis("2018-04-01 1:2", "[Y]-[M]-[D] [H]:[s]")`, code: "D3136"},
{expr: `$toMillis("2018 13", "[X] [W]")`, code: "D3136"},
{expr: `$toMillis("2018", "[Q]")`, code: "D3132"},
{expr: `$toMillis("2018", "[YN]")`, code: "D3133"},
{expr: `$toMillis("2018 x", "[Y] [HN]")`, code: "D3133"},
{expr: `$toMillis("2018 ISO", "[Y] [C]")`, code: "D3133"},
{expr: `$toMillis("2018 ", "[Y] [C1]")`, code: "D3133"},
{expr: `$toMillis("2018 x", "[Y] [E1]")`, code: "D3133"},
{expr: `$toMillis("2018 x", "[Y] [Wo]")`, code: "D3130"},
{expr: `$toMillis(5)`, code: "T0410"},
{expr: `$toMillis("2018", 5)`, code: "T0410"},
}
func TestToMillisPictures(t *testing.T) {
runExprCases(t, toMillisCases)
}
var clockCases = []exprCase{
{expr: `$type($millis())`, want: `"number"`},
{expr: `$length($now("[Y0001]"))`, want: `4`},
{expr: `$length($now())`, want: `24`},
{expr: `$count($distinct([1..500].$millis()))`, want: `1`},
{expr: `$count($distinct([1..500].$now()))`, want: `1`},
{expr: `$toMillis($now()) = $millis()`, want: `true`},
{expr: `$now("[Z]", "+0100")`, want: `"+01:00"`},
{expr: `$now(5)`, code: "T0410"},
{expr: `$now("[Y]", "Bogus/Zone")`, code: "D3137"},
{expr: `$now("[Q", "+0100")`, code: "D3135"},
}
func TestClockFunctions(t *testing.T) {
runExprCases(t, clockCases)
}