瀏覽代碼

Add and implement tests for number handling

Sam Jaffe 6 年之前
父節點
當前提交
3dcab3cc30

+ 24 - 0
src/main/lombok/org/leumasjaffe/json/schema/Schema.java

@@ -5,6 +5,7 @@ import static org.leumasjaffe.json.schema.tester.FixedTester.ACCEPT;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -19,6 +20,10 @@ import lombok.experimental.FieldDefaults;
 @FieldDefaults(level=AccessLevel.PRIVATE)
 public class Schema implements Tester {
 	private static final String SELF = "$self";
+	private static final List<String> NUMBER_MATCHERS = Arrays.asList(
+		"multipleOf", "minimum", "exclusiveMinimum", "maximum",
+		"exclusiveMaximum"
+	);
 	Map<String, Tester> children = new HashMap<>();
 	
 	public Schema(Tester self) {
@@ -47,10 +52,29 @@ public class Schema implements Tester {
 		} else if (!canProcess(node)) {
 			return false;
 		}
+		switch (node.getNodeType()) {
+		case NUMBER: return acceptsNumber(node);
+		default: break;
+		}
 		// TODO
 		return false;
 	}
 
+	private boolean acceptsNumber(JsonNode node) {
+		for (String key : getKeys(NUMBER_MATCHERS)) {
+			if (!children.get(key).accepts(node)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private Set<String> getKeys(List<String> allowed) {
+		Set<String> keys = new HashSet<>(children.keySet());
+		keys.retainAll(allowed);
+		return keys;
+	}
+
 	private boolean canProcess(JsonNode node) {
 		return Arrays.asList(acceptedTypes()).contains(node.getNodeType());
 	}

+ 19 - 0
src/test/java/org/leumasjaffe/json/schema/SchemaTest.java

@@ -16,6 +16,7 @@ public class SchemaTest {
 	private Schema getNumberSchema() {
 		Map<String, Tester> tests = new HashMap<>();
 		tests.put("minimum", new NumberTester(d -> d >= 0.0));
+		tests.put("multipleOf", new NumberTester(d -> Math.abs(d % 0.25) < 1E-7));
 		tests.put("exclusiveMaximum", new NumberTester(d -> d < 1.0));
 		return new Schema(tests);
 	}
@@ -32,7 +33,25 @@ public class SchemaTest {
 
 	@Test
 	public void testHandlesMultipleTestsForNumber() {
+		assertFalse(getNumberSchema().accepts(new DoubleNode(-0.25)));
+		assertTrue(getNumberSchema().accepts(new DoubleNode(0.0)));
 		assertTrue(getNumberSchema().accepts(new DoubleNode(0.5)));
+		assertFalse(getNumberSchema().accepts(new DoubleNode(0.6)));
 		assertFalse(getNumberSchema().accepts(new DoubleNode(1.0)));
 	}
+
+	@Test
+	public void testHandlesOtherNumberChecks() {
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("exclusiveMinimum", new NumberTester(d -> d > 0.0));
+		tests.put("maximum", new NumberTester(d -> d <= 1.0));
+		Schema schema = new Schema(tests);
+		
+		assertFalse(schema.accepts(new DoubleNode(0.0)));
+		assertTrue(schema.accepts(new DoubleNode(0.5)));
+		assertTrue(schema.accepts(new DoubleNode(0.6)));
+		assertTrue(schema.accepts(new DoubleNode(1.0)));
+		assertFalse(schema.accepts(new DoubleNode(1.1)));
+	}
+
 }