Browse Source

Fix AllItemsTester to work for OBJECT

Sam Jaffe 6 years ago
parent
commit
885af8c97f

+ 3 - 3
src/main/lombok/org/leumasjaffe/json/schema/factory/SchemaV6Factory.java

@@ -47,8 +47,8 @@ class SchemaV6Factory extends SchemaFactory {
 		case "maxLength": return new SizeTester(JsonNodeType.STRING, i -> i < value.asInt());
 		case "minLength": return new SizeTester(JsonNodeType.STRING, i -> i >= value.asInt(0));
 		case "pattern": return j -> j.isTextual() && j.asText().matches(value.asText());
-		case "additionalItems": return new AllItemsTester(create(value));
-		case "items": return value.isArray() ? new ItemsTester(createArray(value)) : new AllItemsTester(create(value));
+		case "additionalItems": return new AllItemsTester(JsonNodeType.ARRAY, create(value));
+		case "items": return value.isArray() ? new ItemsTester(createArray(value)) : new AllItemsTester(JsonNodeType.ARRAY, create(value));
 		case "maxItems": return new SizeTester(JsonNodeType.ARRAY, i -> i < value.asInt());
 		case "minItems": return new SizeTester(JsonNodeType.ARRAY, i -> i >= value.asInt(0));
 		case "uniqueItems": return value.asBoolean() ? UniqueItemTester.INSTANCE : FixedTester.ACCEPT;
@@ -56,7 +56,7 @@ class SchemaV6Factory extends SchemaFactory {
 		case "maxProperties": return new SizeTester(JsonNodeType.OBJECT, i -> i < value.asInt());
 		case "minProperties": return new SizeTester(JsonNodeType.OBJECT, i -> i >= value.asInt(0));
 		case "required": return json -> JsonHelper.toArray(value, JsonNode::asText).stream().allMatch(json::has);
-		case "additionalProperties": return j -> JsonHelper.toArray(j).stream().allMatch(create(value)::accepts);
+		case "additionalProperties": return new AllItemsTester(JsonNodeType.OBJECT, create(value));
 		// case "definitions": ; // TODO Implement definitions creation
 		case "properties": return new PropertyTester(JsonHelper.values(value,
 				(k, v) -> new PropertyTester.Pair(stringEqual(k), create(v))));

+ 3 - 1
src/main/lombok/org/leumasjaffe/json/schema/tester/AllItemsTester.java

@@ -6,6 +6,7 @@ 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;
@@ -14,11 +15,12 @@ import lombok.experimental.FieldDefaults;
 @RequiredArgsConstructor
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class AllItemsTester implements Tester {
+	JsonNodeType type;
 	Tester schema;
 
 	@Override
 	public boolean accepts(JsonNode node) {
-		if (!node.isArray()) return false;
+		if (node.getNodeType() != type) return false;
 		List<JsonNode> data = JsonHelper.toArray(node);
 		for (int i = 0; i < data.size(); ++i) {
 			if (!schema.accepts(data.get(i))) {

+ 6 - 5
src/test/java/org/leumasjaffe/json/schema/tester/AllItemsTesterTest.java

@@ -7,19 +7,20 @@ import org.junit.Test;
 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.JsonNodeType;
 import com.fasterxml.jackson.databind.node.NullNode;
 
 public class AllItemsTesterTest {
 
 	@Test
 	public void testRejectsNonArray() {
-		assertFalse(new AllItemsTester(FixedTester.ACCEPT).accepts(NullNode.getInstance()));
+		assertFalse(new AllItemsTester(JsonNodeType.ARRAY, FixedTester.ACCEPT).accepts(NullNode.getInstance()));
 	}
 
 	@Test
 	public void testAcceptsEmptyArray() {
 		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
-		assertTrue(new AllItemsTester(FixedTester.ACCEPT).accepts(node));
+		assertTrue(new AllItemsTester(JsonNodeType.ARRAY, FixedTester.ACCEPT).accepts(node));
 	}
 	
 	@Test
@@ -27,7 +28,7 @@ public class AllItemsTesterTest {
 		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
 		node.add(false);
 		node.add(true);
-		assertFalse(new AllItemsTester(FixedTester.REJECT).accepts(node));
+		assertFalse(new AllItemsTester(JsonNodeType.ARRAY, FixedTester.REJECT).accepts(node));
 	}
 	
 	@Test
@@ -35,7 +36,7 @@ public class AllItemsTesterTest {
 		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
 		node.add(false);
 		node.add(true);
-		assertFalse(new AllItemsTester(JsonNode::asBoolean).accepts(node));
+		assertFalse(new AllItemsTester(JsonNodeType.ARRAY, JsonNode::asBoolean).accepts(node));
 	}
 	
 	@Test
@@ -43,6 +44,6 @@ public class AllItemsTesterTest {
 		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
 		node.add(true);
 		node.add(true);
-		assertTrue(new AllItemsTester(JsonNode::asBoolean).accepts(node));
+		assertTrue(new AllItemsTester(JsonNodeType.ARRAY, JsonNode::asBoolean).accepts(node));
 	}
 }