summaryrefslogtreecommitdiff
path: root/test/parsing
diff options
context:
space:
mode:
Diffstat (limited to 'test/parsing')
-rw-r--r--test/parsing/CMakeLists.txt23
-rw-r--r--test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json1
-rw-r--r--test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json.gold36
-rw-r--r--test/parsing/cases/ac_simple_with_comments.json11
-rw-r--r--test/parsing/cases/ac_simple_with_comments.json.gold9
-rw-r--r--test/parsing/cases/ag_false_then_garbage.json1
-rw-r--r--test/parsing/cases/ag_false_then_garbage.json.gold2
-rw-r--r--test/parsing/cases/ag_null_then_garbage.json1
-rw-r--r--test/parsing/cases/ag_null_then_garbage.json.gold2
-rw-r--r--test/parsing/cases/ag_true_then_garbage.json1
-rw-r--r--test/parsing/cases/ag_true_then_garbage.json.gold2
-rw-r--r--test/parsing/cases/am_eof.json1
-rw-r--r--test/parsing/cases/am_eof.json.gold4
-rw-r--r--test/parsing/cases/am_integers.json1
-rw-r--r--test/parsing/cases/am_integers.json.gold3
-rw-r--r--test/parsing/cases/am_multiple.json3
-rw-r--r--test/parsing/cases/am_multiple.json.gold5
-rw-r--r--test/parsing/cases/am_stuff.json7
-rw-r--r--test/parsing/cases/am_stuff.json.gold14
-rw-r--r--test/parsing/cases/ap_array_open.json1
-rw-r--r--test/parsing/cases/ap_array_open.json.gold2
-rw-r--r--test/parsing/cases/ap_eof_str.json1
-rw-r--r--test/parsing/cases/ap_eof_str.json.gold1
-rw-r--r--test/parsing/cases/ap_map_open.json1
-rw-r--r--test/parsing/cases/ap_map_open.json.gold2
-rw-r--r--test/parsing/cases/ap_partial_ok.json1
-rw-r--r--test/parsing/cases/ap_partial_ok.json.gold4
-rw-r--r--test/parsing/cases/array.json6
-rw-r--r--test/parsing/cases/array.json.gold22
-rw-r--r--test/parsing/cases/array_close.json1
-rw-r--r--test/parsing/cases/array_close.json.gold2
-rw-r--r--test/parsing/cases/bignums.json1
-rw-r--r--test/parsing/cases/bignums.json.gold5
-rw-r--r--test/parsing/cases/bogus_char.json4
-rw-r--r--test/parsing/cases/bogus_char.json.gold10
-rw-r--r--test/parsing/cases/codepoints_from_unicode_org.json1
-rw-r--r--test/parsing/cases/codepoints_from_unicode_org.json.gold2
-rw-r--r--test/parsing/cases/deep_arrays.json1
-rw-r--r--test/parsing/cases/deep_arrays.json.gold2049
-rw-r--r--test/parsing/cases/difficult_json_c_test_case.json1
-rw-r--r--test/parsing/cases/difficult_json_c_test_case.json.gold36
-rw-r--r--test/parsing/cases/doubles.json1
-rw-r--r--test/parsing/cases/doubles.json.gold7
-rw-r--r--test/parsing/cases/doubles_in_array.json1
-rw-r--r--test/parsing/cases/doubles_in_array.json.gold8
-rw-r--r--test/parsing/cases/empty_array.json1
-rw-r--r--test/parsing/cases/empty_array.json.gold3
-rw-r--r--test/parsing/cases/empty_string.json1
-rw-r--r--test/parsing/cases/empty_string.json.gold2
-rw-r--r--test/parsing/cases/escaped_bulgarian.json4
-rw-r--r--test/parsing/cases/escaped_bulgarian.json.gold7
-rw-r--r--test/parsing/cases/escaped_foobar.json1
-rw-r--r--test/parsing/cases/escaped_foobar.json.gold2
-rw-r--r--test/parsing/cases/false.json1
-rw-r--r--test/parsing/cases/false.json.gold2
-rw-r--r--test/parsing/cases/fg_false_then_garbage.json1
-rw-r--r--test/parsing/cases/fg_false_then_garbage.json.gold3
-rw-r--r--test/parsing/cases/fg_issue_7.json1
-rw-r--r--test/parsing/cases/fg_issue_7.json.gold3
-rw-r--r--test/parsing/cases/fg_null_then_garbage.json1
-rw-r--r--test/parsing/cases/fg_null_then_garbage.json.gold3
-rw-r--r--test/parsing/cases/fg_true_then_garbage.json1
-rw-r--r--test/parsing/cases/fg_true_then_garbage.json.gold3
-rw-r--r--test/parsing/cases/four_byte_utf8.json2
-rw-r--r--test/parsing/cases/four_byte_utf8.json.gold5
-rw-r--r--test/parsing/cases/high_overflow.json1
-rw-r--r--test/parsing/cases/high_overflow.json.gold2
-rw-r--r--test/parsing/cases/integers.json3
-rw-r--r--test/parsing/cases/integers.json.gold14
-rw-r--r--test/parsing/cases/invalid_utf8.json1
-rw-r--r--test/parsing/cases/invalid_utf8.json.gold3
-rw-r--r--test/parsing/cases/isolated_surrogate_marker.json1
-rw-r--r--test/parsing/cases/isolated_surrogate_marker.json.gold2
-rw-r--r--test/parsing/cases/leading_zero_in_number.json1
-rw-r--r--test/parsing/cases/leading_zero_in_number.json.gold5
-rw-r--r--test/parsing/cases/lonely_minus_sign.json7
-rw-r--r--test/parsing/cases/lonely_minus_sign.json.gold9
-rw-r--r--test/parsing/cases/lonely_number.json1
-rw-r--r--test/parsing/cases/lonely_number.json.gold2
-rw-r--r--test/parsing/cases/low_overflow.json1
-rw-r--r--test/parsing/cases/low_overflow.json.gold2
-rw-r--r--test/parsing/cases/map_close.json1
-rw-r--r--test/parsing/cases/map_close.json.gold2
-rw-r--r--test/parsing/cases/missing_integer_after_decimal_point.json1
-rw-r--r--test/parsing/cases/missing_integer_after_decimal_point.json.gold2
-rw-r--r--test/parsing/cases/missing_integer_after_exponent.json1
-rw-r--r--test/parsing/cases/missing_integer_after_exponent.json.gold2
-rw-r--r--test/parsing/cases/multiple.json3
-rw-r--r--test/parsing/cases/multiple.json.gold4
-rw-r--r--test/parsing/cases/non_utf8_char_in_string.json1
-rw-r--r--test/parsing/cases/non_utf8_char_in_string.json.gold8
-rw-r--r--test/parsing/cases/np_partial_bad.json1
-rw-r--r--test/parsing/cases/np_partial_bad.json.gold5
-rw-r--r--test/parsing/cases/null.json1
-rw-r--r--test/parsing/cases/null.json.gold2
-rw-r--r--test/parsing/cases/nulls_and_bools.json5
-rw-r--r--test/parsing/cases/nulls_and_bools.json.gold9
-rw-r--r--test/parsing/cases/simple.json5
-rw-r--r--test/parsing/cases/simple.json.gold9
-rw-r--r--test/parsing/cases/simple_with_comments.json11
-rw-r--r--test/parsing/cases/simple_with_comments.json.gold5
-rw-r--r--test/parsing/cases/string_invalid_escape.json1
-rw-r--r--test/parsing/cases/string_invalid_escape.json.gold3
-rw-r--r--test/parsing/cases/string_invalid_hex_char.json1
-rw-r--r--test/parsing/cases/string_invalid_hex_char.json.gold2
-rw-r--r--test/parsing/cases/string_with_escapes.json3
-rw-r--r--test/parsing/cases/string_with_escapes.json.gold7
-rw-r--r--test/parsing/cases/string_with_invalid_newline.json2
-rw-r--r--test/parsing/cases/string_with_invalid_newline.json.gold2
-rw-r--r--test/parsing/cases/three_byte_utf8.json1
-rw-r--r--test/parsing/cases/three_byte_utf8.json.gold7
-rw-r--r--test/parsing/cases/true.json1
-rw-r--r--test/parsing/cases/true.json.gold2
-rw-r--r--test/parsing/cases/unescaped_bulgarian.json1
-rw-r--r--test/parsing/cases/unescaped_bulgarian.json.gold4
-rw-r--r--test/parsing/cases/zerobyte.json1
-rw-r--r--test/parsing/cases/zerobyte.json.goldbin0 -> 28 bytes
-rwxr-xr-xtest/parsing/run_tests.sh94
-rw-r--r--test/parsing/yajl_test.c281
119 files changed, 2891 insertions, 0 deletions
diff --git a/test/parsing/CMakeLists.txt b/test/parsing/CMakeLists.txt
new file mode 100644
index 0000000..153288c
--- /dev/null
+++ b/test/parsing/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+SET (SRCS yajl_test.c)
+
+# use the library we build, duh.
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/include)
+LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/lib)
+
+ADD_EXECUTABLE(yajl_test ${SRCS})
+
+TARGET_LINK_LIBRARIES(yajl_test yajl_s)
diff --git a/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json b/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json
new file mode 100644
index 0000000..2463c71
--- /dev/null
+++ b/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json
@@ -0,0 +1 @@
+{ "glossary": { /* you */ "title": /**/ "example glossary", /*should*/"GlossDiv": { "title": /*never*/"S", /*ever*/"GlossList": [ { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": "A meta-markup language, used to create markup languages such as DocBook.", /*see*/"GlossSeeAlso"/*this*/:/*coming*/[/*out*/"GML"/*of*/,/*the*/"XML"/*parser!*/, "markup"] /*hey*/}/*ho*/]/*hey*/}/*ho*/} } // and the parser won't even get this far, so chill. /* hah!
diff --git a/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json.gold b/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json.gold
new file mode 100644
index 0000000..c3adc11
--- /dev/null
+++ b/test/parsing/cases/ac_difficult_json_c_test_case_with_comments.json.gold
@@ -0,0 +1,36 @@
+map open '{'
+key: 'glossary'
+map open '{'
+key: 'title'
+string: 'example glossary'
+key: 'GlossDiv'
+map open '{'
+key: 'title'
+string: 'S'
+key: 'GlossList'
+array open '['
+map open '{'
+key: 'ID'
+string: 'SGML'
+key: 'SortAs'
+string: 'SGML'
+key: 'GlossTerm'
+string: 'Standard Generalized Markup Language'
+key: 'Acronym'
+string: 'SGML'
+key: 'Abbrev'
+string: 'ISO 8879:1986'
+key: 'GlossDef'
+string: 'A meta-markup language, used to create markup languages such as DocBook.'
+key: 'GlossSeeAlso'
+array open '['
+string: 'GML'
+string: 'XML'
+string: 'markup'
+array close ']'
+map close '}'
+array close ']'
+map close '}'
+map close '}'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/ac_simple_with_comments.json b/test/parsing/cases/ac_simple_with_comments.json
new file mode 100644
index 0000000..3b79bba
--- /dev/null
+++ b/test/parsing/cases/ac_simple_with_comments.json
@@ -0,0 +1,11 @@
+{
+ "this": "is", // ignore this
+ "really": "simple",
+ /* ignore
+this
+too * /
+** //
+(/
+******/
+ "json": "right?"
+}
diff --git a/test/parsing/cases/ac_simple_with_comments.json.gold b/test/parsing/cases/ac_simple_with_comments.json.gold
new file mode 100644
index 0000000..80fcad2
--- /dev/null
+++ b/test/parsing/cases/ac_simple_with_comments.json.gold
@@ -0,0 +1,9 @@
+map open '{'
+key: 'this'
+string: 'is'
+key: 'really'
+string: 'simple'
+key: 'json'
+string: 'right?'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/ag_false_then_garbage.json b/test/parsing/cases/ag_false_then_garbage.json
new file mode 100644
index 0000000..78f4e96
--- /dev/null
+++ b/test/parsing/cases/ag_false_then_garbage.json
@@ -0,0 +1 @@
+falsex \ No newline at end of file
diff --git a/test/parsing/cases/ag_false_then_garbage.json.gold b/test/parsing/cases/ag_false_then_garbage.json.gold
new file mode 100644
index 0000000..e55fa1f
--- /dev/null
+++ b/test/parsing/cases/ag_false_then_garbage.json.gold
@@ -0,0 +1,2 @@
+bool: false
+memory leaks: 0
diff --git a/test/parsing/cases/ag_null_then_garbage.json b/test/parsing/cases/ag_null_then_garbage.json
new file mode 100644
index 0000000..7b65b35
--- /dev/null
+++ b/test/parsing/cases/ag_null_then_garbage.json
@@ -0,0 +1 @@
+nullx
diff --git a/test/parsing/cases/ag_null_then_garbage.json.gold b/test/parsing/cases/ag_null_then_garbage.json.gold
new file mode 100644
index 0000000..94ad0fa
--- /dev/null
+++ b/test/parsing/cases/ag_null_then_garbage.json.gold
@@ -0,0 +1,2 @@
+null
+memory leaks: 0
diff --git a/test/parsing/cases/ag_true_then_garbage.json b/test/parsing/cases/ag_true_then_garbage.json
new file mode 100644
index 0000000..9151612
--- /dev/null
+++ b/test/parsing/cases/ag_true_then_garbage.json
@@ -0,0 +1 @@
+truex \ No newline at end of file
diff --git a/test/parsing/cases/ag_true_then_garbage.json.gold b/test/parsing/cases/ag_true_then_garbage.json.gold
new file mode 100644
index 0000000..0858bf7
--- /dev/null
+++ b/test/parsing/cases/ag_true_then_garbage.json.gold
@@ -0,0 +1,2 @@
+bool: true
+memory leaks: 0
diff --git a/test/parsing/cases/am_eof.json b/test/parsing/cases/am_eof.json
new file mode 100644
index 0000000..43a772f
--- /dev/null
+++ b/test/parsing/cases/am_eof.json
@@ -0,0 +1 @@
+{ "123":
diff --git a/test/parsing/cases/am_eof.json.gold b/test/parsing/cases/am_eof.json.gold
new file mode 100644
index 0000000..5a9708b
--- /dev/null
+++ b/test/parsing/cases/am_eof.json.gold
@@ -0,0 +1,4 @@
+map open '{'
+key: '123'
+parse error: premature EOF
+memory leaks: 0
diff --git a/test/parsing/cases/am_integers.json b/test/parsing/cases/am_integers.json
new file mode 100644
index 0000000..856809b
--- /dev/null
+++ b/test/parsing/cases/am_integers.json
@@ -0,0 +1 @@
+1221 21
diff --git a/test/parsing/cases/am_integers.json.gold b/test/parsing/cases/am_integers.json.gold
new file mode 100644
index 0000000..7b8a953
--- /dev/null
+++ b/test/parsing/cases/am_integers.json.gold
@@ -0,0 +1,3 @@
+integer: 1221
+integer: 21
+memory leaks: 0
diff --git a/test/parsing/cases/am_multiple.json b/test/parsing/cases/am_multiple.json
new file mode 100644
index 0000000..b573db0
--- /dev/null
+++ b/test/parsing/cases/am_multiple.json
@@ -0,0 +1,3 @@
+
+{}
+{}
diff --git a/test/parsing/cases/am_multiple.json.gold b/test/parsing/cases/am_multiple.json.gold
new file mode 100644
index 0000000..bf705d4
--- /dev/null
+++ b/test/parsing/cases/am_multiple.json.gold
@@ -0,0 +1,5 @@
+map open '{'
+map close '}'
+map open '{'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/am_stuff.json b/test/parsing/cases/am_stuff.json
new file mode 100644
index 0000000..89c607d
--- /dev/null
+++ b/test/parsing/cases/am_stuff.json
@@ -0,0 +1,7 @@
+{}
+[]
+[]
+"sdfasd"
+123
+{ "123" : 123 }
+3.1e124
diff --git a/test/parsing/cases/am_stuff.json.gold b/test/parsing/cases/am_stuff.json.gold
new file mode 100644
index 0000000..bf3a5bb
--- /dev/null
+++ b/test/parsing/cases/am_stuff.json.gold
@@ -0,0 +1,14 @@
+map open '{'
+map close '}'
+array open '['
+array close ']'
+array open '['
+array close ']'
+string: 'sdfasd'
+integer: 123
+map open '{'
+key: '123'
+integer: 123
+map close '}'
+double: 3.1e+124
+memory leaks: 0
diff --git a/test/parsing/cases/ap_array_open.json b/test/parsing/cases/ap_array_open.json
new file mode 100644
index 0000000..558ed37
--- /dev/null
+++ b/test/parsing/cases/ap_array_open.json
@@ -0,0 +1 @@
+[
diff --git a/test/parsing/cases/ap_array_open.json.gold b/test/parsing/cases/ap_array_open.json.gold
new file mode 100644
index 0000000..478b6b9
--- /dev/null
+++ b/test/parsing/cases/ap_array_open.json.gold
@@ -0,0 +1,2 @@
+array open '['
+memory leaks: 0
diff --git a/test/parsing/cases/ap_eof_str.json b/test/parsing/cases/ap_eof_str.json
new file mode 100644
index 0000000..6a21793
--- /dev/null
+++ b/test/parsing/cases/ap_eof_str.json
@@ -0,0 +1 @@
+"abc \ No newline at end of file
diff --git a/test/parsing/cases/ap_eof_str.json.gold b/test/parsing/cases/ap_eof_str.json.gold
new file mode 100644
index 0000000..736730b
--- /dev/null
+++ b/test/parsing/cases/ap_eof_str.json.gold
@@ -0,0 +1 @@
+memory leaks: 0
diff --git a/test/parsing/cases/ap_map_open.json b/test/parsing/cases/ap_map_open.json
new file mode 100644
index 0000000..98232c6
--- /dev/null
+++ b/test/parsing/cases/ap_map_open.json
@@ -0,0 +1 @@
+{
diff --git a/test/parsing/cases/ap_map_open.json.gold b/test/parsing/cases/ap_map_open.json.gold
new file mode 100644
index 0000000..ab1f33d
--- /dev/null
+++ b/test/parsing/cases/ap_map_open.json.gold
@@ -0,0 +1,2 @@
+map open '{'
+memory leaks: 0
diff --git a/test/parsing/cases/ap_partial_ok.json b/test/parsing/cases/ap_partial_ok.json
new file mode 100644
index 0000000..2fbd027
--- /dev/null
+++ b/test/parsing/cases/ap_partial_ok.json
@@ -0,0 +1 @@
+[ "foo", "bar"
diff --git a/test/parsing/cases/ap_partial_ok.json.gold b/test/parsing/cases/ap_partial_ok.json.gold
new file mode 100644
index 0000000..9f754c7
--- /dev/null
+++ b/test/parsing/cases/ap_partial_ok.json.gold
@@ -0,0 +1,4 @@
+array open '['
+string: 'foo'
+string: 'bar'
+memory leaks: 0
diff --git a/test/parsing/cases/array.json b/test/parsing/cases/array.json
new file mode 100644
index 0000000..f76058d
--- /dev/null
+++ b/test/parsing/cases/array.json
@@ -0,0 +1,6 @@
+["foo",
+ "bar", "baz",
+ true,false,null,{"key":"value"},
+ [null,null,null,[]],
+ "\n\r\\"
+]
diff --git a/test/parsing/cases/array.json.gold b/test/parsing/cases/array.json.gold
new file mode 100644
index 0000000..477559d
--- /dev/null
+++ b/test/parsing/cases/array.json.gold
@@ -0,0 +1,22 @@
+array open '['
+string: 'foo'
+string: 'bar'
+string: 'baz'
+bool: true
+bool: false
+null
+map open '{'
+key: 'key'
+string: 'value'
+map close '}'
+array open '['
+null
+null
+null
+array open '['
+array close ']'
+array close ']'
+string: '
+ \'
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/array_close.json b/test/parsing/cases/array_close.json
new file mode 100644
index 0000000..079b579
--- /dev/null
+++ b/test/parsing/cases/array_close.json
@@ -0,0 +1 @@
+]
diff --git a/test/parsing/cases/array_close.json.gold b/test/parsing/cases/array_close.json.gold
new file mode 100644
index 0000000..972fd39
--- /dev/null
+++ b/test/parsing/cases/array_close.json.gold
@@ -0,0 +1,2 @@
+parse error: unallowed token at this point in JSON text
+memory leaks: 0
diff --git a/test/parsing/cases/bignums.json b/test/parsing/cases/bignums.json
new file mode 100644
index 0000000..75aca9a
--- /dev/null
+++ b/test/parsing/cases/bignums.json
@@ -0,0 +1 @@
+[ 9223372036854775807, -9223372036854775807 ]
diff --git a/test/parsing/cases/bignums.json.gold b/test/parsing/cases/bignums.json.gold
new file mode 100644
index 0000000..8bb3b1e
--- /dev/null
+++ b/test/parsing/cases/bignums.json.gold
@@ -0,0 +1,5 @@
+array open '['
+integer: 9223372036854775807
+integer: -9223372036854775807
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/bogus_char.json b/test/parsing/cases/bogus_char.json
new file mode 100644
index 0000000..8163bd8
--- /dev/null
+++ b/test/parsing/cases/bogus_char.json
@@ -0,0 +1,4 @@
+["this","is","what","should","be",
+ "a happy bit of json",
+ "but someone, misspelled \"true\"", ture,
+ "who says JSON is easy for humans to generate?"]
diff --git a/test/parsing/cases/bogus_char.json.gold b/test/parsing/cases/bogus_char.json.gold
new file mode 100644
index 0000000..0c68a49
--- /dev/null
+++ b/test/parsing/cases/bogus_char.json.gold
@@ -0,0 +1,10 @@
+array open '['
+string: 'this'
+string: 'is'
+string: 'what'
+string: 'should'
+string: 'be'
+string: 'a happy bit of json'
+string: 'but someone, misspelled "true"'
+lexical error: invalid string in json text.
+memory leaks: 0
diff --git a/test/parsing/cases/codepoints_from_unicode_org.json b/test/parsing/cases/codepoints_from_unicode_org.json
new file mode 100644
index 0000000..f91f3be
--- /dev/null
+++ b/test/parsing/cases/codepoints_from_unicode_org.json
@@ -0,0 +1 @@
+"\u004d\u0430\u4e8c\ud800\udf02"
diff --git a/test/parsing/cases/codepoints_from_unicode_org.json.gold b/test/parsing/cases/codepoints_from_unicode_org.json.gold
new file mode 100644
index 0000000..f359a1b
--- /dev/null
+++ b/test/parsing/cases/codepoints_from_unicode_org.json.gold
@@ -0,0 +1,2 @@
+string: 'Mа二𐌂'
+memory leaks: 0
diff --git a/test/parsing/cases/deep_arrays.json b/test/parsing/cases/deep_arrays.json
new file mode 100644
index 0000000..82d1b0d
--- /dev/null
+++ b/test/parsing/cases/deep_arrays.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] \ No newline at end of file
diff --git a/test/parsing/cases/deep_arrays.json.gold b/test/parsing/cases/deep_arrays.json.gold
new file mode 100644
index 0000000..4d5cd99
--- /dev/null
+++ b/test/parsing/cases/deep_arrays.json.gold
@@ -0,0 +1,2049 @@
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array open '['
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/difficult_json_c_test_case.json b/test/parsing/cases/difficult_json_c_test_case.json
new file mode 100644
index 0000000..6998f55
--- /dev/null
+++ b/test/parsing/cases/difficult_json_c_test_case.json
@@ -0,0 +1 @@
+{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": [ { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML", "markup"] } ] } } }
diff --git a/test/parsing/cases/difficult_json_c_test_case.json.gold b/test/parsing/cases/difficult_json_c_test_case.json.gold
new file mode 100644
index 0000000..c3adc11
--- /dev/null
+++ b/test/parsing/cases/difficult_json_c_test_case.json.gold
@@ -0,0 +1,36 @@
+map open '{'
+key: 'glossary'
+map open '{'
+key: 'title'
+string: 'example glossary'
+key: 'GlossDiv'
+map open '{'
+key: 'title'
+string: 'S'
+key: 'GlossList'
+array open '['
+map open '{'
+key: 'ID'
+string: 'SGML'
+key: 'SortAs'
+string: 'SGML'
+key: 'GlossTerm'
+string: 'Standard Generalized Markup Language'
+key: 'Acronym'
+string: 'SGML'
+key: 'Abbrev'
+string: 'ISO 8879:1986'
+key: 'GlossDef'
+string: 'A meta-markup language, used to create markup languages such as DocBook.'
+key: 'GlossSeeAlso'
+array open '['
+string: 'GML'
+string: 'XML'
+string: 'markup'
+array close ']'
+map close '}'
+array close ']'
+map close '}'
+map close '}'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/doubles.json b/test/parsing/cases/doubles.json
new file mode 100644
index 0000000..626f21c
--- /dev/null
+++ b/test/parsing/cases/doubles.json
@@ -0,0 +1 @@
+[ 0.1e2, 1e1, 3.141569, 10000000000000e-10]
diff --git a/test/parsing/cases/doubles.json.gold b/test/parsing/cases/doubles.json.gold
new file mode 100644
index 0000000..c0ea726
--- /dev/null
+++ b/test/parsing/cases/doubles.json.gold
@@ -0,0 +1,7 @@
+array open '['
+double: 10
+double: 10
+double: 3.14157
+double: 1000
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/doubles_in_array.json b/test/parsing/cases/doubles_in_array.json
new file mode 100644
index 0000000..06bf727
--- /dev/null
+++ b/test/parsing/cases/doubles_in_array.json
@@ -0,0 +1 @@
+[0.00011999999999999999, 6E-06, 6E-06, 1E-06, 1E-06]
diff --git a/test/parsing/cases/doubles_in_array.json.gold b/test/parsing/cases/doubles_in_array.json.gold
new file mode 100644
index 0000000..57f5b9a
--- /dev/null
+++ b/test/parsing/cases/doubles_in_array.json.gold
@@ -0,0 +1,8 @@
+array open '['
+double: 0.00012
+double: 6e-06
+double: 6e-06
+double: 1e-06
+double: 1e-06
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/empty_array.json b/test/parsing/cases/empty_array.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/test/parsing/cases/empty_array.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/test/parsing/cases/empty_array.json.gold b/test/parsing/cases/empty_array.json.gold
new file mode 100644
index 0000000..f069c8f
--- /dev/null
+++ b/test/parsing/cases/empty_array.json.gold
@@ -0,0 +1,3 @@
+array open '['
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/empty_string.json b/test/parsing/cases/empty_string.json
new file mode 100644
index 0000000..e16c76d
--- /dev/null
+++ b/test/parsing/cases/empty_string.json
@@ -0,0 +1 @@
+""
diff --git a/test/parsing/cases/empty_string.json.gold b/test/parsing/cases/empty_string.json.gold
new file mode 100644
index 0000000..c197bba
--- /dev/null
+++ b/test/parsing/cases/empty_string.json.gold
@@ -0,0 +1,2 @@
+string: ''
+memory leaks: 0
diff --git a/test/parsing/cases/escaped_bulgarian.json b/test/parsing/cases/escaped_bulgarian.json
new file mode 100644
index 0000000..9ce1d1c
--- /dev/null
+++ b/test/parsing/cases/escaped_bulgarian.json
@@ -0,0 +1,4 @@
+["\u0414\u0430",
+ "\u041c\u0443",
+ "\u0415\u0431\u0430",
+ "\u041c\u0430\u0439\u043a\u0430\u0442\u0430"]
diff --git a/test/parsing/cases/escaped_bulgarian.json.gold b/test/parsing/cases/escaped_bulgarian.json.gold
new file mode 100644
index 0000000..a0c9ae9
--- /dev/null
+++ b/test/parsing/cases/escaped_bulgarian.json.gold
@@ -0,0 +1,7 @@
+array open '['
+string: 'Да'
+string: 'Му'
+string: 'Еба'
+string: 'Майката'
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/escaped_foobar.json b/test/parsing/cases/escaped_foobar.json
new file mode 100644
index 0000000..2c0e25f
--- /dev/null
+++ b/test/parsing/cases/escaped_foobar.json
@@ -0,0 +1 @@
+"\u0066\u006f\u006f\u0062\u0061\u0072"
diff --git a/test/parsing/cases/escaped_foobar.json.gold b/test/parsing/cases/escaped_foobar.json.gold
new file mode 100644
index 0000000..5753c64
--- /dev/null
+++ b/test/parsing/cases/escaped_foobar.json.gold
@@ -0,0 +1,2 @@
+string: 'foobar'
+memory leaks: 0
diff --git a/test/parsing/cases/false.json b/test/parsing/cases/false.json
new file mode 100644
index 0000000..c508d53
--- /dev/null
+++ b/test/parsing/cases/false.json
@@ -0,0 +1 @@
+false
diff --git a/test/parsing/cases/false.json.gold b/test/parsing/cases/false.json.gold
new file mode 100644
index 0000000..e55fa1f
--- /dev/null
+++ b/test/parsing/cases/false.json.gold
@@ -0,0 +1,2 @@
+bool: false
+memory leaks: 0
diff --git a/test/parsing/cases/fg_false_then_garbage.json b/test/parsing/cases/fg_false_then_garbage.json
new file mode 100644
index 0000000..78f4e96
--- /dev/null
+++ b/test/parsing/cases/fg_false_then_garbage.json
@@ -0,0 +1 @@
+falsex \ No newline at end of file
diff --git a/test/parsing/cases/fg_false_then_garbage.json.gold b/test/parsing/cases/fg_false_then_garbage.json.gold
new file mode 100644
index 0000000..fe8fc1a
--- /dev/null
+++ b/test/parsing/cases/fg_false_then_garbage.json.gold
@@ -0,0 +1,3 @@
+bool: false
+parse error: trailing garbage
+memory leaks: 0
diff --git a/test/parsing/cases/fg_issue_7.json b/test/parsing/cases/fg_issue_7.json
new file mode 100644
index 0000000..77152a9
--- /dev/null
+++ b/test/parsing/cases/fg_issue_7.json
@@ -0,0 +1 @@
+2009-10-20@20:38:21.539575
diff --git a/test/parsing/cases/fg_issue_7.json.gold b/test/parsing/cases/fg_issue_7.json.gold
new file mode 100644
index 0000000..4d0de0f
--- /dev/null
+++ b/test/parsing/cases/fg_issue_7.json.gold
@@ -0,0 +1,3 @@
+integer: 2009
+parse error: trailing garbage
+memory leaks: 0
diff --git a/test/parsing/cases/fg_null_then_garbage.json b/test/parsing/cases/fg_null_then_garbage.json
new file mode 100644
index 0000000..7b65b35
--- /dev/null
+++ b/test/parsing/cases/fg_null_then_garbage.json
@@ -0,0 +1 @@
+nullx
diff --git a/test/parsing/cases/fg_null_then_garbage.json.gold b/test/parsing/cases/fg_null_then_garbage.json.gold
new file mode 100644
index 0000000..349235c
--- /dev/null
+++ b/test/parsing/cases/fg_null_then_garbage.json.gold
@@ -0,0 +1,3 @@
+null
+parse error: trailing garbage
+memory leaks: 0
diff --git a/test/parsing/cases/fg_true_then_garbage.json b/test/parsing/cases/fg_true_then_garbage.json
new file mode 100644
index 0000000..31f9deb
--- /dev/null
+++ b/test/parsing/cases/fg_true_then_garbage.json
@@ -0,0 +1 @@
+truex
diff --git a/test/parsing/cases/fg_true_then_garbage.json.gold b/test/parsing/cases/fg_true_then_garbage.json.gold
new file mode 100644
index 0000000..73af6ce
--- /dev/null
+++ b/test/parsing/cases/fg_true_then_garbage.json.gold
@@ -0,0 +1,3 @@
+bool: true
+parse error: trailing garbage
+memory leaks: 0
diff --git a/test/parsing/cases/four_byte_utf8.json b/test/parsing/cases/four_byte_utf8.json
new file mode 100644
index 0000000..582c575
--- /dev/null
+++ b/test/parsing/cases/four_byte_utf8.json
@@ -0,0 +1,2 @@
+{ "U+10ABCD": "􊯍" }
+
diff --git a/test/parsing/cases/four_byte_utf8.json.gold b/test/parsing/cases/four_byte_utf8.json.gold
new file mode 100644
index 0000000..f6260f2
--- /dev/null
+++ b/test/parsing/cases/four_byte_utf8.json.gold
@@ -0,0 +1,5 @@
+map open '{'
+key: 'U+10ABCD'
+string: '􊯍'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/high_overflow.json b/test/parsing/cases/high_overflow.json
new file mode 100644
index 0000000..8136b73
--- /dev/null
+++ b/test/parsing/cases/high_overflow.json
@@ -0,0 +1 @@
+9223372036854775808 \ No newline at end of file
diff --git a/test/parsing/cases/high_overflow.json.gold b/test/parsing/cases/high_overflow.json.gold
new file mode 100644
index 0000000..19c4b77
--- /dev/null
+++ b/test/parsing/cases/high_overflow.json.gold
@@ -0,0 +1,2 @@
+parse error: integer overflow
+memory leaks: 0
diff --git a/test/parsing/cases/integers.json b/test/parsing/cases/integers.json
new file mode 100644
index 0000000..c50e4c9
--- /dev/null
+++ b/test/parsing/cases/integers.json
@@ -0,0 +1,3 @@
+[ 1,2,3,4,5,6,7,
+ 123456789 , -123456789,
+ 2147483647, -2147483647 ]
diff --git a/test/parsing/cases/integers.json.gold b/test/parsing/cases/integers.json.gold
new file mode 100644
index 0000000..7ac4bee
--- /dev/null
+++ b/test/parsing/cases/integers.json.gold
@@ -0,0 +1,14 @@
+array open '['
+integer: 1
+integer: 2
+integer: 3
+integer: 4
+integer: 5
+integer: 6
+integer: 7
+integer: 123456789
+integer: -123456789
+integer: 2147483647
+integer: -2147483647
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/invalid_utf8.json b/test/parsing/cases/invalid_utf8.json
new file mode 100644
index 0000000..12f1718
--- /dev/null
+++ b/test/parsing/cases/invalid_utf8.json
@@ -0,0 +1 @@
+["Да М Еба Майката"]
diff --git a/test/parsing/cases/invalid_utf8.json.gold b/test/parsing/cases/invalid_utf8.json.gold
new file mode 100644
index 0000000..c0dec77
--- /dev/null
+++ b/test/parsing/cases/invalid_utf8.json.gold
@@ -0,0 +1,3 @@
+array open '['
+lexical error: invalid bytes in UTF8 string.
+memory leaks: 0
diff --git a/test/parsing/cases/isolated_surrogate_marker.json b/test/parsing/cases/isolated_surrogate_marker.json
new file mode 100644
index 0000000..36959f4
--- /dev/null
+++ b/test/parsing/cases/isolated_surrogate_marker.json
@@ -0,0 +1 @@
+"\ud800"
diff --git a/test/parsing/cases/isolated_surrogate_marker.json.gold b/test/parsing/cases/isolated_surrogate_marker.json.gold
new file mode 100644
index 0000000..cca172e
--- /dev/null
+++ b/test/parsing/cases/isolated_surrogate_marker.json.gold
@@ -0,0 +1,2 @@
+string: '?'
+memory leaks: 0
diff --git a/test/parsing/cases/leading_zero_in_number.json b/test/parsing/cases/leading_zero_in_number.json
new file mode 100644
index 0000000..959f5ba
--- /dev/null
+++ b/test/parsing/cases/leading_zero_in_number.json
@@ -0,0 +1 @@
+{ "bad thing": 01 }
diff --git a/test/parsing/cases/leading_zero_in_number.json.gold b/test/parsing/cases/leading_zero_in_number.json.gold
new file mode 100644
index 0000000..1a1580d
--- /dev/null
+++ b/test/parsing/cases/leading_zero_in_number.json.gold
@@ -0,0 +1,5 @@
+map open '{'
+key: 'bad thing'
+integer: 0
+parse error: after key and value, inside map, I expect ',' or '}'
+memory leaks: 0
diff --git a/test/parsing/cases/lonely_minus_sign.json b/test/parsing/cases/lonely_minus_sign.json
new file mode 100644
index 0000000..85f69bd
--- /dev/null
+++ b/test/parsing/cases/lonely_minus_sign.json
@@ -0,0 +1,7 @@
+[
+ "foo", true,
+ true, "blue",
+ "baby where are you?", "oh boo hoo!",
+ -
+]
+
diff --git a/test/parsing/cases/lonely_minus_sign.json.gold b/test/parsing/cases/lonely_minus_sign.json.gold
new file mode 100644
index 0000000..d15ede9
--- /dev/null
+++ b/test/parsing/cases/lonely_minus_sign.json.gold
@@ -0,0 +1,9 @@
+array open '['
+string: 'foo'
+bool: true
+bool: true
+string: 'blue'
+string: 'baby where are you?'
+string: 'oh boo hoo!'
+lexical error: malformed number, a digit is required after the minus sign.
+memory leaks: 0
diff --git a/test/parsing/cases/lonely_number.json b/test/parsing/cases/lonely_number.json
new file mode 100644
index 0000000..e2e107a
--- /dev/null
+++ b/test/parsing/cases/lonely_number.json
@@ -0,0 +1 @@
+123456789 \ No newline at end of file
diff --git a/test/parsing/cases/lonely_number.json.gold b/test/parsing/cases/lonely_number.json.gold
new file mode 100644
index 0000000..181fdfa
--- /dev/null
+++ b/test/parsing/cases/lonely_number.json.gold
@@ -0,0 +1,2 @@
+integer: 123456789
+memory leaks: 0
diff --git a/test/parsing/cases/low_overflow.json b/test/parsing/cases/low_overflow.json
new file mode 100644
index 0000000..9af921b
--- /dev/null
+++ b/test/parsing/cases/low_overflow.json
@@ -0,0 +1 @@
+-9223372036854775808 \ No newline at end of file
diff --git a/test/parsing/cases/low_overflow.json.gold b/test/parsing/cases/low_overflow.json.gold
new file mode 100644
index 0000000..19c4b77
--- /dev/null
+++ b/test/parsing/cases/low_overflow.json.gold
@@ -0,0 +1,2 @@
+parse error: integer overflow
+memory leaks: 0
diff --git a/test/parsing/cases/map_close.json b/test/parsing/cases/map_close.json
new file mode 100644
index 0000000..5c34318
--- /dev/null
+++ b/test/parsing/cases/map_close.json
@@ -0,0 +1 @@
+}
diff --git a/test/parsing/cases/map_close.json.gold b/test/parsing/cases/map_close.json.gold
new file mode 100644
index 0000000..972fd39
--- /dev/null
+++ b/test/parsing/cases/map_close.json.gold
@@ -0,0 +1,2 @@
+parse error: unallowed token at this point in JSON text
+memory leaks: 0
diff --git a/test/parsing/cases/missing_integer_after_decimal_point.json b/test/parsing/cases/missing_integer_after_decimal_point.json
new file mode 100644
index 0000000..2369f4b
--- /dev/null
+++ b/test/parsing/cases/missing_integer_after_decimal_point.json
@@ -0,0 +1 @@
+10.e2
diff --git a/test/parsing/cases/missing_integer_after_decimal_point.json.gold b/test/parsing/cases/missing_integer_after_decimal_point.json.gold
new file mode 100644
index 0000000..c2e7e2e
--- /dev/null
+++ b/test/parsing/cases/missing_integer_after_decimal_point.json.gold
@@ -0,0 +1,2 @@
+lexical error: malformed number, a digit is required after the decimal point.
+memory leaks: 0
diff --git a/test/parsing/cases/missing_integer_after_exponent.json b/test/parsing/cases/missing_integer_after_exponent.json
new file mode 100644
index 0000000..a62b45d
--- /dev/null
+++ b/test/parsing/cases/missing_integer_after_exponent.json
@@ -0,0 +1 @@
+10e
diff --git a/test/parsing/cases/missing_integer_after_exponent.json.gold b/test/parsing/cases/missing_integer_after_exponent.json.gold
new file mode 100644
index 0000000..5089681
--- /dev/null
+++ b/test/parsing/cases/missing_integer_after_exponent.json.gold
@@ -0,0 +1,2 @@
+lexical error: malformed number, a digit is required after the exponent.
+memory leaks: 0
diff --git a/test/parsing/cases/multiple.json b/test/parsing/cases/multiple.json
new file mode 100644
index 0000000..b573db0
--- /dev/null
+++ b/test/parsing/cases/multiple.json
@@ -0,0 +1,3 @@
+
+{}
+{}
diff --git a/test/parsing/cases/multiple.json.gold b/test/parsing/cases/multiple.json.gold
new file mode 100644
index 0000000..0f6f3df
--- /dev/null
+++ b/test/parsing/cases/multiple.json.gold
@@ -0,0 +1,4 @@
+map open '{'
+map close '}'
+parse error: trailing garbage
+memory leaks: 0
diff --git a/test/parsing/cases/non_utf8_char_in_string.json b/test/parsing/cases/non_utf8_char_in_string.json
new file mode 100644
index 0000000..253a664
--- /dev/null
+++ b/test/parsing/cases/non_utf8_char_in_string.json
@@ -0,0 +1 @@
+{"CoreletAPIVersion":2,"CoreletType":"standalone","documentation":"A corelet that provides the capability to upload a folders contents into a users locker.","functions":[{"documentation":"Displays a dialog box that allows user to select a folder on the local system.","name":"ShowBrowseDialog","parameters":[{"documentation":"The callback function for results.","name":"callback","required":true,"type":"callback"}]},{"documentation":"Uploads all mp3 files in the folder provided.","name":"UploadFolder","parameters":[{"documentation":"The path to upload mp3 files from.","name":"path","required":true,"type":"string"},{"documentation":"The callback function for progress.","name":"callback","required":true,"type":"callback"}]},{"documentation":"Returns the server name to the current locker service.","name":"GetLockerService","parameters":[]},{"documentation":"Changes the name of the locker service.","name":"SetLockerService","parameters":[{"documentation":"The value of the locker service to set active.","name":"LockerService","required":true,"type":"string"}]},{"documentation":"Downloads locker files to the suggested folder.","name":"DownloadFile","parameters":[{"documentation":"The origin path of the locker file.","name":"path","required":true,"type":"string"},{"documentation":"The Window destination path of the locker file.","name":"destination","required":true,"type":"integer"},{"documentation":"The callback function for progress.","name":"callback","required":true,"type":"callback"}]}],"name":"LockerUploader","version":{"major":0,"micro":1,"minor":0},"versionString":"0.0.1"} \ No newline at end of file
diff --git a/test/parsing/cases/non_utf8_char_in_string.json.gold b/test/parsing/cases/non_utf8_char_in_string.json.gold
new file mode 100644
index 0000000..5e3c580
--- /dev/null
+++ b/test/parsing/cases/non_utf8_char_in_string.json.gold
@@ -0,0 +1,8 @@
+map open '{'
+key: 'CoreletAPIVersion'
+integer: 2
+key: 'CoreletType'
+string: 'standalone'
+key: 'documentation'
+lexical error: invalid bytes in UTF8 string.
+memory leaks: 0
diff --git a/test/parsing/cases/np_partial_bad.json b/test/parsing/cases/np_partial_bad.json
new file mode 100644
index 0000000..2fbd027
--- /dev/null
+++ b/test/parsing/cases/np_partial_bad.json
@@ -0,0 +1 @@
+[ "foo", "bar"
diff --git a/test/parsing/cases/np_partial_bad.json.gold b/test/parsing/cases/np_partial_bad.json.gold
new file mode 100644
index 0000000..b981bda
--- /dev/null
+++ b/test/parsing/cases/np_partial_bad.json.gold
@@ -0,0 +1,5 @@
+array open '['
+string: 'foo'
+string: 'bar'
+parse error: premature EOF
+memory leaks: 0
diff --git a/test/parsing/cases/null.json b/test/parsing/cases/null.json
new file mode 100644
index 0000000..19765bd
--- /dev/null
+++ b/test/parsing/cases/null.json
@@ -0,0 +1 @@
+null
diff --git a/test/parsing/cases/null.json.gold b/test/parsing/cases/null.json.gold
new file mode 100644
index 0000000..94ad0fa
--- /dev/null
+++ b/test/parsing/cases/null.json.gold
@@ -0,0 +1,2 @@
+null
+memory leaks: 0
diff --git a/test/parsing/cases/nulls_and_bools.json b/test/parsing/cases/nulls_and_bools.json
new file mode 100644
index 0000000..65eb01f
--- /dev/null
+++ b/test/parsing/cases/nulls_and_bools.json
@@ -0,0 +1,5 @@
+{
+ "boolean, true": true,
+ "boolean, false": false,
+ "null": null
+}
diff --git a/test/parsing/cases/nulls_and_bools.json.gold b/test/parsing/cases/nulls_and_bools.json.gold
new file mode 100644
index 0000000..51f990b
--- /dev/null
+++ b/test/parsing/cases/nulls_and_bools.json.gold
@@ -0,0 +1,9 @@
+map open '{'
+key: 'boolean, true'
+bool: true
+key: 'boolean, false'
+bool: false
+key: 'null'
+null
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/simple.json b/test/parsing/cases/simple.json
new file mode 100644
index 0000000..9ed80c9
--- /dev/null
+++ b/test/parsing/cases/simple.json
@@ -0,0 +1,5 @@
+{
+ "this": "is",
+ "really": "simple",
+ "json": "right?"
+}
diff --git a/test/parsing/cases/simple.json.gold b/test/parsing/cases/simple.json.gold
new file mode 100644
index 0000000..80fcad2
--- /dev/null
+++ b/test/parsing/cases/simple.json.gold
@@ -0,0 +1,9 @@
+map open '{'
+key: 'this'
+string: 'is'
+key: 'really'
+string: 'simple'
+key: 'json'
+string: 'right?'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/simple_with_comments.json b/test/parsing/cases/simple_with_comments.json
new file mode 100644
index 0000000..3b79bba
--- /dev/null
+++ b/test/parsing/cases/simple_with_comments.json
@@ -0,0 +1,11 @@
+{
+ "this": "is", // ignore this
+ "really": "simple",
+ /* ignore
+this
+too * /
+** //
+(/
+******/
+ "json": "right?"
+}
diff --git a/test/parsing/cases/simple_with_comments.json.gold b/test/parsing/cases/simple_with_comments.json.gold
new file mode 100644
index 0000000..d222e9b
--- /dev/null
+++ b/test/parsing/cases/simple_with_comments.json.gold
@@ -0,0 +1,5 @@
+map open '{'
+key: 'this'
+string: 'is'
+lexical error: probable comment found in input text, comments are not enabled.
+memory leaks: 0
diff --git a/test/parsing/cases/string_invalid_escape.json b/test/parsing/cases/string_invalid_escape.json
new file mode 100644
index 0000000..c554182
--- /dev/null
+++ b/test/parsing/cases/string_invalid_escape.json
@@ -0,0 +1 @@
+["\n foo \/ bar \r\f\\\uffff\t\b\"\\ and you can't escape thi\s"]
diff --git a/test/parsing/cases/string_invalid_escape.json.gold b/test/parsing/cases/string_invalid_escape.json.gold
new file mode 100644
index 0000000..439df43
--- /dev/null
+++ b/test/parsing/cases/string_invalid_escape.json.gold
@@ -0,0 +1,3 @@
+array open '['
+lexical error: inside a string, '\' occurs before a character which it may not.
+memory leaks: 0
diff --git a/test/parsing/cases/string_invalid_hex_char.json b/test/parsing/cases/string_invalid_hex_char.json
new file mode 100644
index 0000000..bde7ee9
--- /dev/null
+++ b/test/parsing/cases/string_invalid_hex_char.json
@@ -0,0 +1 @@
+"foo foo, blah blah \u0123 \u4567 \u89ab \uc/ef \uABCD \uEFFE bar baz bing"
diff --git a/test/parsing/cases/string_invalid_hex_char.json.gold b/test/parsing/cases/string_invalid_hex_char.json.gold
new file mode 100644
index 0000000..8498792
--- /dev/null
+++ b/test/parsing/cases/string_invalid_hex_char.json.gold
@@ -0,0 +1,2 @@
+lexical error: invalid (non-hex) character occurs after '\u' inside string.
+memory leaks: 0
diff --git a/test/parsing/cases/string_with_escapes.json b/test/parsing/cases/string_with_escapes.json
new file mode 100644
index 0000000..59cc940
--- /dev/null
+++ b/test/parsing/cases/string_with_escapes.json
@@ -0,0 +1,3 @@
+["\n foo \/ bar \r\f\\\uffff\t\b\"\\",
+ "\"and this string has an escape at the beginning",
+ "and this string has no escapes" ]
diff --git a/test/parsing/cases/string_with_escapes.json.gold b/test/parsing/cases/string_with_escapes.json.gold
new file mode 100644
index 0000000..086a9dc
--- /dev/null
+++ b/test/parsing/cases/string_with_escapes.json.gold
@@ -0,0 +1,7 @@
+array open '['
+string: '
+ foo / bar \￿ "\'
+string: '"and this string has an escape at the beginning'
+string: 'and this string has no escapes'
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/string_with_invalid_newline.json b/test/parsing/cases/string_with_invalid_newline.json
new file mode 100644
index 0000000..0e3ea0d
--- /dev/null
+++ b/test/parsing/cases/string_with_invalid_newline.json
@@ -0,0 +1,2 @@
+"la di dah. this is a string, and I can do this, \n, but not this
+"
diff --git a/test/parsing/cases/string_with_invalid_newline.json.gold b/test/parsing/cases/string_with_invalid_newline.json.gold
new file mode 100644
index 0000000..c38bdef
--- /dev/null
+++ b/test/parsing/cases/string_with_invalid_newline.json.gold
@@ -0,0 +1,2 @@
+lexical error: invalid character inside string.
+memory leaks: 0
diff --git a/test/parsing/cases/three_byte_utf8.json b/test/parsing/cases/three_byte_utf8.json
new file mode 100644
index 0000000..9c9e656
--- /dev/null
+++ b/test/parsing/cases/three_byte_utf8.json
@@ -0,0 +1 @@
+{"matzue": "松江", "asakusa": "浅草"}
diff --git a/test/parsing/cases/three_byte_utf8.json.gold b/test/parsing/cases/three_byte_utf8.json.gold
new file mode 100644
index 0000000..7d95fae
--- /dev/null
+++ b/test/parsing/cases/three_byte_utf8.json.gold
@@ -0,0 +1,7 @@
+map open '{'
+key: 'matzue'
+string: '松江'
+key: 'asakusa'
+string: '浅草'
+map close '}'
+memory leaks: 0
diff --git a/test/parsing/cases/true.json b/test/parsing/cases/true.json
new file mode 100644
index 0000000..27ba77d
--- /dev/null
+++ b/test/parsing/cases/true.json
@@ -0,0 +1 @@
+true
diff --git a/test/parsing/cases/true.json.gold b/test/parsing/cases/true.json.gold
new file mode 100644
index 0000000..0858bf7
--- /dev/null
+++ b/test/parsing/cases/true.json.gold
@@ -0,0 +1,2 @@
+bool: true
+memory leaks: 0
diff --git a/test/parsing/cases/unescaped_bulgarian.json b/test/parsing/cases/unescaped_bulgarian.json
new file mode 100644
index 0000000..f9a70a6
--- /dev/null
+++ b/test/parsing/cases/unescaped_bulgarian.json
@@ -0,0 +1 @@
+["Да Му Еба Майката"]
diff --git a/test/parsing/cases/unescaped_bulgarian.json.gold b/test/parsing/cases/unescaped_bulgarian.json.gold
new file mode 100644
index 0000000..8db076e
--- /dev/null
+++ b/test/parsing/cases/unescaped_bulgarian.json.gold
@@ -0,0 +1,4 @@
+array open '['
+string: 'Да Му Еба Майката'
+array close ']'
+memory leaks: 0
diff --git a/test/parsing/cases/zerobyte.json b/test/parsing/cases/zerobyte.json
new file mode 100644
index 0000000..09c5044
--- /dev/null
+++ b/test/parsing/cases/zerobyte.json
@@ -0,0 +1 @@
+"\u0000"
diff --git a/test/parsing/cases/zerobyte.json.gold b/test/parsing/cases/zerobyte.json.gold
new file mode 100644
index 0000000..b0c58fc
--- /dev/null
+++ b/test/parsing/cases/zerobyte.json.gold
Binary files differ
diff --git a/test/parsing/run_tests.sh b/test/parsing/run_tests.sh
new file mode 100755
index 0000000..af64e15
--- /dev/null
+++ b/test/parsing/run_tests.sh
@@ -0,0 +1,94 @@
+#!/bin/sh
+
+ECHO=`which echo`
+
+DIFF_FLAGS="-u"
+case "$(uname)" in
+ *W32*)
+ DIFF_FLAGS="-wu"
+ ;;
+esac
+
+if [ -z "$testBin" ]; then
+ testBin="$1"
+fi
+
+# find test binary on both platforms. allow the caller to force a
+# particular test binary (useful for non-cmake build systems).
+if [ -z "$testBin" ]; then
+ testBin="../build/test/Release/yajl_test.exe"
+ if [ ! -x $testBin ] ; then
+ testBin="../build/test/Debug/yajl_test.exe"
+ if [ ! -x $testBin ] ; then
+ testBin="../build/test/yajl_test"
+ if [ ! -x $testBin ] ; then
+ ${ECHO} "cannot execute test binary: '$testBin'"
+ exit 1;
+ fi
+ fi
+ fi
+fi
+
+${ECHO} "using test binary: $testBin"
+
+testBinShort=`basename $testBin`
+
+testsSucceeded=0
+testsTotal=0
+
+for file in cases/*.json ; do
+ allowComments=""
+ allowGarbage=""
+ allowMultiple=""
+ allowPartials=""
+
+ # if the filename starts with dc_, we disallow comments for this test
+ case $(basename $file) in
+ ac_*)
+ allowComments="-c "
+ ;;
+ ag_*)
+ allowGarbage="-g "
+ ;;
+ am_*)
+ allowMultiple="-m ";
+ ;;
+ ap_*)
+ allowPartials="-p ";
+ ;;
+ esac
+ fileShort=`basename $file`
+ testName=`echo $fileShort | sed -e 's/\.json$//'`
+
+ ${ECHO} -n " test ($testName): "
+ iter=1
+ success="SUCCESS"
+
+ # ${ECHO} -n "$testBinShort $allowPartials$allowComments$allowGarbage$allowMultiple-b $iter < $fileShort > ${fileShort}.test : "
+ # parse with a read buffer size ranging from 1-31 to stress stream parsing
+ while [ $iter -lt 32 ] && [ $success = "SUCCESS" ] ; do
+ $testBin $allowPartials $allowComments $allowGarbage $allowMultiple -b $iter < $file > ${file}.test 2>&1
+ diff ${DIFF_FLAGS} ${file}.gold ${file}.test > ${file}.out
+ if [ $? -eq 0 ] ; then
+ if [ $iter -eq 31 ] ; then testsSucceeded=$(( $testsSucceeded + 1 )) ; fi
+ else
+ success="FAILURE"
+ iter=32
+ ${ECHO}
+ cat ${file}.out
+ fi
+ iter=$(( iter + 1 ))
+ rm ${file}.test ${file}.out
+ done
+
+ ${ECHO} $success
+ testsTotal=$(( testsTotal + 1 ))
+done
+
+${ECHO} $testsSucceeded/$testsTotal tests successful
+
+if [ $testsSucceeded != $testsTotal ] ; then
+ exit 1
+fi
+
+exit 0
diff --git a/test/parsing/yajl_test.c b/test/parsing/yajl_test.c
new file mode 100644
index 0000000..5c373d0
--- /dev/null
+++ b/test/parsing/yajl_test.c
@@ -0,0 +1,281 @@
+/*
+ * Copyright (c) 2007-2011, Lloyd Hilaiel <lloyd@hilaiel.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <yajl/yajl_parse.h>
+#include <yajl/yajl_gen.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+
+/* memory debugging routines */
+typedef struct
+{
+ unsigned int numFrees;
+ unsigned int numMallocs;
+ /* XXX: we really need a hash table here with per-allocation
+ * information */
+} yajlTestMemoryContext;
+
+/* cast void * into context */
+#define TEST_CTX(vptr) ((yajlTestMemoryContext *) (vptr))
+
+static void yajlTestFree(void * ctx, void * ptr)
+{
+ assert(ptr != NULL);
+ TEST_CTX(ctx)->numFrees++;
+ free(ptr);
+}
+
+static void * yajlTestMalloc(void * ctx, size_t sz)
+{
+ assert(sz != 0);
+ TEST_CTX(ctx)->numMallocs++;
+ return malloc(sz);
+}
+
+static void * yajlTestRealloc(void * ctx, void * ptr, size_t sz)
+{
+ if (ptr == NULL) {
+ assert(sz != 0);
+ TEST_CTX(ctx)->numMallocs++;
+ } else if (sz == 0) {
+ TEST_CTX(ctx)->numFrees++;
+ }
+
+ return realloc(ptr, sz);
+}
+
+
+/* begin parsing callback routines */
+#define BUF_SIZE 2048
+
+static int test_yajl_null(void *ctx)
+{
+ printf("null\n");
+ return 1;
+}
+
+static int test_yajl_boolean(void * ctx, int boolVal)
+{
+ printf("bool: %s\n", boolVal ? "true" : "false");
+ return 1;
+}
+
+static int test_yajl_integer(void *ctx, long long integerVal)
+{
+ printf("integer: %lld\n", integerVal);
+ return 1;
+}
+
+static int test_yajl_double(void *ctx, double doubleVal)
+{
+ printf("double: %g\n", doubleVal);
+ return 1;
+}
+
+static int test_yajl_string(void *ctx, const unsigned char * stringVal,
+ size_t stringLen)
+{
+ printf("string: '");
+ fwrite(stringVal, 1, stringLen, stdout);
+ printf("'\n");
+ return 1;
+}
+
+static int test_yajl_map_key(void *ctx, const unsigned char * stringVal,
+ size_t stringLen)
+{
+ char * str = (char *) malloc(stringLen + 1);
+ str[stringLen] = 0;
+ memcpy(str, stringVal, stringLen);
+ printf("key: '%s'\n", str);
+ free(str);
+ return 1;
+}
+
+static int test_yajl_start_map(void *ctx)
+{
+ printf("map open '{'\n");
+ return 1;
+}
+
+
+static int test_yajl_end_map(void *ctx)
+{
+ printf("map close '}'\n");
+ return 1;
+}
+
+static int test_yajl_start_array(void *ctx)
+{
+ printf("array open '['\n");
+ return 1;
+}
+
+static int test_yajl_end_array(void *ctx)
+{
+ printf("array close ']'\n");
+ return 1;
+}
+
+static yajl_callbacks callbacks = {
+ test_yajl_null,
+ test_yajl_boolean,
+ test_yajl_integer,
+ test_yajl_double,
+ NULL,
+ test_yajl_string,
+ test_yajl_start_map,
+ test_yajl_map_key,
+ test_yajl_end_map,
+ test_yajl_start_array,
+ test_yajl_end_array
+};
+
+static void usage(const char * progname)
+{
+ fprintf(stderr,
+ "usage: %s [options]\n"
+ "Parse input from stdin as JSON and ouput parsing details "
+ "to stdout\n"
+ " -b set the read buffer size\n"
+ " -c allow comments\n"
+ " -g allow *g*arbage after valid JSON text\n"
+ " -m allows the parser to consume multiple JSON values\n"
+ " from a single string separated by whitespace\n"
+ " -p partial JSON documents should not cause errors\n",
+ progname);
+ exit(1);
+}
+
+int
+main(int argc, char ** argv)
+{
+ yajl_handle hand;
+ const char * fileName;
+ static unsigned char * fileData = NULL;
+ size_t bufSize = BUF_SIZE;
+ yajl_status stat;
+ size_t rd;
+ int i, j;
+
+ /* memory allocation debugging: allocate a structure which collects
+ * statistics */
+ yajlTestMemoryContext memCtx = { 0,0 };
+
+ /* memory allocation debugging: allocate a structure which holds
+ * allocation routines */
+ yajl_alloc_funcs allocFuncs = {
+ yajlTestMalloc,
+ yajlTestRealloc,
+ yajlTestFree,
+ (void *) NULL
+ };
+
+ allocFuncs.ctx = (void *) &memCtx;
+
+ /* allocate the parser */
+ hand = yajl_alloc(&callbacks, &allocFuncs, NULL);
+
+ /* check arguments. We expect exactly one! */
+ for (i=1;i<argc;i++) {
+ if (!strcmp("-c", argv[i])) {
+ yajl_config(hand, yajl_allow_comments, 1);
+ } else if (!strcmp("-b", argv[i])) {
+ if (++i >= argc) usage(argv[0]);
+
+ /* validate integer */
+ for (j=0;j<(int)strlen(argv[i]);j++) {
+ if (argv[i][j] <= '9' && argv[i][j] >= '0') continue;
+ fprintf(stderr, "-b requires an integer argument. '%s' "
+ "is invalid\n", argv[i]);
+ usage(argv[0]);
+ }
+
+ bufSize = atoi(argv[i]);
+ if (!bufSize) {
+ fprintf(stderr, "%zu is an invalid buffer size\n",
+ bufSize);
+ }
+ } else if (!strcmp("-g", argv[i])) {
+ yajl_config(hand, yajl_allow_trailing_garbage, 1);
+ } else if (!strcmp("-m", argv[i])) {
+ yajl_config(hand, yajl_allow_multiple_values, 1);
+ } else if (!strcmp("-p", argv[i])) {
+ yajl_config(hand, yajl_allow_partial_values, 1);
+ } else {
+ fprintf(stderr, "invalid command line option: '%s'\n",
+ argv[i]);
+ usage(argv[0]);
+ }
+ }
+
+ fileData = (unsigned char *) malloc(bufSize);
+
+ if (fileData == NULL) {
+ fprintf(stderr,
+ "failed to allocate read buffer of %zu bytes, exiting.",
+ bufSize);
+ yajl_free(hand);
+ exit(2);
+ }
+
+ fileName = argv[argc-1];
+
+ for (;;) {
+ rd = fread((void *) fileData, 1, bufSize, stdin);
+
+ if (rd == 0) {
+ if (!feof(stdin)) {
+ fprintf(stderr, "error reading from '%s'\n", fileName);
+ }
+ break;
+ }
+ /* read file data, now pass to parser */
+ stat = yajl_parse(hand, fileData, rd);
+
+ if (stat != yajl_status_ok) break;
+ }
+
+ stat = yajl_complete_parse(hand);
+ if (stat != yajl_status_ok)
+ {
+ unsigned char * str = yajl_get_error(hand, 0, fileData, rd);
+ fflush(stdout);
+ fprintf(stderr, "%s", (char *) str);
+ yajl_free_error(hand, str);
+ }
+
+ yajl_free(hand);
+ free(fileData);
+
+ /* finally, print out some memory statistics */
+
+/* (lth) only print leaks here, as allocations and frees may vary depending
+ * on read buffer size, causing false failures.
+ *
+ * printf("allocations:\t%u\n", memCtx.numMallocs);
+ * printf("frees:\t\t%u\n", memCtx.numFrees);
+*/
+ fflush(stderr);
+ fflush(stdout);
+ printf("memory leaks:\t%u\n", memCtx.numMallocs - memCtx.numFrees);
+
+ return 0;
+}