From 5ebca24ae7ff51c8668a359ed0e36f76dad2aa7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Sat, 27 Jan 2018 22:03:56 +0100 Subject: [PATCH 01/14] Init implementation of ConditonalSchema. Covered case: there is only "if" schema. --- .../everit/json/schema/ConditionalSchema.java | 37 +++++++++++++++++++ .../json/schema/ConditionalSchemaTest.java | 16 ++++++++ 2 files changed, 53 insertions(+) create mode 100644 core/src/main/java/org/everit/json/schema/ConditionalSchema.java create mode 100644 core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java new file mode 100644 index 000000000..17bb98772 --- /dev/null +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -0,0 +1,37 @@ +package org.everit.json.schema; + +/** + * Validator for {@code if}, {@code then}, {@code else} schemas. + */ +public class ConditionalSchema extends Schema { + + /** + * Builder class for {@link ConditionalSchema}. + */ + public static class Builder extends Schema.Builder { + private Schema ifSchema; + + public Builder ifSchema(final Schema ifSchema) { + this.ifSchema = ifSchema; + return this; + } + + @Override + public ConditionalSchema build() { + return new ConditionalSchema(this); + } + } + + public static Builder builder() { + return new Builder(); + } + + public ConditionalSchema(Builder builder) { + super(builder); + } + + @Override + void accept(Visitor visitor) { + + } +} diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java new file mode 100644 index 000000000..3912cc47b --- /dev/null +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -0,0 +1,16 @@ +package org.everit.json.schema; + +import org.junit.Test; + +public class ConditionalSchemaTest { + + @Test + public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { + ConditionalSchema.builder().ifSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); + } + + @Test + public void onlyIfSuccess() { + ConditionalSchema.builder().ifSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + } +} \ No newline at end of file From 251a664064832bcb6f0a3fb853ff631fbc819901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Sun, 28 Jan 2018 17:47:45 +0100 Subject: [PATCH 02/14] Support "else" and "then" schema by ConditionalSchema Covered case: there is only "then" or "else" schema. --- .../everit/json/schema/ConditionalSchema.java | 12 +++++++++++ .../json/schema/ConditionalSchemaTest.java | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index 17bb98772..0a56705e9 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -10,12 +10,24 @@ public class ConditionalSchema extends Schema { */ public static class Builder extends Schema.Builder { private Schema ifSchema; + private Schema thenSchema; + private Schema elseSchema; public Builder ifSchema(final Schema ifSchema) { this.ifSchema = ifSchema; return this; } + public Builder thenSchema(final Schema thenSchema) { + this.thenSchema = thenSchema; + return this; + } + + public Builder elseSchema(final Schema elseSchema) { + this.elseSchema = elseSchema; + return this; + } + @Override public ConditionalSchema build() { return new ConditionalSchema(this); diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index 3912cc47b..171840461 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -13,4 +13,24 @@ public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { public void onlyIfSuccess() { ConditionalSchema.builder().ifSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); } + + @Test + public void onlyThenSuccessEvenIfDataIsInvalidAgainstSubschema() { + ConditionalSchema.builder().thenSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); + } + + @Test + public void onlyThenSuccess() { + ConditionalSchema.builder().thenSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + } + + @Test + public void onlyElseSuccessEvenIfDataIsInvalidAgainstSubschema() { + ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); + } + + @Test + public void onlyElseSuccess() { + ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + } } \ No newline at end of file From 897f05682ad6a5df2d40864b5877076a1db30d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Mon, 29 Jan 2018 23:33:18 +0100 Subject: [PATCH 03/14] Implement ConditionalSchema visit logic in ValidatingVisitor --- .../everit/json/schema/ConditionalSchema.java | 22 +++++++++++++++++- .../everit/json/schema/ValidatingVisitor.java | 23 +++++++++++++++++++ .../java/org/everit/json/schema/Visitor.java | 3 +++ .../json/schema/ConditionalSchemaTest.java | 21 +++++++++++++---- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index 0a56705e9..469f03860 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -38,12 +38,32 @@ public static Builder builder() { return new Builder(); } + private Schema ifSchema; + private Schema thenSchema; + private Schema elseSchema; + public ConditionalSchema(Builder builder) { super(builder); + this.ifSchema = builder.ifSchema; + this.thenSchema = builder.thenSchema; + this.elseSchema = builder.elseSchema; + } + + public Schema getIfSchema() { + return ifSchema; + } + + public Schema getThenSchema() { + return thenSchema; + } + + public Schema getElseSchema() { + return elseSchema; } @Override void accept(Visitor visitor) { - + visitor.visitConditionalSchema(this); } + } diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index d1417ab8f..e4d8eeb20 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -123,6 +123,29 @@ private static boolean isNull(Object obj) { } } + @Override void visitConditionalSchema(ConditionalSchema conditionalSchema) { + if ((conditionalSchema.getIfSchema() == null && conditionalSchema.getThenSchema() == null) || + (conditionalSchema.getIfSchema() == null && conditionalSchema.getElseSchema() == null) || + (conditionalSchema.getElseSchema() == null && conditionalSchema.getThenSchema() == null)){ + return; + } + if (conditionalSchema.getIfSchema() != null) { + try { + conditionalSchema.getIfSchema().validate(subject); + } + catch (ValidationException e) { + if (conditionalSchema.getElseSchema() != null) { + conditionalSchema.getElseSchema().validate(subject); + return; + } + throw e; + } + if (conditionalSchema.getThenSchema() != null) { + conditionalSchema.getThenSchema().validate(subject); + } + } + } + ValidationException getFailureOfSchema(Schema schema, Object input) { Object origSubject = this.subject; this.subject = input; diff --git a/core/src/main/java/org/everit/json/schema/Visitor.java b/core/src/main/java/org/everit/json/schema/Visitor.java index 1e2ad3f74..7c1535a57 100644 --- a/core/src/main/java/org/everit/json/schema/Visitor.java +++ b/core/src/main/java/org/everit/json/schema/Visitor.java @@ -183,4 +183,7 @@ void visitMinLength(Integer minLength) { void visitCombinedSchema(CombinedSchema combinedSchema) { } + + void visitConditionalSchema(ConditionalSchema conditionalSchema){ + } } diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index 171840461..484c0062d 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -4,6 +4,9 @@ public class ConditionalSchemaTest { + public static final StringSchema STRING_SCHEMA_1 = StringSchema.builder().maxLength(4).build(); + public static final StringSchema STRING_SCHEMA_2 = StringSchema.builder().pattern("f.*o").build(); + @Test public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { ConditionalSchema.builder().ifSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); @@ -11,7 +14,7 @@ public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { @Test public void onlyIfSuccess() { - ConditionalSchema.builder().ifSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + ConditionalSchema.builder().ifSchema(STRING_SCHEMA_1).build().validate("foo"); } @Test @@ -21,16 +24,26 @@ public void onlyThenSuccessEvenIfDataIsInvalidAgainstSubschema() { @Test public void onlyThenSuccess() { - ConditionalSchema.builder().thenSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + ConditionalSchema.builder().thenSchema(STRING_SCHEMA_1).build().validate("foo"); } @Test public void onlyElseSuccessEvenIfDataIsInvalidAgainstSubschema() { - ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); + ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(1).build()).build().validate("foo"); } @Test public void onlyElseSuccess() { - ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(4).build()).build().validate("foo"); + ConditionalSchema.builder().elseSchema(STRING_SCHEMA_1).build().validate("foo"); + } + + @Test(expected = ValidationException.class) + public void ifSubschemaSuccessThenSubschemaFailure() { + ConditionalSchema.builder().ifSchema(STRING_SCHEMA_1).thenSchema(STRING_SCHEMA_2).build().validate("bar"); + } + + @Test(expected = ValidationException.class) + public void ifSubschemaFailureThenSubschemaSuccess() { + ConditionalSchema.builder().ifSchema(STRING_SCHEMA_2).thenSchema(STRING_SCHEMA_1).build().validate("bar"); } } \ No newline at end of file From ab90c1f32d267ffbcb5f709e67acf05b5cd07e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Thu, 1 Feb 2018 20:15:30 +0100 Subject: [PATCH 04/14] Do not validate against subschemas needlessly if essential subschemas are missing --- .../everit/json/schema/ConditionalSchema.java | 12 ++++ .../everit/json/schema/ValidatingVisitor.java | 67 +++++++++++-------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index 469f03860..88f019081 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -61,6 +61,18 @@ public Schema getElseSchema() { return elseSchema; } + public boolean ifSchemaMissing() { + return ifSchema == null; + } + + public boolean elseSchemaMissing() { + return elseSchema == null; + } + + public boolean thenSchemaMissing() { + return thenSchema == null; + } + @Override void accept(Visitor visitor) { visitor.visitConditionalSchema(this); diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index e4d8eeb20..f364f3149 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -29,27 +29,32 @@ private static boolean isNull(Object obj) { this.failureReporter = failureReporter; } - @Override void visitNumberSchema(NumberSchema numberSchema) { + @Override + void visitNumberSchema(NumberSchema numberSchema) { numberSchema.accept(new NumberSchemaValidatingVisitor(subject, failureReporter)); } - @Override void visitArraySchema(ArraySchema arraySchema) { + @Override + void visitArraySchema(ArraySchema arraySchema) { arraySchema.accept(new ArraySchemaValidatingVisitor(subject, this)); } - @Override void visitBooleanSchema(BooleanSchema schema) { + @Override + void visitBooleanSchema(BooleanSchema schema) { if (!(subject instanceof Boolean)) { failureReporter.failure(Boolean.class, subject); } } - @Override void visitNullSchema(NullSchema nullSchema) { + @Override + void visitNullSchema(NullSchema nullSchema) { if (!(subject == null || subject == JSONObject.NULL)) { failureReporter.failure("expected: null, found: " + subject.getClass().getSimpleName(), "type"); } } - @Override void visitConstSchema(ConstSchema constSchema) { + @Override + void visitConstSchema(ConstSchema constSchema) { if (isNull(subject) && isNull(constSchema.getPermittedValue())) { return; } @@ -59,7 +64,8 @@ private static boolean isNull(Object obj) { } } - @Override void visitEnumSchema(EnumSchema enumSchema) { + @Override + void visitEnumSchema(EnumSchema enumSchema) { Object effectiveSubject = toJavaValue(subject); for (Object possibleValue : enumSchema.getPossibleValues()) { if (ObjectComparator.deepEquals(possibleValue, effectiveSubject)) { @@ -69,11 +75,13 @@ private static boolean isNull(Object obj) { failureReporter.failure(format("%s is not a valid enum value", subject), "enum"); } - @Override void visitFalseSchema(FalseSchema falseSchema) { + @Override + void visitFalseSchema(FalseSchema falseSchema) { failureReporter.failure("false schema always fails", "false"); } - @Override void visitNotSchema(NotSchema notSchema) { + @Override + void visitNotSchema(NotSchema notSchema) { Schema mustNotMatch = notSchema.getMustNotMatch(); ValidationException failure = getFailureOfSchema(mustNotMatch, subject); if (failure == null) { @@ -81,7 +89,8 @@ private static boolean isNull(Object obj) { } } - @Override void visitReferenceSchema(ReferenceSchema referenceSchema) { + @Override + void visitReferenceSchema(ReferenceSchema referenceSchema) { Schema referredSchema = referenceSchema.getReferredSchema(); if (referredSchema == null) { throw new IllegalStateException("referredSchema must be injected before validation"); @@ -92,15 +101,18 @@ private static boolean isNull(Object obj) { } } - @Override void visitObjectSchema(ObjectSchema objectSchema) { + @Override + void visitObjectSchema(ObjectSchema objectSchema) { objectSchema.accept(new ObjectSchemaValidatingVisitor(subject, this)); } - @Override void visitStringSchema(StringSchema stringSchema) { + @Override + void visitStringSchema(StringSchema stringSchema) { stringSchema.accept(new StringSchemaValidatingVisitor(subject, failureReporter)); } - @Override void visitCombinedSchema(CombinedSchema combinedSchema) { + @Override + void visitCombinedSchema(CombinedSchema combinedSchema) { List failures = new ArrayList<>(); Collection subschemas = combinedSchema.getSubschemas(); CombinedSchema.ValidationCriterion criterion = combinedSchema.getCriterion(); @@ -123,26 +135,23 @@ private static boolean isNull(Object obj) { } } - @Override void visitConditionalSchema(ConditionalSchema conditionalSchema) { - if ((conditionalSchema.getIfSchema() == null && conditionalSchema.getThenSchema() == null) || - (conditionalSchema.getIfSchema() == null && conditionalSchema.getElseSchema() == null) || - (conditionalSchema.getElseSchema() == null && conditionalSchema.getThenSchema() == null)){ + @Override + void visitConditionalSchema(ConditionalSchema conditionalSchema) { + if (conditionalSchema.ifSchemaMissing() || + (conditionalSchema.thenSchemaMissing() && conditionalSchema.elseSchemaMissing())) { return; } - if (conditionalSchema.getIfSchema() != null) { - try { - conditionalSchema.getIfSchema().validate(subject); - } - catch (ValidationException e) { - if (conditionalSchema.getElseSchema() != null) { - conditionalSchema.getElseSchema().validate(subject); - return; - } - throw e; - } - if (conditionalSchema.getThenSchema() != null) { - conditionalSchema.getThenSchema().validate(subject); + try { + conditionalSchema.getIfSchema().validate(subject); + } catch (ValidationException e) { + if (!conditionalSchema.elseSchemaMissing()) { + conditionalSchema.getElseSchema().validate(subject); + return; } + throw e; + } + if (!conditionalSchema.thenSchemaMissing()) { + conditionalSchema.getThenSchema().validate(subject); } } From 525dd840c5decc39509cb27c72eeec9fad9db99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Thu, 1 Feb 2018 20:17:20 +0100 Subject: [PATCH 05/14] Rename exception of ifschema validation to more meaningful name --- .../main/java/org/everit/json/schema/ValidatingVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index f364f3149..7e24a57e1 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -143,12 +143,12 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) { } try { conditionalSchema.getIfSchema().validate(subject); - } catch (ValidationException e) { + } catch (ValidationException ifSchemaValidationException) { if (!conditionalSchema.elseSchemaMissing()) { conditionalSchema.getElseSchema().validate(subject); return; } - throw e; + throw ifSchemaValidationException; } if (!conditionalSchema.thenSchemaMissing()) { conditionalSchema.getThenSchema().validate(subject); From 7b245818b9d214284028ac1cd9dc2f3fec9da3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Thu, 1 Feb 2018 20:45:12 +0100 Subject: [PATCH 06/14] Add unit test for ConditionalSchemaTest to cover more cases --- .../json/schema/ConditionalSchemaTest.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index 484c0062d..1c534523b 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -4,8 +4,9 @@ public class ConditionalSchemaTest { - public static final StringSchema STRING_SCHEMA_1 = StringSchema.builder().maxLength(4).build(); - public static final StringSchema STRING_SCHEMA_2 = StringSchema.builder().pattern("f.*o").build(); + public static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build(); + public static final StringSchema MIN_LENGTH_STRING_SCHEMA = StringSchema.builder().minLength(4).build(); + public static final StringSchema PATTERN_STRING_SCHEMA = StringSchema.builder().pattern("f.*o").build(); @Test public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { @@ -14,7 +15,7 @@ public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { @Test public void onlyIfSuccess() { - ConditionalSchema.builder().ifSchema(STRING_SCHEMA_1).build().validate("foo"); + ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } @Test @@ -24,7 +25,7 @@ public void onlyThenSuccessEvenIfDataIsInvalidAgainstSubschema() { @Test public void onlyThenSuccess() { - ConditionalSchema.builder().thenSchema(STRING_SCHEMA_1).build().validate("foo"); + ConditionalSchema.builder().thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } @Test @@ -34,16 +35,32 @@ public void onlyElseSuccessEvenIfDataIsInvalidAgainstSubschema() { @Test public void onlyElseSuccess() { - ConditionalSchema.builder().elseSchema(STRING_SCHEMA_1).build().validate("foo"); + ConditionalSchema.builder().elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } @Test(expected = ValidationException.class) public void ifSubschemaSuccessThenSubschemaFailure() { - ConditionalSchema.builder().ifSchema(STRING_SCHEMA_1).thenSchema(STRING_SCHEMA_2).build().validate("bar"); + ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); } @Test(expected = ValidationException.class) public void ifSubschemaFailureThenSubschemaSuccess() { - ConditionalSchema.builder().ifSchema(STRING_SCHEMA_2).thenSchema(STRING_SCHEMA_1).build().validate("bar"); + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); } + + @Test(expected = ValidationException.class) + public void ifSubschemaFailureThenSubschemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foobar"); + } + + @Test + public void ifSubschemaSuccessThenSubschemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); + } + + @Test + public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foo"); + } + } \ No newline at end of file From a1dd0b1335698b85bf3fb2d438aaa5255be4c381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Mon, 5 Feb 2018 20:46:02 +0100 Subject: [PATCH 07/14] Cover all possible cases by unit tests for ConditionalSchema. --- .../json/schema/ConditionalSchemaTest.java | 103 ++++++++++++++++-- 1 file changed, 96 insertions(+), 7 deletions(-) diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index 1c534523b..fe1dbda82 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -4,9 +4,11 @@ public class ConditionalSchemaTest { - public static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build(); - public static final StringSchema MIN_LENGTH_STRING_SCHEMA = StringSchema.builder().minLength(4).build(); - public static final StringSchema PATTERN_STRING_SCHEMA = StringSchema.builder().pattern("f.*o").build(); + private static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build(); + private static final StringSchema MIN_LENGTH_STRING_SCHEMA = StringSchema.builder().minLength(6).build(); + private static final StringSchema PATTERN_STRING_SCHEMA = StringSchema.builder().pattern("f.*o").build(); + + // only if @Test public void onlyIfSuccessEvenIfDataIsInvalidAgainstSubschema() { @@ -18,6 +20,8 @@ public void onlyIfSuccess() { ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } + // only then + @Test public void onlyThenSuccessEvenIfDataIsInvalidAgainstSubschema() { ConditionalSchema.builder().thenSchema(StringSchema.builder().maxLength(2).build()).build().validate("foo"); @@ -28,6 +32,8 @@ public void onlyThenSuccess() { ConditionalSchema.builder().thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } + // only else + @Test public void onlyElseSuccessEvenIfDataIsInvalidAgainstSubschema() { ConditionalSchema.builder().elseSchema(StringSchema.builder().maxLength(1).build()).build().validate("foo"); @@ -38,24 +44,77 @@ public void onlyElseSuccess() { ConditionalSchema.builder().elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } + // if-then + @Test(expected = ValidationException.class) public void ifSubschemaSuccessThenSubschemaFailure() { ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); } + @Test(expected = ValidationException.class) + public void ifSubschemaFailureThenSubschemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar"); + } + + @Test + public void ifSubschemaSuccessThenSubschemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); + } + @Test(expected = ValidationException.class) public void ifSubschemaFailureThenSubschemaSuccess() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); } + // if-else + + @Test + public void ifSubschemaSuccessElseSubschemaFailure() { + ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); + } + @Test(expected = ValidationException.class) - public void ifSubschemaFailureThenSubschemaFailure() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foobar"); + public void ifSubschemaFailureElseSubschemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar"); } @Test - public void ifSubschemaSuccessThenSubschemaSuccess() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); + public void ifSubschemaSuccessElseSubschemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); + } + + @Test + public void ifSubschemaFailureElseSubschemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); + } + + // then-else + + @Test + public void thenSubschemaSuccessElseSubschemaFailure() { + ConditionalSchema.builder().thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); + } + + @Test + public void thenSubschemaFailureElseSubschemaFailure() { + ConditionalSchema.builder().thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar"); + } + + @Test + public void thenSubschemaSuccessElseSubschemaSuccess() { + ConditionalSchema.builder().thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); + } + + @Test + public void thenSubschemaFailureElseSubschemaSuccess() { + ConditionalSchema.builder().thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); + } + + // if-then-else + + @Test + public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } @Test @@ -63,4 +122,34 @@ public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaFailure() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foo"); } + @Test(expected = ValidationException.class) + public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar"); + } + + @Test(expected = ValidationException.class) + public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foooo"); + } + + @Test + public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaSuccess() { + ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar"); + } + + @Test(expected = ValidationException.class) + public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("bar"); + } + + @Test + public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaSuccess() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); + } + + @Test(expected = ValidationException.class) + public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaFailure() { + ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbarbar"); + } + } \ No newline at end of file From 42aa72f54b14d9f884a6a0d4a00f84360773090a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Thu, 8 Feb 2018 22:06:22 +0100 Subject: [PATCH 08/14] Use Optional for Schema getters in ConditionalSchema. --- .../everit/json/schema/ConditionalSchema.java | 26 ++++++------------- .../everit/json/schema/ValidatingVisitor.java | 18 +++++-------- .../json/schema/draft7/if-then-else.json | 2 +- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index 88f019081..f8f3efe05 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -1,5 +1,7 @@ package org.everit.json.schema; +import java.util.Optional; + /** * Validator for {@code if}, {@code then}, {@code else} schemas. */ @@ -49,28 +51,16 @@ public ConditionalSchema(Builder builder) { this.elseSchema = builder.elseSchema; } - public Schema getIfSchema() { - return ifSchema; - } - - public Schema getThenSchema() { - return thenSchema; - } - - public Schema getElseSchema() { - return elseSchema; - } - - public boolean ifSchemaMissing() { - return ifSchema == null; + public Optional getIfSchema() { + return Optional.ofNullable(ifSchema); } - public boolean elseSchemaMissing() { - return elseSchema == null; + public Optional getThenSchema() { + return Optional.ofNullable(thenSchema); } - public boolean thenSchemaMissing() { - return thenSchema == null; + public Optional getElseSchema() { + return Optional.ofNullable(elseSchema); } @Override diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index 7e24a57e1..359fef83d 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -137,22 +137,18 @@ void visitCombinedSchema(CombinedSchema combinedSchema) { @Override void visitConditionalSchema(ConditionalSchema conditionalSchema) { - if (conditionalSchema.ifSchemaMissing() || - (conditionalSchema.thenSchemaMissing() && conditionalSchema.elseSchemaMissing())) { + if (!conditionalSchema.getIfSchema().isPresent() || + (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { return; } try { - conditionalSchema.getIfSchema().validate(subject); + conditionalSchema.getIfSchema().get().validate(subject); } catch (ValidationException ifSchemaValidationException) { - if (!conditionalSchema.elseSchemaMissing()) { - conditionalSchema.getElseSchema().validate(subject); - return; - } - throw ifSchemaValidationException; - } - if (!conditionalSchema.thenSchemaMissing()) { - conditionalSchema.getThenSchema().validate(subject); + Schema elseSchema = conditionalSchema.getElseSchema().orElseThrow(() -> ifSchemaValidationException); + elseSchema.validate(subject); + return; } + conditionalSchema.getThenSchema().ifPresent(schema -> schema.validate(subject)); } ValidationException getFailureOfSchema(Schema schema, Object input) { diff --git a/tests/src/test/resources/org/everit/json/schema/draft7/if-then-else.json b/tests/src/test/resources/org/everit/json/schema/draft7/if-then-else.json index 18bd1f79c..0fbff094d 100644 --- a/tests/src/test/resources/org/everit/json/schema/draft7/if-then-else.json +++ b/tests/src/test/resources/org/everit/json/schema/draft7/if-then-else.json @@ -174,7 +174,7 @@ }, "tests": [ { - "description": "valid, but woud have been invalid through then", + "description": "valid, but would have been invalid through then", "data": -100, "valid": true }, From 22fee7506d094a4a9aba7608c9670e638f8a2014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Sat, 10 Feb 2018 20:33:08 +0100 Subject: [PATCH 09/14] Use final modifier on fields of ConditionalSchema class. --- .../main/java/org/everit/json/schema/ConditionalSchema.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index f8f3efe05..f0e5a6988 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -40,9 +40,9 @@ public static Builder builder() { return new Builder(); } - private Schema ifSchema; - private Schema thenSchema; - private Schema elseSchema; + private final Schema ifSchema; + private final Schema thenSchema; + private final Schema elseSchema; public ConditionalSchema(Builder builder) { super(builder); From f939a702c24a984204cef9e583f737ccdc59c82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Sat, 10 Feb 2018 20:37:39 +0100 Subject: [PATCH 10/14] Fix ConditionalSchema Use ValidatingVisitor#getFailureOfSchema(Schema, Object) method instead of try-catch Treat schema as valid if "if" schema is invalid but there is no "else" schema --- .../everit/json/schema/ValidatingVisitor.java | 44 ++++++++++++------- .../json/schema/ConditionalSchemaTest.java | 4 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index 518db583a..fa3337103 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -32,27 +32,32 @@ void visit(Schema schema) { this.failureReporter = failureReporter; } - @Override void visitNumberSchema(NumberSchema numberSchema) { + @Override + void visitNumberSchema(NumberSchema numberSchema) { numberSchema.accept(new NumberSchemaValidatingVisitor(subject, this)); } - @Override void visitArraySchema(ArraySchema arraySchema) { + @Override + void visitArraySchema(ArraySchema arraySchema) { arraySchema.accept(new ArraySchemaValidatingVisitor(subject, this)); } - @Override void visitBooleanSchema(BooleanSchema schema) { + @Override + void visitBooleanSchema(BooleanSchema schema) { if (!(subject instanceof Boolean)) { failureReporter.failure(Boolean.class, subject); } } - @Override void visitNullSchema(NullSchema nullSchema) { + @Override + void visitNullSchema(NullSchema nullSchema) { if (!(subject == null || subject == JSONObject.NULL)) { failureReporter.failure("expected: null, found: " + subject.getClass().getSimpleName(), "type"); } } - @Override void visitConstSchema(ConstSchema constSchema) { + @Override + void visitConstSchema(ConstSchema constSchema) { if (isNull(subject) && isNull(constSchema.getPermittedValue())) { return; } @@ -62,7 +67,8 @@ void visit(Schema schema) { } } - @Override void visitEnumSchema(EnumSchema enumSchema) { + @Override + void visitEnumSchema(EnumSchema enumSchema) { Object effectiveSubject = toJavaValue(subject); for (Object possibleValue : enumSchema.getPossibleValues()) { if (ObjectComparator.deepEquals(possibleValue, effectiveSubject)) { @@ -72,11 +78,13 @@ void visit(Schema schema) { failureReporter.failure(format("%s is not a valid enum value", subject), "enum"); } - @Override void visitFalseSchema(FalseSchema falseSchema) { + @Override + void visitFalseSchema(FalseSchema falseSchema) { failureReporter.failure("false schema always fails", "false"); } - @Override void visitNotSchema(NotSchema notSchema) { + @Override + void visitNotSchema(NotSchema notSchema) { Schema mustNotMatch = notSchema.getMustNotMatch(); ValidationException failure = getFailureOfSchema(mustNotMatch, subject); if (failure == null) { @@ -84,7 +92,8 @@ void visit(Schema schema) { } } - @Override void visitReferenceSchema(ReferenceSchema referenceSchema) { + @Override + void visitReferenceSchema(ReferenceSchema referenceSchema) { Schema referredSchema = referenceSchema.getReferredSchema(); if (referredSchema == null) { throw new IllegalStateException("referredSchema must be injected before validation"); @@ -95,15 +104,18 @@ void visit(Schema schema) { } } - @Override void visitObjectSchema(ObjectSchema objectSchema) { + @Override + void visitObjectSchema(ObjectSchema objectSchema) { objectSchema.accept(new ObjectSchemaValidatingVisitor(subject, this)); } - @Override void visitStringSchema(StringSchema stringSchema) { + @Override + void visitStringSchema(StringSchema stringSchema) { stringSchema.accept(new StringSchemaValidatingVisitor(subject, this)); } - @Override void visitCombinedSchema(CombinedSchema combinedSchema) { + @Override + void visitCombinedSchema(CombinedSchema combinedSchema) { List failures = new ArrayList<>(); Collection subschemas = combinedSchema.getSubschemas(); CombinedSchema.ValidationCriterion criterion = combinedSchema.getCriterion(); @@ -132,11 +144,9 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) { (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { return; } - try { - conditionalSchema.getIfSchema().get().validate(subject); - } catch (ValidationException ifSchemaValidationException) { - Schema elseSchema = conditionalSchema.getElseSchema().orElseThrow(() -> ifSchemaValidationException); - elseSchema.validate(subject); + ValidationException exception = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); + if (exception != null) { + conditionalSchema.getElseSchema().ifPresent(elseSchema -> elseSchema.validate(subject)); return; } conditionalSchema.getThenSchema().ifPresent(schema -> schema.validate(subject)); diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index fe1dbda82..eb490b511 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -51,7 +51,7 @@ public void ifSubschemaSuccessThenSubschemaFailure() { ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaFailureThenSubschemaFailure() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar"); } @@ -61,7 +61,7 @@ public void ifSubschemaSuccessThenSubschemaSuccess() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("foo"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaFailureThenSubschemaSuccess() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); } From 1c163d9b98f1025fc1e8fa948031d455bc1687d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Mon, 12 Feb 2018 20:47:15 +0100 Subject: [PATCH 11/14] Implement failure reporting for ConditionalSchema. --- .../everit/json/schema/ValidatingVisitor.java | 30 +++++++-- .../json/schema/ConditionalSchemaTest.java | 62 +++++++++++++++---- 2 files changed, 76 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index fa3337103..24a5f96ad 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -4,6 +4,7 @@ import static org.everit.json.schema.EnumSchema.toJavaValue; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -144,12 +145,33 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) { (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { return; } - ValidationException exception = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); - if (exception != null) { - conditionalSchema.getElseSchema().ifPresent(elseSchema -> elseSchema.validate(subject)); + ValidationException ifSchemaException = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); + if (ifSchemaException != null) { + if (conditionalSchema.getElseSchema().isPresent()) { + ValidationException elseSchemaException = getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); + if (elseSchemaException != null) { + failureReporter.failure(new ValidationException(conditionalSchema, + new StringBuilder(new StringBuilder("#")), + "Data is invalid for schema of both \"if\" and \"else\" ", + Arrays.asList(ifSchemaException, elseSchemaException), + "else", + conditionalSchema.getSchemaLocation())); + } + } return; } - conditionalSchema.getThenSchema().ifPresent(schema -> schema.validate(subject)); + if (conditionalSchema.getThenSchema().isPresent()) { + Schema schema = conditionalSchema.getThenSchema().get(); + ValidationException thenSchemaException = getFailureOfSchema(schema, subject); + if (thenSchemaException != null) { + failureReporter.failure(new ValidationException(conditionalSchema, + new StringBuilder(new StringBuilder("#")), + "Data is invalid for schema of \"then\" ", + Arrays.asList(thenSchemaException), + "then", + conditionalSchema.getSchemaLocation())); + } + } } ValidationException getFailureOfSchema(Schema schema, Object input) { diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index eb490b511..1852c49ac 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -2,6 +2,8 @@ import org.junit.Test; +import static org.everit.json.schema.TestSupport.buildWithLocation; + public class ConditionalSchemaTest { private static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build(); @@ -46,9 +48,15 @@ public void onlyElseSuccess() { // if-then - @Test(expected = ValidationException.class) + @Test public void ifSubschemaSuccessThenSubschemaFailure() { - ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("then") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("bar") + .expect(); } @Test @@ -73,9 +81,15 @@ public void ifSubschemaSuccessElseSubschemaFailure() { ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(PATTERN_STRING_SCHEMA).build().validate("bar"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaFailureElseSubschemaFailure() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbar"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("else") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("barbar") + .expect(); } @Test @@ -122,14 +136,26 @@ public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaFailure() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foo"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaSuccess() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("then") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("foobar") + .expect(); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaFailure() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foooo"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("then") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("foooo") + .expect(); } @Test @@ -137,9 +163,15 @@ public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaSuccess() { ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("foobar"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaFailure() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA).build().validate("bar"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("else") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("bar") + .expect(); } @Test @@ -147,9 +179,15 @@ public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaSuccess() { ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("bar"); } - @Test(expected = ValidationException.class) + @Test public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaFailure() { - ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA).build().validate("barbarbar"); + ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA)); + TestSupport.failureOf(subject) + .expectedKeyword("else") + .expectedPointer("#") + .expectedViolatedSchema(subject) + .input("barbarbar") + .expect(); } } \ No newline at end of file From 1f4772ffd7180721b541f5575ee220b9c5b456e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Mon, 12 Feb 2018 22:32:37 +0100 Subject: [PATCH 12/14] Extract then schema and else schema visit into methods --- .../everit/json/schema/ValidatingVisitor.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index 24a5f96ad..90da9b59b 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -3,10 +3,7 @@ import static java.lang.String.format; import static org.everit.json.schema.EnumSchema.toJavaValue; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import org.json.JSONObject; @@ -146,23 +143,16 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) { return; } ValidationException ifSchemaException = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); - if (ifSchemaException != null) { - if (conditionalSchema.getElseSchema().isPresent()) { - ValidationException elseSchemaException = getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); - if (elseSchemaException != null) { - failureReporter.failure(new ValidationException(conditionalSchema, - new StringBuilder(new StringBuilder("#")), - "Data is invalid for schema of both \"if\" and \"else\" ", - Arrays.asList(ifSchemaException, elseSchemaException), - "else", - conditionalSchema.getSchemaLocation())); - } - } - return; + if (ifSchemaException == null) { + visitThenSchema(conditionalSchema); + } else { + visitElseSchema(conditionalSchema, ifSchemaException); } + } + + private void visitThenSchema(ConditionalSchema conditionalSchema) { if (conditionalSchema.getThenSchema().isPresent()) { - Schema schema = conditionalSchema.getThenSchema().get(); - ValidationException thenSchemaException = getFailureOfSchema(schema, subject); + ValidationException thenSchemaException = getFailureOfSchema(conditionalSchema.getThenSchema().get(), subject); if (thenSchemaException != null) { failureReporter.failure(new ValidationException(conditionalSchema, new StringBuilder(new StringBuilder("#")), @@ -174,6 +164,20 @@ void visitConditionalSchema(ConditionalSchema conditionalSchema) { } } + private void visitElseSchema(ConditionalSchema conditionalSchema, ValidationException ifSchemaException) { + if (conditionalSchema.getElseSchema().isPresent()) { + ValidationException elseSchemaException = getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); + if (elseSchemaException != null) { + failureReporter.failure(new ValidationException(conditionalSchema, + new StringBuilder(new StringBuilder("#")), + "Data is invalid for schema of both \"if\" and \"else\" ", + Arrays.asList(ifSchemaException, elseSchemaException), + "else", + conditionalSchema.getSchemaLocation())); + } + } + } + ValidationException getFailureOfSchema(Schema schema, Object input) { Object origSubject = this.subject; this.subject = input; From 4d25400f25723250e792ba431e94438e912461c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Mon, 12 Feb 2018 22:45:21 +0100 Subject: [PATCH 13/14] Move ConditionalSchema visit logic into new class: ConditionalSchemaValidatingVisitor --- .../ConditionalSchemaValidatingVisitor.java | 61 +++++++++++++++++++ .../everit/json/schema/ValidatingVisitor.java | 39 +----------- 2 files changed, 62 insertions(+), 38 deletions(-) create mode 100644 core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java new file mode 100644 index 000000000..fa31fe048 --- /dev/null +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java @@ -0,0 +1,61 @@ +package org.everit.json.schema; + + +import java.util.Arrays; + +import static java.util.Objects.requireNonNull; + +public class ConditionalSchemaValidatingVisitor extends Visitor { + + private final Object subject; + + private final ValidatingVisitor owner; + + public ConditionalSchemaValidatingVisitor(Object subject, ValidatingVisitor owner) { + this.subject = subject; + this.owner = requireNonNull(owner, "owner cannot be null"); + } + + @Override + void visitConditionalSchema(ConditionalSchema conditionalSchema) { + if (!conditionalSchema.getIfSchema().isPresent() || + (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { + return; + } + ValidationException ifSchemaException = owner.getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); + if (ifSchemaException == null) { + visitThenSchema(conditionalSchema); + } else { + visitElseSchema(conditionalSchema, ifSchemaException); + } + } + + private void visitThenSchema(ConditionalSchema conditionalSchema) { + if (conditionalSchema.getThenSchema().isPresent()) { + ValidationException thenSchemaException = owner.getFailureOfSchema(conditionalSchema.getThenSchema().get(), subject); + if (thenSchemaException != null) { + owner.failure(new ValidationException(conditionalSchema, + new StringBuilder(new StringBuilder("#")), + "Data is invalid for schema of \"then\" ", + Arrays.asList(thenSchemaException), + "then", + conditionalSchema.getSchemaLocation())); + } + } + } + + private void visitElseSchema(ConditionalSchema conditionalSchema, ValidationException ifSchemaException) { + if (conditionalSchema.getElseSchema().isPresent()) { + ValidationException elseSchemaException = owner.getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); + if (elseSchemaException != null) { + owner.failure(new ValidationException(conditionalSchema, + new StringBuilder(new StringBuilder("#")), + "Data is invalid for schema of both \"if\" and \"else\" ", + Arrays.asList(ifSchemaException, elseSchemaException), + "else", + conditionalSchema.getSchemaLocation())); + } + } + } + +} diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index 90da9b59b..630c9601b 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -138,44 +138,7 @@ void visitCombinedSchema(CombinedSchema combinedSchema) { @Override void visitConditionalSchema(ConditionalSchema conditionalSchema) { - if (!conditionalSchema.getIfSchema().isPresent() || - (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { - return; - } - ValidationException ifSchemaException = getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); - if (ifSchemaException == null) { - visitThenSchema(conditionalSchema); - } else { - visitElseSchema(conditionalSchema, ifSchemaException); - } - } - - private void visitThenSchema(ConditionalSchema conditionalSchema) { - if (conditionalSchema.getThenSchema().isPresent()) { - ValidationException thenSchemaException = getFailureOfSchema(conditionalSchema.getThenSchema().get(), subject); - if (thenSchemaException != null) { - failureReporter.failure(new ValidationException(conditionalSchema, - new StringBuilder(new StringBuilder("#")), - "Data is invalid for schema of \"then\" ", - Arrays.asList(thenSchemaException), - "then", - conditionalSchema.getSchemaLocation())); - } - } - } - - private void visitElseSchema(ConditionalSchema conditionalSchema, ValidationException ifSchemaException) { - if (conditionalSchema.getElseSchema().isPresent()) { - ValidationException elseSchemaException = getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); - if (elseSchemaException != null) { - failureReporter.failure(new ValidationException(conditionalSchema, - new StringBuilder(new StringBuilder("#")), - "Data is invalid for schema of both \"if\" and \"else\" ", - Arrays.asList(ifSchemaException, elseSchemaException), - "else", - conditionalSchema.getSchemaLocation())); - } - } + conditionalSchema.accept(new ConditionalSchemaValidatingVisitor(subject, this)); } ValidationException getFailureOfSchema(Schema schema, Object input) { From 600c1071d6d45941c2337df4ed04d906a6f06171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Gy=C3=B6rffi?= Date: Tue, 13 Feb 2018 22:58:41 +0100 Subject: [PATCH 14/14] Separate traversal logic from ConditionalSchemaValidatingVisitor into Visitor --- .../ConditionalSchemaValidatingVisitor.java | 37 ++++++++++++------- .../everit/json/schema/ValidatingVisitor.java | 10 +++-- .../java/org/everit/json/schema/Visitor.java | 12 ++++++ .../json/schema/ConditionalSchemaTest.java | 20 +++------- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java index fa31fe048..b61e4c22f 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchemaValidatingVisitor.java @@ -5,12 +5,16 @@ import static java.util.Objects.requireNonNull; -public class ConditionalSchemaValidatingVisitor extends Visitor { +class ConditionalSchemaValidatingVisitor extends Visitor { private final Object subject; private final ValidatingVisitor owner; + private ConditionalSchema conditionalSchema; + + private ValidationException ifSchemaException; + public ConditionalSchemaValidatingVisitor(Object subject, ValidatingVisitor owner) { this.subject = subject; this.owner = requireNonNull(owner, "owner cannot be null"); @@ -18,25 +22,29 @@ public ConditionalSchemaValidatingVisitor(Object subject, ValidatingVisitor owne @Override void visitConditionalSchema(ConditionalSchema conditionalSchema) { + this.conditionalSchema = conditionalSchema; if (!conditionalSchema.getIfSchema().isPresent() || (!conditionalSchema.getThenSchema().isPresent() && !conditionalSchema.getElseSchema().isPresent())) { return; } - ValidationException ifSchemaException = owner.getFailureOfSchema(conditionalSchema.getIfSchema().get(), subject); - if (ifSchemaException == null) { - visitThenSchema(conditionalSchema); - } else { - visitElseSchema(conditionalSchema, ifSchemaException); + super.visitConditionalSchema(conditionalSchema); + } + + @Override + void visitIfSchema(Schema ifSchema) { + if (conditionalSchema.getIfSchema().isPresent()) { + ifSchemaException = owner.getFailureOfSchema(ifSchema, subject); } } - private void visitThenSchema(ConditionalSchema conditionalSchema) { - if (conditionalSchema.getThenSchema().isPresent()) { - ValidationException thenSchemaException = owner.getFailureOfSchema(conditionalSchema.getThenSchema().get(), subject); + @Override + void visitThenSchema(Schema thenSchema) { + if (ifSchemaException == null) { + ValidationException thenSchemaException = owner.getFailureOfSchema(thenSchema, subject); if (thenSchemaException != null) { owner.failure(new ValidationException(conditionalSchema, new StringBuilder(new StringBuilder("#")), - "Data is invalid for schema of \"then\" ", + "input is invalid against the \"then\" schema", Arrays.asList(thenSchemaException), "then", conditionalSchema.getSchemaLocation())); @@ -44,13 +52,14 @@ private void visitThenSchema(ConditionalSchema conditionalSchema) { } } - private void visitElseSchema(ConditionalSchema conditionalSchema, ValidationException ifSchemaException) { - if (conditionalSchema.getElseSchema().isPresent()) { - ValidationException elseSchemaException = owner.getFailureOfSchema(conditionalSchema.getElseSchema().get(), subject); + @Override + void visitElseSchema(Schema elseSchema) { + if (ifSchemaException != null) { + ValidationException elseSchemaException = owner.getFailureOfSchema(elseSchema, subject); if (elseSchemaException != null) { owner.failure(new ValidationException(conditionalSchema, new StringBuilder(new StringBuilder("#")), - "Data is invalid for schema of both \"if\" and \"else\" ", + "input is invalid against both the \"if\" and \"else\" schema", Arrays.asList(ifSchemaException, elseSchemaException), "else", conditionalSchema.getSchemaLocation())); diff --git a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java index 630c9601b..2fb9f246b 100644 --- a/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ValidatingVisitor.java @@ -1,11 +1,13 @@ package org.everit.json.schema; -import static java.lang.String.format; -import static org.everit.json.schema.EnumSchema.toJavaValue; +import org.json.JSONObject; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; -import org.json.JSONObject; +import static java.lang.String.format; +import static org.everit.json.schema.EnumSchema.toJavaValue; class ValidatingVisitor extends Visitor { diff --git a/core/src/main/java/org/everit/json/schema/Visitor.java b/core/src/main/java/org/everit/json/schema/Visitor.java index 7c1535a57..8736ba1f5 100644 --- a/core/src/main/java/org/everit/json/schema/Visitor.java +++ b/core/src/main/java/org/everit/json/schema/Visitor.java @@ -185,5 +185,17 @@ void visitCombinedSchema(CombinedSchema combinedSchema) { } void visitConditionalSchema(ConditionalSchema conditionalSchema){ + conditionalSchema.getIfSchema().ifPresent(this::visitIfSchema); + conditionalSchema.getThenSchema().ifPresent(this::visitThenSchema); + conditionalSchema.getElseSchema().ifPresent(this::visitElseSchema); + } + + void visitIfSchema(Schema ifSchema) { + } + + void visitThenSchema(Schema thenSchema) { + } + + void visitElseSchema(Schema elseSchema) { } } diff --git a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java index 1852c49ac..8d46303c8 100644 --- a/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/ConditionalSchemaTest.java @@ -2,8 +2,6 @@ import org.junit.Test; -import static org.everit.json.schema.TestSupport.buildWithLocation; - public class ConditionalSchemaTest { private static final StringSchema MAX_LENGTH_STRING_SCHEMA = StringSchema.builder().maxLength(4).build(); @@ -50,11 +48,10 @@ public void onlyElseSuccess() { @Test public void ifSubschemaSuccessThenSubschemaFailure() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(MAX_LENGTH_STRING_SCHEMA).thenSchema(PATTERN_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("then") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("bar") .expect(); } @@ -83,11 +80,10 @@ public void ifSubschemaSuccessElseSubschemaFailure() { @Test public void ifSubschemaFailureElseSubschemaFailure() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("else") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("barbar") .expect(); } @@ -138,22 +134,20 @@ public void ifSubschemaSuccessThenSubschemaSuccessElseSubSchemaFailure() { @Test public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaSuccess() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("then") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("foobar") .expect(); } @Test public void ifSubschemaSuccessThenSubschemaFailureElseSubSchemaFailure() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("then") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("foooo") .expect(); } @@ -165,11 +159,10 @@ public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaSuccess() { @Test public void ifSubschemaFailureThenSubschemaSuccessElseSubSchemaFailure() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MAX_LENGTH_STRING_SCHEMA).elseSchema(MIN_LENGTH_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("else") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("bar") .expect(); } @@ -181,11 +174,10 @@ public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaSuccess() { @Test public void ifSubschemaFailureThenSubschemaFailureElseSubSchemaFailure() { - ConditionalSchema subject = buildWithLocation(ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA)); + ConditionalSchema.Builder subject = ConditionalSchema.builder().ifSchema(PATTERN_STRING_SCHEMA).thenSchema(MIN_LENGTH_STRING_SCHEMA).elseSchema(MAX_LENGTH_STRING_SCHEMA); TestSupport.failureOf(subject) .expectedKeyword("else") .expectedPointer("#") - .expectedViolatedSchema(subject) .input("barbarbar") .expect(); }