From ea81e5137d47750c0b16089fbcb2b5cf0d6dbee1 Mon Sep 17 00:00:00 2001 From: Dan Hudlow Date: Tue, 20 May 2025 10:05:26 -0500 Subject: [PATCH 1/3] Add boundary cases for integers --- tests/draft-next/type.json | 37 ++++++++++++++++++++++++++++++- tests/draft2019-09/type.json | 37 ++++++++++++++++++++++++++++++- tests/draft2020-12/type.json | 37 ++++++++++++++++++++++++++++++- tests/draft3/type.json | 42 +++++++++++++++++++++++++++++++++++- tests/draft4/type.json | 42 +++++++++++++++++++++++++++++++++++- tests/draft6/type.json | 37 ++++++++++++++++++++++++++++++- tests/draft7/type.json | 37 ++++++++++++++++++++++++++++++- 7 files changed, 262 insertions(+), 7 deletions(-) diff --git a/tests/draft-next/type.json b/tests/draft-next/type.json index 86e551c7..c2733de4 100644 --- a/tests/draft-next/type.json +++ b/tests/draft-next/type.json @@ -11,13 +11,48 @@ "data": 1, "valid": true }, + { + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, { "description": "a float with zero fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float is not an integer", + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft2019-09/type.json b/tests/draft2019-09/type.json index 92c6be89..a54c285d 100644 --- a/tests/draft2019-09/type.json +++ b/tests/draft2019-09/type.json @@ -11,13 +11,48 @@ "data": 1, "valid": true }, + { + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, { "description": "a float with zero fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float is not an integer", + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft2020-12/type.json b/tests/draft2020-12/type.json index 2123c408..77061c94 100644 --- a/tests/draft2020-12/type.json +++ b/tests/draft2020-12/type.json @@ -11,13 +11,48 @@ "data": 1, "valid": true }, + { + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, { "description": "a float with zero fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float is not an integer", + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft3/type.json b/tests/draft3/type.json index 8447bc8e..559ab6b2 100644 --- a/tests/draft3/type.json +++ b/tests/draft3/type.json @@ -9,7 +9,47 @@ "valid": true }, { - "description": "a float is not an integer", + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, + { + "description": "a float with zero fractional part is an integer", + "data": 1.0, + "valid": true + }, + { + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft4/type.json b/tests/draft4/type.json index df46677b..2b7a47ed 100644 --- a/tests/draft4/type.json +++ b/tests/draft4/type.json @@ -9,7 +9,47 @@ "valid": true }, { - "description": "a float is not an integer", + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, + { + "description": "a float with zero fractional part is an integer", + "data": 1.0, + "valid": true + }, + { + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft6/type.json b/tests/draft6/type.json index 83046470..3e2905b4 100644 --- a/tests/draft6/type.json +++ b/tests/draft6/type.json @@ -8,13 +8,48 @@ "data": 1, "valid": true }, + { + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, { "description": "a float with zero fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float is not an integer", + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft7/type.json b/tests/draft7/type.json index 83046470..3e2905b4 100644 --- a/tests/draft7/type.json +++ b/tests/draft7/type.json @@ -8,13 +8,48 @@ "data": 1, "valid": true }, + { + "description": "a negative integer is an integer", + "data": -1, + "valid": true + }, + { + "description": "zero is an integer", + "data": 0, + "valid": true + }, + { + "description": "negative zero is an integer", + "data": -0, + "valid": true + }, { "description": "a float with zero fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float is not an integer", + "description": "a float with an exponent and a zero fractional part is an integer", + "data": 1e0, + "valid": true + }, + { + "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 1.00000000000001, + "valid": true + }, + { + "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", + "data": 9007199254740991.5, + "valid": true + }, + { + "description": "a number near the maximum representable value for a binary64 float is an integer", + "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, + "valid": true + }, + { + "description": "a float with a non-zero fractional part is not an integer", "data": 1.1, "valid": false }, From fe9a2875b3f914ce732c9158fc585df85208937b Mon Sep 17 00:00:00 2001 From: Dan Hudlow Date: Wed, 28 May 2025 23:31:26 -0500 Subject: [PATCH 2/3] Adjust integer boundary tests based on review feedback --- tests/draft-next/optional/bignum.json | 5 + tests/draft-next/optional/integer.json | 201 ++++++++++++++++++ tests/draft-next/type.json | 23 +- tests/draft2019-09/optional/bignum.json | 5 + tests/draft2019-09/optional/integer.json | 201 ++++++++++++++++++ tests/draft2019-09/type.json | 23 +- tests/draft2020-12/optional/bignum.json | 5 + tests/draft2020-12/optional/integer.json | 201 ++++++++++++++++++ tests/draft2020-12/type.json | 23 +- tests/draft3/optional/bignum.json | 5 + tests/draft3/optional/integer.json | 191 +++++++++++++++++ .../draft3/optional/zeroTerminatedFloats.json | 7 +- tests/draft4/optional/bignum.json | 5 + tests/draft4/optional/integer.json | 191 +++++++++++++++++ .../draft4/optional/zeroTerminatedFloats.json | 7 +- tests/draft4/type.json | 27 +-- tests/draft6/optional/bignum.json | 5 + tests/draft6/optional/integer.json | 191 +++++++++++++++++ tests/draft6/type.json | 23 +- tests/draft7/optional/bignum.json | 5 + tests/draft7/optional/integer.json | 191 +++++++++++++++++ tests/draft7/type.json | 23 +- 22 files changed, 1435 insertions(+), 123 deletions(-) create mode 100644 tests/draft-next/optional/integer.json create mode 100644 tests/draft2019-09/optional/integer.json create mode 100644 tests/draft2020-12/optional/integer.json create mode 100644 tests/draft3/optional/integer.json create mode 100644 tests/draft4/optional/integer.json create mode 100644 tests/draft6/optional/integer.json create mode 100644 tests/draft7/optional/integer.json diff --git a/tests/draft-next/optional/bignum.json b/tests/draft-next/optional/bignum.json index 9f4f7079..90b40001 100644 --- a/tests/draft-next/optional/bignum.json +++ b/tests/draft-next/optional/bignum.json @@ -15,6 +15,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft-next/optional/integer.json b/tests/draft-next/optional/integer.json new file mode 100644 index 00000000..b8ace0b2 --- /dev/null +++ b/tests/draft-next/optional/integer.json @@ -0,0 +1,201 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/next/schema", + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft-next/type.json b/tests/draft-next/type.json index c2733de4..581f210c 100644 --- a/tests/draft-next/type.json +++ b/tests/draft-next/type.json @@ -27,32 +27,17 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", + "description": "a float with a zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, + "description": "a float with an exponent and a zero-value fractional part is an integer", + "data": 1.1e1, "valid": true }, { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft2019-09/optional/bignum.json b/tests/draft2019-09/optional/bignum.json index 8b064677..3fd6699e 100644 --- a/tests/draft2019-09/optional/bignum.json +++ b/tests/draft2019-09/optional/bignum.json @@ -15,6 +15,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft2019-09/optional/integer.json b/tests/draft2019-09/optional/integer.json new file mode 100644 index 00000000..8ac0cf8a --- /dev/null +++ b/tests/draft2019-09/optional/integer.json @@ -0,0 +1,201 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft2019-09/type.json b/tests/draft2019-09/type.json index a54c285d..1a27e76b 100644 --- a/tests/draft2019-09/type.json +++ b/tests/draft2019-09/type.json @@ -27,32 +27,17 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", + "description": "a float a with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, + "description": "a float with an exponent and a zero-value fractional part is an integer", + "data": 1.1e1, "valid": true }, { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft2020-12/optional/bignum.json b/tests/draft2020-12/optional/bignum.json index d69b29e8..cd759547 100644 --- a/tests/draft2020-12/optional/bignum.json +++ b/tests/draft2020-12/optional/bignum.json @@ -15,6 +15,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft2020-12/optional/integer.json b/tests/draft2020-12/optional/integer.json new file mode 100644 index 00000000..a9f871fb --- /dev/null +++ b/tests/draft2020-12/optional/integer.json @@ -0,0 +1,201 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft2020-12/type.json b/tests/draft2020-12/type.json index 77061c94..b70f9935 100644 --- a/tests/draft2020-12/type.json +++ b/tests/draft2020-12/type.json @@ -27,32 +27,17 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", + "description": "a float a with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, + "description": "a float with an exponent and a zero-value fractional part is an integer", + "data": 1.1e1, "valid": true }, { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft3/optional/bignum.json b/tests/draft3/optional/bignum.json index 1bc8eb21..1b6644c7 100644 --- a/tests/draft3/optional/bignum.json +++ b/tests/draft3/optional/bignum.json @@ -12,6 +12,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft3/optional/integer.json b/tests/draft3/optional/integer.json new file mode 100644 index 00000000..c20f8463 --- /dev/null +++ b/tests/draft3/optional/integer.json @@ -0,0 +1,191 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft3/optional/zeroTerminatedFloats.json b/tests/draft3/optional/zeroTerminatedFloats.json index 9b50ea27..89594c90 100644 --- a/tests/draft3/optional/zeroTerminatedFloats.json +++ b/tests/draft3/optional/zeroTerminatedFloats.json @@ -6,9 +6,14 @@ }, "tests": [ { - "description": "a float is not an integer even without fractional part", + "description": "a float a with zero-value fractional part is not an integer", "data": 1.0, "valid": false + }, + { + "description": "a float with an exponent and a zero-value fractional part is not an integer", + "data": 1.1e1, + "valid": false } ] } diff --git a/tests/draft4/optional/bignum.json b/tests/draft4/optional/bignum.json index 1bc8eb21..1b6644c7 100644 --- a/tests/draft4/optional/bignum.json +++ b/tests/draft4/optional/bignum.json @@ -12,6 +12,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft4/optional/integer.json b/tests/draft4/optional/integer.json new file mode 100644 index 00000000..c20f8463 --- /dev/null +++ b/tests/draft4/optional/integer.json @@ -0,0 +1,191 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft4/optional/zeroTerminatedFloats.json b/tests/draft4/optional/zeroTerminatedFloats.json index 9b50ea27..89594c90 100644 --- a/tests/draft4/optional/zeroTerminatedFloats.json +++ b/tests/draft4/optional/zeroTerminatedFloats.json @@ -6,9 +6,14 @@ }, "tests": [ { - "description": "a float is not an integer even without fractional part", + "description": "a float a with zero-value fractional part is not an integer", "data": 1.0, "valid": false + }, + { + "description": "a float with an exponent and a zero-value fractional part is not an integer", + "data": 1.1e1, + "valid": false } ] } diff --git a/tests/draft4/type.json b/tests/draft4/type.json index 2b7a47ed..fb8cd74c 100644 --- a/tests/draft4/type.json +++ b/tests/draft4/type.json @@ -24,32 +24,7 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", - "data": 1.0, - "valid": true - }, - { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, - "valid": true - }, - { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft6/optional/bignum.json b/tests/draft6/optional/bignum.json index 94b4a4e6..cfda7732 100644 --- a/tests/draft6/optional/bignum.json +++ b/tests/draft6/optional/bignum.json @@ -12,6 +12,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft6/optional/integer.json b/tests/draft6/optional/integer.json new file mode 100644 index 00000000..c20f8463 --- /dev/null +++ b/tests/draft6/optional/integer.json @@ -0,0 +1,191 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft6/type.json b/tests/draft6/type.json index 3e2905b4..dada7fe6 100644 --- a/tests/draft6/type.json +++ b/tests/draft6/type.json @@ -24,32 +24,17 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", + "description": "a float a with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, + "description": "a float with an exponent and a zero-value fractional part is an integer", + "data": 1.1e1, "valid": true }, { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft7/optional/bignum.json b/tests/draft7/optional/bignum.json index 94b4a4e6..cfda7732 100644 --- a/tests/draft7/optional/bignum.json +++ b/tests/draft7/optional/bignum.json @@ -12,6 +12,11 @@ "description": "a negative bignum is an integer", "data": -12345678910111213141516171819202122232425262728293031, "valid": true + }, + { + "description": "a bignum with a nonzero-value fractional part is not an integer", + "data": 12345678910111213141516171819202122232425262728293031.5, + "valid": false } ] }, diff --git a/tests/draft7/optional/integer.json b/tests/draft7/optional/integer.json new file mode 100644 index 00000000..c20f8463 --- /dev/null +++ b/tests/draft7/optional/integer.json @@ -0,0 +1,191 @@ +[ + { + "description": "binary64 float (double) truncation", + "schema": { + "type": "integer" + }, + "tests": [ + { + "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 1.00000000000001, + "valid": false + }, + { + "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "data": 9007199254740991.5, + "valid": false + } + ] + }, + { + "description": "maximum signed 32-bit integer comparison", + "schema": { + "minimum": 2147483647, + "maximum": 2147483647 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 2147483647, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 2147483646, + "valid": false + } + ] + }, + { + "description": "minimum signed 32-bit integer comparison", + "schema": { + "minimum": -2147483648, + "maximum": -2147483648 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -2147483648, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -2147483647, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 32-bit integer comparison", + "schema": { + "minimum": 4294967295, + "maximum": 4294967295 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 4294967295, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 4294967294, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MAX_SAFE_INTEGER (2^53-1) comparison", + "schema": { + "minimum": 9007199254740991, + "maximum": 9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9007199254740990, + "valid": false + } + ] + }, + { + "description": "ECMAScript Number.MIN_SAFE_INTEGER (-2^53-1) comparison", + "schema": { + "minimum": -9007199254740991, + "maximum": -9007199254740991 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9007199254740991, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9007199254740990, + "valid": false + } + ] + }, + { + "description": "maximum signed 64-bit integer comparison", + "schema": { + "minimum": 9223372036854775807, + "maximum": 9223372036854775807 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 9223372036854775807, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 9223372036854775806, + "valid": false + } + ] + }, + { + "description": "minimum signed 64-bit integer comparison", + "schema": { + "minimum": -9223372036854775808, + "maximum": -9223372036854775808 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": -9223372036854775808, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": -9223372036854775807, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 64-bit integer comparison", + "schema": { + "minimum": 18446744073709551615, + "maximum": 18446744073709551615 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 18446744073709551615, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 18446744073709551614, + "valid": false + } + ] + }, + { + "description": "maximum unsigned 128-bit integer comparison", + "schema": { + "minimum": 340282366920938463463374607431768211455, + "maximum": 340282366920938463463374607431768211455 + }, + "tests": [ + { + "description": "comparison is true for equal numbers", + "data": 340282366920938463463374607431768211455, + "valid": true + }, + { + "description": "comparison is false for inequal numbers", + "data": 340282366920938463463374607431768211454, + "valid": false + } + ] + } +] diff --git a/tests/draft7/type.json b/tests/draft7/type.json index 3e2905b4..dada7fe6 100644 --- a/tests/draft7/type.json +++ b/tests/draft7/type.json @@ -24,32 +24,17 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", + "description": "a float a with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, + "description": "a float with an exponent and a zero-value fractional part is an integer", + "data": 1.1e1, "valid": true }, { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, From 1f812122bf366d640f0fde9eca57ee4f7e10d231 Mon Sep 17 00:00:00 2001 From: Dan Hudlow Date: Thu, 29 May 2025 23:04:38 -0500 Subject: [PATCH 3/3] Fix linting issues --- tests/draft-next/optional/integer.json | 4 +-- tests/draft-next/type.json | 2 +- tests/draft2019-09/optional/integer.json | 4 +-- tests/draft2019-09/type.json | 4 +-- tests/draft2020-12/optional/integer.json | 4 +-- tests/draft2020-12/type.json | 4 +-- tests/draft3/optional/integer.json | 4 +-- .../draft3/optional/zeroTerminatedFloats.json | 4 +-- tests/draft3/type.json | 27 +------------------ tests/draft4/optional/integer.json | 4 +-- .../draft4/optional/zeroTerminatedFloats.json | 4 +-- tests/draft6/optional/integer.json | 4 +-- tests/draft6/type.json | 4 +-- tests/draft7/optional/integer.json | 4 +-- tests/draft7/type.json | 4 +-- 15 files changed, 28 insertions(+), 53 deletions(-) diff --git a/tests/draft-next/optional/integer.json b/tests/draft-next/optional/integer.json index b8ace0b2..b70d6a7f 100644 --- a/tests/draft-next/optional/integer.json +++ b/tests/draft-next/optional/integer.json @@ -7,12 +7,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft-next/type.json b/tests/draft-next/type.json index 581f210c..c9911878 100644 --- a/tests/draft-next/type.json +++ b/tests/draft-next/type.json @@ -32,7 +32,7 @@ "valid": true }, { - "description": "a float with an exponent and a zero-value fractional part is an integer", + "description": "a float with an exponent and zero-value fractional part is an integer", "data": 1.1e1, "valid": true }, diff --git a/tests/draft2019-09/optional/integer.json b/tests/draft2019-09/optional/integer.json index 8ac0cf8a..5749cba8 100644 --- a/tests/draft2019-09/optional/integer.json +++ b/tests/draft2019-09/optional/integer.json @@ -7,12 +7,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft2019-09/type.json b/tests/draft2019-09/type.json index 1a27e76b..829d3294 100644 --- a/tests/draft2019-09/type.json +++ b/tests/draft2019-09/type.json @@ -27,12 +27,12 @@ "valid": true }, { - "description": "a float a with zero-value fractional part is an integer", + "description": "a float with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero-value fractional part is an integer", + "description": "a float with an exponent and zero-value fractional part is an integer", "data": 1.1e1, "valid": true }, diff --git a/tests/draft2020-12/optional/integer.json b/tests/draft2020-12/optional/integer.json index a9f871fb..5cd480ec 100644 --- a/tests/draft2020-12/optional/integer.json +++ b/tests/draft2020-12/optional/integer.json @@ -7,12 +7,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft2020-12/type.json b/tests/draft2020-12/type.json index b70f9935..dbc3a293 100644 --- a/tests/draft2020-12/type.json +++ b/tests/draft2020-12/type.json @@ -27,12 +27,12 @@ "valid": true }, { - "description": "a float a with zero-value fractional part is an integer", + "description": "a float with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero-value fractional part is an integer", + "description": "a float with an exponent and zero-value fractional part is an integer", "data": 1.1e1, "valid": true }, diff --git a/tests/draft3/optional/integer.json b/tests/draft3/optional/integer.json index c20f8463..9488e450 100644 --- a/tests/draft3/optional/integer.json +++ b/tests/draft3/optional/integer.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft3/optional/zeroTerminatedFloats.json b/tests/draft3/optional/zeroTerminatedFloats.json index 89594c90..bb6484fe 100644 --- a/tests/draft3/optional/zeroTerminatedFloats.json +++ b/tests/draft3/optional/zeroTerminatedFloats.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a float a with zero-value fractional part is not an integer", + "description": "a float with zero-value fractional part isn't an integer", "data": 1.0, "valid": false }, { - "description": "a float with an exponent and a zero-value fractional part is not an integer", + "description": "a float with exponent and zero-value fractional part isn't an integer", "data": 1.1e1, "valid": false } diff --git a/tests/draft3/type.json b/tests/draft3/type.json index 559ab6b2..6d32f827 100644 --- a/tests/draft3/type.json +++ b/tests/draft3/type.json @@ -24,32 +24,7 @@ "valid": true }, { - "description": "a float with zero fractional part is an integer", - "data": 1.0, - "valid": true - }, - { - "description": "a float with an exponent and a zero fractional part is an integer", - "data": 1e0, - "valid": true - }, - { - "description": "a small float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 1.00000000000001, - "valid": true - }, - { - "description": "a large float whose non-zero fractional part is truncated in a binary64 float is an integer", - "data": 9007199254740991.5, - "valid": true - }, - { - "description": "a number near the maximum representable value for a binary64 float is an integer", - "data": 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368, - "valid": true - }, - { - "description": "a float with a non-zero fractional part is not an integer", + "description": "a float with a nonzero-value fractional part is not an integer", "data": 1.1, "valid": false }, diff --git a/tests/draft4/optional/integer.json b/tests/draft4/optional/integer.json index c20f8463..9488e450 100644 --- a/tests/draft4/optional/integer.json +++ b/tests/draft4/optional/integer.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft4/optional/zeroTerminatedFloats.json b/tests/draft4/optional/zeroTerminatedFloats.json index 89594c90..bb6484fe 100644 --- a/tests/draft4/optional/zeroTerminatedFloats.json +++ b/tests/draft4/optional/zeroTerminatedFloats.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a float a with zero-value fractional part is not an integer", + "description": "a float with zero-value fractional part isn't an integer", "data": 1.0, "valid": false }, { - "description": "a float with an exponent and a zero-value fractional part is not an integer", + "description": "a float with exponent and zero-value fractional part isn't an integer", "data": 1.1e1, "valid": false } diff --git a/tests/draft6/optional/integer.json b/tests/draft6/optional/integer.json index c20f8463..9488e450 100644 --- a/tests/draft6/optional/integer.json +++ b/tests/draft6/optional/integer.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft6/type.json b/tests/draft6/type.json index dada7fe6..b2155f1b 100644 --- a/tests/draft6/type.json +++ b/tests/draft6/type.json @@ -24,12 +24,12 @@ "valid": true }, { - "description": "a float a with zero-value fractional part is an integer", + "description": "a float with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero-value fractional part is an integer", + "description": "a float with an exponent and zero-value fractional part is an integer", "data": 1.1e1, "valid": true }, diff --git a/tests/draft7/optional/integer.json b/tests/draft7/optional/integer.json index c20f8463..9488e450 100644 --- a/tests/draft7/optional/integer.json +++ b/tests/draft7/optional/integer.json @@ -6,12 +6,12 @@ }, "tests": [ { - "description": "a small float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a small float whose fractional part is truncated is not an integer", "data": 1.00000000000001, "valid": false }, { - "description": "a large float whose nonzero-value fractional part is truncated in a binary64 float is not an integer", + "description": "a large float whose fractional part is truncated is not an integer", "data": 9007199254740991.5, "valid": false } diff --git a/tests/draft7/type.json b/tests/draft7/type.json index dada7fe6..b2155f1b 100644 --- a/tests/draft7/type.json +++ b/tests/draft7/type.json @@ -24,12 +24,12 @@ "valid": true }, { - "description": "a float a with zero-value fractional part is an integer", + "description": "a float with zero-value fractional part is an integer", "data": 1.0, "valid": true }, { - "description": "a float with an exponent and a zero-value fractional part is an integer", + "description": "a float with an exponent and zero-value fractional part is an integer", "data": 1.1e1, "valid": true },