Skip to content

Commit f19e691

Browse files
committed
Gather all violations while validating NumberSchema
1 parent 98aeeab commit f19e691

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
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;
@@ -109,6 +111,8 @@ public static Builder builder() {
109111

110112
private final boolean requiresInteger;
111113

114+
private final List<ValidationException> validationExceptions;
115+
112116
public NumberSchema() {
113117
this(builder());
114118
}
@@ -129,34 +133,36 @@ public NumberSchema(final Builder builder) {
129133
this.requiresInteger = builder.requiresInteger;
130134
this.exclusiveMinimumLimit = builder.exclusiveMinimumLimit;
131135
this.exclusiveMaximumLimit = builder.exclusiveMaximumLimit;
136+
this.validationExceptions = new ArrayList<>();
132137
}
133138

134139
private void checkMaximum(final double subject) {
135140
if (maximum != null) {
136141
if (exclusiveMaximum && maximum.doubleValue() <= subject) {
137-
throw failure(subject + " is not less than " + maximum, "exclusiveMaximum");
142+
validationExceptions.add(failure(subject + " is not less than " + maximum, "exclusiveMaximum"));
138143
} else if (maximum.doubleValue() < subject) {
139-
throw failure(subject + " is not less or equal to " + maximum, "maximum");
144+
validationExceptions.add(failure(subject + " is not less or equal to " + maximum, "maximum"));
140145
}
141146
}
142147
if (exclusiveMaximumLimit != null) {
143148
if (subject >= exclusiveMaximumLimit.doubleValue()) {
144-
throw failure(format("is not less than " + exclusiveMaximumLimit), "exclusiveMaximum");
149+
validationExceptions.add(
150+
failure(format("is not less than " + exclusiveMaximumLimit),"exclusiveMaximum"));
145151
}
146152
}
147153
}
148154

149155
private void checkMinimum(final double subject) {
150156
if (minimum != null) {
151157
if (exclusiveMinimum && subject <= minimum.doubleValue()) {
152-
throw failure(subject + " is not greater than " + minimum, "exclusiveMinimum");
158+
validationExceptions.add(failure(subject + " is not greater than " + minimum, "exclusiveMinimum"));
153159
} else if (subject < minimum.doubleValue()) {
154-
throw failure(subject + " is not greater or equal to " + minimum, "minimum");
160+
validationExceptions.add(failure(subject + " is not greater or equal to " + minimum, "minimum"));
155161
}
156162
}
157163
if (exclusiveMinimumLimit != null) {
158164
if (subject <= exclusiveMinimumLimit.doubleValue()) {
159-
throw failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum");
165+
validationExceptions.add(failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum"));
160166
}
161167
}
162168
}
@@ -166,7 +172,7 @@ private void checkMultipleOf(final double subject) {
166172
BigDecimal remainder = BigDecimal.valueOf(subject).remainder(
167173
BigDecimal.valueOf(multipleOf.doubleValue()));
168174
if (remainder.compareTo(BigDecimal.ZERO) != 0) {
169-
throw failure(subject + " is not a multiple of " + multipleOf, "multipleOf");
175+
validationExceptions.add(failure(subject + " is not a multiple of " + multipleOf, "multipleOf"));
170176
}
171177
}
172178
}
@@ -206,9 +212,11 @@ public void validate(final Object subject) {
206212
throw failure(Integer.class, subject);
207213
}
208214
double intSubject = ((Number) subject).doubleValue();
215+
validationExceptions.clear();
209216
checkMinimum(intSubject);
210217
checkMaximum(intSubject);
211218
checkMultipleOf(intSubject);
219+
ValidationException.throwFor(this, validationExceptions);
212220
}
213221
}
214222

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

Lines changed: 24 additions & 8 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");
@@ -154,7 +167,10 @@ public void longNumber() {
154167
public void equalsVerifier() {
155168
EqualsVerifier.forClass(NumberSchema.class)
156169
.withRedefinedSuperclass()
157-
.withIgnoredFields("schemaLocation")
170+
.withPrefabValues(ValidationException.class,
171+
new ValidationException(null, "msg1", "key1", "loc1"),
172+
new ValidationException(null, "msg", "key2", "loc2"))
173+
.withIgnoredFields("schemaLocation", "validationExceptions")
158174
.suppress(Warning.STRICT_INHERITANCE)
159175
.verify();
160176
}

0 commit comments

Comments
 (0)