From 6e04ed9c53d5dc9f98ef5b345df46213af47c735 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 22 Oct 2025 16:22:03 -0400 Subject: [PATCH] Define ISO 8601-1:2019 recurring interval schemas Signed-off-by: Juan Cruz Viotti --- .../duration-end-calendar-basic.json | 16 + .../duration-end-calendar-extended.json | 16 + .../recurring/duration-end-ordinal-basic.json | 16 + .../duration-end-ordinal-extended.json | 16 + .../recurring/duration-end-week-basic.json | 16 + .../recurring/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 + .../recurring/start-duration-week-basic.json | 16 + .../start-duration-week-extended.json | 16 + .../recurring/start-end-calendar-basic.json | 16 + .../start-end-calendar-extended.json | 16 + .../recurring/start-end-ordinal-basic.json | 16 + .../recurring/start-end-ordinal-extended.json | 16 + .../2019/recurring/start-end-week-basic.json | 16 + .../recurring/start-end-week-extended.json | 16 + .../duration-end-calendar-basic.test.json | 481 +++++++++++ .../duration-end-calendar-extended.test.json | 456 ++++++++++ .../duration-end-ordinal-basic.test.json | 436 ++++++++++ .../duration-end-ordinal-extended.test.json | 411 +++++++++ .../duration-end-week-basic.test.json | 466 ++++++++++ .../duration-end-week-extended.test.json | 436 ++++++++++ .../start-duration-calendar-basic.test.json | 501 +++++++++++ ...start-duration-calendar-extended.test.json | 381 ++++++++ .../start-duration-ordinal-basic.test.json | 361 ++++++++ .../start-duration-ordinal-extended.test.json | 361 ++++++++ .../start-duration-week-basic.test.json | 501 +++++++++++ .../start-duration-week-extended.test.json | 371 ++++++++ .../start-end-calendar-basic.test.json | 816 ++++++++++++++++++ .../start-end-calendar-extended.test.json | 571 ++++++++++++ .../start-end-ordinal-basic.test.json | 491 +++++++++++ .../start-end-ordinal-extended.test.json | 476 ++++++++++ .../recurring/start-end-week-basic.test.json | 501 +++++++++++ .../start-end-week-extended.test.json | 521 +++++++++++ 36 files changed, 8826 insertions(+) create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-week-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/duration-end-week-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-week-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-duration-week-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-calendar-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-calendar-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-ordinal-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-ordinal-extended.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-week-basic.json create mode 100644 schemas/iso/datetime/2019/recurring/start-end-week-extended.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-week-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/duration-end-week-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-week-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-duration-week-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-calendar-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-calendar-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-ordinal-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-ordinal-extended.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-week-basic.test.json create mode 100644 test/iso/datetime/2019/recurring/start-end-week-extended.test.json diff --git a/schemas/iso/datetime/2019/recurring/duration-end-calendar-basic.json b/schemas/iso/datetime/2019/recurring/duration-end-calendar-basic.json new file mode 100644 index 00000000..b97c53ff --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-calendar-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Calendar Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.3 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/P1Y2M15DT12H30M0S/19850412T232050", + "R/P1Y/20001231T235959", + "R0/PT5H30M/20230615T180000", + "R9999/P2W/19850101T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/(?: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/recurring/duration-end-calendar-extended.json b/schemas/iso/datetime/2019/recurring/duration-end-calendar-extended.json new file mode 100644 index 00000000..d15270b3 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-calendar-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Calendar Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.3 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "R/P1Y/2000-12-31T23:59:59", + "R0/PT5H30M/2023-06-15T18:00:00", + "R9999/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": "^R([0-9]+)?/(?: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/recurring/duration-end-ordinal-basic.json b/schemas/iso/datetime/2019/recurring/duration-end-ordinal-basic.json new file mode 100644 index 00000000..ab846e20 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-ordinal-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Ordinal Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.4 a, §5.5.3.3 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/P1Y2M15DT12H30M0S/1985102T232050", + "R/P1Y/2000366T235959", + "R0/PT5H30M/2023166T180000", + "R9999/P2W/1985001T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/(?: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/recurring/duration-end-ordinal-extended.json b/schemas/iso/datetime/2019/recurring/duration-end-ordinal-extended.json new file mode 100644 index 00000000..6e6e51c5 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-ordinal-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Ordinal Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.4 a, §5.5.3.3 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "R/P1Y/2000-366T23:59:59", + "R0/PT5H30M/2023-166T18:00:00", + "R9999/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": "^R([0-9]+)?/(?: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/recurring/duration-end-week-basic.json b/schemas/iso/datetime/2019/recurring/duration-end-week-basic.json new file mode 100644 index 00000000..e866e62a --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-week-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Week Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.4 a, §5.5.3.3 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/P1Y2M15DT12H30M0S/1985W155T232050", + "R/P1Y/2000W527T235959", + "R0/PT5H30M/2023W241T180000", + "R9999/P2W/1985W011T000000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/(?: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/recurring/duration-end-week-extended.json b/schemas/iso/datetime/2019/recurring/duration-end-week-extended.json new file mode 100644 index 00000000..eb0908a0 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/duration-end-week-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Duration and End (Week Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][duration][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.4 a, §5.5.3.3 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "R/P1Y/2000-W52-7T23:59:59", + "R0/PT5H30M/2023-W24-1T18:00:00", + "R9999/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": "^R([0-9]+)?/(?: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/recurring/start-duration-calendar-basic.json b/schemas/iso/datetime/2019/recurring/start-duration-calendar-basic.json new file mode 100644 index 00000000..e65d6e4e --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-calendar-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Calendar Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss][\"/\"][duration] (§5.6.3 a, §5.5.3.2 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/19850412T232050/P1Y2M15DT12H30M0S", + "R/20000101T000000/P1Y", + "R0/20230615T120000/PT5H30M", + "R9999/19851231T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/([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/recurring/start-duration-calendar-extended.json b/schemas/iso/datetime/2019/recurring/start-duration-calendar-extended.json new file mode 100644 index 00000000..66ae6e25 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-calendar-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Calendar Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.6.3 b, §5.5.3.2 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "R/2000-01-01T00:00:00/P1Y", + "R0/2023-06-15T12:00:00/PT5H30M", + "R9999/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": "^R([0-9]+)?/([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/recurring/start-duration-ordinal-basic.json b/schemas/iso/datetime/2019/recurring/start-duration-ordinal-basic.json new file mode 100644 index 00000000..5fc919ee --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-ordinal-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Ordinal Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss][\"/\"][duration] (§5.6.3 a, §5.5.3.4 a, §5.5.3.2 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985102T232050/P1Y2M15DT12H30M0S", + "R/2000001T000000/P1Y", + "R0/2023166T120000/PT5H30M", + "R9999/1985365T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/start-duration-ordinal-extended.json b/schemas/iso/datetime/2019/recurring/start-duration-ordinal-extended.json new file mode 100644 index 00000000..6b0beadb --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-ordinal-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Ordinal Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.6.3 b, §5.5.3.4 a, §5.5.3.2 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "R/2000-001T00:00:00/P1Y", + "R0/2023-166T12:00:00/PT5H30M", + "R9999/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": "^R([0-9]+)?/[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/recurring/start-duration-week-basic.json b/schemas/iso/datetime/2019/recurring/start-duration-week-basic.json new file mode 100644 index 00000000..ecaac99a --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-week-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Week Date, Basic Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss][\"/\"][duration] (§5.6.3 a, §5.5.3.4 a, §5.5.3.2 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985W155T232050/P1Y2M15DT12H30M0S", + "R/2000W011T000000/P1Y", + "R0/2023W241T120000/PT5H30M", + "R9999/1985W527T235959/P2W" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/start-duration-week-extended.json b/schemas/iso/datetime/2019/recurring/start-duration-week-extended.json new file mode 100644 index 00000000..f680df69 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-duration-week-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and Duration (Week Date, Extended Format)", + "description": "A recurring 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 [\"R\"][n][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][duration] (§5.6.3 b, §5.5.3.4 a, §5.5.3.2 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "R/2000-W01-1T00:00:00/P1Y", + "R0/2023-W24-1T12:00:00/PT5H30M", + "R9999/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": "^R([0-9]+)?/[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/recurring/start-end-calendar-basic.json b/schemas/iso/datetime/2019/recurring/start-end-calendar-basic.json new file mode 100644 index 00000000..0da0d25f --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-calendar-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Calendar Date, Basic Format)", + "description": "A recurring time interval identified by its start and end, using calendar date combined with complete local time of day in basic format [\"R\"][n][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss][\"/\"][YYYY][MM][DD][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.1 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/19850412T232050/19850625T103000", + "R/20000101T000000/20001231T235959", + "R0/20230101T120000/20230630T180000", + "R9999/19850412T232050/19850625T103000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/([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/recurring/start-end-calendar-extended.json b/schemas/iso/datetime/2019/recurring/start-end-calendar-extended.json new file mode 100644 index 00000000..d532007c --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-calendar-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Calendar Date, Extended Format)", + "description": "A recurring time interval identified by its start and end, using calendar date combined with complete local time of day in extended format [\"R\"][n][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][MM][\"-\"][DD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.1 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. This schema does not validate leap years or time shifts (§5.5.3.4 b)", + "examples": [ + "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "R/2000-01-01T00:00:00/2000-12-31T23:59:59", + "R0/2023-01-01T12:00:00/2023-06-30T18:00:00", + "R9999/1985-04-12T23:20:50/1985-06-25T10:30:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/([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/recurring/start-end-ordinal-basic.json b/schemas/iso/datetime/2019/recurring/start-end-ordinal-basic.json new file mode 100644 index 00000000..176d745e --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-ordinal-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Ordinal Date, Basic Format)", + "description": "A recurring time interval identified by its start and end, using ordinal date combined with complete local time of day in basic format [\"R\"][n][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss][\"/\"][YYYY][DDD][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.4 a, §5.5.3.1 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985102T232050/1985176T103000", + "R/2000001T000000/2000366T235959", + "R0/2023001T120000/2023365T180000", + "R9999/1985102T232050/1985176T103000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/start-end-ordinal-extended.json b/schemas/iso/datetime/2019/recurring/start-end-ordinal-extended.json new file mode 100644 index 00000000..f4c71818 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-ordinal-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Ordinal Date, Extended Format)", + "description": "A recurring time interval identified by its start and end, using ordinal date combined with complete local time of day in extended format [\"R\"][n][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][DDD][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.4 a, §5.5.3.1 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Day 366 is accepted for any year, and leap year validation must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985-102T23:20:50/1985-176T10:30:00", + "R/2000-001T00:00:00/2000-366T23:59:59", + "R0/2023-001T12:00:00/2023-365T18:00:00", + "R9999/1985-102T23:20:50/1985-176T10:30:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/start-end-week-basic.json b/schemas/iso/datetime/2019/recurring/start-end-week-basic.json new file mode 100644 index 00000000..6454ddf9 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-week-basic.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Week Date, Basic Format)", + "description": "A recurring time interval identified by its start and end, using week date combined with complete local time of day in basic format [\"R\"][n][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss][\"/\"][YYYY][\"W\"][ww][D][\"T\"][hh][mm][ss] (§5.6.3 a, §5.5.3.4 a, §5.5.3.1 a)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985W155T232050/1985W261T103000", + "R/2000W011T000000/2000W527T235959", + "R0/2023W011T120000/2023W527T180000", + "R9999/1985W155T232050/1985W261T103000" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/start-end-week-extended.json b/schemas/iso/datetime/2019/recurring/start-end-week-extended.json new file mode 100644 index 00000000..4586e1a1 --- /dev/null +++ b/schemas/iso/datetime/2019/recurring/start-end-week-extended.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "ISO 8601-1:2019 Recurring Time Interval by Start and End (Week Date, Extended Format)", + "description": "A recurring time interval identified by its start and end, using week date combined with complete local time of day in extended format [\"R\"][n][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss][\"/\"][YYYY][\"-\"][\"W\"][ww][\"-\"][D][\"T\"][hh][\":\"[mm][\":\"[ss] (§5.6.3 b, §5.5.3.4 a, §5.5.3.1 b)", + "$comment": "The recurrence number [n] is optional (§5.6.1). When absent, the number of occurrences is unbounded. Week 53 is accepted for any year, and validation of whether a year actually has 53 weeks must be performed by the consumer. Time shifts (§5.5.3.4 b) are not supported", + "examples": [ + "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "R/2000-W01-1T00:00:00/2000-W52-7T23:59:59", + "R0/2023-W01-1T12:00:00/2023-W52-7T18:00:00", + "R9999/1985-W15-5T23:20:50/1985-W26-1T10:30:00" + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "x-links": [ "https://www.iso.org/standard/70907.html" ], + "type": "string", + "pattern": "^R([0-9]+)?/[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/recurring/duration-end-calendar-basic.test.json b/test/iso/datetime/2019/recurring/duration-end-calendar-basic.test.json new file mode 100644 index 00000000..4184a494 --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-calendar-basic.test.json @@ -0,0 +1,481 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/19850412T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/20001231T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/20230615T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/19850101T000000", + "valid": true + }, + { + "description": "Invalid - extended format datetime", + "data": "R12/P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y19850412T232050", + "valid": false + }, + { + "description": "Invalid - start datetime instead of duration", + "data": "R12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/19850412T232050", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "R12/P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "R12/P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "R12/P1Y/19851312T232050", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "R12/P1Y/19850432T232050", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "R12/P1Y/19850431T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/19850412T235960", + "valid": true + }, + { + "description": "Valid - 29 February end", + "data": "R12/P1Y/20230229T120000", + "valid": true + }, + { + "description": "Invalid - end month 00", + "data": "R12/P1Y/19850012T232050", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "R12/P1Y/19850400T232050", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "R12/P1Y/20230230T120000", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "R12/P1Y/19850631T120000", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "R12/P1Y/19850931T120000", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "R12/P1Y/19851131T120000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/19850412T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/19850412T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/19850412T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/19850412T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/19850412T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/19850412T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/19850412T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/19850412232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/19850412t232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/19850412T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/19850412T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/19850412T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//19850412T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\19850412T232050", + "valid": false + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/20230101T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/20230101T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/20230101T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/20230101T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/20230101T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/20230101T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/19850412T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/20230101T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/20230101T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/20230101T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/20230101T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "R12/P1Y/19850412T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "R12/P1Y/19850412T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/P1Y/19850412T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "R12/XP1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "R12/P1Y/1985 04 12T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I9850412T232050", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "R12/P1Y/1985O412T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/198504I2T232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/19850412TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/19850412T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/19850412T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/19850412T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/19850412T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/19850412T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/19850412T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/19850412T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/19850412T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 19850412T232050", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/duration-end-calendar-extended.test.json b/test/iso/datetime/2019/recurring/duration-end-calendar-extended.test.json new file mode 100644 index 00000000..ae678fde --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-calendar-extended.test.json @@ -0,0 +1,456 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/2000-12-31T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/2023-06-15T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/1985-01-01T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format datetime", + "data": "R12/P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - start datetime instead of duration", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "R12/P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "R12/P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "R12/P1Y/1985-13-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "R12/P1Y/1985-04-32T23:20:50", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "R12/P1Y/1985-04-31T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/1985-04-12T23:59:60", + "valid": true + }, + { + "description": "Valid - 29 February end", + "data": "R12/P1Y/2023-02-29T12:00:00", + "valid": true + }, + { + "description": "Invalid - end month 00", + "data": "R12/P1Y/1985-00-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "R12/P1Y/1985-04-00T23:20:50", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "R12/P1Y/2023-02-30T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "R12/P1Y/1985-06-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "R12/P1Y/1985-09-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "R12/P1Y/1985-11-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/1985-04-12T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/1985-04-12T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/1985-04-12T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/1985-04-12T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/1985-04-12T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/1985-04-12T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/1985-04-12T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/1985-04-12 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/1985-04-12t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/2023-01-01T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/2023-01-01T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "R12/P1Y/1985-O4-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/1985-04-I2T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/1985-04-12TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/1985-04-12T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/1985-04-12T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 1985-04-12T23:20:50", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/duration-end-ordinal-basic.test.json b/test/iso/datetime/2019/recurring/duration-end-ordinal-basic.test.json new file mode 100644 index 00000000..4c46dddf --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-ordinal-basic.test.json @@ -0,0 +1,436 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/1985102T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/2000366T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/2023166T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/1985001T000000", + "valid": true + }, + { + "description": "Invalid - extended format", + "data": "R12/P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y1985102T232050", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/1985102T232050", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "R12/P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "R12/P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - day 000", + "data": "R12/P1Y/1985000T232050", + "valid": false + }, + { + "description": "Invalid - day 367", + "data": "R12/P1Y/1985367T232050", + "valid": false + }, + { + "description": "Valid - day 366", + "data": "R12/P1Y/2020366T000000", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/1985102T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/1985102T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/1985102T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/1985102T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/1985102T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/1985102T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/1985102T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/1985102232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/1985102t232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/1985102T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/1985102T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/1985102T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//1985102T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\1985102T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/1985102T235960", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/2023001T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/2023001T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/2023001T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/2023001T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/2023001T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/2023001T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/1985102T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/2023001T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/2023001T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/2023001T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/2023001T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "R12/P1Y/1985102T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "R12/P1Y/1985102T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/P1Y/1985102T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "R12/XP1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "R12/P1Y/1985 102T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I985102T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/1985I02T232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/1985102TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/1985102T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/1985102T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/1985102T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/1985102T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/1985102T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/1985102T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/1985102T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/1985102T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 1985102T232050", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/duration-end-ordinal-extended.test.json b/test/iso/datetime/2019/recurring/duration-end-ordinal-extended.test.json new file mode 100644 index 00000000..265500fb --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-ordinal-extended.test.json @@ -0,0 +1,411 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/2000-366T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/2023-166T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/1985-001T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format", + "data": "R12/P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "R12/P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - week date end", + "data": "R12/P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 000", + "data": "R12/P1Y/1985-000T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 367", + "data": "R12/P1Y/1985-367T23:20:50", + "valid": false + }, + { + "description": "Valid - day 366", + "data": "R12/P1Y/2020-366T00:00:00", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/1985-102T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/1985-102T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/1985-102T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/1985-102T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/1985-102T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/1985-102T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/1985-102T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/1985-102 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/1985-102t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/1985-102T23:59:60", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/2023-001T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/2023-001T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/2023-001T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/2023-001T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/1985-I02T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/1985-102TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/1985-102T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/1985-102T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/1985-102T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/1985-102T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/1985-102T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 1985-102T23:20:50", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/duration-end-week-basic.test.json b/test/iso/datetime/2019/recurring/duration-end-week-basic.test.json new file mode 100644 index 00000000..0746163d --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-week-basic.test.json @@ -0,0 +1,466 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/2000W527T235959", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/2023W241T180000", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/1985W011T000000", + "valid": true + }, + { + "description": "Invalid - extended format", + "data": "R12/P1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y1985W155T232050", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "R12/P1Y/19850412T232050", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "R12/P1Y/1985102T232050", + "valid": false + }, + { + "description": "Invalid - week 00", + "data": "R12/P1Y/1985W005T232050", + "valid": false + }, + { + "description": "Invalid - week 54", + "data": "R12/P1Y/1985W545T232050", + "valid": false + }, + { + "description": "Invalid - day 0", + "data": "R12/P1Y/1985W150T232050", + "valid": false + }, + { + "description": "Invalid - day 8", + "data": "R12/P1Y/1985W158T232050", + "valid": false + }, + { + "description": "Valid - week 53", + "data": "R12/P1Y/2020W531T000000", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/1985W155T242050", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/1985W155T252050", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/1985W155T992050", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/1985W155T236050", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/1985W155T239950", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/1985W155T232061", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/1985W155T232099", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/1985W155232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/1985W155t232050", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "R12/P1Y/1985w155T232050", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//1985W155T232050", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\1985W155T232050", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/1985W155T235960", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/2023W011T000000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/2023W011T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/2023W011T120000", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/2023W011T120000", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/2023W011T120000", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/2023W011T120000", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/1985W155T232050", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/2023W011T000000", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/2023W011T000000", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/2023W011T000000", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/2023W011T000000", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "R12/P1Y/1985W155T23205", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "R12/P1Y/1985W155T2320500", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/P1Y/1985W155T232050X", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning of duration", + "data": "R12/XP1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "R12/P1Y/1985 W15 5T23 20 50", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I985W155T232050", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "R12/P1Y/1985WI55T232050", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/1985W15IT232050", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/1985W155TI32050", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/1985W155T23I050", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/1985W155T2320I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/1985W155T232050", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/1985W155T232050", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/1985W155T232050", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/1985W155T232050", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/1985W155T232050", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 1985W155T232050", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "R12/P1Y/2023W011T120000", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "R12/P1Y/2023W527T120000", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/duration-end-week-extended.test.json b/test/iso/datetime/2019/recurring/duration-end-week-extended.test.json new file mode 100644 index 00000000..a4ae146e --- /dev/null +++ b/test/iso/datetime/2019/recurring/duration-end-week-extended.test.json @@ -0,0 +1,436 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - full duration", + "data": "R12/P1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/P1Y/2000-W52-7T23:59:59", + "valid": true + }, + { + "description": "Valid - time duration", + "data": "R12/PT5H30M/2023-W24-1T18:00:00", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/P2W/1985-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - basic format", + "data": "R12/P1Y/1985W155T232050", + "valid": false + }, + { + "description": "Invalid - missing slash", + "data": "R12/P1Y1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty duration", + "data": "R12/P/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - calendar date end", + "data": "R12/P1Y/1985-04-12T23:20:50", + "valid": false + }, + { + "description": "Invalid - ordinal date end", + "data": "R12/P1Y/1985-102T23:20:50", + "valid": false + }, + { + "description": "Invalid - week 00", + "data": "R12/P1Y/1985-W00-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - week 54", + "data": "R12/P1Y/1985-W54-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 0", + "data": "R12/P1Y/1985-W15-0T23:20:50", + "valid": false + }, + { + "description": "Invalid - day 8", + "data": "R12/P1Y/1985-W15-8T23:20:50", + "valid": false + }, + { + "description": "Valid - week 53", + "data": "R12/P1Y/2020-W53-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - end hour 24", + "data": "R12/P1Y/1985-W15-5T24:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 25", + "data": "R12/P1Y/1985-W15-5T25:20:50", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/P1Y/1985-W15-5T99:20:50", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/P1Y/1985-W15-5T23:60:50", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/P1Y/1985-W15-5T23:99:50", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/P1Y/1985-W15-5T23:20:61", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/P1Y/1985-W15-5T23:20:99", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/P1Y/1985-W15-5 23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/P1Y/1985-W15-5t23:20:50", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1Y2M15DT12H30M0S/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/p1Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/P1Dt1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/PT/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/P1Y//1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/P1Y\\1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - leap second in end", + "data": "R12/P1D/1985-W15-5T23:59:60", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/P0Y0M0DT0H0M0S/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/P1.5Y/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/P3M15DT2.5H/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/P10.5D/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/PT2.5H/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/PT45.5M/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/PT10.123S/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/P1.5W/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/P6M3Y/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/P15D6M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/P1D1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/P1W2D/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/P1Y2W/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/P1WT1H/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/P500Y/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/P500D/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/PT100H/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/P13M/2023-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - letter in year", + "data": "R12/P1Y/I985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "R12/P1Y/1985-WI5-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/P1Y/1985-W15-IT23:20:50", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/P1Y/1985-W15-5TI3:20:50", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/P1Y/1985-W15-5T23:I0:50", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/P1Y/1985-W15-5T23:20:I0", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/P1Y 2M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/P1Y/2M/1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/PT60M/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/PT60S/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/PT25H/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/P32D/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/P1Y2M15DT12H30M0S/", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/P1Y / 1985-W15-5T23:20:50", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "R12/P1Y/2023-W01-1T12:00:00", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "R12/P1Y/2023-W52-7T12:00:00", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-calendar-basic.test.json b/test/iso/datetime/2019/recurring/start-duration-calendar-basic.test.json new file mode 100644 index 00000000..a3681894 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-calendar-basic.test.json @@ -0,0 +1,501 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/20000101T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/20230615T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/19851231T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/20230101T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/20231231T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/20000630T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/19850412T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "R12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/19850412T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/19850412T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "R12/19850012T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "R12/19851312T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "R12/19850400T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "R12/19850432T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "R12/19850431T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "R12/20230230T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/19850412T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/19850412T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/19850412T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/19850412232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/19850412t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/19850412T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/19850412T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/19850412T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/19850412T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/19850412T232050/PT", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of calendar", + "data": "R12/1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of calendar", + "data": "R12/1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/19850412T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/19850412T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "R12/20230229T120000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/19850412T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/20230101T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction", + "data": "R12/20230101T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction", + "data": "R12/20230101T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/20230101T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/20230101T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/20230101T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/20230101T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/20230101T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/19850412T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/19850412T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/19850412T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/19850412T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/19850412T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/19850412T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/20230101T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/20230101T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/20230101T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/20230101T000000/P13M", + "valid": true + }, + { + "description": "Invalid - start hour 25", + "data": "R12/19850412T252050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "R12/19850412T992050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/19850412T239950/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/19850412T232099/P1Y", + "valid": false + }, + { + "description": "Invalid - too short", + "data": "R12/19850412T23205/P1Y", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "R12/19850412T2320500/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/19850412T232050X/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "R12/X19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "R12/1985 04 12T23 20 50/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "R12/I9850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in month", + "data": "R12/1985O412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/198504I2T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/19850412TI32050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/19850412T23I050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/19850412T2320I0/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 June", + "data": "R12/19850631T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 September", + "data": "R12/19850931T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - 31 November", + "data": "R12/19851131T120000/P1Y", + "valid": false + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/19850412T232050/P1Y 2M", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/19850412T232050/P1Y/2M", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/19850412T232050/PT60M", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/19850412T232050/PT60S", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/19850412T232050/PT25H", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/19850412T232050/P32D", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-calendar-extended.test.json b/test/iso/datetime/2019/recurring/start-duration-calendar-extended.test.json new file mode 100644 index 00000000..3a0dbd4b --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-calendar-extended.test.json @@ -0,0 +1,381 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/2000-01-01T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/2023-06-15T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/1985-12-31T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/2023-01-01T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/2023-12-31T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/2000-06-30T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-04-12T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "R12/19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/1985-04-12T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-04-12T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "R12/1985-00-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "R12/1985-13-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "R12/1985-04-00T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "R12/1985-04-32T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "R12/1985-04-31T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "R12/2023-02-30T12:00:00/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-04-12T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-04-12T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-04-12T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-04-12 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-04-12t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1985-04-12T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/1985-04-12T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/1985-04-12T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/1985-04-12T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/1985-04-12T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of calendar", + "data": "R12/1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of calendar", + "data": "R12/1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-04-12T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985-04-12T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "R12/2023-02-29T12:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/1985-04-12T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/2023-01-01T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/2023-01-01T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/2023-01-01T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/2023-01-01T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/2023-01-01T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/2023-01-01T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/2023-01-01T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/2023-01-01T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/1985-04-12T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/1985-04-12T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/1985-04-12T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/1985-04-12T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/1985-04-12T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/1985-04-12T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/2023-01-01T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/2023-01-01T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/2023-01-01T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/2023-01-01T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-ordinal-basic.test.json b/test/iso/datetime/2019/recurring/start-duration-ordinal-basic.test.json new file mode 100644 index 00000000..e3832e20 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-ordinal-basic.test.json @@ -0,0 +1,361 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/2000001T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/2023166T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/1985365T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/2023001T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/2023365T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/2000182T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985102T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "R12/1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/1985102T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985102T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "R12/1985000T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "R12/1985367T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985102T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985102T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985102T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985102232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985102t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1985102T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/1985102T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/1985102T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/1985102T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/1985102T232050/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal", + "data": "R12/19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of ordinal", + "data": "R12/1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985102T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985102T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - day 366 (leap year validation is consumer responsibility)", + "data": "R12/2020366T000000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/1985102T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/2023001T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/2023001T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/2023001T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/2023001T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/2023001T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/2023001T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/2023001T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/2023001T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/1985102T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/1985102T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/1985102T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/1985102T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/1985102T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/1985102T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/2023001T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/2023001T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/2023001T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/2023001T000000/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-ordinal-extended.test.json b/test/iso/datetime/2019/recurring/start-duration-ordinal-extended.test.json new file mode 100644 index 00000000..dd2cf1a0 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-ordinal-extended.test.json @@ -0,0 +1,361 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/2000-001T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/2023-166T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/1985-365T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/2023-001T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/2023-365T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/2000-182T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-102T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "R12/1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/1985-102T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-102T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "R12/1985-000T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "R12/1985-367T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-102T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-102T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-102T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-102 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-102t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1985-102T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/1985-102T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/1985-102T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/1985-102T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/1985-102T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal", + "data": "R12/1985-04-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - week date instead of ordinal", + "data": "R12/1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-102T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985-102T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - day 366 (leap year validation is consumer responsibility)", + "data": "R12/2020-366T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/1985-102T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/2023-001T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/2023-001T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/2023-001T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/2023-001T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/2023-001T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/2023-001T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/2023-001T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/2023-001T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/1985-102T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/1985-102T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/1985-102T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/1985-102T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/1985-102T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/1985-102T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/2023-001T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/2023-001T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/2023-001T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/2023-001T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-week-basic.test.json b/test/iso/datetime/2019/recurring/start-duration-week-basic.test.json new file mode 100644 index 00000000..db5e6bb7 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-week-basic.test.json @@ -0,0 +1,501 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/2000W011T000000/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/2023W241T120000/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/1985W527T235959/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/2023W011T000000/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/2023W527T120000/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/2000W265T180000/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985W155T232050P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - extended format datetime", + "data": "R12/1985-W15-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/1985W155T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985W155T232050 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "R12/1985W005T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "R12/1985W545T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "R12/1985W150T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "R12/1985W158T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985W155T242050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "R12/1985W155T252050/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985W155T992050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985W155T236050/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985W155T239950/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985W155T232061/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985W155T232099/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985W155232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985W155t232050/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase w", + "data": "R12/1985w155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1985W155T232050/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/1985W155T232050/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/1985W155T232050/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/1985W155T232050/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/1985W155T232050/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week", + "data": "R12/19850412T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week", + "data": "R12/1985102T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985W155T232050//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985W155T232050\\P1Y", + "valid": false + }, + { + "description": "Valid - week 53 (long year validation is consumer responsibility)", + "data": "R12/2020W531T000000/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/1985W155T235960/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/2023W011T000000/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/2023W011T120000/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/2023W011T120000/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/2023W011T120000/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/2023W011T120000/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/2023W011T120000/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/2023W011T120000/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/2023W011T120000/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/1985W155T232050/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/1985W155T232050/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/1985W155T232050/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/1985W155T232050/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/1985W155T232050/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/1985W155T232050/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/2023W011T000000/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/2023W011T000000/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/2023W011T000000/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/2023W011T000000/P13M", + "valid": true + }, + { + "description": "Invalid - too short", + "data": "R12/1985W155T23205/P1Y", + "valid": false + }, + { + "description": "Invalid - too long", + "data": "R12/1985W155T2320500/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/1985W155T232050X/P1Y", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "R12/X1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - spaces in datetime", + "data": "R12/1985 W15 5T23 20 50/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in year", + "data": "R12/I985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in week", + "data": "R12/1985WI55T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in day", + "data": "R12/1985W15IT232050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in hour", + "data": "R12/1985W155TI32050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in minute", + "data": "R12/1985W155T23I050/P1Y", + "valid": false + }, + { + "description": "Invalid - letter in second", + "data": "R12/1985W155T2320I0/P1Y", + "valid": false + }, + { + "description": "Valid - week 01 day 1", + "data": "R12/2023W011T120000/P1Y", + "valid": true + }, + { + "description": "Valid - week 52 day 7", + "data": "R12/2023W527T120000/P1Y", + "valid": true + }, + { + "description": "Valid - year 0000", + "data": "R12/0000W011T120000/P1Y", + "valid": true + }, + { + "description": "Valid - year 9999", + "data": "R12/9999W527T235959/P1Y", + "valid": true + }, + { + "description": "Invalid - duration with spaces", + "data": "R12/1985W155T232050/P1Y 2M", + "valid": false + }, + { + "description": "Invalid - duration with extra slash", + "data": "R12/1985W155T232050/P1Y/2M", + "valid": false + }, + { + "description": "Valid - PT60M (durations can exceed calendar limits)", + "data": "R12/1985W155T232050/PT60M", + "valid": true + }, + { + "description": "Valid - PT60S (durations can exceed calendar limits)", + "data": "R12/1985W155T232050/PT60S", + "valid": true + }, + { + "description": "Valid - PT25H (durations can exceed calendar limits)", + "data": "R12/1985W155T232050/PT25H", + "valid": true + }, + { + "description": "Valid - P32D (durations can exceed calendar limits)", + "data": "R12/1985W155T232050/P32D", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-duration-week-extended.test.json b/test/iso/datetime/2019/recurring/start-duration-week-extended.test.json new file mode 100644 index 00000000..2b056cf4 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-duration-week-extended.test.json @@ -0,0 +1,371 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Valid - full duration with all components", + "data": "R12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": true + }, + { + "description": "Valid - only years duration", + "data": "R12/2000-W01-1T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - only time component duration", + "data": "R12/2023-W24-1T12:00:00/PT5H30M", + "valid": true + }, + { + "description": "Valid - weeks duration", + "data": "R12/1985-W52-7T23:59:59/P2W", + "valid": true + }, + { + "description": "Valid - days and seconds duration", + "data": "R12/2023-W01-1T00:00:00/P5DT30S", + "valid": true + }, + { + "description": "Valid - months duration", + "data": "R12/2023-W52-7T12:00:00/P6M", + "valid": true + }, + { + "description": "Valid - hours duration", + "data": "R12/2000-W26-5T18:00:00/PT12H", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-W15-5T23:20:50P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - basic format datetime", + "data": "R12/1985W155T232050/P1Y", + "valid": false + }, + { + "description": "Invalid - missing duration", + "data": "R12/1985-W15-5T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-W15-5T23:20:50 / P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "R12/1985-W00-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "R12/1985-W54-5T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "R12/1985-W15-0T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "R12/1985-W15-8T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-W15-5T24:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-W15-5T23:60:50/P1Y", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-W15-5T23:20:61/P1Y", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-W15-5 23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-W15-5t23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - end datetime instead of duration", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration without P prefix", + "data": "R12/1985-W15-5T23:20:50/1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - lowercase p in duration", + "data": "R12/1985-W15-5T23:20:50/p1Y", + "valid": false + }, + { + "description": "Invalid - lowercase t in duration", + "data": "R12/1985-W15-5T23:20:50/P1Dt1H", + "valid": false + }, + { + "description": "Invalid - empty duration (only P)", + "data": "R12/1985-W15-5T23:20:50/P", + "valid": false + }, + { + "description": "Invalid - empty time duration (only PT)", + "data": "R12/1985-W15-5T23:20:50/PT", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week", + "data": "R12/1985-04-12T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week", + "data": "R12/1985-102T23:20:50/P1Y", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-W15-5T23:20:50//P1Y", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985-W15-5T23:20:50\\P1Y", + "valid": false + }, + { + "description": "Valid - week 53 (long year validation is consumer responsibility)", + "data": "R12/2020-W53-1T00:00:00/P1Y", + "valid": true + }, + { + "description": "Valid - leap second in start", + "data": "R12/1985-W15-5T23:59:60/P1D", + "valid": true + }, + { + "description": "Valid - zero duration components", + "data": "R12/2023-W01-1T00:00:00/P0Y0M0DT0H0M0S", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in years", + "data": "R12/2023-W01-1T12:00:00/P1.5Y", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in months", + "data": "R12/2023-W01-1T12:00:00/P3M15DT2.5H", + "valid": true + }, + { + "description": "Valid - duration with decimal fraction in days", + "data": "R12/2023-W01-1T12:00:00/P10.5D", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in hours", + "data": "R12/2023-W01-1T12:00:00/PT2.5H", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in minutes", + "data": "R12/2023-W01-1T12:00:00/PT45.5M", + "valid": true + }, + { + "description": "Valid - time duration with decimal fraction in seconds", + "data": "R12/2023-W01-1T12:00:00/PT10.123S", + "valid": true + }, + { + "description": "Valid - decimal weeks", + "data": "R12/2023-W01-1T12:00:00/P1.5W", + "valid": true + }, + { + "description": "Invalid - duration wrong component order (M before Y)", + "data": "R12/1985-W15-5T23:20:50/P6M3Y", + "valid": false + }, + { + "description": "Invalid - duration wrong component order (D before M)", + "data": "R12/1985-W15-5T23:20:50/P15D6M", + "valid": false + }, + { + "description": "Invalid - duration time without T designator", + "data": "R12/1985-W15-5T23:20:50/P1D1H", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with other units", + "data": "R12/1985-W15-5T23:20:50/P1W2D", + "valid": false + }, + { + "description": "Invalid - duration weeks mixed with years", + "data": "R12/1985-W15-5T23:20:50/P1Y2W", + "valid": false + }, + { + "description": "Invalid - duration weeks with time", + "data": "R12/1985-W15-5T23:20:50/P1WT1H", + "valid": false + }, + { + "description": "Valid - large year value", + "data": "R12/2023-W01-1T00:00:00/P500Y", + "valid": true + }, + { + "description": "Valid - large day value", + "data": "R12/2023-W01-1T00:00:00/P500D", + "valid": true + }, + { + "description": "Valid - large hour value", + "data": "R12/2023-W01-1T00:00:00/PT100H", + "valid": true + }, + { + "description": "Valid - 13 months", + "data": "R12/2023-W01-1T00:00:00/P13M", + "valid": true + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-calendar-basic.test.json b/test/iso/datetime/2019/recurring/start-end-calendar-basic.test.json new file mode 100644 index 00000000..4d6f0f57 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-calendar-basic.test.json @@ -0,0 +1,816 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/20000101T000000/20001231T235959", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/20230101T120000/20230101T180000", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/20230101T120000/20230102T120000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R5/20221231T230000/20230101T010000", + "valid": true + }, + { + "description": "Valid - 31 January to 28 February", + "data": "R3/20230131T000000/20230228T235959", + "valid": true + }, + { + "description": "Valid - leap year February 29", + "data": "R2/20200228T120000/20200229T120000", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds) in start", + "data": "R10/19850412T235960/19850413T000000", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds) in end", + "data": "R10/19850412T235959/19850413T000060", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R7/20230101T000000/20230102T000000", + "valid": true + }, + { + "description": "Valid - 31 May to 30 June", + "data": "R4/20230531T120000/20230630T120000", + "valid": true + }, + { + "description": "Valid - 31 August to 30 September", + "data": "R4/20230831T120000/20230930T120000", + "valid": true + }, + { + "description": "Valid - 31 October to 30 November", + "data": "R4/20231031T120000/20231130T120000", + "valid": true + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "R12/20230229T120000/20230331T120000", + "valid": true + }, + { + "description": "Valid - both start and end with 29 February", + "data": "R5/20230229T000000/20240229T235959", + "valid": true + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "R3/19850625T103000/19850412T232050", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - space before first slash", + "data": "R12 /19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in recurrence number", + "data": "R1A/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing separator slash between R and interval", + "data": "R1219850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing separator slash between start and end", + "data": "R12/19850412T23205019850625T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/19850412T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-04-12T23:20:50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/19850412T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//19850625T103000", + "valid": false + }, + { + "description": "Invalid - only R and separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - only R", + "data": "R", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "", + "valid": false + }, + { + "description": "Invalid - spaces around interval separator", + "data": "R12/19850412T232050 / 19850625T103000", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "R12/19850012T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "R12/19851312T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end month 00", + "data": "R12/19850412T232050/19850025T103000", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "R12/19850412T232050/19851325T103000", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "R12/19850400T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "R12/19850432T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "R12/19850412T232050/19850600T103000", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "R12/19850412T232050/19850632T103000", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "R12/19850431T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start 31 June", + "data": "R12/19850631T232050/19850731T103000", + "valid": false + }, + { + "description": "Invalid - start 31 September", + "data": "R12/19850931T232050/19851031T103000", + "valid": false + }, + { + "description": "Invalid - start 31 November", + "data": "R12/19851131T232050/19851231T103000", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "R12/19850401T232050/19850431T103000", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "R12/19850601T232050/19850631T103000", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "R12/19850901T232050/19850931T103000", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "R12/19851101T232050/19851131T103000", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "R12/20230230T120000/20230331T120000", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "R12/20230131T120000/20230230T120000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/19850412T242050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "R12/19850412T252050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/19850412T232050/19850625T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/19850412T236050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/19850412T232050/19850625T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/19850412T232061/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/19850412T232050/19850625T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/19850412232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/19850412T232050/19850625103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/19850412t232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/19850412T232050/19850625t103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/19850412T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCD0412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/19850412T232050/ABCD0625T103000", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "R12/19850412TABC050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "R12/19850412T232050/19850625TABC000", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/19850412T232050//19850625T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/19850412T232050\\19850625T103000", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "R12/19850412T992050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/19850412T232050/19850625T993000", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/19850412T239950/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/19850412T232050/19850625T109900", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/19850412T232099/19850625T103000", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/19850412T232050/19850625T103099", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I9850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/19850412T232050/I9850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in start month", + "data": "R12/1985O412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end month", + "data": "R12/19850412T232050/1985O625T103000", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/198504I2T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/19850412T232050/198506I5T103000", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/19850412TI32050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/19850412T232050/19850625TI03000", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/19850412T23I050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/19850412T232050/19850625T10I000", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/19850412T2320I0/19850625T103000", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/19850412T232050/19850625T1030I0", + "valid": false + }, + { + "description": "Invalid - too short start", + "data": "R12/19850412T23205/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too long start", + "data": "R12/19850412T2320500/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too short end", + "data": "R12/19850412T232050/19850625T10300", + "valid": false + }, + { + "description": "Invalid - too long end", + "data": "R12/19850412T232050/19850625T1030000", + "valid": false + }, + { + "description": "Invalid - extra characters at beginning", + "data": "XR12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - extra characters at end", + "data": "R12/19850412T232050/19850625T103000X", + "valid": false + }, + { + "description": "Invalid - spaces in start datetime", + "data": "R12/1985 04 12T23 20 50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - spaces in end datetime", + "data": "R12/19850412T232050/1985 06 25T10 30 00", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R without slash", + "data": "R12", + "valid": false + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R30 monthly pattern", + "data": "R30/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R4 quarterly", + "data": "R4/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R2 semi-annual", + "data": "R2/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R365 daily for year", + "data": "R365/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R1000 large recurrence", + "data": "R1000/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R10000 very large recurrence", + "data": "R10000/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Valid - R999999 maximum practical recurrence", + "data": "R999999/19850412T232050/19850625T103000", + "valid": true + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with trailing space", + "data": "R12 /19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - space in recurrence number", + "data": "R 1 2/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with comma separator", + "data": "R1,200/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with underscore", + "data": "R1_2/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - multiple R prefixes", + "data": "R12/R5/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R in middle", + "data": "12/R/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R at end", + "data": "12/19850412T232050/19850625T103000/R", + "valid": false + }, + { + "description": "Invalid - lowercase r with number", + "data": "r5/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - mixed case R", + "data": "r12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with decimal point", + "data": "R12.0/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with fraction", + "data": "R1/2/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with scientific notation", + "data": "R1e2/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with hexadecimal", + "data": "R0x12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R followed by tab", + "data": "R\t12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R followed by newline", + "data": "R\n12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - double slash after R", + "data": "R12//19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - backslash after R", + "data": "R12\\19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing both slashes", + "data": "R1219850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with parentheses", + "data": "R(12)/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with brackets", + "data": "R[12]/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with braces", + "data": "R{12}/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - extra character before R", + "data": "XR12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - extra character after recurrence", + "data": "R12X/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - unicode R character", + "data": "ℜ12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with asterisk", + "data": "R*/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with question mark", + "data": "R?/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with hash", + "data": "R#12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with dollar sign", + "data": "R$12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with percent", + "data": "R%12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with ampersand", + "data": "R&12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with at symbol", + "data": "R@12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with caret", + "data": "R^12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with tilde", + "data": "R~12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with backtick", + "data": "R`12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with pipe", + "data": "R|12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with equals", + "data": "R=12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with semicolon", + "data": "R;12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with colon", + "data": "R:12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with single quote", + "data": "R'12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with double quote", + "data": "R\"12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with less than", + "data": "R<12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - R with greater than", + "data": "R>12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - only R/", + "data": "R/", + "valid": false + }, + { + "description": "Invalid - R//interval", + "data": "R//19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - trailing slash", + "data": "R12/19850412T232050/19850625T103000/", + "valid": false + }, + { + "description": "Invalid - leading slash", + "data": "/R12/19850412T232050/19850625T103000", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-calendar-extended.test.json b/test/iso/datetime/2019/recurring/start-end-calendar-extended.test.json new file mode 100644 index 00000000..60c0a64b --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-calendar-extended.test.json @@ -0,0 +1,571 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Valid - 12 April 1985 to 25 June 1985", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": true + }, + { + "description": "Valid - 1 January 2000 to 31 December 2000", + "data": "R12/2000-01-01T00:00:00/2000-12-31T23:59:59", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "R12/2023-01-01T12:00:00/2023-01-01T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R12/2022-12-31T23:00:00/2023-01-01T01:00:00", + "valid": true + }, + { + "description": "Valid - 31 January to 28 February", + "data": "R12/2023-01-31T00:00:00/2023-02-28T23:59:59", + "valid": true + }, + { + "description": "Valid - leap year February 29", + "data": "R12/2020-02-28T12:00:00/2020-02-29T12:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "R12/1985-04-12T23:59:60/1985-04-13T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R12/2023-01-01T00:00:00/2023-01-02T00:00:00", + "valid": true + }, + { + "description": "Valid - 31 May to 30 June", + "data": "R12/2023-05-31T12:00:00/2023-06-30T12:00:00", + "valid": true + }, + { + "description": "Valid - 31 August to 30 September", + "data": "R12/2023-08-31T12:00:00/2023-09-30T12:00:00", + "valid": true + }, + { + "description": "Valid - 31 October to 30 November", + "data": "R12/2023-10-31T12:00:00/2023-11-30T12:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-04-12T23:20:501985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "R12/19850412T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/19850412T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-04-12T23:20:50/19850625T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/1985-04-12T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-04-12T23:20:50 / 1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start month 00", + "data": "R12/1985-00-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start month 13", + "data": "R12/1985-13-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end month 00", + "data": "R12/1985-04-12T23:20:50/1985-00-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end month 13", + "data": "R12/1985-04-12T23:20:50/1985-13-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 00", + "data": "R12/1985-04-00T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 32", + "data": "R12/1985-04-32T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 00", + "data": "R12/1985-04-12T23:20:50/1985-06-00T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 32", + "data": "R12/1985-04-12T23:20:50/1985-06-32T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 April", + "data": "R12/1985-04-31T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 June", + "data": "R12/1985-06-31T23:20:50/1985-07-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 September", + "data": "R12/1985-09-31T23:20:50/1985-10-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 31 November", + "data": "R12/1985-11-31T23:20:50/1985-12-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 April", + "data": "R12/1985-04-01T23:20:50/1985-04-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 June", + "data": "R12/1985-06-01T23:20:50/1985-06-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 September", + "data": "R12/1985-09-01T23:20:50/1985-09-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - end 31 November", + "data": "R12/1985-11-01T23:20:50/1985-11-31T10:30:00", + "valid": false + }, + { + "description": "Invalid - start 30 February", + "data": "R12/2023-02-30T12:00:00/2023-03-31T12:00:00", + "valid": false + }, + { + "description": "Invalid - end 30 February", + "data": "R12/2023-01-31T12:00:00/2023-02-30T12:00:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-04-12T24:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "R12/1985-04-12T25:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/1985-04-12T23:20:50/1985-06-25T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-04-12T23:60:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-04-12T23:20:61/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-04-1223:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/1985-04-12T23:20:50/1985-06-2510:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-04-12t23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/1985-04-12T23:20:50/1985-06-25t10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/1985-04-12T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "R12/19850412T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "R12/1985-04-12T23:20:50/19850625T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "R12/1985-04-12T232050/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "R12/1985-04-12T23:20:50/1985-06-25T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCD-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/1985-04-12T23:20:50/ABCD-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "R12/1985-04-12TAB:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "R12/1985-04-12T23:20:50/1985-06-25TAB:30:00", + "valid": false + }, + { + "description": "Valid - 29 February (leap year validation is consumer responsibility)", + "data": "R12/2023-02-29T12:00:00/2023-03-31T12:00:00", + "valid": true + }, + { + "description": "Valid - both start and end with 29 February", + "data": "R12/2023-02-29T00:00:00/2024-02-29T23:59:59", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-04-12T23:20:50//1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/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": "R12/1985-06-25T10:30:00/1985-04-12T23:20:50", + "valid": true + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985-04-12T99:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/1985-04-12T23:20:50/1985-06-25T99:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985-04-12T23:99:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:99:00", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985-04-12T23:20:99/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:99", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/1985-04-12T23:20:50/I985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start month", + "data": "R12/1985-0I-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end month", + "data": "R12/1985-04-12T23:20:50/1985-0I-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/1985-04-I2T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/1985-04-12T23:20:50/1985-06-I5T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/1985-04-12TI3:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/1985-04-12T23:20:50/1985-06-25TI0:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/1985-04-12T23:I0:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:I0:00", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/1985-04-12T23:20:I0/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:I0", + "valid": false + }, + { + "description": "Invalid - too short start datetime", + "data": "R12/1985-04-12T23:20:5/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - too short end datetime", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:0", + "valid": false + }, + { + "description": "Invalid - too long start datetime", + "data": "R12/1985-04-12T23:20:500/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - too long end datetime", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:000", + "valid": false + }, + { + "description": "Invalid - extra character at start", + "data": "R12/X1985-04-12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - extra character at end", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10:30:00X", + "valid": false + }, + { + "description": "Invalid - extra character in middle", + "data": "R12/1985-04-12T23:20:50X/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start date", + "data": "R12/1985-04- 12T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end date", + "data": "R12/1985-04-12T23:20:50/1985-06- 25T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start time", + "data": "R12/1985-04-12T23: 20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end time", + "data": "R12/1985-04-12T23:20:50/1985-06-25T10: 30:00", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-ordinal-basic.test.json b/test/iso/datetime/2019/recurring/start-end-ordinal-basic.test.json new file mode 100644 index 00000000..62b4ba87 --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-ordinal-basic.test.json @@ -0,0 +1,491 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Valid - day 102 to day 176 of 1985", + "data": "R12/1985102T232050/1985176T103000", + "valid": true + }, + { + "description": "Valid - day 1 to day 366 of 2000 (leap year)", + "data": "R12/2000001T000000/2000366T235959", + "valid": true + }, + { + "description": "Valid - day 1 to day 365 of 2023", + "data": "R12/2023001T120000/2023365T180000", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "R12/2023100T120000/2023100T180000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R12/2022365T230000/2023001T010000", + "valid": true + }, + { + "description": "Valid - first to last day of year", + "data": "R12/2020001T000000/2020366T235959", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "R12/1985102T235960/1985103T000000", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R12/2023001T000000/2023002T000000", + "valid": true + }, + { + "description": "Valid - day 59 to day 60 (February 28-29 in leap year)", + "data": "R12/2020059T120000/2020060T120000", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985102T2320501985176T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "R12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/1985102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-102T23:20:50/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/1985102T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//1985176T103000", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985102T232050 / 1985176T103000", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "R12/1985000T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "R12/1985367T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end day 000", + "data": "R12/1985102T232050/1985000T103000", + "valid": false + }, + { + "description": "Invalid - end day 367", + "data": "R12/1985102T232050/1985367T103000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985102T242050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - start hour 25", + "data": "R12/1985102T252050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/1985102T232050/1985176T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985102T236050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/1985102T232050/1985176T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985102T232061/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/1985102T232050/1985176T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985102232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/1985102T232050/1985176103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985102t232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/1985102T232050/1985176t103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/1985102T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/1985176T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in start", + "data": "R12/19850412T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in end", + "data": "R12/1985102T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - too few digits in start day", + "data": "R12/198502T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - too many digits in start day", + "data": "R12/19851022T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCD102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/1985102T232050/ABCD176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start time", + "data": "R12/1985102TABC050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in end time", + "data": "R12/1985102T232050/1985176TABC000", + "valid": false + }, + { + "description": "Valid - day 366 in leap year", + "data": "R12/2020366T000000/2021001T000000", + "valid": true + }, + { + "description": "Valid - day 366 in non-leap year (validation is consumer responsibility)", + "data": "R12/2023366T120000/2024001T120000", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985102T232050//1985176T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985102T232050\\1985176T103000", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "R12/1985176T103000/1985102T232050", + "valid": true + }, + { + "description": "Invalid - week date format instead of ordinal in start", + "data": "R12/1985W155T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - week date format instead of ordinal in end", + "data": "R12/1985102T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985102T992050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/1985102T232050/1985176T993000", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985102T239950/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/1985102T232050/1985176T109900", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985102T232099/1985176T103000", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/1985102T232050/1985176T103099", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/1985102T232050/I985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/1985I02T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/1985102T232050/1985I76T103000", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/1985102TI32050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/1985102T232050/1985176TI03000", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/1985102T23I050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/1985102T232050/1985176T10I000", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/1985102T2320I0/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/1985102T232050/1985176T1030I0", + "valid": false + }, + { + "description": "Invalid - too short start datetime", + "data": "R12/1985102T23205/1985176T103000", + "valid": false + }, + { + "description": "Invalid - too short end datetime", + "data": "R12/1985102T232050/1985176T10300", + "valid": false + }, + { + "description": "Invalid - too long start datetime", + "data": "R12/1985102T2320500/1985176T103000", + "valid": false + }, + { + "description": "Invalid - too long end datetime", + "data": "R12/1985102T232050/1985176T1030000", + "valid": false + }, + { + "description": "Invalid - extra character at start", + "data": "R12/X1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - extra character at end", + "data": "R12/1985102T232050/1985176T103000X", + "valid": false + }, + { + "description": "Invalid - extra character in middle", + "data": "R12/1985102T232050X/1985176T103000", + "valid": false + }, + { + "description": "Invalid - space in start date", + "data": "R12/1985 102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - space in end date", + "data": "R12/1985102T232050/1985 176T103000", + "valid": false + }, + { + "description": "Invalid - space in start time", + "data": "R12/1985102T23 2050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - space in end time", + "data": "R12/1985102T232050/1985176T10 3000", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-ordinal-extended.test.json b/test/iso/datetime/2019/recurring/start-end-ordinal-extended.test.json new file mode 100644 index 00000000..1af5984c --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-ordinal-extended.test.json @@ -0,0 +1,476 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Valid - day 102 to day 176 of 1985", + "data": "R12/1985-102T23:20:50/1985-176T10:30:00", + "valid": true + }, + { + "description": "Valid - day 1 to day 366 of 2000 (leap year)", + "data": "R12/2000-001T00:00:00/2000-366T23:59:59", + "valid": true + }, + { + "description": "Valid - day 1 to day 365 of 2023", + "data": "R12/2023-001T12:00:00/2023-365T18:00:00", + "valid": true + }, + { + "description": "Valid - same day interval", + "data": "R12/2023-100T12:00:00/2023-100T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R12/2022-365T23:00:00/2023-001T01:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "R12/1985-102T23:59:60/1985-103T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R12/2023-001T00:00:00/2023-002T00:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-102T23:20:501985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "R12/1985102T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/1985102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-102T23:20:50/1985176T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/1985-102T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-102T23:20:50 / 1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 000", + "data": "R12/1985-000T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 367", + "data": "R12/1985-367T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 000", + "data": "R12/1985-102T23:20:50/1985-000T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 367", + "data": "R12/1985-102T23:20:50/1985-367T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-102T24:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/1985-102T23:20:50/1985-176T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-102T23:60:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/1985-102T23:20:50/1985-176T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-102T23:20:61/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/1985-102T23:20:50/1985-176T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-10223:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/1985-102T23:20:50/1985-17610:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-102t23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/1985-102T23:20:50/1985-176t10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/1985-102T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in start", + "data": "R12/1985-04-12T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of ordinal in end", + "data": "R12/1985-102T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "R12/1985102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "R12/1985-102T23:20:50/1985176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "R12/1985-102T232050/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "R12/1985-102T23:20:50/1985-176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCD-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/1985-102T23:20:50/ABCD-176T10:30:00", + "valid": false + }, + { + "description": "Valid - day 366 in leap year", + "data": "R12/2020-366T00:00:00/2021-001T00:00:00", + "valid": true + }, + { + "description": "Valid - day 366 in non-leap year (validation is consumer responsibility)", + "data": "R12/2023-366T12:00:00/2024-001T12:00:00", + "valid": true + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-102T23:20:50//1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985-102T23:20:50\\1985-176T10:30:00", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "R12/1985-176T10:30:00/1985-102T23:20:50", + "valid": true + }, + { + "description": "Invalid - week date format instead of ordinal in start", + "data": "R12/1985-W15-5T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - week date format instead of ordinal in end", + "data": "R12/1985-102T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985-102T99:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/1985-102T23:20:50/1985-176T99:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985-102T23:99:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/1985-102T23:20:50/1985-176T10:99:00", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985-102T23:20:99/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/1985-102T23:20:50/1985-176T10:30:99", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/1985-102T23:20:50/I985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/1985-I02T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/1985-102T23:20:50/1985-I76T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/1985-102TI3:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/1985-102T23:20:50/1985-176TI0:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/1985-102T23:I0:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/1985-102T23:20:50/1985-176T10:I0:00", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/1985-102T23:20:I0/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/1985-102T23:20:50/1985-176T10:30:I0", + "valid": false + }, + { + "description": "Invalid - too short start datetime", + "data": "R12/1985-102T23:20:5/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - too short end datetime", + "data": "R12/1985-102T23:20:50/1985-176T10:30:0", + "valid": false + }, + { + "description": "Invalid - too long start datetime", + "data": "R12/1985-102T23:20:500/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - too long end datetime", + "data": "R12/1985-102T23:20:50/1985-176T10:30:000", + "valid": false + }, + { + "description": "Invalid - extra character at start", + "data": "R12/X1985-102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - extra character at end", + "data": "R12/1985-102T23:20:50/1985-176T10:30:00X", + "valid": false + }, + { + "description": "Invalid - extra character in middle", + "data": "R12/1985-102T23:20:50X/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start date", + "data": "R12/1985- 102T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end date", + "data": "R12/1985-102T23:20:50/1985- 176T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start time", + "data": "R12/1985-102T23: 20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end time", + "data": "R12/1985-102T23:20:50/1985-176T10: 30:00", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-week-basic.test.json b/test/iso/datetime/2019/recurring/start-end-week-basic.test.json new file mode 100644 index 00000000..13950a3c --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-week-basic.test.json @@ -0,0 +1,501 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Valid - week 15 day 5 to week 26 day 1 of 1985", + "data": "R12/1985W155T232050/1985W261T103000", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2000", + "data": "R12/2000W011T000000/2000W527T235959", + "valid": true + }, + { + "description": "Valid - week 01 day 1 to week 52 day 7 of 2023", + "data": "R12/2023W011T120000/2023W527T180000", + "valid": true + }, + { + "description": "Valid - same week interval", + "data": "R12/2023W151T120000/2023W155T180000", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R12/2022W527T230000/2023W011T010000", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "R12/1985W155T235960/1985W156T000000", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R12/2023W011T000000/2023W012T000000", + "valid": true + }, + { + "description": "Valid - week 53 (some years have 53 weeks)", + "data": "R12/2020W531T000000/2021W011T000000", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985W155T2320501985W261T103000", + "valid": false + }, + { + "description": "Invalid - extended format (contains hyphens)", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/1985W155T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-W15-5T23:20:50/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/1985W155T232050/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//1985W261T103000", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985W155T232050 / 1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "R12/1985W005T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "R12/1985W545T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end week 00", + "data": "R12/1985W155T232050/1985W001T103000", + "valid": false + }, + { + "description": "Invalid - end week 54", + "data": "R12/1985W155T232050/1985W541T103000", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "R12/1985W150T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "R12/1985W158T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end day 0", + "data": "R12/1985W155T232050/1985W260T103000", + "valid": false + }, + { + "description": "Invalid - end day 8", + "data": "R12/1985W155T232050/1985W268T103000", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985W155T242050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/1985W155T232050/1985W261T243000", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985W155T236050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/1985W155T232050/1985W261T106000", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985W155T232061/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/1985W155T232050/1985W261T103061", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985W155232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/1985W155T232050/1985W261103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985W155t232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/1985W155T232050/1985W261t103000", + "valid": false + }, + { + "description": "Invalid - lowercase w in start", + "data": "R12/1985w155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "R12/1985W155T232050/1985w261T103000", + "valid": false + }, + { + "description": "Invalid - missing W designator in start", + "data": "R12/1985155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing W designator in end", + "data": "R12/1985W155T232050/1985261T103000", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/1985W155T232050/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in start", + "data": "R12/19850412T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in end", + "data": "R12/1985W155T232050/19850625T103000", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in start", + "data": "R12/1985102T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in end", + "data": "R12/1985W155T232050/1985176T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCDW155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/1985W155T232050/ABCDW261T103000", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985W155T232050//1985W261T103000", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/1985W155T232050\\1985W261T103000", + "valid": false + }, + { + "description": "Valid - reversed order (end before start is syntactically valid per ISO 8601)", + "data": "R12/1985W261T103000/1985W155T232050", + "valid": true + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985W155T992050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/1985W155T232050/1985W261T993000", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985W155T239950/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/1985W155T232050/1985W261T109900", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985W155T232099/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/1985W155T232050/1985W261T103099", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/1985W155T232050/I985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in start week", + "data": "R12/1985WI55T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end week", + "data": "R12/1985W155T232050/1985WI61T103000", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/1985W15IT232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/1985W155T232050/1985W26IT103000", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/1985W155TI32050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/1985W155T232050/1985W261TI03000", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/1985W155T23I050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/1985W155T232050/1985W261T10I000", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/1985W155T2320I0/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/1985W155T232050/1985W261T1030I0", + "valid": false + }, + { + "description": "Invalid - too short start datetime", + "data": "R12/1985W155T23205/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - too short end datetime", + "data": "R12/1985W155T232050/1985W261T10300", + "valid": false + }, + { + "description": "Invalid - too long start datetime", + "data": "R12/1985W155T2320500/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - too long end datetime", + "data": "R12/1985W155T232050/1985W261T1030000", + "valid": false + }, + { + "description": "Invalid - extra character at start", + "data": "R12/X1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - extra character at end", + "data": "R12/1985W155T232050/1985W261T103000X", + "valid": false + }, + { + "description": "Invalid - extra character in middle", + "data": "R12/1985W155T232050X/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - space in start date", + "data": "R12/1985W15 5T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - space in end date", + "data": "R12/1985W155T232050/1985W26 1T103000", + "valid": false + }, + { + "description": "Invalid - space in start time", + "data": "R12/1985W155T23 2050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - space in end time", + "data": "R12/1985W155T232050/1985W261T10 3000", + "valid": false + } + ] +} diff --git a/test/iso/datetime/2019/recurring/start-end-week-extended.test.json b/test/iso/datetime/2019/recurring/start-end-week-extended.test.json new file mode 100644 index 00000000..800960cf --- /dev/null +++ b/test/iso/datetime/2019/recurring/start-end-week-extended.test.json @@ -0,0 +1,521 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../../../schemas/iso/datetime/2019/recurring/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 - R12 with interval", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R without number (unbounded)", + "data": "R/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R0 (zero recurrences)", + "data": "R0/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R9999 (large number)", + "data": "R9999/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R1 (single recurrence)", + "data": "R1/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R52 weekly for a year", + "data": "R52/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R24 every hour for a day", + "data": "R24/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Valid - R7 daily for a week", + "data": "R7/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": true + }, + { + "description": "Invalid - missing R prefix", + "data": "12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase r prefix", + "data": "r12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - space after R", + "data": "R 12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - negative recurrence number", + "data": "R-5/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - decimal recurrence number", + "data": "R12.5/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - double R", + "data": "RR12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - R with plus sign", + "data": "R+12/1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Valid - week 15 day 5 to week 26 day 1 of 1985", + "data": "R12/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": "R12/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": "R12/2023-W01-1T12:00:00/2023-W52-7T18:00:00", + "valid": true + }, + { + "description": "Valid - same week interval", + "data": "R12/2023-W15-1T12:00:00/2023-W15-5T18:00:00", + "valid": true + }, + { + "description": "Valid - cross year boundary", + "data": "R12/2022-W52-7T23:00:00/2023-W01-1T01:00:00", + "valid": true + }, + { + "description": "Valid - with leap second (60 seconds)", + "data": "R12/1985-W15-5T23:59:60/1985-W15-6T00:00:00", + "valid": true + }, + { + "description": "Valid - midnight to midnight", + "data": "R12/2023-W01-1T00:00:00/2023-W01-2T00:00:00", + "valid": true + }, + { + "description": "Valid - week 53 (some years have 53 weeks)", + "data": "R12/2020-W53-1T00:00:00/2021-W01-1T00:00:00", + "valid": true + }, + { + "description": "Invalid - missing separator slash", + "data": "R12/1985-W15-5T23:20:501985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - basic format (no hyphens or colons)", + "data": "R12/1985W155T232050/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - mixed formats (basic start, extended end)", + "data": "R12/1985W155T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - mixed formats (extended start, basic end)", + "data": "R12/1985-W15-5T23:20:50/1985W261T103000", + "valid": false + }, + { + "description": "Invalid - missing end datetime", + "data": "R12/1985-W15-5T23:20:50/", + "valid": false + }, + { + "description": "Invalid - missing start datetime", + "data": "R12//1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - only separator", + "data": "R12//", + "valid": false + }, + { + "description": "Invalid - empty string", + "data": "R12/", + "valid": false + }, + { + "description": "Invalid - spaces around separator", + "data": "R12/1985-W15-5T23:20:50 / 1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start week 00", + "data": "R12/1985-W00-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start week 54", + "data": "R12/1985-W54-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end week 00", + "data": "R12/1985-W15-5T23:20:50/1985-W00-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end week 54", + "data": "R12/1985-W15-5T23:20:50/1985-W54-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 0", + "data": "R12/1985-W15-0T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - start day 8", + "data": "R12/1985-W15-8T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 0", + "data": "R12/1985-W15-5T23:20:50/1985-W26-0T10:30:00", + "valid": false + }, + { + "description": "Invalid - end day 8", + "data": "R12/1985-W15-5T23:20:50/1985-W26-8T10:30:00", + "valid": false + }, + { + "description": "Invalid - start hour 24", + "data": "R12/1985-W15-5T24:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 24", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T24:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 60", + "data": "R12/1985-W15-5T23:60:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 60", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:60:00", + "valid": false + }, + { + "description": "Invalid - start second 61", + "data": "R12/1985-W15-5T23:20:61/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 61", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:61", + "valid": false + }, + { + "description": "Invalid - missing T separator in start", + "data": "R12/1985-W15-523:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing T separator in end", + "data": "R12/1985-W15-5T23:20:50/1985-W26-110:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in start", + "data": "R12/1985-W15-5t23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase t in end", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1t10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase w in start", + "data": "R12/1985-w15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - lowercase w in end", + "data": "R12/1985-W15-5T23:20:50/1985-w26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing W designator in start", + "data": "R12/1985-15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing W designator in end", + "data": "R12/1985-W15-5T23:20:50/1985-26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - duration instead of end datetime", + "data": "R12/1985-W15-5T23:20:50/P1Y2M15DT12H30M0S", + "valid": false + }, + { + "description": "Invalid - duration instead of start datetime", + "data": "R12/P1Y2M15DT12H30M0S/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in start", + "data": "R12/1985-04-12T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - calendar date instead of week in end", + "data": "R12/1985-W15-5T23:20:50/1985-06-25T10:30:00", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in start", + "data": "R12/1985-102T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - ordinal date instead of week in end", + "data": "R12/1985-W15-5T23:20:50/1985-176T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in start date", + "data": "R12/1985W155T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing hyphen in end date", + "data": "R12/1985-W15-5T23:20:50/1985W261T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in start time", + "data": "R12/1985-W15-5T232050/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - missing colon in end time", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T103000", + "valid": false + }, + { + "description": "Invalid - letters in start date", + "data": "R12/ABCD-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letters in end date", + "data": "R12/1985-W15-5T23:20:50/ABCD-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - double slash separator", + "data": "R12/1985-W15-5T23:20:50//1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - backslash separator", + "data": "R12/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": "R12/1985-W26-1T10:30:00/1985-W15-5T23:20:50", + "valid": true + }, + { + "description": "Invalid - start hour 99", + "data": "R12/1985-W15-5T99:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end hour 99", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T99:30:00", + "valid": false + }, + { + "description": "Invalid - start minute 99", + "data": "R12/1985-W15-5T23:99:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end minute 99", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:99:00", + "valid": false + }, + { + "description": "Invalid - start second 99", + "data": "R12/1985-W15-5T23:20:99/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - end second 99", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:99", + "valid": false + }, + { + "description": "Invalid - letter in start year", + "data": "R12/I985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end year", + "data": "R12/1985-W15-5T23:20:50/I985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start week", + "data": "R12/1985-WI5-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end week", + "data": "R12/1985-W15-5T23:20:50/1985-WI6-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start day", + "data": "R12/1985-W15-IT23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end day", + "data": "R12/1985-W15-5T23:20:50/1985-W26-IT10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start hour", + "data": "R12/1985-W15-5TI3:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end hour", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1TI0:30:00", + "valid": false + }, + { + "description": "Invalid - letter in start minute", + "data": "R12/1985-W15-5T23:I0:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end minute", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:I0:00", + "valid": false + }, + { + "description": "Invalid - letter in start second", + "data": "R12/1985-W15-5T23:20:I0/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - letter in end second", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:I0", + "valid": false + }, + { + "description": "Invalid - too short start datetime", + "data": "R12/1985-W15-5T23:20:5/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - too short end datetime", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:0", + "valid": false + }, + { + "description": "Invalid - too long start datetime", + "data": "R12/1985-W15-5T23:20:500/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - too long end datetime", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:000", + "valid": false + }, + { + "description": "Invalid - extra character at start", + "data": "R12/X1985-W15-5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - extra character at end", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10:30:00X", + "valid": false + }, + { + "description": "Invalid - extra character in middle", + "data": "R12/1985-W15-5T23:20:50X/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start date", + "data": "R12/1985-W15- 5T23:20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end date", + "data": "R12/1985-W15-5T23:20:50/1985-W26- 1T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in start time", + "data": "R12/1985-W15-5T23: 20:50/1985-W26-1T10:30:00", + "valid": false + }, + { + "description": "Invalid - space in end time", + "data": "R12/1985-W15-5T23:20:50/1985-W26-1T10: 30:00", + "valid": false + } + ] +}