소스 검색

Add format tests for most formats accepted.
Fix a few mixups and bugs.

Sam Jaffe 6 년 전
부모
커밋
0d59ea231c

+ 6 - 5
src/main/lombok/org/leumasjaffe/json/schema/tester/FormatTester.java

@@ -18,6 +18,7 @@ import lombok.experimental.FieldDefaults;
 @RequiredArgsConstructor
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public abstract class FormatTester implements Tester {
+	// TODO Make these into subclasses instead of this
 	static Tester UUID = new FormatTester("uuid") {
 		@Override
 		public boolean accepts(JsonNode node) {
@@ -73,21 +74,21 @@ public abstract class FormatTester implements Tester {
 			if (!node.isTextual()) return false;
 			try {
 				// TODO: RFC 2396 -> RFC 3986
-				new java.net.URI(node.asText());
+				return new java.net.URI(node.asText()).isAbsolute();
 			} catch (URISyntaxException e) {
 				return false;
 			}
-			return true;
 		}
 	};
 	
-	static Tester URI_REFERNCE = new FormatTester("uri") {
+	static Tester URI_REFERNCE = new FormatTester("uri-reference") {
 		@Override
 		public boolean accepts(JsonNode node) {
 			if (!node.isTextual()) return false;
 			try {
 				// TODO: RFC 2396 -> RFC 3986
-				return !new java.net.URI(node.asText()).isAbsolute();
+				new java.net.URI(node.asText());
+				return true;
 			} catch (URISyntaxException e) {
 				return false;
 			}
@@ -97,7 +98,7 @@ public abstract class FormatTester implements Tester {
 	static Tester JSON_POINTER = new FormatTester("json-pointer") {
 		@Override
 		public boolean accepts(JsonNode node) {
-			final String pattern = "^(/([\\u00-\\u2E\\u30-\\u7D\\u7F-\\u10FFFF]|~0|~1)*)*$";
+			final String pattern = "^(/([\\u0000-\\u002E\\u0030-\\u007D\\u007F-\\u10FFFF]|~0|~1)*)*$";
 			return node.isTextual() && node.asText().matches(pattern);
 		}
 	};

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

@@ -5,6 +5,7 @@ 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.FormatTesterTest;
 import org.leumasjaffe.json.schema.tester.NotTesterTest;
 import org.leumasjaffe.json.schema.tester.NumberTesterTest;
 import org.leumasjaffe.json.schema.tester.OneOfTesterTest;
@@ -19,6 +20,7 @@ import org.leumasjaffe.json.schema.tester.UniqueItemTesterTest;
 	AllOfTesterTest.class,
 	AnyOfTesterTest.class,
 	ContainsTesterTest.class,
+	FormatTesterTest.class,
 	NotTesterTest.class,
 	NumberTesterTest.class,
 	OneOfTesterTest.class,

+ 107 - 0
src/test/java/org/leumasjaffe/json/schema/tester/FormatTesterTest.java

@@ -0,0 +1,107 @@
+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.node.NullNode;
+import com.fasterxml.jackson.databind.node.TextNode;
+
+public class FormatTesterTest {
+
+	@Test(expected=IllegalArgumentException.class)
+	public void testThrowsForUnknownFormat() {
+		FormatTester.forCode("unknown");
+	}
+
+	@Test
+	public void testUUIDMatcher() {
+		Tester test = FormatTester.forCode("uuid");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("00000000-0000-0000-0000-000000000000")));
+		assertFalse(test.accepts(new TextNode("0000000-0000-0000-0000-000000000000")));
+		assertFalse(test.accepts(new TextNode("X0000000-0000-0000-0000-000000000000")));
+	}
+	
+	@Test
+	public void testDateTimeMatcher() {
+		Tester test = FormatTester.forCode("date-time");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("2000-01-01T21:10:10Z")));
+		assertTrue(test.accepts(new TextNode("2000-01-01T21:10:10+01:00")));
+		assertTrue(test.accepts(new TextNode("2000-01-01T21:10:10-01:00")));
+		assertFalse(test.accepts(new TextNode("2000-01-01")));
+		assertFalse(test.accepts(new TextNode("21:10:10Z")));
+		assertFalse(test.accepts(new TextNode("21:10:10+01:00")));
+		assertFalse(test.accepts(new TextNode("21:10:10001:00")));
+	}
+	
+	@Test
+	public void testEmailMatcher() {
+		Tester test = FormatTester.forCode("email");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("user@mail.com")));
+		assertFalse(test.accepts(new TextNode("user@mail")));
+		assertFalse(test.accepts(new TextNode("@mail.com")));
+	}
+
+	@Test
+	public void testHostnameMatcher() {
+		Tester test = FormatTester.forCode("hostname");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("google.com")));
+		assertFalse(test.accepts(new TextNode("192.168.0.1")));
+		assertFalse(test.accepts(new TextNode("user@google.com")));
+		assertFalse(test.accepts(new TextNode("http://google.com")));
+	}
+
+	@Test
+	public void testipv4Matcher() {
+		Tester test = FormatTester.forCode("ipv4");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("192.168.0.1")));
+		assertFalse(test.accepts(new TextNode("192.168.0.1/24")));
+		assertFalse(test.accepts(new TextNode("192.168.0.1:80")));
+	}
+	
+	@Test
+	public void testipv6Matcher() {
+		Tester test = FormatTester.forCode("ipv6");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("::1")));
+		assertFalse(test.accepts(new TextNode("[::1]:80")));
+	}
+	
+
+	@Test
+	public void testURIMatcher() {
+		Tester test = FormatTester.forCode("uri");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("file:///var/log/syslog")));
+		assertFalse(test.accepts(new TextNode("#/definitions/schemaArray")));
+		assertTrue(test.accepts(new TextNode("http://google.com")));
+		assertFalse(test.accepts(new TextNode("100:file")));
+		assertFalse(test.accepts(new TextNode("http://google.com/{domain}")));
+	}
+	
+	@Test
+	public void testURIReferenceMatcher() {
+		Tester test = FormatTester.forCode("uri-reference");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("file:///var/log/syslog")));
+		assertTrue(test.accepts(new TextNode("#/definitions/schemaArray")));
+		assertTrue(test.accepts(new TextNode("http://google.com")));
+		assertFalse(test.accepts(new TextNode("100:file")));
+		assertFalse(test.accepts(new TextNode("http://google.com/{domain}")));
+	}
+	
+	@Test
+	public void testJsonPointerMatcher() {
+		Tester test = FormatTester.forCode("json-pointer");
+		assertFalse(test.accepts(NullNode.getInstance()));
+		assertTrue(test.accepts(new TextNode("/definitions/schemaArray")));
+		assertFalse(test.accepts(new TextNode("#/definitions/schemaArray")));
+		assertTrue(test.accepts(new TextNode("/definitions/schemas/5/")));
+	}
+}