From bb9c31e4b7e892ddfd20736922060a4ebb28711c Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 22 Oct 2025 14:18:05 -0400 Subject: [PATCH] Define ISO 8601-1:2019 interval schemas Signed-off-by: Juan Cruz Viotti --- .../interval/duration-end-calendar-basic.json | 16 + .../duration-end-calendar-extended.json | 16 + .../interval/duration-end-ordinal-basic.json | 16 + .../duration-end-ordinal-extended.json | 16 + .../interval/duration-end-week-basic.json | 16 + .../interval/duration-end-week-extended.json | 16 + .../start-duration-calendar-basic.json | 16 + .../start-duration-calendar-extended.json | 16 + .../start-duration-ordinal-basic.json | 16 + .../start-duration-ordinal-extended.json | 16 + .../interval/start-duration-week-basic.json | 16 + .../start-duration-week-extended.json | 16 + .../interval/start-end-calendar-basic.json | 15 + .../interval/start-end-calendar-extended.json | 15 + .../interval/start-end-ordinal-basic.json | 14 + .../interval/start-end-ordinal-extended.json | 14 + .../2019/interval/start-end-week-basic.json | 14 + .../interval/start-end-week-extended.json | 14 + .../duration-end-calendar-basic.test.json | 406 +++++++++++++++ .../duration-end-calendar-extended.test.json | 381 ++++++++++++++ .../duration-end-ordinal-basic.test.json | 361 ++++++++++++++ .../duration-end-ordinal-extended.test.json | 336 +++++++++++++ .../duration-end-week-basic.test.json | 391 +++++++++++++++ .../duration-end-week-extended.test.json | 361 ++++++++++++++ .../start-duration-calendar-basic.test.json | 426 ++++++++++++++++ ...start-duration-calendar-extended.test.json | 306 ++++++++++++ .../start-duration-ordinal-basic.test.json | 286 +++++++++++ .../start-duration-ordinal-extended.test.json | 286 +++++++++++ .../start-duration-week-basic.test.json | 426 ++++++++++++++++ .../start-duration-week-extended.test.json | 296 +++++++++++ .../start-end-calendar-basic.test.json | 471 ++++++++++++++++++ .../start-end-calendar-extended.test.json | 351 +++++++++++++ .../start-end-ordinal-basic.test.json | 281 +++++++++++ .../start-end-ordinal-extended.test.json | 266 ++++++++++ .../interval/start-end-week-basic.test.json | 281 +++++++++++ .../start-end-week-extended.test.json | 301 +++++++++++ 36 files changed, 6491 insertions(+) create mode 100644 schemas/iso/datetime/2019/interval/duration-end-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/interval/duration-end-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/interval/duration-end-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/interval/duration-end-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/interval/duration-end-week-basic.json create mode 100644 schemas/iso/datetime/2019/interval/duration-end-week-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-week-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-duration-week-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-week-basic.json create mode 100644 schemas/iso/datetime/2019/interval/start-end-week-extended.json create mode 100644 test/iso/datetime/2019/interval/duration-end-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/interval/duration-end-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/interval/duration-end-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/interval/duration-end-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/interval/duration-end-week-basic.test.json create mode 100644 test/iso/datetime/2019/interval/duration-end-week-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-week-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-duration-week-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-week-basic.test.json create mode 100644 test/iso/datetime/2019/interval/start-end-week-extended.test.json diff --git a/schemas/iso/datetime/2019/interval/duration-end-calendar-basic.json b/schemas/iso/datetime/2019/interval/duration-end-calendar-basic.json new file mode 100644 index 00000000..385f2311 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-calendar-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Calendar Date, Basic Format)", + "description": "A time interval identified by its duration and end, using a duration followed by calendar date combined with complete local time of day in basic format [duration][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss] (§5.5.3.3 a)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer. The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/19850412T232050", + "P1Y/20001231T235959", + "PT5H30M/20230615T180000", + "P2W/19850101T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/([0-9]{4}(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|[0-9]{4}(0[469]|11)(0[1-9]|[12][0-9]|30)|[0-9]{4}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]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/duration-end-calendar-extended.json b/schemas/iso/datetime/2019/interval/duration-end-calendar-extended.json new file mode 100644 index 00000000..3cc77f89 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-calendar-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Calendar Date, Extended Format)", + "description": "A time interval identified by its duration and end, using a duration followed by calendar date combined with complete local time of day in extended format [duration][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.3 b)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer. The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "P1Y/2000-12-31T23:59:59", + "PT5H30M/2023-06-15T18:00:00", + "P2W/1985-01-01T00:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/([0-9]{4}-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|[0-9]{4}-(0[469]|11)-(0[1-9]|[12][0-9]|30)|[0-9]{4}-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]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/duration-end-ordinal-basic.json b/schemas/iso/datetime/2019/interval/duration-end-ordinal-basic.json new file mode 100644 index 00000000..8e5f828a --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-ordinal-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Ordinal Date, Basic Format)", + "description": "A time interval identified by its duration and end, using a duration followed by ordinal date combined with complete local time of day in basic format [duration][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss] (§5.5.3.4 a, §5.5.3.3 a)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/1985102T232050", + "P1Y/2000366T235959", + "PT5H30M/2023166T180000", + "P2W/1985001T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/duration-end-ordinal-extended.json b/schemas/iso/datetime/2019/interval/duration-end-ordinal-extended.json new file mode 100644 index 00000000..fd5c5bee --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-ordinal-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Ordinal Date, Extended Format)", + "description": "A time interval identified by its duration and end, using a duration followed by ordinal date combined with complete local time of day in extended format [duration][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.4 a, §5.5.3.3 b)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/1985-102T23:20:50", + "P1Y/2000-366T23:59:59", + "PT5H30M/2023-166T18:00:00", + "P2W/1985-001T00:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/duration-end-week-basic.json b/schemas/iso/datetime/2019/interval/duration-end-week-basic.json new file mode 100644 index 00000000..0656f327 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-week-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Week Date, Basic Format)", + "description": "A time interval identified by its duration and end, using a duration followed by week date combined with complete local time of day in basic format [duration][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss] (§5.5.3.4 a, §5.5.3.3 a)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/1985W155T232050", + "P1Y/2000W527T235959", + "PT5H30M/2023W241T180000", + "P2W/1985W011T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-3])[1-7]T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/duration-end-week-extended.json b/schemas/iso/datetime/2019/interval/duration-end-week-extended.json new file mode 100644 index 00000000..ffca00fa --- /dev/null +++ b/schemas/iso/datetime/2019/interval/duration-end-week-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Duration and End (Week Date, Extended Format)", + "description": "A time interval identified by its duration and end, using a duration followed by week date combined with complete local time of day in extended format [duration][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.4 a, §5.5.3.3 b)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "P1Y/2000-W52-7T23:59:59", + "PT5H30M/2023-W24-1T18:00:00", + "P2W/1985-W01-1T00:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)/[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])-[1-7]T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-calendar-basic.json b/schemas/iso/datetime/2019/interval/start-duration-calendar-basic.json new file mode 100644 index 00000000..61efd420 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-calendar-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Calendar Date, Basic Format)", + "description": "A time interval identified by its start and duration, using calendar date combined with complete local time of day in basic format followed by a duration [YYYY][MM][DD][\"T\"][hh][mm][ss][\"/\"][duration] (§5.5.3.2 a)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer. The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "19850412T232050/P1Y2M15DT12H30M0S", + "20000101T000000/P1Y", + "20230615T120000/PT5H30M", + "19851231T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^([0-9]{4}(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|[0-9]{4}(0[469]|11)(0[1-9]|[12][0-9]|30)|[0-9]{4}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]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-calendar-extended.json b/schemas/iso/datetime/2019/interval/start-duration-calendar-extended.json new file mode 100644 index 00000000..446f9d93 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-calendar-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Calendar Date, Extended Format)", + "description": "A time interval identified by its start and duration, using calendar date combined with complete local time of day in extended format followed by a duration [YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.5.3.2 b)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer. The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "2000-01-01T00:00:00/P1Y", + "2023-06-15T12:00:00/PT5H30M", + "1985-12-31T23:59:59/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^([0-9]{4}-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|[0-9]{4}-(0[469]|11)-(0[1-9]|[12][0-9]|30)|[0-9]{4}-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]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-ordinal-basic.json b/schemas/iso/datetime/2019/interval/start-duration-ordinal-basic.json new file mode 100644 index 00000000..d12d6fdd --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-ordinal-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Ordinal Date, Basic Format)", + "description": "A time interval identified by its start and duration, using ordinal date combined with complete local time of day in basic format followed by a duration [YYYY][DDD][\"T\"][hh][mm][ss][\"/\"][duration] (§5.5.3.4 a, §5.5.3.2 a)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "1985102T232050/P1Y2M15DT12H30M0S", + "2000001T000000/P1Y", + "2023166T120000/PT5H30M", + "1985365T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-ordinal-extended.json b/schemas/iso/datetime/2019/interval/start-duration-ordinal-extended.json new file mode 100644 index 00000000..ca4d8d3b --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-ordinal-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Ordinal Date, Extended Format)", + "description": "A time interval identified by its start and duration, using ordinal date combined with complete local time of day in extended format followed by a duration [YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.5.3.4 a, §5.5.3.2 b)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "1985-102T23:20:50/P1Y2M15DT12H30M0S", + "2000-001T00:00:00/P1Y", + "2023-166T12:00:00/PT5H30M", + "1985-365T23:59:59/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-week-basic.json b/schemas/iso/datetime/2019/interval/start-duration-week-basic.json new file mode 100644 index 00000000..7b711086 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-week-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Week Date, Basic Format)", + "description": "A time interval identified by its start and duration, using week date combined with complete local time of day in basic format followed by a duration [YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss][\"/\"][duration] (§5.5.3.4 a, §5.5.3.2 a)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "1985W155T232050/P1Y2M15DT12H30M0S", + "2000W011T000000/P1Y", + "2023W241T120000/PT5H30M", + "1985W527T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-3])[1-7]T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-duration-week-extended.json b/schemas/iso/datetime/2019/interval/start-duration-week-extended.json new file mode 100644 index 00000000..204e5cdf --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-duration-week-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and Duration (Week Date, Extended Format)", + "description": "A time interval identified by its start and duration, using week date combined with complete local time of day in extended format followed by a duration [YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.5.3.4 a, §5.5.3.2 b)", + "$comment": "The duration component accepts designator format (P...) and weeks format (PnW)", + "examples": [ + "1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "2000-W01-1T00:00:00/P1Y", + "2023-W24-1T12:00:00/PT5H30M", + "1985-W52-7T23:59:59/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])-[1-7]T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)/(?:P[0-9]+(?:\\.[0-9]+)?W|P[0-9]+(?:\\.[0-9]+)?Y|P[0-9]+Y[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+(?:\\.[0-9]+)?D|P[0-9]+(?:\\.[0-9]+)?D|PT[0-9]+(?:\\.[0-9]+)?H|PT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?M|PT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|PT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+YT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+YT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+YT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+Y[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+MT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+MT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+MT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+M[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+M[0-9]+DT[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?H|P[0-9]+DT[0-9]+H[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+H[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?M|P[0-9]+DT[0-9]+M[0-9]+(?:\\.[0-9]+)?S|P[0-9]+DT[0-9]+(?:\\.[0-9]+)?S)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-calendar-basic.json b/schemas/iso/datetime/2019/interval/start-end-calendar-basic.json new file mode 100644 index 00000000..06d4eb77 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-calendar-basic.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Calendar Date, Basic Format)", + "description": "A time interval identified by its start and end, using calendar date combined with complete local time of day in basic format [YYYY][MM][DD][\"T\"][hh][mm][ss][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss] (§5.5.3.1 a)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer", + "examples": [ + "19850412T232050/19850625T103000", + "20000101T000000/20001231T235959", + "20230101T120000/20230630T180000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^([0-9]{4}(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|[0-9]{4}(0[469]|11)(0[1-9]|[12][0-9]|30)|[0-9]{4}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]|60)/([0-9]{4}(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|[0-9]{4}(0[469]|11)(0[1-9]|[12][0-9]|30)|[0-9]{4}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]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-calendar-extended.json b/schemas/iso/datetime/2019/interval/start-end-calendar-extended.json new file mode 100644 index 00000000..ebc7124c --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-calendar-extended.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Calendar Date, Extended Format)", + "description": "A time interval identified by its start and end, using calendar date combined with complete local time of day in extended format [YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.1 b)", + "$comment": "This schema validates day/month combinations (i.e rejects April 31) but does not validate leap years. February 29 is accepted for any year, and leap year validation must be performed by the consumer", + "examples": [ + "1985-04-12T23:20:50/1985-06-25T10:30:00", + "2000-01-01T00:00:00/2000-12-31T23:59:59", + "2023-01-01T12:00:00/2023-06-30T18:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^([0-9]{4}-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|[0-9]{4}-(0[469]|11)-(0[1-9]|[12][0-9]|30)|[0-9]{4}-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]|60)/([0-9]{4}-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|[0-9]{4}-(0[469]|11)-(0[1-9]|[12][0-9]|30)|[0-9]{4}-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]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-ordinal-basic.json b/schemas/iso/datetime/2019/interval/start-end-ordinal-basic.json new file mode 100644 index 00000000..318e7784 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-ordinal-basic.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Ordinal Date, Basic Format)", + "description": "A time interval identified by its start and end, using ordinal date combined with complete local time of day in basic format [YYYY][DDD][\"T\"][hh][mm][ss][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss] (§5.5.3.4 a, §5.5.3.1 a)", + "examples": [ + "1985102T232050/1985176T103000", + "2000001T000000/2000366T235959", + "2023001T120000/2023365T180000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)/[0-9]{4}(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-ordinal-extended.json b/schemas/iso/datetime/2019/interval/start-end-ordinal-extended.json new file mode 100644 index 00000000..f6765791 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-ordinal-extended.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Ordinal Date, Extended Format)", + "description": "A time interval identified by its start and end, using ordinal date combined with complete local time of day in extended format [YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.4 a, §5.5.3.1 b)", + "examples": [ + "1985-102T23:20:50/1985-176T10:30:00", + "2000-001T00:00:00/2000-366T23:59:59", + "2023-001T12:00:00/2023-365T18:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)/[0-9]{4}-(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|3[0-5][0-9]|36[0-6])T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-week-basic.json b/schemas/iso/datetime/2019/interval/start-end-week-basic.json new file mode 100644 index 00000000..51b52a75 --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-week-basic.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Week Date, Basic Format)", + "description": "A time interval identified by its start and end, using week date combined with complete local time of day in basic format [YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss] (§5.5.3.4 a, §5.5.3.1 a)", + "examples": [ + "1985W155T232050/1985W261T103000", + "2000W011T000000/2000W527T235959", + "2023W011T120000/2023W527T180000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-3])[1-7]T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)/[0-9]{4}W(0[1-9]|[1-4][0-9]|5[0-3])[1-7]T([01][0-9]|2[0-3])[0-5][0-9]([0-5][0-9]|60)$" +} diff --git a/schemas/iso/datetime/2019/interval/start-end-week-extended.json b/schemas/iso/datetime/2019/interval/start-end-week-extended.json new file mode 100644 index 00000000..2920b09b --- /dev/null +++ b/schemas/iso/datetime/2019/interval/start-end-week-extended.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Time Interval by Start and End (Week Date, Extended Format)", + "description": "A time interval identified by its start and end, using week date combined with complete local time of day in extended format [YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.5.3.4 a, §5.5.3.1 b)", + "examples": [ + "1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "2000-W01-1T00:00:00/2000-W52-7T23:59:59", + "2023-W01-1T12:00:00/2023-W52-7T18:00:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])-[1-7]T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)/[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])-[1-7]T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)$" +} diff --git a/test/iso/datetime/2019/interval/duration-end-calendar-basic.test.json b/test/iso/datetime/2019/interval/duration-end-calendar-basic.test.json new file mode 100644 index 00000000..c6156aad --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-calendar-basic.test.json @@ -0,0 +1,406 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-calendar-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/20001231T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/20230615T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/19850101T000000", + "valid": true + }, + { + "description": "Invalid - extended format datetime", + "data": "P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y19850412T232050", + "valid": false + }, + { + "description": "Invalid - start datetime instead of duration", + "data": "19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/19850412T232050", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "P1Y/19851312T232050", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "P1Y/19850432T232050", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "P1Y/19850431T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/19850412T235960", + "valid": true + }, + { + "description": "Valid - 29 February end", + "data": "P1Y/20230229T120000", + "valid": true + }, + { + "description": "Invalid - end month 00", + "data": "P1Y/19850012T232050", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "P1Y/19850400T232050", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "P1Y/20230230T120000", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "P1Y/19850631T120000", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "P1Y/19850931T120000", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "P1Y/19851131T120000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/19850412T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/19850412T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/19850412T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/19850412T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/19850412T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/19850412T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/19850412T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/19850412232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/19850412t232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/19850412T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/19850412T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//19850412T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\19850412T232050", + "valid": false + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/20230101T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/20230101T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/20230101T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/20230101T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/20230101T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/19850412T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/20230101T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/20230101T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/20230101T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/20230101T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "P1Y/19850412T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "P1Y/19850412T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "P1Y/19850412T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "XP1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "P1Y/1985 04 12T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I9850412T232050", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "P1Y/1985O412T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/198504I2T232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/19850412TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/19850412T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/19850412T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/19850412T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/19850412T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/19850412T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/19850412T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/19850412T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 19850412T232050", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/duration-end-calendar-extended.test.json b/test/iso/datetime/2019/interval/duration-end-calendar-extended.test.json new file mode 100644 index 00000000..d2b4f879 --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-calendar-extended.test.json @@ -0,0 +1,381 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-calendar-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/2000-12-31T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/2023-06-15T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/1985-01-01T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format datetime", + "data": "P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - start datetime instead of duration", + "data": "1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "P1Y/1985-13-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "P1Y/1985-04-32T23:20:50", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "P1Y/1985-04-31T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/1985-04-12T23:59:60", + "valid": true + }, + { + "description": "Valid - 29 February end", + "data": "P1Y/2023-02-29T12:00:00", + "valid": true + }, + { + "description": "Invalid - end month 00", + "data": "P1Y/1985-00-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "P1Y/1985-04-00T23:20:50", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "P1Y/2023-02-30T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "P1Y/1985-06-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "P1Y/1985-09-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "P1Y/1985-11-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/1985-04-12T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/1985-04-12T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/1985-04-12T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/1985-04-12T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/1985-04-12T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/1985-04-12T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/1985-04-12T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/1985-04-12 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/1985-04-12t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "P1Y/1985-O4-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/1985-04-I2T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/1985-04-12TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/1985-04-12T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/1985-04-12T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 1985-04-12T23:20:50", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/duration-end-ordinal-basic.test.json b/test/iso/datetime/2019/interval/duration-end-ordinal-basic.test.json new file mode 100644 index 00000000..cdff8f10 --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-ordinal-basic.test.json @@ -0,0 +1,361 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-ordinal-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/2000366T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/2023166T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/1985001T000000", + "valid": true + }, + { + "description": "Invalid - extended format", + "data": "P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y1985102T232050", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/1985102T232050", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - day 000", + "data": "P1Y/1985000T232050", + "valid": false + }, + { + "description": "Invalid - day 367", + "data": "P1Y/1985367T232050", + "valid": false + }, + { + "description": "Valid - day 366", + "data": "P1Y/2020366T000000", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/1985102T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/1985102T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/1985102T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/1985102T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/1985102T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/1985102T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/1985102T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/1985102232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/1985102t232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/1985102T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/1985102T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//1985102T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\1985102T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/1985102T235960", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/2023001T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/2023001T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/2023001T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/2023001T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/2023001T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/1985102T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/2023001T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/2023001T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/2023001T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/2023001T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "P1Y/1985102T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "P1Y/1985102T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "P1Y/1985102T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "XP1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "P1Y/1985 102T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I985102T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/1985I02T232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/1985102TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/1985102T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/1985102T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/1985102T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/1985102T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/1985102T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/1985102T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/1985102T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 1985102T232050", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/duration-end-ordinal-extended.test.json b/test/iso/datetime/2019/interval/duration-end-ordinal-extended.test.json new file mode 100644 index 00000000..84ad304f --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-ordinal-extended.test.json @@ -0,0 +1,336 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-ordinal-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/2000-366T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/2023-166T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/1985-001T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format", + "data": "P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 000", + "data": "P1Y/1985-000T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 367", + "data": "P1Y/1985-367T23:20:50", + "valid": false + }, + { + "description": "Valid - day 366", + "data": "P1Y/2020-366T00:00:00", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/1985-102T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/1985-102T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/1985-102T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/1985-102T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/1985-102T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/1985-102T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/1985-102T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/1985-102 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/1985-102t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/1985-102T23:59:60", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/2023-001T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/2023-001T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/1985-I02T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/1985-102TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/1985-102T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/1985-102T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/1985-102T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 1985-102T23:20:50", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/duration-end-week-basic.test.json b/test/iso/datetime/2019/interval/duration-end-week-basic.test.json new file mode 100644 index 00000000..c00ffd97 --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-week-basic.test.json @@ -0,0 +1,391 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-week-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/2000W527T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/2023W241T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/1985W011T000000", + "valid": true + }, + { + "description": "Invalid - extended format", + "data": "P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y1985W155T232050", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - week 00", + "data": "P1Y/1985W005T232050", + "valid": false + }, + { + "description": "Invalid - week 54", + "data": "P1Y/1985W545T232050", + "valid": false + }, + { + "description": "Invalid - day 0", + "data": "P1Y/1985W150T232050", + "valid": false + }, + { + "description": "Invalid - day 8", + "data": "P1Y/1985W158T232050", + "valid": false + }, + { + "description": "Valid - week 53", + "data": "P1Y/2020W531T000000", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/1985W155T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/1985W155T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/1985W155T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/1985W155T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/1985W155T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/1985W155T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/1985W155T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/1985W155232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/1985W155t232050", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "P1Y/1985w155T232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//1985W155T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\1985W155T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/1985W155T235960", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/2023W011T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/2023W011T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/2023W011T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/2023W011T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/2023W011T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/1985W155T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/2023W011T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/2023W011T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/2023W011T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/2023W011T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "P1Y/1985W155T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "P1Y/1985W155T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "P1Y/1985W155T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "XP1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "P1Y/1985 W15 5T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I985W155T232050", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "P1Y/1985WI55T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/1985W15IT232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/1985W155TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/1985W155T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/1985W155T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/1985W155T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/1985W155T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/1985W155T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/1985W155T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 1985W155T232050", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "P1Y/2023W011T120000", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "P1Y/2023W527T120000", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/duration-end-week-extended.test.json b/test/iso/datetime/2019/interval/duration-end-week-extended.test.json new file mode 100644 index 00000000..c2e8abe8 --- /dev/null +++ b/test/iso/datetime/2019/interval/duration-end-week-extended.test.json @@ -0,0 +1,361 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/duration-end-week-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration", + "data": "P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "P1Y/2000-W52-7T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "PT5H30M/2023-W24-1T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "P2W/1985-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format", + "data": "P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "P1Y1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "P/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - week 00", + "data": "P1Y/1985-W00-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - week 54", + "data": "P1Y/1985-W54-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 0", + "data": "P1Y/1985-W15-0T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 8", + "data": "P1Y/1985-W15-8T23:20:50", + "valid": false + }, + { + "description": "Valid - week 53", + "data": "P1Y/2020-W53-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "P1Y/1985-W15-5T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "P1Y/1985-W15-5T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "P1Y/1985-W15-5T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "P1Y/1985-W15-5T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "P1Y/1985-W15-5T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "P1Y/1985-W15-5T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "P1Y/1985-W15-5T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "P1Y/1985-W15-5 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "P1Y/1985-W15-5t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "p1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "P1Dt1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "PT/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "P1Y//1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "P1Y\\1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "P1D/1985-W15-5T23:59:60", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "P0Y0M0DT0H0M0S/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "P1.5Y/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "P3M15DT2.5H/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "P10.5D/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "PT2.5H/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "PT45.5M/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "PT10.123S/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "P1.5W/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "P6M3Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "P15D6M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "P1D1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "P1W2D/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "P1Y2W/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "P1WT1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "P500Y/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "P500D/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "PT100H/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "P13M/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "P1Y/I985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "P1Y/1985-WI5-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "P1Y/1985-W15-IT23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "P1Y/1985-W15-5TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "P1Y/1985-W15-5T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "P1Y/1985-W15-5T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "P1Y 2M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "P1Y/2M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "PT60M/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "PT60S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "PT25H/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "P32D/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "P1Y / 1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "P1Y/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "P1Y/2023-W52-7T12:00:00", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-calendar-basic.test.json b/test/iso/datetime/2019/interval/start-duration-calendar-basic.test.json new file mode 100644 index 00000000..20a835a8 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-calendar-basic.test.json @@ -0,0 +1,426 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-calendar-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "20000101T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "20230615T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "19851231T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "20230101T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "20231231T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "20000630T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "19850412T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "19850412T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "19850412T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "19850012T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "19851312T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "19850400T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "19850432T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "19850431T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "20230230T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "19850412T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "19850412T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "19850412T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "19850412232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "19850412t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "19850412T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "19850412T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "19850412T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "19850412T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "19850412T232050/PT", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of calendar", + "data": "1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of calendar", + "data": "1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "19850412T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "19850412T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "20230229T120000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "19850412T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "20230101T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction", + "data": "20230101T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction", + "data": "20230101T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "20230101T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "20230101T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "20230101T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "20230101T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "20230101T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "19850412T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "19850412T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "19850412T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "19850412T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "19850412T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "19850412T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "20230101T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "20230101T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "20230101T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "20230101T000000/P13M", + "valid": true + }, + { + "description": "Invalid - start hour 25", + "data": "19850412T252050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "19850412T992050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "19850412T239950/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "19850412T232099/P1Y", + "valid": false + }, + { + "description": "Invalid - too short", + "data": "19850412T23205/P1Y", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "19850412T2320500/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "19850412T232050X/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "X19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "1985 04 12T23 20 50/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "I9850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "1985O412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "198504I2T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "19850412TI32050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "19850412T23I050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "19850412T2320I0/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 June", + "data": "19850631T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 September", + "data": "19850931T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 November", + "data": "19851131T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "19850412T232050/P1Y 2M", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "19850412T232050/P1Y/2M", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "19850412T232050/PT60M", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "19850412T232050/PT60S", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "19850412T232050/PT25H", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "19850412T232050/P32D", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-calendar-extended.test.json b/test/iso/datetime/2019/interval/start-duration-calendar-extended.test.json new file mode 100644 index 00000000..33cdaa19 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-calendar-extended.test.json @@ -0,0 +1,306 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-calendar-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "2000-01-01T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "2023-06-15T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "1985-12-31T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "2023-01-01T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "2023-12-31T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "2000-06-30T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-04-12T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "1985-04-12T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-04-12T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "1985-00-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "1985-13-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "1985-04-00T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "1985-04-32T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "1985-04-31T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "2023-02-30T12:00:00/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-04-12T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-04-12T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-04-12T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-04-12 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-04-12t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1985-04-12T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "1985-04-12T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "1985-04-12T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "1985-04-12T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "1985-04-12T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of calendar", + "data": "1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of calendar", + "data": "1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985-04-12T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-04-12T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "2023-02-29T12:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "1985-04-12T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "2023-01-01T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "2023-01-01T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "2023-01-01T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "2023-01-01T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "2023-01-01T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "2023-01-01T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "2023-01-01T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "2023-01-01T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "1985-04-12T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "1985-04-12T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "1985-04-12T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "1985-04-12T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "1985-04-12T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "1985-04-12T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "2023-01-01T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "2023-01-01T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "2023-01-01T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "2023-01-01T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-ordinal-basic.test.json b/test/iso/datetime/2019/interval/start-duration-ordinal-basic.test.json new file mode 100644 index 00000000..e7f8b4a1 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-ordinal-basic.test.json @@ -0,0 +1,286 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-ordinal-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "2000001T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "2023166T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "1985365T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "2023001T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "2023365T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "2000182T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985102T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "1985102T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985102T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "1985000T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "1985367T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985102T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985102T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985102T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985102232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985102t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1985102T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "1985102T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "1985102T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "1985102T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "1985102T232050/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal", + "data": "19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of ordinal", + "data": "1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985102T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985102T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - day 366 (leap year validation is consumer responsibility)", + "data": "2020366T000000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "1985102T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "2023001T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "2023001T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "2023001T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "2023001T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "2023001T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "2023001T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "2023001T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "2023001T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "1985102T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "1985102T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "1985102T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "1985102T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "1985102T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "1985102T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "2023001T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "2023001T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "2023001T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "2023001T000000/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-ordinal-extended.test.json b/test/iso/datetime/2019/interval/start-duration-ordinal-extended.test.json new file mode 100644 index 00000000..77456e35 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-ordinal-extended.test.json @@ -0,0 +1,286 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-ordinal-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "2000-001T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "2023-166T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "1985-365T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "2023-001T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "2023-365T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "2000-182T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-102T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "1985-102T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-102T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "1985-000T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "1985-367T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-102T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-102T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-102T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-102 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-102t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1985-102T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "1985-102T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "1985-102T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "1985-102T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "1985-102T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal", + "data": "1985-04-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of ordinal", + "data": "1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985-102T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-102T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - day 366 (leap year validation is consumer responsibility)", + "data": "2020-366T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "1985-102T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "2023-001T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "2023-001T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "2023-001T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "2023-001T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "2023-001T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "2023-001T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "2023-001T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "2023-001T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "1985-102T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "1985-102T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "1985-102T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "1985-102T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "1985-102T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "1985-102T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "2023-001T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "2023-001T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "2023-001T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "2023-001T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-week-basic.test.json b/test/iso/datetime/2019/interval/start-duration-week-basic.test.json new file mode 100644 index 00000000..0ed16acb --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-week-basic.test.json @@ -0,0 +1,426 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-week-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "2000W011T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "2023W241T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "1985W527T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "2023W011T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "2023W527T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "2000W265T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985W155T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "1985W155T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985W155T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "1985W005T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "1985W545T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "1985W150T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "1985W158T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985W155T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "1985W155T252050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "1985W155T992050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985W155T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "1985W155T239950/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985W155T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "1985W155T232099/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985W155232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985W155t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase w", + "data": "1985w155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1985W155T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "1985W155T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "1985W155T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "1985W155T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "1985W155T232050/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week", + "data": "19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week", + "data": "1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985W155T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985W155T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - week 53 (long year validation is consumer responsibility)", + "data": "2020W531T000000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "1985W155T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "2023W011T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "2023W011T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "2023W011T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "2023W011T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "2023W011T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "2023W011T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "2023W011T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "2023W011T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "1985W155T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "1985W155T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "1985W155T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "1985W155T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "1985W155T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "1985W155T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "2023W011T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "2023W011T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "2023W011T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "2023W011T000000/P13M", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "1985W155T23205/P1Y", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "1985W155T2320500/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "1985W155T232050X/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "X1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "1985 W15 5T23 20 50/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "I985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "1985WI55T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "1985W15IT232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "1985W155TI32050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "1985W155T23I050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "1985W155T2320I0/P1Y", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "2023W011T120000/P1Y", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "2023W527T120000/P1Y", + "valid": true + }, + { + "description": "Valid - year 0000", + "data": "0000W011T120000/P1Y", + "valid": true + }, + { + "description": "Valid - year 9999", + "data": "9999W527T235959/P1Y", + "valid": true + }, + { + "description": "Invalid - duration with spaces", + "data": "1985W155T232050/P1Y 2M", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "1985W155T232050/P1Y/2M", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "1985W155T232050/PT60M", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "1985W155T232050/PT60S", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "1985W155T232050/PT25H", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "1985W155T232050/P32D", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-duration-week-extended.test.json b/test/iso/datetime/2019/interval/start-duration-week-extended.test.json new file mode 100644 index 00000000..975502a1 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-duration-week-extended.test.json @@ -0,0 +1,296 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-duration-week-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "2000-W01-1T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "2023-W24-1T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "1985-W52-7T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "2023-W01-1T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "2023-W52-7T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "2000-W26-5T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-W15-5T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "1985-W15-5T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-W15-5T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "1985-W00-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "1985-W54-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "1985-W15-0T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "1985-W15-8T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-W15-5T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-W15-5T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-W15-5T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-W15-5 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-W15-5t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "1985-W15-5T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "1985-W15-5T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "1985-W15-5T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "1985-W15-5T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "1985-W15-5T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week", + "data": "1985-04-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week", + "data": "1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985-W15-5T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-W15-5T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - week 53 (long year validation is consumer responsibility)", + "data": "2020-W53-1T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "1985-W15-5T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "2023-W01-1T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "2023-W01-1T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "2023-W01-1T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "2023-W01-1T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "2023-W01-1T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "2023-W01-1T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "2023-W01-1T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "2023-W01-1T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "1985-W15-5T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "1985-W15-5T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "1985-W15-5T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "1985-W15-5T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "1985-W15-5T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "1985-W15-5T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "2023-W01-1T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "2023-W01-1T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "2023-W01-1T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "2023-W01-1T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-calendar-basic.test.json b/test/iso/datetime/2019/interval/start-end-calendar-basic.test.json new file mode 100644 index 00000000..f6f39ed3 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-calendar-basic.test.json @@ -0,0 +1,471 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-calendar-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - 12 April 1985 to 25 June 1985", + "data": "19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - 1 January 2000 to 31 December 2000", + "data": "20000101T000000/20001231T235959", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "20230101T120000/20230101T180000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "20221231T230000/20230101T010000", + "valid": true + }, + { + "description": "Valid - 31 January to 28 February", + "data": "20230131T000000/20230228T235959", + "valid": true + }, + { + "description": "Valid - leap year February 29", + "data": "20200228T120000/20200229T120000", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "19850412T235960/19850413T000000", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "20230101T000000/20230102T000000", + "valid": true + }, + { + "description": "Valid - 31 May to 30 June", + "data": "20230531T120000/20230630T120000", + "valid": true + }, + { + "description": "Valid - 31 August to 30 September", + "data": "20230831T120000/20230930T120000", + "valid": true + }, + { + "description": "Valid - 31 October to 30 November", + "data": "20231031T120000/20231130T120000", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "19850412T23205019850625T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "19850412T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-04-12T23:20:50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "19850412T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/19850625T103000", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "19850412T232050 / 19850625T103000", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "19850012T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "19851312T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end month 00", + "data": "19850412T232050/19850025T103000", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "19850412T232050/19851325T103000", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "19850400T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "19850432T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "19850412T232050/19850600T103000", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "19850412T232050/19850632T103000", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "19850431T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start 31 June", + "data": "19850631T232050/19850731T103000", + "valid": false + }, + { + "description": "Invalid - start 31 September", + "data": "19850931T232050/19851031T103000", + "valid": false + }, + { + "description": "Invalid - start 31 November", + "data": "19851131T232050/19851231T103000", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "19850401T232050/19850431T103000", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "19850601T232050/19850631T103000", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "19850901T232050/19850931T103000", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "19851101T232050/19851131T103000", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "20230230T120000/20230331T120000", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "20230131T120000/20230230T120000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "19850412T242050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "19850412T252050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "19850412T232050/19850625T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "19850412T236050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "19850412T232050/19850625T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "19850412T232061/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "19850412T232050/19850625T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "19850412232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "19850412T232050/19850625103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "19850412t232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "19850412T232050/19850625t103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too few digits in start year", + "data": "985412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too many digits in start year", + "data": "198504412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCD0412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "19850412T232050/ABCD0625T103000", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "19850412TABC050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "19850412T232050/19850625TABC000", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "20230229T120000/20230331T120000", + "valid": true + }, + { + "description": "Valid - both start and end with 29 February", + "data": "20230229T000000/20240229T235959", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "19850412T232050//19850625T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "19850412T232050\\19850625T103000", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "19850625T103000/19850412T232050", + "valid": true + }, + { + "description": "Invalid - start hour 99", + "data": "19850412T992050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "19850412T232050/19850625T993000", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "19850412T239950/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "19850412T232050/19850625T109900", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "19850412T232099/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "19850412T232050/19850625T103099", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "I9850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "19850412T232050/I9850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in start month", + "data": "1985O412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end month", + "data": "19850412T232050/1985O625T103000", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "198504I2T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "19850412T232050/198506I5T103000", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "19850412TI32050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "19850412T232050/19850625TI03000", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "19850412T23I050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "19850412T232050/19850625T10I000", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "19850412T2320I0/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "19850412T232050/19850625T1030I0", + "valid": false + }, + { + "description": "Invalid - too short start", + "data": "19850412T23205/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too long start", + "data": "19850412T2320500/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too short end", + "data": "19850412T232050/19850625T10300", + "valid": false + }, + { + "description": "Invalid - too long end", + "data": "19850412T232050/19850625T1030000", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "X19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "19850412T232050/19850625T103000X", + "valid": false + }, + { + "description": "Invalid - spaces in start datetime", + "data": "1985 04 12T23 20 50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - spaces in end datetime", + "data": "19850412T232050/1985 06 25T10 30 00", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-calendar-extended.test.json b/test/iso/datetime/2019/interval/start-end-calendar-extended.test.json new file mode 100644 index 00000000..214443ca --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-calendar-extended.test.json @@ -0,0 +1,351 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-calendar-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 19850412232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - 12 April 1985 to 25 June 1985", + "data": "1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - 1 January 2000 to 31 December 2000", + "data": "2000-01-01T00:00:00/2000-12-31T23:59:59", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "2023-01-01T12:00:00/2023-01-01T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "2022-12-31T23:00:00/2023-01-01T01:00:00", + "valid": true + }, + { + "description": "Valid - 31 January to 28 February", + "data": "2023-01-31T00:00:00/2023-02-28T23:59:59", + "valid": true + }, + { + "description": "Valid - leap year February 29", + "data": "2020-02-28T12:00:00/2020-02-29T12:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "1985-04-12T23:59:60/1985-04-13T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "2023-01-01T00:00:00/2023-01-02T00:00:00", + "valid": true + }, + { + "description": "Valid - 31 May to 30 June", + "data": "2023-05-31T12:00:00/2023-06-30T12:00:00", + "valid": true + }, + { + "description": "Valid - 31 August to 30 September", + "data": "2023-08-31T12:00:00/2023-09-30T12:00:00", + "valid": true + }, + { + "description": "Valid - 31 October to 30 November", + "data": "2023-10-31T12:00:00/2023-11-30T12:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-04-12T23:20:501985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "19850412T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-04-12T23:20:50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "1985-04-12T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-04-12T23:20:50 / 1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "1985-00-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "1985-13-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end month 00", + "data": "1985-04-12T23:20:50/1985-00-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "1985-04-12T23:20:50/1985-13-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "1985-04-00T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "1985-04-32T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "1985-04-12T23:20:50/1985-06-00T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "1985-04-12T23:20:50/1985-06-32T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "1985-04-31T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 June", + "data": "1985-06-31T23:20:50/1985-07-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 September", + "data": "1985-09-31T23:20:50/1985-10-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 November", + "data": "1985-11-31T23:20:50/1985-12-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "1985-04-01T23:20:50/1985-04-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "1985-06-01T23:20:50/1985-06-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "1985-09-01T23:20:50/1985-09-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "1985-11-01T23:20:50/1985-11-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "2023-02-30T12:00:00/2023-03-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "2023-01-31T12:00:00/2023-02-30T12:00:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-04-12T24:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "1985-04-12T25:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "1985-04-12T23:20:50/1985-06-25T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-04-12T23:60:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "1985-04-12T23:20:50/1985-06-25T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-04-12T23:20:61/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "1985-04-12T23:20:50/1985-06-25T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-04-1223:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "1985-04-12T23:20:50/1985-06-2510:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-04-12t23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "1985-04-12T23:20:50/1985-06-25t10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "19850412T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "1985-04-12T23:20:50/19850625T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "1985-04-12T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "1985-04-12T23:20:50/1985-06-25T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCD-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "1985-04-12T23:20:50/ABCD-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "1985-04-12TAB:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "1985-04-12T23:20:50/1985-06-25TAB:30:00", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "2023-02-29T12:00:00/2023-03-31T12:00:00", + "valid": true + }, + { + "description": "Valid - both start and end with 29 February", + "data": "2023-02-29T00:00:00/2024-02-29T23:59:59", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "1985-04-12T23:20:50//1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-04-12T23:20:50\\1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "1985-06-25T10:30:00/1985-04-12T23:20:50", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-ordinal-basic.test.json b/test/iso/datetime/2019/interval/start-end-ordinal-basic.test.json new file mode 100644 index 00000000..6d866b29 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-ordinal-basic.test.json @@ -0,0 +1,281 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-ordinal-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - day 102 to day 176 of 1985", + "data": "1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - day 1 to day 366 of 2000 (leap year)", + "data": "2000001T000000/2000366T235959", + "valid": true + }, + { + "description": "Valid - day 1 to day 365 of 2023", + "data": "2023001T120000/2023365T180000", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "2023100T120000/2023100T180000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "2022365T230000/2023001T010000", + "valid": true + }, + { + "description": "Valid - first to last day of year", + "data": "2020001T000000/2020366T235959", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "1985102T235960/1985103T000000", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "2023001T000000/2023002T000000", + "valid": true + }, + { + "description": "Valid - day 59 to day 60 (February 28-29 in leap year)", + "data": "2020059T120000/2020060T120000", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985102T2320501985176T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "1985102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-102T23:20:50/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "1985102T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/1985176T103000", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985102T232050 / 1985176T103000", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "1985000T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "1985367T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end day 000", + "data": "1985102T232050/1985000T103000", + "valid": false + }, + { + "description": "Invalid - end day 367", + "data": "1985102T232050/1985367T103000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985102T242050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "1985102T252050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "1985102T232050/1985176T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985102T236050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "1985102T232050/1985176T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985102T232061/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "1985102T232050/1985176T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985102232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "1985102T232050/1985176103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985102t232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "1985102T232050/1985176t103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/1985176T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in start", + "data": "19850412T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in end", + "data": "1985102T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too few digits in start day", + "data": "198502T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - too many digits in start day", + "data": "19851022T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCD102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "1985102T232050/ABCD176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "1985102TABC050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "1985102T232050/1985176TABC000", + "valid": false + }, + { + "description": "Valid - day 366 in leap year", + "data": "2020366T000000/2021001T000000", + "valid": true + }, + { + "description": "Valid - day 366 in non-leap year (validation is consumer responsibility)", + "data": "2023366T120000/2024001T120000", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "1985102T232050//1985176T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985102T232050\\1985176T103000", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "1985176T103000/1985102T232050", + "valid": true + }, + { + "description": "Invalid - week date format instead of ordinal in start", + "data": "1985W155T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - week date format instead of ordinal in end", + "data": "1985102T232050/1985W261T103000", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-ordinal-extended.test.json b/test/iso/datetime/2019/interval/start-end-ordinal-extended.test.json new file mode 100644 index 00000000..930dc0a9 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-ordinal-extended.test.json @@ -0,0 +1,266 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-ordinal-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985102232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - day 102 to day 176 of 1985", + "data": "1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - day 1 to day 366 of 2000 (leap year)", + "data": "2000-001T00:00:00/2000-366T23:59:59", + "valid": true + }, + { + "description": "Valid - day 1 to day 365 of 2023", + "data": "2023-001T12:00:00/2023-365T18:00:00", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "2023-100T12:00:00/2023-100T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "2022-365T23:00:00/2023-001T01:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "1985-102T23:59:60/1985-103T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "2023-001T00:00:00/2023-002T00:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-102T23:20:501985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "1985102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-102T23:20:50/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "1985-102T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-102T23:20:50 / 1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "1985-000T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "1985-367T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 000", + "data": "1985-102T23:20:50/1985-000T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 367", + "data": "1985-102T23:20:50/1985-367T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-102T24:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "1985-102T23:20:50/1985-176T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-102T23:60:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "1985-102T23:20:50/1985-176T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-102T23:20:61/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "1985-102T23:20:50/1985-176T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-10223:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "1985-102T23:20:50/1985-17610:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-102t23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "1985-102T23:20:50/1985-176t10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in start", + "data": "1985-04-12T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in end", + "data": "1985-102T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "1985102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "1985-102T23:20:50/1985176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "1985-102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "1985-102T23:20:50/1985-176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCD-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "1985-102T23:20:50/ABCD-176T10:30:00", + "valid": false + }, + { + "description": "Valid - day 366 in leap year", + "data": "2020-366T00:00:00/2021-001T00:00:00", + "valid": true + }, + { + "description": "Valid - day 366 in non-leap year (validation is consumer responsibility)", + "data": "2023-366T12:00:00/2024-001T12:00:00", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "1985-102T23:20:50//1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-102T23:20:50\\1985-176T10:30:00", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "1985-176T10:30:00/1985-102T23:20:50", + "valid": true + }, + { + "description": "Invalid - week date format instead of ordinal in start", + "data": "1985-W15-5T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - week date format instead of ordinal in end", + "data": "1985-102T23:20:50/1985-W26-1T10:30:00", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-week-basic.test.json b/test/iso/datetime/2019/interval/start-end-week-basic.test.json new file mode 100644 index 00000000..568c7369 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-week-basic.test.json @@ -0,0 +1,281 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-week-basic.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - week 15 day 5 to week 26 day 1 of 1985", + "data": "1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2000", + "data": "2000W011T000000/2000W527T235959", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2023", + "data": "2023W011T120000/2023W527T180000", + "valid": true + }, + { + "description": "Valid - same week interval", + "data": "2023W151T120000/2023W155T180000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "2022W527T230000/2023W011T010000", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "1985W155T235960/1985W156T000000", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "2023W011T000000/2023W012T000000", + "valid": true + }, + { + "description": "Valid - week 53 (some years have 53 weeks)", + "data": "2020W531T000000/2021W011T000000", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985W155T2320501985W261T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "1985W155T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-W15-5T23:20:50/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "1985W155T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985W155T232050 / 1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "1985W005T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "1985W545T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end week 00", + "data": "1985W155T232050/1985W001T103000", + "valid": false + }, + { + "description": "Invalid - end week 54", + "data": "1985W155T232050/1985W541T103000", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "1985W150T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "1985W158T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end day 0", + "data": "1985W155T232050/1985W260T103000", + "valid": false + }, + { + "description": "Invalid - end day 8", + "data": "1985W155T232050/1985W268T103000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985W155T242050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "1985W155T232050/1985W261T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985W155T236050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "1985W155T232050/1985W261T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985W155T232061/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "1985W155T232050/1985W261T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985W155232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "1985W155T232050/1985W261103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985W155t232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "1985W155T232050/1985W261t103000", + "valid": false + }, + { + "description": "Invalid - lowercase w in start", + "data": "1985w155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "1985W155T232050/1985w261T103000", + "valid": false + }, + { + "description": "Invalid - missing W designator in start", + "data": "1985155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing W designator in end", + "data": "1985W155T232050/1985261T103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in start", + "data": "19850412T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in end", + "data": "1985W155T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in start", + "data": "1985102T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in end", + "data": "1985W155T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCDW155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "1985W155T232050/ABCDW261T103000", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985W155T232050//1985W261T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985W155T232050\\1985W261T103000", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "1985W261T103000/1985W155T232050", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/interval/start-end-week-extended.test.json b/test/iso/datetime/2019/interval/start-end-week-extended.test.json new file mode 100644 index 00000000..150cfab6 --- /dev/null +++ b/test/iso/datetime/2019/interval/start-end-week-extended.test.json @@ -0,0 +1,301 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/interval/start-end-week-extended.json", + "tests": [ + { + "description": "Invalid type - integer", + "data": 1985155232050, + "valid": false + }, + { + "description": "Invalid type - boolean", + "data": true, + "valid": false + }, + { + "description": "Invalid type - null", + "data": null, + "valid": false + }, + { + "description": "Invalid type - array", + "data": [], + "valid": false + }, + { + "description": "Invalid type - object", + "data": {}, + "valid": false + }, + { + "description": "Valid - week 15 day 5 to week 26 day 1 of 1985", + "data": "1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2000", + "data": "2000-W01-1T00:00:00/2000-W52-7T23:59:59", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2023", + "data": "2023-W01-1T12:00:00/2023-W52-7T18:00:00", + "valid": true + }, + { + "description": "Valid - same week interval", + "data": "2023-W15-1T12:00:00/2023-W15-5T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "2022-W52-7T23:00:00/2023-W01-1T01:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "1985-W15-5T23:59:60/1985-W15-6T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "2023-W01-1T00:00:00/2023-W01-2T00:00:00", + "valid": true + }, + { + "description": "Valid - week 53 (some years have 53 weeks)", + "data": "2020-W53-1T00:00:00/2021-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "1985-W15-5T23:20:501985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "1985W155T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "1985-W15-5T23:20:50/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "1985-W15-5T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "/", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "1985-W15-5T23:20:50 / 1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "1985-W00-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "1985-W54-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end week 00", + "data": "1985-W15-5T23:20:50/1985-W00-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end week 54", + "data": "1985-W15-5T23:20:50/1985-W54-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "1985-W15-0T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "1985-W15-8T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 0", + "data": "1985-W15-5T23:20:50/1985-W26-0T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 8", + "data": "1985-W15-5T23:20:50/1985-W26-8T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "1985-W15-5T24:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "1985-W15-5T23:20:50/1985-W26-1T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "1985-W15-5T23:60:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "1985-W15-5T23:20:50/1985-W26-1T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "1985-W15-5T23:20:61/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "1985-W15-5T23:20:50/1985-W26-1T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "1985-W15-523:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "1985-W15-5T23:20:50/1985-W26-110:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "1985-W15-5t23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "1985-W15-5T23:20:50/1985-W26-1t10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase w in start", + "data": "1985-w15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "1985-W15-5T23:20:50/1985-w26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing W designator in start", + "data": "1985-15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing W designator in end", + "data": "1985-W15-5T23:20:50/1985-26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "P1Y2M15DT12H30M0S/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in start", + "data": "1985-04-12T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in end", + "data": "1985-W15-5T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in start", + "data": "1985-102T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in end", + "data": "1985-W15-5T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "1985W155T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "1985-W15-5T23:20:50/1985W261T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "1985-W15-5T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "1985-W15-5T23:20:50/1985-W26-1T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "ABCD-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "1985-W15-5T23:20:50/ABCD-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "1985-W15-5T23:20:50//1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "1985-W15-5T23:20:50\\1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "1985-W26-1T10:30:00/1985-W15-5T23:20:50", + "valid": true + } + ] +}