summary refs log tree commit diff stats
path: root/tests/stdlib/tjsontestsuite.nim
blob: 06f783a7310c100957af6d0f7700b35902a3693f (plain) (blame)
1
2
3
4
5
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#!/bin/sh
# Translate given Mu files with debug information on Linux.
#
# (You _could_ do something similar on other platforms using emulation. But I
# often find that to be too slow.)

set -e

cat $* [0-9]*.mu    |apps/mu    > a.subx

./translate_subx_debug init.linux [0-9]*.subx mu-init.subx a.subx
#n207'>207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
## JSON tests based on https://github.com/nst/JSONTestSuite

import unittest,
  json,
  strutils

let parsing_testdata = {
  "i_number_neg_int_huge_exp": """[-1e+9999]""",
  "i_number_pos_double_huge_exp": """[1.5e+9999]""",
  "i_object_key_lone_2nd_surrogate": """{"\uDFAA":0}""",
  "i_string_1st_surrogate_but_2nd_missing": """["\uDADA"]""",
  "i_string_1st_valid_surrogate_2nd_invalid": """["\uD888\u1234"]""",
  "i_string_incomplete_surrogate_and_escape_valid": """["\uD800\n"]""",
  "i_string_incomplete_surrogate_pair": """["\uDd1ea"]""",
  "i_string_incomplete_surrogates_escape_valid": """["\uD800\uD800\n"]""",
  "i_string_inverted_surrogates_U+1D11E": """["\uDd1e\uD834"]""",
  "i_string_lone_second_surrogate": """["\uDFAA"]""",
  "i_string_not_in_unicode_range": """["����"]""",
  "i_string_truncated-utf-8": """["��"]""",
  "i_string_unicode_U+10FFFE_nonchar": """["\uDBFF\uDFFE"]""",
  "i_string_unicode_U+1FFFE_nonchar": """["\uD83F\uDFFE"]""",
  "i_string_unicode_U+FDD0_nonchar": """["\uFDD0"]""",
  "i_string_unicode_U+FFFE_nonchar": """["\uFFFE"]""",
  "i_string_UTF-16_invalid_lonely_surrogate": """["\ud800"]""",
  "i_string_UTF-16_invalid_surrogate": """["\ud800abc"]""",
  "i_string_UTF-8_invalid_sequence": """["日ш�"]""",
  "i_structure_500_nested_arrays": """[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]""",
  "i_structure_UTF-8_BOM_empty_object": """{}""",
  "n_array_1_true_without_comma": """[1 true]""",
  "n_array_a_invalid_utf8": """[a�]""",
  "n_array_colon_instead_of_comma": """["": 1]""",
  "n_array_comma_after_close": """[""],""",
  "n_array_comma_and_number": """[,1]""",
  "n_array_double_comma": """[1,,2]""",
  "n_array_double_extra_comma": """["x",,]""",
  "n_array_extra_close": """["x"]]""",
  "n_array_extra_comma": """["",]""",
  "n_array_incomplete_invalid_value": """[x""",
  "n_array_incomplete": """["x"""",
  "n_array_inner_array_no_comma": """[3[4]]""",
  "n_array_invalid_utf8": """[�]""",
  "n_array_items_separated_by_semicolon": """[1:2]""",
  "n_array_just_comma": """[,]""",
  "n_array_just_minus": """[-]""",
  "n_array_missing_value": """[   , ""]""",
  "n_array_newlines_unclosed": """["a",""",
  "n_array_newlines_unclosed": """4""",
  "n_array_newlines_unclosed": """,1,""",
  "n_array_number_and_comma": """[1,]""",
  "n_array_number_and_several_commas": """[1,,]""",
  "n_array_spaces_vertical_tab_formfeed": """["a"\f]""",
  "n_array_star_inside": """[*]""",
  "n_array_unclosed": """[""""",
  "n_array_unclosed_trailing_comma": """[1,""",
  "n_array_unclosed_with_new_lines": """[1,""",
  "n_array_unclosed_with_new_lines": """1""",
  "n_array_unclosed_with_new_lines": """,1""",
  "n_array_unclosed_with_object_inside": """[{}""",
  "n_incomplete_false": """[fals]""",
  "n_incomplete_null": """[nul]""",
  "n_incomplete_true": """[tru]""",
  "n_number_0.1.2": """[0.1.2]""",
  "n_number_-01": """[-01]""",
  "n_number_0.3e": """[0.3e]""",
  "n_number_0.3e+": """[0.3e+]""",
  "n_number_0_capital_E": """[0E]""",
  "n_number_0_capital_E+": """[0E+]""",
  "n_number_0.e1": """[0.e1]""",
  "n_number_0e": """[0e]""",
  "n_number_0e+": """[0e+]""",
  "n_number_1_000": """[1 000.0]""",
  "n_number_1.0e-": """[1.0e-]""",
  "n_number_1.0e": """[1.0e]""",
  "n_number_1.0e+": """[1.0e+]""",
  "n_number_-1.0.": """[-1.0.]""",
  "n_number_1eE2": """[1eE2]""",
  "n_number_.-1": """[.-1]""",
  "n_number_+1": """[+1]""",
  "n_number_.2e-3": """[.2e-3]""",
  "n_number_2.e-3": """[2.e-3]""",
  "n_number_2.e+3": """[2.e+3]""",
  "n_number_2.e3": """[2.e3]""",
  "n_number_-2.": """[-2.]""",
  "n_number_9.e+": """[9.e+]""",
  "n_number_expression": """[1+2]""",
  "n_number_hex_1_digit": """[0x1]""",
  "n_number_hex_2_digits": """[0x42]""",
  "n_number_infinity": """[Infinity]""",
  "n_number_+Inf": """[+Inf]""",
  "n_number_Inf": """[Inf]""",
  "n_number_invalid+-": """[0e+-1]""",
  "n_number_invalid-negative-real": """[-123.123foo]""",
  "n_number_invalid-utf-8-in-bigger-int": """[123�]""",
  "n_number_invalid-utf-8-in-exponent": """[1e1�]""",
  "n_number_invalid-utf-8-in-int": """[0�]""",
  "n_number_++": """[++1234]""",
  "n_number_minus_infinity": """[-Infinity]""",
  "n_number_minus_sign_with_trailing_garbage": """[-foo]""",
  "n_number_minus_space_1": """[- 1]""",
  "n_number_-NaN": """[-NaN]""",
  "n_number_NaN": """[NaN]""",
  "n_number_neg_int_starting_with_zero": """[-012]""",
  "n_number_neg_real_without_int_part": """[-.123]""",
  "n_number_neg_with_garbage_at_end": """[-1x]""",
  "n_number_real_garbage_after_e": """[1ea]""",
  "n_number_real_with_invalid_utf8_after_e": """[1e�]""",
  "n_number_real_without_fractional_part": """[1.]""",
  "n_number_starting_with_dot": """[.123]""",
  "n_number_then_00": """1\x00""",
  "n_number_U+FF11_fullwidth_digit_one": """[1]""",
  "n_number_with_alpha_char": """[1.8011670033376514H-308]""",
  "n_number_with_alpha": """[1.2a-3]""",
  "n_number_with_leading_zero": """[012]""",
  "n_object_bad_value": """["x", truth]""",
  "n_object_bracket_key": """{[: "x"}""",
  "n_object_comma_instead_of_colon": """{"x", null}""",
  "n_object_double_colon": """{"x"::"b"}""",
  "n_object_emoji": """{🇨🇭}""",
  "n_object_garbage_at_end": """{"a":"a" 123}""",
  "n_object_key_with_single_quotes": """{key: 'value'}""",
  "n_object_missing_colon": """{"a" b}""",
  "n_object_missing_key": """{:"b"}""",
  "n_object_missing_semicolon": """{"a" "b"}""",
  "n_object_missing_value": """{"a":""",
  "n_object_no-colon": """{"a"""",
  "n_object_non_string_key_but_huge_number_instead": """{9999E9999:1}""",
  "n_object_non_string_key": """{1:1}""",
  "n_object_pi_in_key_and_trailing_comma": """{"�":"0",}""",
  "n_object_repeated_null_null": """{null:null,null:null}""",
  "n_object_several_trailing_commas": """{"id":0,,,,,}""",
  "n_object_single_quote": """{'a':0}""",
  "n_object_trailing_comma": """{"id":0,}""",
  "n_object_trailing_comment": """{"a":"b"}/**/""",
  "n_object_trailing_comment_open": """{"a":"b"}/**//""",
  "n_object_trailing_comment_slash_open_incomplete": """{"a":"b"}/""",
  "n_object_trailing_comment_slash_open": """{"a":"b"}//""",
  "n_object_two_commas_in_a_row": """{"a":"b",,"c":"d"}""",
  "n_object_unquoted_key": """{a: "b"}""",
  "n_object_unterminated-value": """{"a":"a""",
  "n_object_with_single_string": """{ "foo" : "bar", "a" }""",
  "n_object_with_trailing_garbage": """{"a":"b"}#""",
  "n_single_space": """ """,
  "n_string_1_surrogate_then_escape": """["\uD800\"]""",
  "n_string_1_surrogate_then_escape u1": """["\uD800\u1"]""",
  "n_string_1_surrogate_then_escape u1x": """["\uD800\u1x"]""",
  "n_string_1_surrogate_then_escape u": """["\uD800\u"]""",
  "n_string_accentuated_char_no_quotes": """[é]""",
  "n_string_backslash_00": """["\\x00"]""",
  "n_string_escaped_backslash_bad": """["\\\"]""",
  "n_string_escaped_ctrl_char_tab": """["\	"]""",
  "n_string_escaped_emoji": """["\🌀"]""",
  "n_string_escape_x": """["\x00"]""",
  "n_string_incomplete_escaped_character": """["\u00A"]""",
  "n_string_incomplete_escape": """["\"]""",
  "n_string_incomplete_surrogate_escape_invalid": """["\uD800\uD800\x"]""",
  "n_string_invalid_backslash_esc": """["\a"]""",
  "n_string_invalid_unicode_escape": """["\uqqqq"]""",
  "n_string_invalid_utf8_after_escape": """["\�"]""",
  "n_string_invalid-utf-8-in-escape": """["\u�"]""",
  "n_string_invalid_utf-8": """["�"]""",
  "n_string_iso_latin_1": """["�"]""",
  "n_string_leading_uescaped_thinspace": """[\u0020"asd"]""",
  "n_string_lone_utf8_continuation_byte": """["�"]""",
  "n_string_no_quotes_with_bad_escape": """[\n]""",
  "n_string_overlong_sequence_2_bytes": """["��"]""",
  "n_string_overlong_sequence_6_bytes": """["������"]""",
  "n_string_overlong_sequence_6_bytes_null": """["������"]""",
  "n_string_single_doublequote": """"""",
  "n_string_single_quote": """['single quote']""",
  "n_string_single_string_no_double_quotes": """abc""",
  "n_string_start_escape_unclosed": """["\""",
  "n_string_unescaped_ctrl_char": """["a\x00a"]""",
  "n_string_unescaped_newline": """["new
line"]""",
  "n_string_unescaped_tab": """["	"]""",
  "n_string_unicode_CapitalU": """"\UA66D"""",
  "n_string_UTF-16_incomplete_surrogate": """["\uD834\uDd"]""",
  "n_string_UTF8_surrogate_U+D800": """["���"]""",
  "n_string_with_trailing_garbage": """""x""",
  "n_structure_array_trailing_garbage": """[1]x""",
  "n_structure_array_with_extra_array_close": """[1]]""",
  "n_structure_array_with_unclosed_string": """["asd]""",
  "n_structure_ascii-unicode-identifier": """""",
  "n_structure_capitalized_True": """[True]""",
  "n_structure_close_unopened_array": """1]""",
  "n_structure_comma_instead_of_closing_brace": """{"x": true,""",
  "n_structure_double_array": """[][]""",
  "n_structure_end_array": """]""",
  "n_structure_incomplete_UTF8_BOM": """�{}""",
  "n_structure_<.>": """<.>""",
  "n_structure_lone-invalid-utf-8": """""",
  "n_structure_lone-open-bracket": """[""",
  "n_structure_null-byte-outside-string": """[\00]""",
  "n_structure_<null>": """[<null>]""",
  "n_structure_number_with_trailing_garbage": """2@""",
  "n_structure_object_followed_by_closing_object": """{}}""",
  "n_structure_object_unclosed_no_value": """{"":""",
  "n_structure_object_with_comment": """{"a":/*comment*/"b"}""",
  "n_structure_object_with_trailing_garbage": """{"a": true} "x"""",
  "n_structure_open_array_apostrophe": """['""",
  "n_structure_open_array_comma": """[,""",
  "n_structure_open_array_open_object": """[{""",
  "n_structure_open_array_open_string": """["a""",
  "n_structure_open_array_string": """["a"""",
  "n_structure_open_object_close_array": """{]""",
  "n_structure_open_object_comma": """{,""",
  "n_structure_open_object": """{""",
  "n_structure_open_object_open_array": """{[""",
  "n_structure_open_object_open_string": """{"a""",
  "n_structure_open_object_string_with_apostrophes": """{'a'""",
  "n_structure_open_open": """["\{["\{["\{["\{""",
  "n_structure_single_point": """""",
  "n_structure_single_star": """*""",
  "n_structure_trailing_#": """{"a":"b"}#{}""",
  "n_structure_U+2060_word_joined": """[⁠]""",
  "n_structure_uescaped_LF_before_string": """[\u000A""]""",
  "n_structure_unclosed_array": """[1""",
  "n_structure_unclosed_array_partial_null": """[ false, nul""",
  "n_structure_unclosed_array_unfinished_false": """[ true, fals""",
  "n_structure_unclosed_array_unfinished_true": """[ false, tru""",
  "n_structure_unclosed_object": """{"asd":"asd"""",
  "n_structure_unicode-identifier": """å""",
  "n_structure_UTF8_BOM_no_data": """""",
  "n_structure_whitespace_formfeed": """[]""",
  "n_structure_whitespace_U+2060_word_joiner": """[⁠]""",
  "y_array_arraysWithSpaces": """[[]   ]""",
  "y_array_empty": """[]""",
  "y_array_empty-string": """[""]""",
  "y_array_ending_with_newline": """["a"]""",
  "y_array_false": """[false]""",
  "y_array_heterogeneous": """[null, 1, "1", {}]""",
  "y_array_null": """[null]""",
  "y_array_with_1_and_newline": """[1
]""",
  "y_array_with_leading_space": """ [1]""",
  "y_array_with_several_null": """[1,null,null,null,2]""",
  "y_array_with_trailing_space": """[2] """,
  "y_number_0e+1": """[0e+1]""",
  "y_number_0e1": """[0e1]""",
  "y_number_after_space": """[ 4]""",
  "y_number_double_close_to_zero": """[-0.000000000000000000000000000000000000000000000000000000000000000000000000000001]""",
  "y_number_double_huge_neg_exp": """[123.456e-789]""",
  "y_number_huge_exp": """[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006]""",
  "y_number_int_with_exp": """[20e1]""",
  "y_number": """[123e65]""",
  "y_number_minus_zero": """[-0]""",
  "y_number_negative_int": """[-123]""",
  "y_number_negative_one": """[-1]""",
  "y_number_negative_zero": """[-0]""",
  "y_number_real_capital_e": """[1E22]""",
  "y_number_real_capital_e_neg_exp": """[1E-2]""",
  "y_number_real_capital_e_pos_exp": """[1E+2]""",
  "y_number_real_exponent": """[123e45]""",
  "y_number_real_fraction_exponent": """[123.456e78]""",
  "y_number_real_neg_exp": """[1e-2]""",
  "y_number_real_neg_overflow": """[-123123e100000]""",
  "y_number_real_pos_exponent": """[1e+2]""",
  "y_number_real_pos_overflow": """[123123e100000]""",
  "y_number_real_underflow": """[123e-10000000]""",
  "y_number_simple_int": """[123]""",
  "y_number_simple_real": """[123.456789]""",
  "y_number_too_big_neg_int": """[-123123123123123123123123123123]""",
  "y_number_too_big_pos_int": """[100000000000000000000]""",
  "y_number_very_big_negative_int": """[-237462374673276894279832749832423479823246327846]""",
  "y_object_basic": """{"asd":"sdf"}""",
  "y_object_duplicated_key_and_value": """{"a":"b","a":"b"}""",
  "y_object_duplicated_key": """{"a":"b","a":"c"}""",
  "y_object_empty": """{}""",
  "y_object_empty_key": """{"":0}""",
  "y_object_escaped_null_in_key": """{"foo\u0000bar": 42}""",
  "y_object_extreme_numbers": """{ "min": -1.0e+28, "max": 1.0e+28 }""",
  "y_object": """{"asd":"sdf", "dfg":"fgh"}""",
  "y_object_long_strings": """{"x":[{"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}""",
  "y_object_simple": """{"a":[]}""",
  "y_object_string_unicode": """{"title":"\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0417\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430" }""",
  "y_object_with_newlines": """{
"a": "b"
}""",
  "y_string_1_2_3_bytes_UTF-8_sequences": """["\u0060\u012a\u12AB"]""",
  "y_string_accepted_surrogate_pair": """["\uD801\udc37"]""",
  "y_string_accepted_surrogate_pairs": """["\ud83d\ude39\ud83d\udc8d"]""",
  "y_string_allowed_escapes": """["\"\\\/\b\f\n\r\t"]""",
  "y_string_backslash_and_u_escaped_zero": """["\\u0000"]""",
  "y_string_backslash_doublequotes": """["\""]""",
  "y_string_comments": """["a/*b*/c/*d//e"]""",
  "y_string_double_escape_a": """["\\a"]""",
  "y_string_double_escape_n": """["\\n"]""",
  "y_string_escaped_control_character": """["\u0012"]""",
  "y_string_escaped_noncharacter": """["\uFFFF"]""",
  "y_string_in_array": """["asd"]""",
  "y_string_in_array_with_leading_space": """[ "asd"]""",
  "y_string_last_surrogates_1_and_2": """["\uDBFF\uDFFF"]""",
  "y_string_newline_uescaped": """["new\u00A0line"]""",
  "y_string_nonCharacterInUTF-8_U+10FFFF": """["􏿿"]""",
  "y_string_nonCharacterInUTF-8_U+1FFFF": """["𛿿"]""",
  "y_string_nonCharacterInUTF-8_U+FFFF": """["￿"]""",
  "y_string_null_escape": """["\u0000"]""",
  "y_string_one-byte-utf-8": """["\u002c"]""",
  "y_string_pi": """["π"]""",
  "y_string_simple_ascii": """["asd "]""",
  "y_string_space": """" """",
  "y_string_three-byte-utf-8": """["\u0821"]""",
  "y_string_two-byte-utf-8": """["\u0123"]""",
  "y_string_u+2028_line_sep": """["
"]""",
  "y_string_u+2029_par_sep": """["
"]""",
  "y_string_uEscape": """["\u0061\u30af\u30EA\u30b9"]""",
  "y_string_unescaped_char_delete": """[""]""",
  "y_string_unicode_2": """["⍂㈴⍂"]""",
  "y_string_unicodeEscapedBackslash": """["\u005C"]""",
  "y_string_unicode_escaped_double_quote": """["\u0022"]""",
  "y_string_unicode": """["\uA66D"]""",
  "y_string_unicode_U+200B_ZERO_WIDTH_SPACE": """["\u200B"]""",
  "y_string_unicode_U+2064_invisible_plus": """["\u2064"]""",
  "y_string_UTF-16_Surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF": """["\uD834\uDd1e"]""",
  "y_string_utf8": """["€𝄞"]""",
  "y_string_with_del_character": """["aa"]""",
  "y_structure_lonely_false": """false""",
  "y_structure_lonely_int": """42""",
  "y_structure_lonely_negative_real": """-0.1""",
  "y_structure_lonely_null": """null""",
  "y_structure_lonely_string": """"asd"""",
  "y_structure_lonely_true": """true""",
  "y_structure_string_empty": """""""",
  "y_structure_trailing_newline": """["a"]""",
  "y_structure_true_in_array": """[true]""",
  "y_structure_whitespace_array": """ [] """,
}


suite "JSON":

  test "Multiple parsing tests":
    var test_is_failed = false
    for test_item in parsing_testdata:

      let name = test_item[0]
      let data = test_item[1]
      var
        parsed_successfully = false
        parsed: JsonNode
        exception_while_parsing = ""
        exception_while_rendering = ""

      try:
        parsed = parseJson(data)
        parsed_successfully = true
      except:
        exception_while_parsing = getCurrentExceptionMsg()


      proc echo_summary(msg: string) =
        var rendered = ""
        var render_successfully = false
        if parsed_successfully:
          try:
            rendered = $parsed
            render_successfully = true
          except:
            rendered = "[Fail to render:<$#>]" % getCurrentExceptionMsg()
        else:
          rendered = "<$#>" % exception_while_parsing

        echo name, repeat(' ', 60 - name.len), "[$#]" % msg, " ", rendered

      case name[0]
      of 'y':
        # Tests starting with y_ must parse
        if not parsed_successfully:
          echo_summary "Failed to parse"
          test_is_failed = true
      of 'n':
        # Tests starting with n_ should not parse
        if parsed_successfully:
          echo_summary "Failed to raise exception"
      of 'i':
        if parsed_successfully:
          echo_summary "OK"
        else:
          echo_summary "Not parsed"

      else: discard

    # FIXME: temporarily disabled until "y_" tests will succeed
    # if test_is_failed: fail()