Jelajahi Sumber

Add tests for PropertyTester.
Fix bug in PropertyTester where we re-used a terminated stream.

Sam Jaffe 6 tahun lalu
induk
melakukan
b078ed2353

+ 13 - 5
src/main/lombok/org/leumasjaffe/json/schema/tester/PropertyTester.java

@@ -1,10 +1,11 @@
 package org.leumasjaffe.json.schema.tester;
 
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
-import java.util.stream.Stream;
+import java.util.stream.Collectors;
 
 import org.leumasjaffe.json.schema.Tester;
 
@@ -25,18 +26,25 @@ public class PropertyTester implements Tester {
 	}
 	
 	List<Pair> schema;
+	
+	public PropertyTester(Pair...pairs) {
+		this(Arrays.asList(pairs));
+	}
 
 	@Override
 	public boolean accepts(final JsonNode node) {
 		final Iterator<Map.Entry<String, JsonNode>> iter = node.fields();
 		while (iter.hasNext()) {
 			final Map.Entry<String, JsonNode> data = iter.next();
-			final Stream<Pair> stream = schema.stream()
-					.filter(p -> p.keyMatches.test(data.getKey()));
-			if (stream.count() > 0) {
+			final List<Pair> stream = schema.stream()
+					.filter(p -> p.keyMatches.test(data.getKey()))
+					.collect(Collectors.toList());
+			if (stream.size() == 0) {
+				continue;
+			} else if (stream.size() > 1) {
 				// TODO: Don't accept multiple
 				return false;
-			} else if (stream.findFirst().map(p -> valueMatches(data, p)).orElse(false)) {
+			} else if (!valueMatches(data, stream.get(0))) {
 				return false;
 			}
 		}

+ 2 - 0
src/test/java/org/leumasjaffe/json/schema/JsonTesterSuite.java

@@ -7,6 +7,7 @@ import org.leumasjaffe.json.schema.tester.AnyOfTesterTest;
 import org.leumasjaffe.json.schema.tester.ContainsTesterTest;
 import org.leumasjaffe.json.schema.tester.NotTesterTest;
 import org.leumasjaffe.json.schema.tester.OneOfTesterTest;
+import org.leumasjaffe.json.schema.tester.PropertyTesterTest;
 import org.leumasjaffe.json.schema.tester.SizeTesterTest;
 import org.leumasjaffe.json.schema.tester.TypeTesterTest;
 import org.leumasjaffe.json.schema.tester.UniqueItemTesterTest;
@@ -18,6 +19,7 @@ import org.leumasjaffe.json.schema.tester.UniqueItemTesterTest;
 	ContainsTesterTest.class,
 	NotTesterTest.class,
 	OneOfTesterTest.class,
+	PropertyTesterTest.class,
 	SizeTesterTest.class, 
 	TypeTesterTest.class,
 	UniqueItemTesterTest.class

+ 78 - 0
src/test/java/org/leumasjaffe/json/schema/tester/PropertyTesterTest.java

@@ -0,0 +1,78 @@
+package org.leumasjaffe.json.schema.tester;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.leumasjaffe.json.schema.Tester;
+import org.leumasjaffe.json.schema.tester.PropertyTester.Pair;
+
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.NullNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class PropertyTesterTest {
+
+	@Test
+	public void testPassesUnmatchedProperty() {
+		PropertyTester test = new PropertyTester(new Pair[0]);
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		assertTrue(test.accepts(node));
+	}
+
+	@Test
+	public void testFailsIfMatchFails() {
+		PropertyTester test = new PropertyTester(new Pair(s -> s.equals("A"), Tester.REJECT));
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		assertFalse(test.accepts(node));
+	}
+	
+	@Test
+	public void testFailsIfAnyMatchFails() {
+		PropertyTester test = new PropertyTester(
+				new Pair(s -> s.equals("A"), Tester.ACCEPT),
+				new Pair(s -> s.equals("B"), Tester.REJECT)
+				);
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		node.set("B", NullNode.getInstance());
+		assertFalse(test.accepts(node));
+	}
+
+	@Test
+	public void testFailsIfMoreThanOneMatcherForKey() {
+		PropertyTester test = new PropertyTester(
+				new Pair(s -> s.equals("A"), Tester.ACCEPT),
+				new Pair(s -> s.equals("A"), Tester.REJECT)
+				);
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		node.set("B", NullNode.getInstance());
+		assertFalse(test.accepts(node));
+	}
+	
+	@Test
+	public void testPassesIfAllPass() {
+		PropertyTester test = new PropertyTester(
+				new Pair(s -> s.equals("A"), Tester.ACCEPT),
+				new Pair(s -> s.equals("B"), Tester.ACCEPT)
+				);
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		node.set("B", NullNode.getInstance());
+		assertTrue(test.accepts(node));
+	}
+	
+	@Test
+	public void testPairMatcherCanOperateOnMultipleKeys() {
+		PropertyTester test = new PropertyTester(
+				new Pair(s -> s.length() == 1, Tester.ACCEPT),
+				new Pair(s -> s.equals("B"), Tester.ACCEPT)
+				);
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", NullNode.getInstance());
+		node.set("B", NullNode.getInstance());
+		assertFalse(test.accepts(node));
+	}
+}