Browse Source

Add DependencyTester and tests

Sam Jaffe 6 years ago
parent
commit
46e45a53f1

+ 37 - 0
src/main/lombok/org/leumasjaffe/json/schema/tester/DependencyTester.java

@@ -0,0 +1,37 @@
+package org.leumasjaffe.json.schema.tester;
+
+import java.util.Map;
+
+import org.leumasjaffe.json.JsonHelper;
+import org.leumasjaffe.json.schema.Tester;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@RequiredArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class DependencyTester implements Tester {
+	Map<String, Tester> testers;
+
+	@Override
+	public JsonNodeType[] acceptedTypes() {
+		return new JsonNodeType[]{JsonNodeType.OBJECT};
+	}
+
+	@Override
+	public boolean accepts(JsonNode node) {
+		final Map<String, JsonNode> object = JsonHelper.fields(node);
+		object.keySet().retainAll(testers.keySet());
+		for (String key : object.keySet()) {
+			if (!testers.get(key).accepts(node)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}

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

@@ -6,6 +6,7 @@ import org.leumasjaffe.json.schema.tester.AllItemsTesterTest;
 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.DependencyTesterTest;
 import org.leumasjaffe.json.schema.tester.FormatTesterTest;
 import org.leumasjaffe.json.schema.tester.ItemsTesterTest;
 import org.leumasjaffe.json.schema.tester.NotTesterTest;
@@ -23,6 +24,7 @@ import org.leumasjaffe.json.schema.tester.UniqueItemTesterTest;
 	AllOfTesterTest.class,
 	AnyOfTesterTest.class,
 	ContainsTesterTest.class,
+	DependencyTesterTest.class,
 	FormatTesterTest.class,
 	ItemsTesterTest.class,
 	NotTesterTest.class,

+ 47 - 0
src/test/java/org/leumasjaffe/json/schema/tester/DependencyTesterTest.java

@@ -0,0 +1,47 @@
+package org.leumasjaffe.json.schema.tester;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.leumasjaffe.json.schema.Tester;
+import org.leumasjaffe.json.schema.tester.PropertyTester.Pair;
+
+import com.fasterxml.jackson.databind.node.BooleanNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class DependencyTesterTest {
+
+	@Test
+	public void testAcceptsObjects() {
+		assertThat(new DependencyTester(new HashMap<>()).acceptedTypes(),
+				is(new JsonNodeType[]{JsonNodeType.OBJECT}));
+	}
+	
+	@Test
+	public void testDependencyAppliesToSourceJson() {
+		Map<String, Tester> expect = new HashMap<>();
+		expect.put("A", TypeTester.fromType("boolean"));
+		
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", BooleanNode.TRUE);
+		
+		assertFalse(new DependencyTester(expect).accepts(node));
+	}
+
+	@Test
+	public void testDependencyCanInjectSchema() {
+		Map<String, Tester> expect = new HashMap<>();
+		expect.put("A", new PropertyTester(new Pair("A"::equals, FixedTester.ACCEPT)));
+		
+		final ObjectNode node = new ObjectNode(JsonNodeFactory.instance);
+		node.set("A", BooleanNode.TRUE);
+		
+		assertTrue(new DependencyTester(expect).accepts(node));
+	}
+}