Skip to content

Commit 6f98c0a

Browse files
committed
integrating nullable + require* checks by calling #passesTypeCheck()
for the following Schema classes: * ArraySchema * NumberSchema
1 parent 59a5d7e commit 6f98c0a

File tree

5 files changed

+41
-22
lines changed

5 files changed

+41
-22
lines changed

core/src/main/java/org/everit/json/schema/ArraySchemaValidatingVisitor.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,7 @@ public ArraySchemaValidatingVisitor(Object subject, ValidatingVisitor owner) {
3030
}
3131

3232
@Override void visitArraySchema(ArraySchema arraySchema) {
33-
if (!(subject instanceof JSONArray)) {
34-
if (arraySchema.requiresArray()) {
35-
owner.failure(JSONArray.class, subject);
36-
}
37-
} else {
33+
if (owner.passesTypeCheck(JSONArray.class, arraySchema.requiresArray(), arraySchema.isNullable())) {
3834
this.arraySubject = (JSONArray) subject;
3935
this.subjectLength = arraySubject.length();
4036
this.arraySchema = arraySchema;

core/src/main/java/org/everit/json/schema/NumberSchemaValidatingVisitor.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,23 @@ class NumberSchemaValidatingVisitor extends Visitor {
88

99
private final Object subject;
1010

11-
private final ValidationFailureReporter failureReporter;
11+
private final ValidatingVisitor owner;
1212

1313
private boolean exclusiveMinimum;
1414

1515
private boolean exclusiveMaximum;
1616

1717
private double numberSubject;
1818

19-
NumberSchemaValidatingVisitor(Object subject, ValidationFailureReporter failureReporter) {
19+
NumberSchemaValidatingVisitor(Object subject, ValidatingVisitor owner) {
2020
this.subject = subject;
21-
this.failureReporter = failureReporter;
21+
this.owner= owner;
2222
}
2323

2424
@Override void visitNumberSchema(NumberSchema numberSchema) {
25-
if (!(subject instanceof Number)) {
26-
if (numberSchema.isRequiresNumber()) {
27-
failureReporter.failure(Number.class, subject);
28-
}
29-
} else {
25+
if (owner.passesTypeCheck(Number.class, numberSchema.isRequiresNumber(), numberSchema.isNullable())) {
3026
if (!(subject instanceof Integer || subject instanceof Long) && numberSchema.requiresInteger()) {
31-
failureReporter.failure(Integer.class, subject);
27+
owner.failure(Integer.class, subject);
3228
} else {
3329
this.numberSubject = ((Number) subject).doubleValue();
3430
super.visitNumberSchema(numberSchema);
@@ -45,16 +41,16 @@ class NumberSchemaValidatingVisitor extends Visitor {
4541
return;
4642
}
4743
if (exclusiveMinimum && numberSubject <= minimum.doubleValue()) {
48-
failureReporter.failure(subject + " is not greater than " + minimum, "exclusiveMinimum");
44+
owner.failure(subject + " is not greater than " + minimum, "exclusiveMinimum");
4945
} else if (numberSubject < minimum.doubleValue()) {
50-
failureReporter.failure(subject + " is not greater or equal to " + minimum, "minimum");
46+
owner.failure(subject + " is not greater or equal to " + minimum, "minimum");
5147
}
5248
}
5349

5450
@Override void visitExclusiveMinimumLimit(Number exclusiveMinimumLimit) {
5551
if (exclusiveMinimumLimit != null) {
5652
if (numberSubject <= exclusiveMinimumLimit.doubleValue()) {
57-
failureReporter.failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum");
53+
owner.failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum");
5854
}
5955
}
6056
}
@@ -64,9 +60,9 @@ class NumberSchemaValidatingVisitor extends Visitor {
6460
return;
6561
}
6662
if (exclusiveMaximum && maximum.doubleValue() <= numberSubject) {
67-
failureReporter.failure(subject + " is not less than " + maximum, "exclusiveMaximum");
63+
owner.failure(subject + " is not less than " + maximum, "exclusiveMaximum");
6864
} else if (maximum.doubleValue() < numberSubject) {
69-
failureReporter.failure(subject + " is not less or equal to " + maximum, "maximum");
65+
owner.failure(subject + " is not less or equal to " + maximum, "maximum");
7066
}
7167
}
7268

@@ -77,7 +73,7 @@ class NumberSchemaValidatingVisitor extends Visitor {
7773
@Override void visitExclusiveMaximumLimit(Number exclusiveMaximumLimit) {
7874
if (exclusiveMaximumLimit != null) {
7975
if (numberSubject >= exclusiveMaximumLimit.doubleValue()) {
80-
failureReporter.failure(format("is not less than " + exclusiveMaximumLimit), "exclusiveMaximum");
76+
owner.failure(format("is not less than " + exclusiveMaximumLimit), "exclusiveMaximum");
8177
}
8278
}
8379
}
@@ -87,7 +83,7 @@ class NumberSchemaValidatingVisitor extends Visitor {
8783
BigDecimal remainder = BigDecimal.valueOf(numberSubject).remainder(
8884
BigDecimal.valueOf(multipleOf.doubleValue()));
8985
if (remainder.compareTo(BigDecimal.ZERO) != 0) {
90-
failureReporter.failure(subject + " is not a multiple of " + multipleOf, "multipleOf");
86+
owner.failure(subject + " is not a multiple of " + multipleOf, "multipleOf");
9187
}
9288
}
9389
}

core/src/main/java/org/everit/json/schema/ValidatingVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void visit(Schema schema) {
3333
}
3434

3535
@Override void visitNumberSchema(NumberSchema numberSchema) {
36-
numberSchema.accept(new NumberSchemaValidatingVisitor(subject, failureReporter));
36+
numberSchema.accept(new NumberSchemaValidatingVisitor(subject, this));
3737
}
3838

3939
@Override void visitArraySchema(ArraySchema arraySchema) {

core/src/test/java/org/everit/json/schema/ArraySchemaTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,10 @@ public void containedItemSchemaEmptyArr() {
247247
.expect();
248248
}
249249

250+
@Test
251+
public void requiresArray_nullable() {
252+
ArraySchema subject = ArraySchema.builder().requiresArray(true).nullable(true).build();
253+
subject.validate(JSONObject.NULL);
254+
}
255+
250256
}

core/src/test/java/org/everit/json/schema/NumberSchemaTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,25 @@ public void exclusiveMinimumDoubleBoundary() {
233233
.expectedMessageFragment("3.0 is not greater than")
234234
.expect();
235235
}
236+
237+
@Test
238+
public void requiresNumber_nullable() {
239+
NumberSchema subject = NumberSchema.builder().requiresNumber(true).nullable(true).build();
240+
subject.validate(JSONObject.NULL);
241+
}
242+
243+
@Test
244+
public void requiresInteger_nullable() {
245+
NumberSchema subject = NumberSchema.builder().requiresInteger(true).nullable(true).build();
246+
subject.validate(JSONObject.NULL);
247+
}
248+
249+
@Test
250+
public void requiresInteger_nonNullable() {
251+
Schema.Builder<?> subject = NumberSchema.builder().requiresInteger(true).nullable(false);
252+
TestSupport.failureOf(subject)
253+
.input(JSONObject.NULL)
254+
.expect();
255+
}
256+
236257
}

0 commit comments

Comments
 (0)