JSON Pointer Parsing Tests (RFC 6901) Root pointer (empty string): $ ./test_pointer.exe parse "" OK: [] RFC 6901 Section 5 examples: $ ./test_pointer.exe parse "/foo" OK: [Mem:foo] $ ./test_pointer.exe parse "/foo/0" OK: [Mem:foo, Nth:0] $ ./test_pointer.exe parse "/" OK: [Mem:] $ ./test_pointer.exe parse "/a~1b" OK: [Mem:a/b] $ ./test_pointer.exe parse "/c%d" OK: [Mem:c%d] $ ./test_pointer.exe parse "/e^f" OK: [Mem:e^f] $ ./test_pointer.exe parse "/g|h" OK: [Mem:g|h] $ ./test_pointer.exe parse '/i\j' OK: [Mem:i\j] $ ./test_pointer.exe parse '/k"l' OK: [Mem:k"l] $ ./test_pointer.exe parse "/ " OK: [Mem: ] $ ./test_pointer.exe parse "/m~0n" OK: [Mem:m~n] Array indices: $ ./test_pointer.exe parse "/0" OK: [Nth:0] $ ./test_pointer.exe parse "/1" OK: [Nth:1] $ ./test_pointer.exe parse "/10" OK: [Nth:10] $ ./test_pointer.exe parse "/123" OK: [Nth:123] End-of-array marker: $ ./test_pointer.exe parse "/-" OK: [, /-] $ ./test_pointer.exe parse "/foo/-" OK: [Mem:foo, /-] Multiple levels: $ ./test_pointer.exe parse "/a/b/c" OK: [Mem:a, Mem:b, Mem:c] $ ./test_pointer.exe parse "/0/1/2" OK: [Nth:0, Nth:1, Nth:2] $ ./test_pointer.exe parse "/foo/0/bar/1" OK: [Mem:foo, Nth:0, Mem:bar, Nth:1] Escape sequences: $ ./test_pointer.exe parse "/~0" OK: [Mem:~] $ ./test_pointer.exe parse "/~1" OK: [Mem:/] $ ./test_pointer.exe parse "/~0~1" OK: [Mem:~/] $ ./test_pointer.exe parse "/~1~0" OK: [Mem:/~] $ ./test_pointer.exe parse "/~01" OK: [Mem:~1] Empty member names: $ ./test_pointer.exe parse "//" OK: [Mem:, Mem:] $ ./test_pointer.exe parse "///" OK: [Mem:, Mem:, Mem:] Invalid: must start with / $ ./test_pointer.exe parse "foo" ERROR: Invalid JSON Pointer: must be empty or start with '/': foo $ ./test_pointer.exe parse "a/b" ERROR: Invalid JSON Pointer: must be empty or start with '/': a/b Invalid: incomplete escape $ ./test_pointer.exe parse "/~" ERROR: Invalid JSON Pointer: incomplete escape sequence at end $ ./test_pointer.exe parse "/foo~" ERROR: Invalid JSON Pointer: incomplete escape sequence at end Invalid: bad escape sequence $ ./test_pointer.exe parse "/~2" ERROR: Invalid JSON Pointer: invalid escape sequence ~2 $ ./test_pointer.exe parse "/~a" ERROR: Invalid JSON Pointer: invalid escape sequence ~a Leading zeros - valid as tokens, become member names (invalid as array indices at eval time): $ ./test_pointer.exe parse "/00" OK: [Mem:00] $ ./test_pointer.exe parse "/01" OK: [Mem:01] $ ./test_pointer.exe parse "/007" OK: [Mem:007] RFC 6901 Section 4: ~01 decodes to ~1, not / (order matters): $ ./test_pointer.exe parse "/~01" OK: [Mem:~1] $ ./test_pointer.exe parse "/~10" OK: [Mem:/0] Unicode characters (RFC 6901 specifies JSON Pointer is Unicode): $ ./test_pointer.exe parse "/café" OK: [Mem:café] $ ./test_pointer.exe parse "/日本語" OK: [Mem:日本語] $ ./test_pointer.exe parse "/emoji🎉" OK: [Mem:emoji🎉] Numeric member names (should be parsed as indices when valid): $ ./test_pointer.exe parse "/0" OK: [Nth:0] $ ./test_pointer.exe parse "/-1" OK: [Mem:-1] $ ./test_pointer.exe parse "/+1" OK: [Mem:+1] Very deep paths: $ ./test_pointer.exe parse "/a/b/c/d/e/f/g/h/i/j" OK: [Mem:a, Mem:b, Mem:c, Mem:d, Mem:e, Mem:f, Mem:g, Mem:h, Mem:i, Mem:j] Complex escape sequences: $ ./test_pointer.exe parse "/~0~0" OK: [Mem:~~] $ ./test_pointer.exe parse "/~1~1" OK: [Mem://] $ ./test_pointer.exe parse "/a~0b~1c~0d~1e" OK: [Mem:a~b/c~d/e] Invalid: tilde at end of path: $ ./test_pointer.exe parse "/foo/bar~" ERROR: Invalid JSON Pointer: incomplete escape sequence at end