@@ -162,90 +162,93 @@ fn disallows_notallowed() {
162
162
163
163
#[ test]
164
164
fn test_duration_year ( ) {
165
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 2019 ) ) , duration_year( b"2019 " ) ) ;
166
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_year( b"0 " ) ) ;
167
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 10000 ) ) , duration_year( b"10000 " ) ) ;
165
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 2019 ) ) , duration_year( b"2019Y " ) ) ;
166
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_year( b"0Y " ) ) ;
167
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 10000 ) ) , duration_year( b"10000Y " ) ) ;
168
168
assert ! ( duration_year( b"abcd" ) . is_err( ) ) ;
169
169
assert ! ( duration_year( b"-1" ) . is_err( ) ) ;
170
170
}
171
171
172
172
#[ test]
173
173
fn test_duration_month ( ) {
174
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 6 ) ) , duration_month( b"6 " ) ) ;
175
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_month( b"0 " ) ) ;
176
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 12 ) ) , duration_month( b"12 " ) ) ;
174
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 6 ) ) , duration_month( b"6M " ) ) ;
175
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_month( b"0M " ) ) ;
176
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 12 ) ) , duration_month( b"12M " ) ) ;
177
177
assert ! ( duration_month( b"ab" ) . is_err( ) ) ;
178
178
assert ! ( duration_month( b"-1" ) . is_err( ) ) ;
179
179
assert ! ( duration_month( b"13" ) . is_err( ) ) ;
180
180
}
181
181
182
182
#[ test]
183
183
fn test_duration_week ( ) {
184
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 26 ) ) , duration_week( b"26 " ) ) ;
185
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_week( b"0 " ) ) ;
186
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 52 ) ) , duration_week( b"52 " ) ) ;
184
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 26 ) ) , duration_week( b"26W " ) ) ;
185
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_week( b"0W " ) ) ;
186
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 52 ) ) , duration_week( b"52W " ) ) ;
187
187
assert ! ( duration_week( b"ab" ) . is_err( ) ) ;
188
188
assert ! ( duration_week( b"-1" ) . is_err( ) ) ;
189
189
assert ! ( duration_week( b"53" ) . is_err( ) ) ;
190
190
}
191
191
192
192
#[ test]
193
193
fn test_duration_day ( ) {
194
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 16 ) ) , duration_day( b"16 " ) ) ;
195
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_day( b"0 " ) ) ;
196
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 31 ) ) , duration_day( b"31 " ) ) ;
194
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 16 ) ) , duration_day( b"16D " ) ) ;
195
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_day( b"0D " ) ) ;
196
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 31 ) ) , duration_day( b"31D " ) ) ;
197
197
assert ! ( duration_day( b"ab" ) . is_err( ) ) ;
198
198
assert ! ( duration_day( b"-1" ) . is_err( ) ) ;
199
199
assert ! ( duration_day( b"32" ) . is_err( ) ) ;
200
200
}
201
201
202
202
#[ test]
203
203
fn test_duration_hour ( ) {
204
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 12 ) ) , duration_hour( b"12 " ) ) ;
205
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_hour( b"0 " ) ) ;
206
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 24 ) ) , duration_hour( b"24 " ) ) ;
204
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 12 ) ) , duration_hour( b"12H " ) ) ;
205
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_hour( b"0H " ) ) ;
206
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 24 ) ) , duration_hour( b"24H " ) ) ;
207
207
assert ! ( duration_hour( b"ab" ) . is_err( ) ) ;
208
208
assert ! ( duration_hour( b"-1" ) . is_err( ) ) ;
209
209
assert ! ( duration_hour( b"25" ) . is_err( ) ) ;
210
210
}
211
211
212
212
#[ test]
213
213
fn test_duration_minute ( ) {
214
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 30 ) ) , duration_minute( b"30 " ) ) ;
215
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_minute( b"0 " ) ) ;
216
- assert_eq ! ( Ok ( ( & [ ] [ ..] , 60 ) ) , duration_minute( b"60 " ) ) ;
214
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 30 ) ) , duration_minute( b"30M " ) ) ;
215
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 0 ) ) , duration_minute( b"0M " ) ) ;
216
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , 60 ) ) , duration_minute( b"60M " ) ) ;
217
217
assert ! ( duration_minute( b"ab" ) . is_err( ) ) ;
218
218
assert ! ( duration_minute( b"-1" ) . is_err( ) ) ;
219
219
assert ! ( duration_minute( b"61" ) . is_err( ) ) ;
220
220
}
221
221
222
222
#[ test]
223
- fn test_duration_second_and_millisecond ( ) {
223
+ fn test_duration_second_and_millisecond1 ( ) {
224
224
assert_eq ! (
225
225
Ok ( ( & [ ] [ ..] , ( 30 , 0 ) ) ) ,
226
- duration_second_and_millisecond( b"30" )
226
+ duration_second_and_millisecond( b"30S" )
227
+ ) ;
228
+ assert_eq ! (
229
+ Ok ( ( & [ ] [ ..] , ( 0 , 0 ) ) ) ,
230
+ duration_second_and_millisecond( b"0S" )
227
231
) ;
228
- assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 0 , 0 ) ) ) , duration_second_and_millisecond( b"0" ) ) ;
229
232
assert_eq ! (
230
233
Ok ( ( & [ ] [ ..] , ( 60 , 0 ) ) ) ,
231
- duration_second_and_millisecond( b"60 " )
234
+ duration_second_and_millisecond( b"60S " )
232
235
) ;
233
236
assert_eq ! (
234
237
Ok ( ( & [ ] [ ..] , ( 1 , 230 ) ) ) ,
235
- duration_second_and_millisecond( b"1,23 " )
238
+ duration_second_and_millisecond( b"1,23S " )
236
239
) ;
237
240
assert_eq ! (
238
- Ok ( ( & [ ] [ ..] , ( 1 , 230 ) ) ) ,
239
- duration_second_and_millisecond( b"1.23 " )
241
+ Ok ( ( & [ ] [ ..] , ( 2 , 340 ) ) ) ,
242
+ duration_second_and_millisecond( b"2.34S " )
240
243
) ;
241
- assert ! ( duration_second_and_millisecond( b"ab" ) . is_err( ) ) ;
242
- assert ! ( duration_second_and_millisecond( b"-1" ) . is_err( ) ) ;
243
- assert ! ( duration_second_and_millisecond( b"61" ) . is_err( ) ) ;
244
+ assert ! ( duration_second_and_millisecond( b"abS" ) . is_err( ) ) ;
245
+ assert ! ( duration_second_and_millisecond( b"-1S" ) . is_err( ) ) ;
244
246
}
245
247
246
248
#[ test]
247
249
fn test_duration_time ( ) {
248
250
assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 1 , 2 , 3 , 0 ) ) ) , duration_time( b"1H2M3S" ) ) ;
251
+ assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 10 , 12 , 30 , 0 ) ) ) , duration_time( b"10H12M30S" ) ) ;
249
252
assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 1 , 0 , 3 , 0 ) ) ) , duration_time( b"1H3S" ) ) ;
250
253
assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 0 , 2 , 0 , 0 ) ) ) , duration_time( b"2M" ) ) ;
251
254
assert_eq ! ( Ok ( ( & [ ] [ ..] , ( 1 , 2 , 3 , 400 ) ) ) , duration_time( b"1H2M3,4S" ) ) ;
@@ -277,6 +280,27 @@ fn test_duration_datetime_error() {
277
280
assert ! ( duration_datetime( b"0001-02-03T04:05:06" ) . is_err( ) ) ; // missing P at start
278
281
}
279
282
283
+ #[ rustfmt:: skip]
284
+ #[ test]
285
+ fn test_duration_second_and_millisecond2 ( ) {
286
+ assert_parser ! (
287
+ parse_duration, "PT30S" ,
288
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 0 , second: 30 , millisecond: 0 }
289
+
290
+ ) ;
291
+
292
+ assert_parser ! (
293
+ parse_duration, "PT30.123S" ,
294
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 0 , second: 30 , millisecond: 123 }
295
+
296
+ ) ;
297
+
298
+ assert_parser ! (
299
+ parse_duration, "P2021Y11M16DT23H26M59.123S" ,
300
+ Duration :: YMDHMS { year: 2021 , month: 11 , day: 16 , hour: 23 , minute: 26 , second: 59 , millisecond: 123 }
301
+ ) ;
302
+ }
303
+
280
304
#[ rustfmt:: skip]
281
305
#[ test]
282
306
fn duration_roundtrip ( ) {
@@ -330,6 +354,59 @@ fn duration_roundtrip() {
330
354
) ;
331
355
}
332
356
357
+ #[ rustfmt:: skip]
358
+ #[ test]
359
+ fn duration_multi_digit_hour ( ) {
360
+ assert_parser ! (
361
+ parse_duration, "PT12H" ,
362
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 12 , minute: 0 , second: 0 , millisecond: 0 }
363
+ ) ;
364
+ assert_parser ! (
365
+ parse_duration, "PT8760H" ,
366
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 365 * 24 , minute: 0 , second: 0 , millisecond: 0 }
367
+ ) ;
368
+ }
369
+
370
+ #[ rustfmt:: skip]
371
+ #[ test]
372
+ fn duration_multi_digit_minute ( ) {
373
+ assert_parser ! (
374
+ parse_duration, "PT15M" ,
375
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 15 , second: 0 , millisecond: 0 }
376
+ ) ;
377
+ assert_parser ! (
378
+ parse_duration, "PT600M" ,
379
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 600 , second: 0 , millisecond: 0 }
380
+ ) ;
381
+ }
382
+
383
+ #[ rustfmt:: skip]
384
+ #[ test]
385
+ fn duration_multi_digit_second ( ) {
386
+ assert_parser ! (
387
+ parse_duration, "PT16S" ,
388
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 0 , second: 16 , millisecond: 0 }
389
+ ) ;
390
+
391
+ assert_parser ! (
392
+ parse_duration, "PT900S" ,
393
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 0 , hour: 0 , minute: 0 , second: 900 , millisecond: 0 }
394
+ ) ;
395
+ }
396
+
397
+ #[ rustfmt:: skip]
398
+ #[ test]
399
+ fn duration_multi_digit_day ( ) {
400
+ assert_parser ! (
401
+ parse_duration, "P365D" ,
402
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 365 , hour: 0 , minute: 0 , second: 0 , millisecond: 0 }
403
+ ) ;
404
+ assert_parser ! (
405
+ parse_duration, "P36500D" ,
406
+ Duration :: YMDHMS { year: 0 , month: 0 , day: 36500 , hour: 0 , minute: 0 , second: 0 , millisecond: 0 }
407
+ ) ;
408
+ }
409
+
333
410
// #[test]
334
411
// fn corner_cases() {
335
412
// // how to deal with left overs?
0 commit comments