RFC6901 JSON Pointer implementation in OCaml using jsont
1Comprehensive JSON Pointer Tests (from json-pointer-js test suite)
2
3Additional parsing tests:
4 $ ./test_pointer.exe parse "/foo/bar"
5 OK: [Mem:foo, Mem:bar]
6 $ ./test_pointer.exe parse "/foo/-"
7 OK: [Mem:foo, /-]
8 $ ./test_pointer.exe parse "/foo/1"
9 OK: [Mem:foo, Nth:1]
10 $ ./test_pointer.exe parse "/foo/~0"
11 OK: [Mem:foo, Mem:~]
12 $ ./test_pointer.exe parse "/foo/~1"
13 OK: [Mem:foo, Mem:/]
14 $ ./test_pointer.exe parse "/foo/~1~0"
15 OK: [Mem:foo, Mem:/~]
16 $ ./test_pointer.exe parse "/foo/~0~1"
17 OK: [Mem:foo, Mem:~/]
18 $ ./test_pointer.exe parse "/foo/~01"
19 OK: [Mem:foo, Mem:~1]
20 $ ./test_pointer.exe parse "/foo/~10"
21 OK: [Mem:foo, Mem:/0]
22
23Parse error tests:
24 $ ./test_pointer.exe parse "foo/bar"
25 ERROR: Invalid JSON Pointer: must be empty or start with '/': foo/bar
26 $ ./test_pointer.exe parse "~foo"
27 ERROR: Invalid JSON Pointer: must be empty or start with '/': ~foo
28 $ ./test_pointer.exe parse "/~a"
29 ERROR: Invalid JSON Pointer: invalid escape sequence ~a
30 $ ./test_pointer.exe parse "~1/foo"
31 ERROR: Invalid JSON Pointer: must be empty or start with '/': ~1/foo
32
33Get value tests:
34 $ ./test_pointer.exe eval data/rfc6901_example.json "/a~1b"
35 OK: 1
36 $ ./test_pointer.exe eval data/rfc6901_example.json "/c%d"
37 OK: 2
38 $ ./test_pointer.exe eval data/rfc6901_example.json "/e^f"
39 OK: 3
40 $ ./test_pointer.exe eval data/rfc6901_example.json "/g|h"
41 OK: 4
42 $ ./test_pointer.exe eval data/rfc6901_example.json '/i\j'
43 OK: 5
44 $ ./test_pointer.exe eval data/rfc6901_example.json '/k"l'
45 OK: 6
46 $ ./test_pointer.exe eval data/rfc6901_example.json "/ "
47 OK: 7
48 $ ./test_pointer.exe eval data/rfc6901_example.json "/m~0n"
49 OK: 8
50 $ ./test_pointer.exe eval data/rfc6901_example.json "/"
51 OK: 0
52
53Set tests (using add for replace/add semantics):
54 $ ./test_pointer.exe add '{"bar":"foo"}' '/bar' '"baz"'
55 {"bar":"baz"}
56 $ ./test_pointer.exe add '{"bar":"foo"}' '/foo' '"baz"'
57 {"bar":"foo","foo":"baz"}
58 $ ./test_pointer.exe add '["foo"]' '/0' '"bar"'
59 ["bar","foo"]
60 $ ./test_pointer.exe add '["foo"]' '/-' '"bar"'
61 ["foo","bar"]
62 $ ./test_pointer.exe add '{"foo":["bar"]}' '/foo/0' '"baz"'
63 {"foo":["baz","bar"]}
64
65Replace tests using special characters:
66 $ ./test_pointer.exe replace '{"a/b":"bar"}' '/a~1b' '"baz"'
67 {"a/b":"baz"}
68 $ ./test_pointer.exe replace '{"c%d":"bar"}' '/c%d' '"baz"'
69 {"c%d":"baz"}
70 $ ./test_pointer.exe replace '{"e^f":"bar"}' '/e^f' '"baz"'
71 {"e^f":"baz"}
72 $ ./test_pointer.exe replace '{"g|h":"bar"}' '/g|h' '"baz"'
73 {"g|h":"baz"}
74 $ ./test_pointer.exe replace '{" ":"bar"}' '/ ' '"baz"'
75 {" ":"baz"}
76 $ ./test_pointer.exe replace '{"m~n":"bar"}' '/m~0n' '"baz"'
77 {"m~n":"baz"}
78 $ ./test_pointer.exe replace '{"":"bar"}' '/' '"baz"'
79 {"":"baz"}
80
81Remove tests:
82 $ ./test_pointer.exe remove '{"foo":"bar","baz":"qux"}' '/foo'
83 {"baz":"qux"}
84 $ ./test_pointer.exe remove '["foo","baz"]' '/1'
85 ["foo"]
86 $ ./test_pointer.exe remove '["foo","baz"]' '/0'
87 ["baz"]
88 $ ./test_pointer.exe remove '{"foo":["bar"]}' '/foo/0'
89 {"foo":[]}
90
91Copy tests:
92 $ ./test_pointer.exe copy '{"foo":"bar"}' '/foo' '/baz'
93 {"foo":"bar","baz":"bar"}
94
95Test operation:
96 $ ./test_pointer.exe test '{"foo":"bar"}' '/foo' '"bar"'
97 true
98 $ ./test_pointer.exe test '{"foo":"bar"}' '/foo' '"baz"'
99 false
100 $ ./test_pointer.exe test '{"foo":["bar","baz"]}' '/foo' '["bar","baz"]'
101 true
102 $ ./test_pointer.exe test '{"foo":"bar"}' '/baz' '"qux"'
103 false
104
105Equality tests (pointers that should be equal after roundtrip):
106 $ ./test_pointer.exe roundtrip "/foo/~0"
107 OK: /foo/~0
108 $ ./test_pointer.exe roundtrip "/foo/~1"
109 OK: /foo/~1
110
111Has/exists tests (from json-pointer-js):
112 $ ./test_pointer.exe has '{"foo":"bar"}' '/foo'
113 true
114 $ ./test_pointer.exe has '{"foo":"bar"}' '/bar'
115 false
116 $ ./test_pointer.exe has '{"foo":{"bar":"baz"}}' '/foo/bar'
117 true
118 $ ./test_pointer.exe has '{"foo":{"bar":"baz"}}' '/foo/qux'
119 false
120 $ ./test_pointer.exe has '["foo","bar"]' '/0'
121 true
122 $ ./test_pointer.exe has '["foo","bar"]' '/1'
123 true
124 $ ./test_pointer.exe has '["foo","bar"]' '/2'
125 false
126 $ ./test_pointer.exe has '{"foo":["bar"]}' '/foo/0'
127 true
128 $ ./test_pointer.exe has '{"foo":["bar"]}' '/foo/1'
129 false
130 $ ./test_pointer.exe has '{}' ''
131 true
132 $ ./test_pointer.exe has '[]' ''
133 true
134 $ ./test_pointer.exe has '{"":0}' '/'
135 true
136 $ ./test_pointer.exe has '{"a/b":1}' '/a~1b'
137 true
138 $ ./test_pointer.exe has '{"m~n":8}' '/m~0n'
139 true
140
141Has with null values:
142 $ ./test_pointer.exe has '{"foo":null}' '/foo'
143 true
144 $ ./test_pointer.exe has 'null' ''
145 true
146
147Has with '-' (end marker - now errors because has uses of_string_nav):
148 $ ./test_pointer.exe has '["foo"]' '/-'
149 ERROR: Invalid JSON Pointer: '-' not allowed in navigation pointer
150 $ ./test_pointer.exe has '[]' '/-'
151 ERROR: Invalid JSON Pointer: '-' not allowed in navigation pointer