Skip to content

Commit 724b94a

Browse files
authored
Merge pull request #118 from adyach/gather-valations-numberschema
Collect all violations while validating NumberSchema
2 parents 98aeeab + 4324392 commit 724b94a

File tree

2 files changed

+39
-20
lines changed

2 files changed

+39
-20
lines changed

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import org.json.JSONException;
55

66
import java.math.BigDecimal;
7+
import java.util.ArrayList;
8+
import java.util.List;
79
import java.util.Objects;
810

911
import static java.lang.String.format;
1012

1113
/**
1214
* Number schema validator.
15+
* @ThreadSafe
1316
*/
1417
public class NumberSchema extends Schema {
1518

@@ -131,42 +134,43 @@ public NumberSchema(final Builder builder) {
131134
this.exclusiveMaximumLimit = builder.exclusiveMaximumLimit;
132135
}
133136

134-
private void checkMaximum(final double subject) {
137+
private void checkMaximum(final double subject, final List<ValidationException> validationExceptions) {
135138
if (maximum != null) {
136139
if (exclusiveMaximum && maximum.doubleValue() <= subject) {
137-
throw failure(subject + " is not less than " + maximum, "exclusiveMaximum");
140+
validationExceptions.add(failure(subject + " is not less than " + maximum, "exclusiveMaximum"));
138141
} else if (maximum.doubleValue() < subject) {
139-
throw failure(subject + " is not less or equal to " + maximum, "maximum");
142+
validationExceptions.add(failure(subject + " is not less or equal to " + maximum, "maximum"));
140143
}
141144
}
142145
if (exclusiveMaximumLimit != null) {
143146
if (subject >= exclusiveMaximumLimit.doubleValue()) {
144-
throw failure(format("is not less than " + exclusiveMaximumLimit), "exclusiveMaximum");
147+
validationExceptions.add(
148+
failure(format("is not less than " + exclusiveMaximumLimit),"exclusiveMaximum"));
145149
}
146150
}
147151
}
148152

149-
private void checkMinimum(final double subject) {
153+
private void checkMinimum(final double subject, final List<ValidationException> validationExceptions) {
150154
if (minimum != null) {
151155
if (exclusiveMinimum && subject <= minimum.doubleValue()) {
152-
throw failure(subject + " is not greater than " + minimum, "exclusiveMinimum");
156+
validationExceptions.add(failure(subject + " is not greater than " + minimum, "exclusiveMinimum"));
153157
} else if (subject < minimum.doubleValue()) {
154-
throw failure(subject + " is not greater or equal to " + minimum, "minimum");
158+
validationExceptions.add(failure(subject + " is not greater or equal to " + minimum, "minimum"));
155159
}
156160
}
157161
if (exclusiveMinimumLimit != null) {
158162
if (subject <= exclusiveMinimumLimit.doubleValue()) {
159-
throw failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum");
163+
validationExceptions.add(failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum"));
160164
}
161165
}
162166
}
163167

164-
private void checkMultipleOf(final double subject) {
168+
private void checkMultipleOf(final double subject, final List<ValidationException> validationExceptions) {
165169
if (multipleOf != null) {
166170
BigDecimal remainder = BigDecimal.valueOf(subject).remainder(
167171
BigDecimal.valueOf(multipleOf.doubleValue()));
168172
if (remainder.compareTo(BigDecimal.ZERO) != 0) {
169-
throw failure(subject + " is not a multiple of " + multipleOf, "multipleOf");
173+
validationExceptions.add(failure(subject + " is not a multiple of " + multipleOf, "multipleOf"));
170174
}
171175
}
172176
}
@@ -206,9 +210,11 @@ public void validate(final Object subject) {
206210
throw failure(Integer.class, subject);
207211
}
208212
double intSubject = ((Number) subject).doubleValue();
209-
checkMinimum(intSubject);
210-
checkMaximum(intSubject);
211-
checkMultipleOf(intSubject);
213+
final List<ValidationException> validationExceptions = new ArrayList<>();
214+
checkMinimum(intSubject, validationExceptions);
215+
checkMaximum(intSubject, validationExceptions);
216+
checkMultipleOf(intSubject, validationExceptions);
217+
ValidationException.throwFor(this, validationExceptions);
212218
}
213219
}
214220

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,18 @@
1515
*/
1616
package org.everit.json.schema;
1717

18+
import nl.jqno.equalsverifier.EqualsVerifier;
19+
import nl.jqno.equalsverifier.Warning;
20+
import org.everit.json.schema.loader.SchemaLoader;
21+
import org.json.JSONObject;
22+
import org.junit.Test;
23+
1824
import static org.everit.json.schema.TestSupport.buildWithLocation;
1925
import static org.everit.json.schema.TestSupport.loadAsV6;
2026
import static org.junit.Assert.assertEquals;
2127
import static org.junit.Assert.assertTrue;
2228
import static org.junit.Assert.fail;
2329

24-
import org.everit.json.schema.loader.SchemaLoader;
25-
import org.json.JSONObject;
26-
import org.junit.Test;
27-
28-
import nl.jqno.equalsverifier.EqualsVerifier;
29-
import nl.jqno.equalsverifier.Warning;
30-
3130
public class NumberSchemaTest {
3231

3332
private final ResourceLoader loader = new ResourceLoader("/org/everit/jsonvalidator/tostring/");
@@ -104,6 +103,20 @@ public void multipleOfFailure() {
104103
.expect();
105104
}
106105

106+
@Test
107+
public void shouldListAllViolationsWhenThereIsMoreThanOne() {
108+
try {
109+
NumberSchema.builder()
110+
.multipleOf(10).minimum(10.0).maximum(15.0)
111+
.build()
112+
.validate(3);
113+
} catch (ValidationException ve) {
114+
assertEquals(2, ve.getViolationCount());
115+
assertEquals("minimum", ve.getCausingExceptions().get(0).getKeyword());
116+
assertEquals("multipleOf", ve.getCausingExceptions().get(1).getKeyword());
117+
}
118+
}
119+
107120
@Test
108121
public void notRequiresNumber() {
109122
NumberSchema.builder().requiresNumber(false).build().validate("foo");

0 commit comments

Comments
 (0)