Browse Source

Test "anyOf" and "allOf"
- Fix bug where "anyOf" was implemented as "oneOf"

Sam Jaffe 6 years ago
parent
commit
a2a1ec0005

+ 5 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/AllOfTester.java

@@ -1,5 +1,6 @@
 package org.leumasjaffe.json.schema.tester;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.leumasjaffe.json.schema.Tester;
@@ -15,6 +16,10 @@ import lombok.experimental.FieldDefaults;
 public class AllOfTester implements Tester {
 	List<Tester> children;
 
+	public AllOfTester(Tester...testers) {
+		this(Arrays.asList(testers));
+	}
+
 	public boolean accepts(JsonNode node) {
 		return children.parallelStream().allMatch(t -> t.accepts(node));
 	}

+ 6 - 1
src/main/lombok/org/leumasjaffe/json/schema/tester/AnyOfTester.java

@@ -1,5 +1,6 @@
 package org.leumasjaffe.json.schema.tester;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.leumasjaffe.json.schema.Tester;
@@ -14,8 +15,12 @@ import lombok.experimental.FieldDefaults;
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class AnyOfTester implements Tester {
 	List<Tester> children;
+	
+	public AnyOfTester(Tester...testers) {
+		this(Arrays.asList(testers));
+	}
 
 	public boolean accepts(JsonNode node) {
-		return children.parallelStream().filter(t -> t.accepts(node)).count() == 1L;
+		return children.parallelStream().anyMatch(t -> t.accepts(node));
 	}
 }

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

@@ -2,6 +2,8 @@ package org.leumasjaffe.json.schema;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
+import org.leumasjaffe.json.schema.tester.AllOfTesterTest;
+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;
@@ -10,6 +12,8 @@ import org.leumasjaffe.json.schema.tester.TypeTesterTest;
 
 @RunWith(Suite.class)
 @Suite.SuiteClasses({
+	AllOfTesterTest.class,
+	AnyOfTesterTest.class,
 	ContainsTesterTest.class,
 	NotTesterTest.class,
 	OneOfTesterTest.class,

+ 46 - 0
src/test/java/org/leumasjaffe/json/schema/tester/AllOfTesterTest.java

@@ -0,0 +1,46 @@
+package org.leumasjaffe.json.schema.tester;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.leumasjaffe.json.schema.Tester;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.NullNode;
+
+public class AllOfTesterTest {
+	Tester isArray = JsonNode::isArray;
+	Tester isObject = JsonNode::isObject;
+	Tester notEmpty = j -> j.size() != 0;
+
+	@Test
+	public void testFailsIfAllFail() {
+		Tester fails = new AllOfTester(isArray, isObject);
+		assertFalse(fails.accepts(NullNode.getInstance()));
+	}
+
+	@Test
+	public void testPassesIfAllPass() {
+		Tester fails = new AllOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertTrue(fails.accepts(node));
+	}
+	
+	@Test
+	public void testFailsIfMoreThanOnePass() {
+		Tester fails = new AllOfTester(isArray, isObject, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertFalse(fails.accepts(node));
+	}
+	
+	@Test
+	public void testFailsIfPreciselyOnePasses() {
+		Tester fails = new AllOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		assertFalse(fails.accepts(node));
+	}
+}

+ 46 - 0
src/test/java/org/leumasjaffe/json/schema/tester/AnyOfTesterTest.java

@@ -0,0 +1,46 @@
+package org.leumasjaffe.json.schema.tester;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.leumasjaffe.json.schema.Tester;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.NullNode;
+
+public class AnyOfTesterTest {
+	Tester isArray = JsonNode::isArray;
+	Tester isObject = JsonNode::isObject;
+	Tester notEmpty = j -> j.size() != 0;
+
+	@Test
+	public void testFailsIfAllFail() {
+		Tester fails = new AnyOfTester(isArray, isObject);
+		assertFalse(fails.accepts(NullNode.getInstance()));
+	}
+
+	@Test
+	public void testPassesIfAllPass() {
+		Tester fails = new AnyOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertTrue(fails.accepts(node));
+	}
+	
+	@Test
+	public void testPassesIfMoreThanOnePass() {
+		Tester fails = new AnyOfTester(isArray, isObject, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertTrue(fails.accepts(node));
+	}
+	
+	@Test
+	public void testPassesIfPreciselyOnePasses() {
+		Tester fails = new AnyOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		assertTrue(fails.accepts(node));
+	}
+}

+ 1 - 1
src/test/java/org/leumasjaffe/json/schema/tester/OneOfTesterTest.java

@@ -38,7 +38,7 @@ public class OneOfTesterTest {
 	}
 	
 	@Test
-	public void testFailsIfPreciselyOnePasses() {
+	public void testPassesIfPreciselyOnePasses() {
 		Tester fails = new OneOfTester(isArray, notEmpty);
 		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
 		assertTrue(fails.accepts(node));