Skip to content

Commit c9eabf1

Browse files
committed
fixing "json-pointer" format related tests
1 parent 7d3d628 commit c9eabf1

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

core/src/main/java/org/everit/json/schema/internal/JsonPointerFormatValidator.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,39 @@
1010
public class JsonPointerFormatValidator implements FormatValidator {
1111

1212
@Override public Optional<String> validate(String subject) {
13+
if ("".equals(subject)) {
14+
return Optional.empty();
15+
}
1316
try {
1417
new JSONPointer(subject);
15-
return Optional.empty();
18+
if (subject.startsWith("#")) {
19+
return failure(subject);
20+
}
21+
return checkEscaping(subject);
1622
} catch (IllegalArgumentException e) {
17-
return Optional.of(format("[%s] is not a valid JSON pointer", subject));
23+
return failure(subject);
24+
}
25+
}
26+
27+
protected Optional<String> failure(String subject) {
28+
return Optional.of(format("[%s] is not a valid JSON pointer", subject));
29+
}
30+
31+
protected Optional<String> checkEscaping(String subject) {
32+
for (int i = 0; i < subject.length() - 1; ++i) {
33+
char c = subject.charAt(i);
34+
if (c == '~') {
35+
char next = subject.charAt(i + 1);
36+
if (next == '1' || next == '0') {
37+
continue;
38+
}
39+
return failure(subject);
40+
}
41+
}
42+
if (subject.charAt(subject.length() - 1) == '~') {
43+
return failure(subject);
1844
}
45+
return Optional.empty();
1946
}
2047

2148
@Override public String formatName() {
Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.everit.json.schema.internal;
22

3-
import static org.everit.json.schema.internal.ValidatorTestSupport.assertFailure;
3+
import static java.lang.String.format;
44
import static org.everit.json.schema.internal.ValidatorTestSupport.assertSuccess;
55

66
import org.junit.Test;
@@ -10,18 +10,47 @@ public class JsonPointerFormatValidatorTest {
1010
private final JsonPointerFormatValidator subject = new JsonPointerFormatValidator();
1111

1212
@Test
13-
public void uriSuccess() {
14-
assertSuccess("#/hello", subject);
13+
public void stringSuccess() {
14+
assertSuccess("/hello", subject);
1515
}
1616

1717
@Test
18-
public void stringSuccess() {
19-
assertSuccess("/hello", subject);
18+
public void root() {
19+
assertSuccess("/", subject);
20+
}
21+
22+
@Test
23+
public void emptyStringIsValid() {
24+
assertSuccess("", subject);
2025
}
2126

2227
@Test
2328
public void illegalLeadingCharFailure() {
24-
assertFailure("aaa", subject, "[aaa] is not a valid JSON pointer");
29+
assertFailure("aaa");
30+
}
31+
32+
@Test
33+
public void invalidTildeEscape() {
34+
assertFailure("/~asd");
35+
}
36+
37+
@Test
38+
public void invalidEscapeNum() {
39+
assertFailure("/~2");
40+
}
41+
42+
@Test
43+
public void trailingTilde() {
44+
assertFailure("/foo/bar~");
45+
}
46+
47+
@Test
48+
public void uriFragment() {
49+
assertFailure("#/");
50+
}
51+
52+
private void assertFailure(String input) {
53+
ValidatorTestSupport.assertFailure(input, subject, format("[%s] is not a valid JSON pointer", input));
2554
}
2655

2756
}

0 commit comments

Comments
 (0)