diff options
Diffstat (limited to 'test/parsing')
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 Binary files differnew file mode 100644 index 0000000..b0c58fc --- /dev/null +++ b/test/parsing/cases/zerobyte.json.gold 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; +} |