diff --git a/src/error-handlers/draft-04/dependencies.js b/src/error-handlers/draft-04/dependencies.js new file mode 100644 index 0000000..71a155d --- /dev/null +++ b/src/error-handlers/draft-04/dependencies.js @@ -0,0 +1,47 @@ +import { getSchema } from "@hyperjump/json-schema/experimental"; +import { getErrors } from "../../json-schema-errors.js"; +import * as Schema from "@hyperjump/browser"; +import * as Instance from "@hyperjump/json-schema/instance/experimental"; + +/** + * @import { ErrorHandler, ErrorObject, NormalizedOutput } from "../../index.d.ts" + */ + +/** @type ErrorHandler */ +const dependenciesErrorHandler = async (normalizedErrors, instance, localization) => { + /** @type ErrorObject[] */ + const errors = []; + + for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/dependencies"]) { + if (typeof normalizedErrors["https://json-schema.org/keyword/draft-04/dependencies"][schemaLocation] === "boolean") { + continue; + } + + const outputs = normalizedErrors["https://json-schema.org/keyword/draft-04/dependencies"][schemaLocation]; + for (const output of outputs) { + const result = await getErrors(output, instance, localization); + errors.push(...result); + } + + const dependencies = await getSchema(schemaLocation); + for await (const [property, dependency] of Schema.entries(dependencies)) { + if (!Instance.has(property, instance)) { + continue; + } + + if (Schema.typeOf(dependency) === "array") { + const dependentRequired = /** @type {string[]} */ (Schema.value(dependency)); + const missing = dependentRequired.filter((required) => !Instance.has(required, instance)); + errors.push({ + message: localization.getRequiredErrorMessage(missing), + instanceLocation: Instance.uri(instance), + schemaLocations: [schemaLocation] + }); + } + } + } + + return errors; +}; + +export default dependenciesErrorHandler; diff --git a/src/error-handlers/draft-04/maximum.js b/src/error-handlers/draft-04/maximum.js new file mode 100644 index 0000000..33dde38 --- /dev/null +++ b/src/error-handlers/draft-04/maximum.js @@ -0,0 +1,52 @@ +import { getSchema } from "@hyperjump/json-schema/experimental"; +import * as Schema from "@hyperjump/browser"; +import * as Instance from "@hyperjump/json-schema/instance/experimental"; + +/** + * @import { ErrorHandler, ErrorObject } from "../../index.d.ts" + */ + +/** @type ErrorHandler */ +const maximumErrorHandler = async (normalizedErrors, instance, localization) => { + /** @type ErrorObject[] */ + const errors = []; + + for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/maximum"]) { + if (normalizedErrors["https://json-schema.org/keyword/draft-04/maximum"][schemaLocation]) { + continue; + } + + const compiled = await getSchema(schemaLocation); + const maximum = /** @type number */ (Schema.value(compiled)); + + const parentLocation = schemaLocation.replace(/\/[^/]+$/, ""); + + let exclusive = false; + for (const exclusiveLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/exclusiveMaximum"]) { + const exclusiveParentLocation = exclusiveLocation.replace(/\/[^/]+$/, ""); + if (exclusiveParentLocation === parentLocation) { + const exclusiveCompiled = await getSchema(exclusiveLocation); + exclusive = /** @type boolean */ (Schema.value(exclusiveCompiled)); + break; + } + } + + if (exclusive) { + errors.push({ + message: localization.getExclusiveMaximumErrorMessage(maximum), + instanceLocation: Instance.uri(instance), + schemaLocations: [schemaLocation] + }); + } else { + errors.push({ + message: localization.getMaximumErrorMessage(maximum), + instanceLocation: Instance.uri(instance), + schemaLocations: [schemaLocation] + }); + } + } + + return errors; +}; + +export default maximumErrorHandler; diff --git a/src/error-handlers/draft-04/minimum.js b/src/error-handlers/draft-04/minimum.js new file mode 100644 index 0000000..38d5395 --- /dev/null +++ b/src/error-handlers/draft-04/minimum.js @@ -0,0 +1,52 @@ +import { getSchema } from "@hyperjump/json-schema/experimental"; +import * as Schema from "@hyperjump/browser"; +import * as Instance from "@hyperjump/json-schema/instance/experimental"; + +/** + * @import { ErrorHandler, ErrorObject } from "../../index.d.ts" + */ + +/** @type ErrorHandler */ +const minimumErrorHandler = async (normalizedErrors, instance, localization) => { + /** @type ErrorObject[] */ + const errors = []; + + for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/minimum"]) { + if (normalizedErrors["https://json-schema.org/keyword/draft-04/minimum"][schemaLocation]) { + continue; + } + + const compiled = await getSchema(schemaLocation); + const minimum = /** @type number */ (Schema.value(compiled)); + + const parentLocation = schemaLocation.replace(/\/[^/]+$/, ""); + + let exclusive = false; + for (const exclusiveLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/exclusiveMinimum"]) { + const exclusiveParentLocation = exclusiveLocation.replace(/\/[^/]+$/, ""); + if (exclusiveParentLocation === parentLocation) { + const exclusiveCompiled = await getSchema(exclusiveLocation); + exclusive = /** @type boolean */ (Schema.value(exclusiveCompiled)); + break; + } + } + + if (exclusive) { + errors.push({ + message: localization.getExclusiveMinimumErrorMessage(minimum), + instanceLocation: Instance.uri(instance), + schemaLocations: [schemaLocation] + }); + } else { + errors.push({ + message: localization.getMinimumErrorMessage(minimum), + instanceLocation: Instance.uri(instance), + schemaLocations: [schemaLocation] + }); + } + } + + return errors; +}; + +export default minimumErrorHandler; diff --git a/src/hyperjump-json-schema.test.js b/src/hyperjump-json-schema.test.js index 8887885..1aba5ad 100644 --- a/src/hyperjump-json-schema.test.js +++ b/src/hyperjump-json-schema.test.js @@ -11,6 +11,7 @@ import "@hyperjump/json-schema/formats"; import { BASIC } from "@hyperjump/json-schema/experimental"; import { jsonSchemaErrors } from "../src/index.js"; import { FluentBundle, FluentResource } from "@fluent/bundle"; +import "@hyperjump/json-schema/draft-04"; /** * @import { SchemaObject } from "@hyperjump/json-schema" @@ -184,4 +185,4 @@ runTests("https://json-schema.org/draft/2020-12/schema", 2020); runTests("https://json-schema.org/draft/2019-09/schema", 2019); // runTests("http://json-schema.org/draft-07/schema", 7); // runTests("http://json-schema.org/draft-06/schema", 6); -// runTests("http://json-schema.org/draft-04/schema", 4); +runTests("http://json-schema.org/draft-04/schema", 4); diff --git a/src/index.js b/src/index.js index 8017fe1..3b25776 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,6 @@ import { addErrorHandler, setNormalizationHandler } from "./json-schema-errors.js"; // Normalization Handlers -import additionalItemsNormalizationHandler from "./normalization-handlers/draft-04/additionalItems.js"; import additionalPropertiesNormalizationHandler from "./normalization-handlers/additionalProperties.js"; import allOfNormalizationHandler from "./normalization-handlers/allOf.js"; import anyOfNormalizationHandler from "./normalization-handlers/anyOf.js"; @@ -17,7 +16,6 @@ import exclusiveMaximumNormalizationHandler from "./normalization-handlers/exclu import exclusiveMinimumNormalizationHandler from "./normalization-handlers/exclusiveMinimum.js"; import formatNormalizationHandler from "./normalization-handlers/format.js"; import ifNormalizationHandler from "./normalization-handlers/if.js"; -import itemsDraft04NormalizationHandler from "./normalization-handlers/draft-04/items.js"; import itemsNormalizationHandler from "./normalization-handlers/items.js"; import maximumNormalizationHandler from "./normalization-handlers/maximum.js"; import maxContainsNormalizationHandler from "./normalization-handlers/maxContains.js"; @@ -45,6 +43,14 @@ import unevaluatedItemsNormalizationHandler from "./normalization-handlers/uneva import unevaluatedPropertiesNormalizationHandler from "./normalization-handlers/unevaluatedProperties.js"; import uniqueItemsNormalizationHandler from "./normalization-handlers/uniqueItems.js"; import unknownNormalizationHandler from "./normalization-handlers/unknown.js"; +// Draft 04 Normalization Handlers +import draft04AdditionalItemsNormalizationHandler from "./normalization-handlers/draft-04/additionalItems.js"; +import draft04DependenciesNormalizationHandler from "./normalization-handlers/draft-04/dependencies.js"; +import draft04ExclusiveMaximumNormalizationHandler from "./normalization-handlers/draft-04/exclusiveMaximum.js"; +import draft04ExclusiveMinimumNormalizationHandler from "./normalization-handlers/draft-04/exclusiveMinimum.js"; +import draft04ItemsNormalizationHandler from "./normalization-handlers/draft-04/items.js"; +import draft04MaximumNormalizationHandler from "./normalization-handlers/draft-04/maximum.js"; +import draft04MinimumNormalizationHandler from "./normalization-handlers/draft-04/minimum.js"; // Error Handlers import anyOfErrorHandler from "./error-handlers/anyOf.js"; @@ -72,8 +78,11 @@ import requiredErrorHandler from "./error-handlers/required.js"; import typeErrorHandler from "./error-handlers/type.js"; import uniqueItemsErrorHandler from "./error-handlers/uniqueItems.js"; import unknownErrorHandler from "./error-handlers/unknown.js"; +// Draft 04 Error Handlers +import draft04DependenciesErrorHandler from "./error-handlers/draft-04/dependencies.js"; +import draft04MaximumErrorHandler from "./error-handlers/draft-04/maximum.js"; +import draft04MinimumErrorHandler from "./error-handlers/draft-04/minimum.js"; -setNormalizationHandler("https://json-schema.org/keyword/draft-04/additionalItems", additionalItemsNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/additionalProperties", additionalPropertiesNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/allOf", allOfNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/anyOf", anyOfNormalizationHandler); @@ -93,7 +102,6 @@ setNormalizationHandler("https://json-schema.org/keyword/draft-07/format", forma setNormalizationHandler("https://json-schema.org/keyword/draft-06/format", formatNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/draft-04/format", formatNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/if", ifNormalizationHandler); -setNormalizationHandler("https://json-schema.org/keyword/draft-04/items", itemsDraft04NormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/items", itemsNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/exclusiveMaximum", exclusiveMaximumNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/exclusiveMinimum", exclusiveMinimumNormalizationHandler); @@ -123,6 +131,13 @@ setNormalizationHandler("https://json-schema.org/keyword/unevaluatedItems", unev setNormalizationHandler("https://json-schema.org/keyword/unevaluatedProperties", unevaluatedPropertiesNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/uniqueItems", uniqueItemsNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/unknown", unknownNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/additionalItems", draft04AdditionalItemsNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/dependencies", draft04DependenciesNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/exclusiveMaximum", draft04ExclusiveMaximumNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/exclusiveMinimum", draft04ExclusiveMinimumNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/items", draft04ItemsNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/maximum", draft04MaximumNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/minimum", draft04MinimumNormalizationHandler); addErrorHandler(anyOfErrorHandler); addErrorHandler(booleanSchemaErrorHandler); @@ -149,6 +164,9 @@ addErrorHandler(requiredErrorHandler); addErrorHandler(typeErrorHandler); addErrorHandler(uniqueItemsErrorHandler); addErrorHandler(unknownErrorHandler); +addErrorHandler(draft04DependenciesErrorHandler); +addErrorHandler(draft04MaximumErrorHandler); +addErrorHandler(draft04MinimumErrorHandler); export { addErrorHandler, diff --git a/src/normalization-handlers/draft-04/dependencies.js b/src/normalization-handlers/draft-04/dependencies.js new file mode 100644 index 0000000..af14f7b --- /dev/null +++ b/src/normalization-handlers/draft-04/dependencies.js @@ -0,0 +1,32 @@ +import { evaluateSchema } from "../../json-schema-errors.js"; +import * as Instance from "@hyperjump/json-schema/instance/experimental"; + +/** + * @import { NormalizationHandler, NormalizedOutput } from "../../index.d.ts" + */ + +/** @type NormalizationHandler> */ +const dependenciesNormalizationHandler = { + evaluate(dependencies, instance, context) { + /** @type NormalizedOutput[] */ + const outputs = []; + + if (Instance.typeOf(instance) !== "object") { + return outputs; + } + + for (const [property, dependency] of dependencies) { + if (!Instance.has(property, instance)) { + continue; + } + + if (typeof dependency === "string") { + outputs.push(evaluateSchema(dependency, instance, context)); + } + } + + return outputs; + } +}; + +export default dependenciesNormalizationHandler; diff --git a/src/normalization-handlers/draft-04/exclusiveMaximum.js b/src/normalization-handlers/draft-04/exclusiveMaximum.js new file mode 100644 index 0000000..9bdffaf --- /dev/null +++ b/src/normalization-handlers/draft-04/exclusiveMaximum.js @@ -0,0 +1,11 @@ +/** + * @import { NormalizationHandler } from "../../index.d.ts" + */ + +/** @type NormalizationHandler */ +const exclusiveMaximumNormalizationHandler = { + evaluate() { + } +}; + +export default exclusiveMaximumNormalizationHandler; diff --git a/src/normalization-handlers/draft-04/exclusiveMinimum.js b/src/normalization-handlers/draft-04/exclusiveMinimum.js new file mode 100644 index 0000000..70fa029 --- /dev/null +++ b/src/normalization-handlers/draft-04/exclusiveMinimum.js @@ -0,0 +1,11 @@ +/** + * @import { NormalizationHandler } from "../../index.d.ts" + */ + +/** @type NormalizationHandler */ +const exclusiveMinimumNormalizationHandler = { + evaluate() { + } +}; + +export default exclusiveMinimumNormalizationHandler; diff --git a/src/normalization-handlers/draft-04/maximum.js b/src/normalization-handlers/draft-04/maximum.js new file mode 100644 index 0000000..1e9b441 --- /dev/null +++ b/src/normalization-handlers/draft-04/maximum.js @@ -0,0 +1,11 @@ +/** + * @import { NormalizationHandler } from "../../index.d.ts" + */ + +/** @type NormalizationHandler */ +const maximumNormalizationHandler = { + evaluate() { + } +}; + +export default maximumNormalizationHandler; diff --git a/src/normalization-handlers/draft-04/minimum.js b/src/normalization-handlers/draft-04/minimum.js new file mode 100644 index 0000000..ce09e84 --- /dev/null +++ b/src/normalization-handlers/draft-04/minimum.js @@ -0,0 +1,11 @@ +/** + * @import { NormalizationHandler } from "../../index.d.ts" + */ + +/** @type NormalizationHandler */ +const minimumNormalizationHandler = { + evaluate() { + } +}; + +export default minimumNormalizationHandler; diff --git a/src/test-suite/tests/additionalItems.json b/src/test-suite/tests/additionalItems.json new file mode 100644 index 0000000..cdb3534 --- /dev/null +++ b/src/test-suite/tests/additionalItems.json @@ -0,0 +1,99 @@ +{ + "$schema": "../test-suite.schema.json", + "description": "The additionalItems keyword", + "tests": [ + { + "description": "additionalItems with true", + "compatibility": "=4", + "schema": { + "items": [ + { + "type": "number" + } + ], + "additionalItems": true + }, + "instance": [ + 1, + "foo" + ], + "errors": [] + }, + { + "description": "additionalItems with false", + "compatibility": "=4", + "schema": { + "items": [ + { + "type": "number" + } + ], + "additionalItems": false + }, + "instance": [ + 1, + "foo" + ], + "errors": [ + { + "messageId": "boolean-schema-message", + "messageParams": {}, + "instanceLocation": "#/1", + "schemaLocations": [ + "#/additionalItems" + ] + } + ] + }, + { + "description": "additionalItems with schema", + "compatibility": "=4", + "schema": { + "items": [ + { + "type": "number" + } + ], + "additionalItems": { + "type": "string" + } + }, + "instance": [ + 1, + 2 + ], + "errors": [ + { + "messageId": "type-message", + "messageParams": { + "expectedTypes": { + "or": [ + "string" + ] + } + }, + "instanceLocation": "#/1", + "schemaLocations": [ + "#/additionalItems/type" + ] + } + ] + }, + { + "description": "additionalItems when items is schema", + "compatibility": "=4", + "schema": { + "items": { + "type": "number" + }, + "additionalItems": false + }, + "instance": [ + 1, + 2, + 3 + ], + "errors": [] + } + ] +} \ No newline at end of file diff --git a/src/test-suite/tests/boolean-schema.json b/src/test-suite/tests/boolean-schema.json index 91c10ed..eab5d7b 100644 --- a/src/test-suite/tests/boolean-schema.json +++ b/src/test-suite/tests/boolean-schema.json @@ -5,6 +5,7 @@ "tests": [ { "description": "false schema on a property", + "compatibility": "6", "schema": { "properties": { "foo": false @@ -23,6 +24,7 @@ }, { "description": "true schema on a property", + "compatibility": "6", "schema": { "properties": { "foo": true, diff --git a/src/test-suite/tests/dependencies.json b/src/test-suite/tests/dependencies.json new file mode 100644 index 0000000..7496e9e --- /dev/null +++ b/src/test-suite/tests/dependencies.json @@ -0,0 +1,169 @@ +{ + "$schema": "../test-suite.schema.json", + + "description": "The dependencies keyword", + "tests": [ + { + "description": "dependencies with schema", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": { + "properties": { + "bar": { + "type": "number" + } + } + } + } + }, + "instance": { + "foo": 1, + "bar": "baz" + }, + "errors": [ + { + "messageId": "type-message", + "messageParams": { + "expectedTypes": { + "or": [ + "number" + ] + } + }, + "instanceLocation": "#/bar", + "schemaLocations": [ + "#/dependencies/foo/properties/bar/type" + ] + } + ] + }, + { + "description": "dependencies with property array (success)", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": [ + "bar" + ] + } + }, + "instance": { + "foo": 1, + "bar": 2 + }, + "errors": [] + }, + { + "description": "dependencies with property array (failure)", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": [ + "bar" + ] + } + }, + "instance": { + "foo": 1 + }, + "errors": [ + { + "messageId": "required-message", + "messageParams": { + "count": 1, + "required": { + "and": [ + "bar" + ] + } + }, + "instanceLocation": "#", + "schemaLocations": [ + "#/dependencies" + ] + } + ] + }, + { + "description": "dependencies with property array (success)", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": [ + "bar" + ] + } + }, + "instance": { + "foo": 1, + "bar": 2 + }, + "errors": [] + }, + { + "description": "dependencies with property array (failure)", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": [ + "bar" + ] + } + }, + "instance": { + "foo": 1 + }, + "errors": [ + { + "messageId": "required-message", + "messageParams": { + "count": 1, + "required": { + "and": [ + "bar" + ] + } + }, + "instanceLocation": "#", + "schemaLocations": [ + "#/dependencies" + ] + } + ] + }, + { + "description": "dependencies with missing property array (multiple)", + "compatibility": "<=7", + "schema": { + "dependencies": { + "foo": [ + "bar", + "baz" + ] + } + }, + "instance": { + "foo": 1 + }, + "errors": [ + { + "messageId": "required-message", + "messageParams": { + "count": 2, + "required": { + "and": [ + "bar", + "baz" + ] + } + }, + "instanceLocation": "#", + "schemaLocations": [ + "#/dependencies" + ] + } + ] + } + ] +} diff --git a/src/test-suite/tests/exclusiveMaximum.json b/src/test-suite/tests/exclusiveMaximum.json index ba8b6b9..99338e9 100644 --- a/src/test-suite/tests/exclusiveMaximum.json +++ b/src/test-suite/tests/exclusiveMaximum.json @@ -1,10 +1,10 @@ { "$schema": "../test-suite.schema.json", - "description": "The exclusiveMaximum keyword", "tests": [ { "description": "exclusiveMaximum", + "compatibility": "6", "schema": { "exclusiveMaximum": 3 }, @@ -12,9 +12,7 @@ "errors": [ { "messageId": "exclusiveMaximum-message", - "messageParams": { - "exclusiveMaximum": "3" - }, + "messageParams": {"exclusiveMaximum": "3" }, "instanceLocation": "#", "schemaLocations": ["#/exclusiveMaximum"] } @@ -22,6 +20,7 @@ }, { "description": "exclusiveMaximum pass", + "compatibility": "6", "schema": { "exclusiveMaximum": 3 }, diff --git a/src/test-suite/tests/exclusiveMinimum.json b/src/test-suite/tests/exclusiveMinimum.json index f15bf77..9a90c4d 100644 --- a/src/test-suite/tests/exclusiveMinimum.json +++ b/src/test-suite/tests/exclusiveMinimum.json @@ -1,10 +1,10 @@ { "$schema": "../test-suite.schema.json", - "description": "The exclusiveMinimum keyword", "tests": [ { "description": "exclusiveMinimum", + "compatibility": "6", "schema": { "exclusiveMinimum": 3 }, @@ -12,9 +12,7 @@ "errors": [ { "messageId": "exclusiveMinimum-message", - "messageParams": { - "exclusiveMinimum": "3" - }, + "messageParams": {"exclusiveMinimum": "3" }, "instanceLocation": "#", "schemaLocations": ["#/exclusiveMinimum"] } @@ -22,6 +20,7 @@ }, { "description": "exclusiveMinimum pass", + "compatibility": "6", "schema": { "exclusiveMinimum": 3 }, diff --git a/src/test-suite/tests/items.json b/src/test-suite/tests/items.json index 09ddba9..4ff5b2c 100644 --- a/src/test-suite/tests/items.json +++ b/src/test-suite/tests/items.json @@ -125,6 +125,47 @@ }, "instance": [42, 24], "errors": [] + }, + { + "description": "items as schemas (draft-04)", + "compatibility": "=4", + "schema": { + "items": { + "type": "number" + } + }, + "instance": [1,"foo"], + "errors": [ + { + "messageId": "type-message", + "messageParams": { + "expectedTypes": {"or": ["number"] } + }, + "instanceLocation": "#/1", + "schemaLocations": ["#/items/type"] + } + ] + }, + { + "description": "items as array of schemas (draft-04)", + "compatibility": "=4", + "schema": { + "items": [ + {"type": "number"}, + {"type": "string"} + ] + }, + "instance": [1,2], + "errors": [ + { + "messageId": "type-message", + "messageParams": { + "expectedTypes": {"or": ["string"] } + }, + "instanceLocation": "#/1", + "schemaLocations": ["#/items/1/type"] + } + ] } ] -} +} \ No newline at end of file diff --git a/src/test-suite/tests/maximum.json b/src/test-suite/tests/maximum.json index dfb3c80..5fea031 100644 --- a/src/test-suite/tests/maximum.json +++ b/src/test-suite/tests/maximum.json @@ -12,8 +12,8 @@ "errors": [ { "messageId": "maximum-message", - "messageParams": { - "maximum": "3" + "messageParams": { + "maximum": "3" }, "instanceLocation": "#", "schemaLocations": ["#/maximum"] @@ -27,6 +27,43 @@ }, "instance": 3, "errors": [] + }, + { + "description": "maximum (draft-04)", + "compatibility": "=4", + "schema": { + "maximum": 3 + }, + "instance": 4, + "errors": [ + { + "messageId": "maximum-message", + "messageParams": { + "maximum": "3" + }, + "instanceLocation": "#", + "schemaLocations": ["#/maximum"] + } + ] + }, + { + "description": "exclusiveMaximum (draft-04)", + "compatibility": "=4", + "schema": { + "maximum": 3, + "exclusiveMaximum": true + }, + "instance": 3, + "errors": [ + { + "messageId": "exclusiveMaximum-message", + "messageParams": { + "exclusiveMaximum": "3" + }, + "instanceLocation": "#", + "schemaLocations": ["#/maximum"] + } + ] } ] } diff --git a/src/test-suite/tests/minimum.json b/src/test-suite/tests/minimum.json index f915abf..7073020 100644 --- a/src/test-suite/tests/minimum.json +++ b/src/test-suite/tests/minimum.json @@ -12,7 +12,9 @@ "errors": [ { "messageId": "minimum-message", - "messageParams": { "minimum": "3" }, + "messageParams": { + "minimum": "3" + }, "instanceLocation": "#", "schemaLocations": ["#/minimum"] } @@ -25,6 +27,43 @@ }, "instance": 5, "errors": [] + }, + { + "description": "minimum (draft-04)", + "compatibility": "=4", + "schema": { + "minimum": 3 + }, + "instance": 2, + "errors": [ + { + "messageId": "minimum-message", + "messageParams": { + "minimum": "3" + }, + "instanceLocation": "#", + "schemaLocations": ["#/minimum"] + } + ] + }, + { + "description": "exclusiveMinimum (draft-04)", + "compatibility": "=4", + "schema": { + "minimum": 3, + "exclusiveMinimum": true + }, + "instance": 3, + "errors": [ + { + "messageId": "exclusiveMinimum-message", + "messageParams": { + "exclusiveMinimum": "3" + }, + "instanceLocation": "#", + "schemaLocations": ["#/minimum"] + } + ] } ] }