浏览代码

Add tests for "oneOf".
- Fix bug where "oneOf" was implemented as "anyOf"

Sam Jaffe 6 年之前
父节点
当前提交
70c7c664f1

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

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

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

@@ -4,6 +4,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite;
 import org.leumasjaffe.json.schema.tester.ContainsTesterTest;
 import org.leumasjaffe.json.schema.tester.ContainsTesterTest;
 import org.leumasjaffe.json.schema.tester.NotTesterTest;
 import org.leumasjaffe.json.schema.tester.NotTesterTest;
+import org.leumasjaffe.json.schema.tester.OneOfTesterTest;
 import org.leumasjaffe.json.schema.tester.SizeTesterTest;
 import org.leumasjaffe.json.schema.tester.SizeTesterTest;
 import org.leumasjaffe.json.schema.tester.TypeTesterTest;
 import org.leumasjaffe.json.schema.tester.TypeTesterTest;
 
 
@@ -11,6 +12,7 @@ import org.leumasjaffe.json.schema.tester.TypeTesterTest;
 @Suite.SuiteClasses({
 @Suite.SuiteClasses({
 	ContainsTesterTest.class,
 	ContainsTesterTest.class,
 	NotTesterTest.class,
 	NotTesterTest.class,
+	OneOfTesterTest.class,
 	SizeTesterTest.class, 
 	SizeTesterTest.class, 
 	TypeTesterTest.class
 	TypeTesterTest.class
 })
 })

+ 46 - 0
src/test/java/org/leumasjaffe/json/schema/tester/OneOfTesterTest.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 OneOfTesterTest {
+	Tester isArray = JsonNode::isArray;
+	Tester isObject = JsonNode::isObject;
+	Tester notEmpty = j -> j.size() != 0;
+
+	@Test
+	public void testFailsIfAllFail() {
+		Tester fails = new OneOfTester(isArray, isObject);
+		assertFalse(fails.accepts(NullNode.getInstance()));
+	}
+
+	@Test
+	public void testFailsIfAllPass() {
+		Tester fails = new OneOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertFalse(fails.accepts(node));
+	}
+	
+	@Test
+	public void testFailsIfMoreThanOnePass() {
+		Tester fails = new OneOfTester(isArray, isObject, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(true);
+		assertFalse(fails.accepts(node));
+	}
+	
+	@Test
+	public void testFailsIfPreciselyOnePasses() {
+		Tester fails = new OneOfTester(isArray, notEmpty);
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		assertTrue(fails.accepts(node));
+	}
+}