Переглянути джерело

Fix NPE.
Add tests for fallback and other cases to Arrays

Sam Jaffe 6 роки тому
батько
коміт
8779f16738

+ 1 - 1
src/main/lombok/org/leumasjaffe/json/schema/Schema.java

@@ -93,7 +93,7 @@ public class Schema implements Tester {
 				return false;
 			}
 		}
-		ArrayTester items = (ArrayTester) children.get("items");
+		ArrayTester items = (ArrayTester) children.getOrDefault("items", ACCEPT);
 		ArrayTester addtlItems = (ArrayTester) children.getOrDefault("additionalItems", ACCEPT);
 		ArrayTester.Status status = items.accepts(JsonHelper.toArray(node));
 		if (status.accepted && !status.unprocessed.isEmpty()) {

+ 56 - 0
src/test/java/org/leumasjaffe/json/schema/SchemaTest.java

@@ -8,6 +8,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.junit.Test;
+import org.leumasjaffe.json.schema.tester.ContainsTester;
 import org.leumasjaffe.json.schema.tester.EqualsTester;
 import org.leumasjaffe.json.schema.tester.FixedTester;
 import org.leumasjaffe.json.schema.tester.FormatTester;
@@ -16,6 +17,7 @@ import org.leumasjaffe.json.schema.tester.MockTester;
 import org.leumasjaffe.json.schema.tester.NumberTester;
 import org.leumasjaffe.json.schema.tester.SizeTester;
 import org.leumasjaffe.json.schema.tester.StubTester;
+import org.leumasjaffe.json.schema.tester.UniqueItemTester;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -55,6 +57,15 @@ public class SchemaTest {
 		return new Schema(tests);
 	}
 	
+	private Schema getArraySchema() {
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("maxItems", new SizeTester(ARRAY, s -> s <= 3));
+		tests.put("minItems", new SizeTester(ARRAY, s -> s >= 1));
+		tests.put("uniqueItems", new UniqueItemTester());
+		tests.put("contains", new ContainsTester(getNumberSchema()));
+		return new Schema(tests);
+	}
+	
 	@Test
 	public void testAcceptsAnyIfNoMatchers() {
 		assertThat(new Schema().acceptedTypes().length, is(Tester.ANY.length));
@@ -134,6 +145,22 @@ public class SchemaTest {
 				.accepts(new TextNode("C")));
 	}
 
+	@Test
+	public void testHandlesMultipleTestsForArray() {
+		final ArrayNode array = new ArrayNode(JsonNodeFactory.instance);
+		assertFalse(getArraySchema().accepts(array));
+		array.add("Test");
+		assertFalse(getArraySchema().accepts(array));
+		array.add(0.5);
+		assertTrue(getArraySchema().accepts(array));
+		array.add(0.5);
+		assertFalse(getArraySchema().accepts(array));
+		array.remove(2);
+		array.add(true);
+		array.add(false);
+		assertFalse(getArraySchema().accepts(array));
+	}
+	
 	@Test
 	public void testHandlesAdditionalItemsMatcherWhenArrayItems() {
 		Map<String, Tester> tests = new HashMap<>();
@@ -155,4 +182,33 @@ public class SchemaTest {
 		assertTrue(new Schema(tests).accepts(node));
 	}
 
+	@Test
+	public void testHandlesAdditionalItemsNotCalledIfFailsInItems() {
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("items", new ItemsTester(getNumberSchema(), getStringSchema()));
+		tests.put("additionalItems", FixedTester.ACCEPT);
+		Schema schema = new Schema(tests);
+
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		node.add(0.5);
+		node.add("https://a");
+		node.add(true);
+		assertFalse(schema.accepts(node));
+	}
+	
+	@Test
+	public void testHandlesUniversalChecksForArray() {
+		final ArrayNode expected = new ArrayNode(JsonNodeFactory.instance);
+		expected.add(true);
+
+		Map<String, Tester> tests = new HashMap<>();
+		tests.put("const", new EqualsTester(expected));
+		Schema schema = new Schema(tests);
+
+		final ArrayNode node = new ArrayNode(JsonNodeFactory.instance);
+		assertFalse(schema.accepts(node));
+		node.add(true);
+		assertTrue(schema.accepts(node));
+	}
+
 }