Skip to content

Commit 925dc7e

Browse files
authored
Improve syntactic validation of ISO 8601-1:2019 durations (#15)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 5ebad30 commit 925dc7e

File tree

6 files changed

+212
-2
lines changed

6 files changed

+212
-2
lines changed

schemas/iso/datetime/2019/duration-calendar-basic.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"examples": [ "P00020110T223355", "P00010101T000000", "P00001231T235959" ],
77
"x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE",
88
"type": "string",
9-
"pattern": "^P(?:[0-9]{4}|[+-][0-9]{5,})(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3])(?:[0-5][0-9])(?:[0-5][0-9])$"
9+
"pattern": "^P(?:[0-9]{4}|[+-][0-9]{5,})(?:(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|(0[469]|11)(0[1-9]|[12][0-9]|30)|02(0[1-9]|1[0-9]|2[0-9]))T(?:[01][0-9]|2[0-3])(?:[0-5][0-9])(?:[0-5][0-9])$"
1010
}

schemas/iso/datetime/2019/duration-calendar-extended.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
],
1111
"x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE",
1212
"type": "string",
13-
"pattern": "^P(?:[0-9]{4}|[+-][0-9]{5,})-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):(?:[0-5][0-9]):(?:[0-5][0-9])$"
13+
"pattern": "^P(?:[0-9]{4}|[+-][0-9]{5,})-(?:(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|02-(0[1-9]|1[0-9]|2[0-9]))T(?:[01][0-9]|2[0-3]):(?:[0-5][0-9]):(?:[0-5][0-9])$"
1414
}

test/iso/datetime/2019/duration-calendar-basic.test.json

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,71 @@
281281
"description": "Invalid - second without leading zero (single digit)",
282282
"data": "P00000101T00001",
283283
"valid": false
284+
},
285+
{
286+
"description": "Invalid - month 00",
287+
"data": "P00010001T000000",
288+
"valid": false
289+
},
290+
{
291+
"description": "Invalid - month 13",
292+
"data": "P00011301T000000",
293+
"valid": false
294+
},
295+
{
296+
"description": "Invalid - day 00",
297+
"data": "P00010100T000000",
298+
"valid": false
299+
},
300+
{
301+
"description": "Invalid - day 32",
302+
"data": "P00010132T000000",
303+
"valid": false
304+
},
305+
{
306+
"description": "Invalid - February 30",
307+
"data": "P00010230T000000",
308+
"valid": false
309+
},
310+
{
311+
"description": "Invalid - February 31",
312+
"data": "P00010231T000000",
313+
"valid": false
314+
},
315+
{
316+
"description": "Invalid - April 31",
317+
"data": "P00010431T000000",
318+
"valid": false
319+
},
320+
{
321+
"description": "Invalid - June 31",
322+
"data": "P00010631T000000",
323+
"valid": false
324+
},
325+
{
326+
"description": "Invalid - September 31",
327+
"data": "P00010931T000000",
328+
"valid": false
329+
},
330+
{
331+
"description": "Invalid - November 31",
332+
"data": "P00011131T000000",
333+
"valid": false
334+
},
335+
{
336+
"description": "Valid - February 29 (leap year validation is consumer responsibility)",
337+
"data": "P00010229T000000",
338+
"valid": true
339+
},
340+
{
341+
"description": "Valid - April 30",
342+
"data": "P00010430T000000",
343+
"valid": true
344+
},
345+
{
346+
"description": "Valid - January 31",
347+
"data": "P00010131T000000",
348+
"valid": true
284349
}
285350
]
286351
}

test/iso/datetime/2019/duration-calendar-extended.test.json

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,71 @@
281281
"description": "Invalid - second without leading zero (single digit)",
282282
"data": "P0000-01-01T00:00:1",
283283
"valid": false
284+
},
285+
{
286+
"description": "Invalid - month 00",
287+
"data": "P0001-00-01T00:00:00",
288+
"valid": false
289+
},
290+
{
291+
"description": "Invalid - month 13",
292+
"data": "P0001-13-01T00:00:00",
293+
"valid": false
294+
},
295+
{
296+
"description": "Invalid - day 00",
297+
"data": "P0001-01-00T00:00:00",
298+
"valid": false
299+
},
300+
{
301+
"description": "Invalid - day 32",
302+
"data": "P0001-01-32T00:00:00",
303+
"valid": false
304+
},
305+
{
306+
"description": "Invalid - February 30",
307+
"data": "P0001-02-30T00:00:00",
308+
"valid": false
309+
},
310+
{
311+
"description": "Invalid - February 31",
312+
"data": "P0001-02-31T00:00:00",
313+
"valid": false
314+
},
315+
{
316+
"description": "Invalid - April 31",
317+
"data": "P0001-04-31T00:00:00",
318+
"valid": false
319+
},
320+
{
321+
"description": "Invalid - June 31",
322+
"data": "P0001-06-31T00:00:00",
323+
"valid": false
324+
},
325+
{
326+
"description": "Invalid - September 31",
327+
"data": "P0001-09-31T00:00:00",
328+
"valid": false
329+
},
330+
{
331+
"description": "Invalid - November 31",
332+
"data": "P0001-11-31T00:00:00",
333+
"valid": false
334+
},
335+
{
336+
"description": "Valid - February 29 (leap year validation is consumer responsibility)",
337+
"data": "P0001-02-29T00:00:00",
338+
"valid": true
339+
},
340+
{
341+
"description": "Valid - April 30",
342+
"data": "P0001-04-30T00:00:00",
343+
"valid": true
344+
},
345+
{
346+
"description": "Valid - January 31",
347+
"data": "P0001-01-31T00:00:00",
348+
"valid": true
284349
}
285350
]
286351
}

test/iso/datetime/2019/duration-ordinal-basic.test.json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,46 @@
261261
"description": "Invalid - second without leading zero (single digit)",
262262
"data": "P0000001T00001",
263263
"valid": false
264+
},
265+
{
266+
"description": "Invalid - day 000",
267+
"data": "P0001000T000000",
268+
"valid": false
269+
},
270+
{
271+
"description": "Invalid - day 367",
272+
"data": "P0001367T000000",
273+
"valid": false
274+
},
275+
{
276+
"description": "Invalid - day 400",
277+
"data": "P0001400T000000",
278+
"valid": false
279+
},
280+
{
281+
"description": "Invalid - day 500",
282+
"data": "P0001500T000000",
283+
"valid": false
284+
},
285+
{
286+
"description": "Invalid - day 999",
287+
"data": "P0001999T000000",
288+
"valid": false
289+
},
290+
{
291+
"description": "Valid - day 366 (leap year validation is consumer responsibility)",
292+
"data": "P0001366T000000",
293+
"valid": true
294+
},
295+
{
296+
"description": "Valid - day 001",
297+
"data": "P0001001T000000",
298+
"valid": true
299+
},
300+
{
301+
"description": "Valid - day 365",
302+
"data": "P0001365T000000",
303+
"valid": true
264304
}
265305
]
266306
}

test/iso/datetime/2019/duration-ordinal-extended.test.json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,46 @@
261261
"description": "Invalid - second without leading zero (single digit)",
262262
"data": "P0000-001T00:00:1",
263263
"valid": false
264+
},
265+
{
266+
"description": "Invalid - day 000",
267+
"data": "P0001-000T00:00:00",
268+
"valid": false
269+
},
270+
{
271+
"description": "Invalid - day 367",
272+
"data": "P0001-367T00:00:00",
273+
"valid": false
274+
},
275+
{
276+
"description": "Invalid - day 400",
277+
"data": "P0001-400T00:00:00",
278+
"valid": false
279+
},
280+
{
281+
"description": "Invalid - day 500",
282+
"data": "P0001-500T00:00:00",
283+
"valid": false
284+
},
285+
{
286+
"description": "Invalid - day 999",
287+
"data": "P0001-999T00:00:00",
288+
"valid": false
289+
},
290+
{
291+
"description": "Valid - day 366 (leap year validation is consumer responsibility)",
292+
"data": "P0001-366T00:00:00",
293+
"valid": true
294+
},
295+
{
296+
"description": "Valid - day 001",
297+
"data": "P0001-001T00:00:00",
298+
"valid": true
299+
},
300+
{
301+
"description": "Valid - day 365",
302+
"data": "P0001-365T00:00:00",
303+
"valid": true
264304
}
265305
]
266306
}

0 commit comments

Comments
 (0)