aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-13 06:16:12 +0100
committereunhhu <[email protected]>2026-10-13 06:16:12 +0100
commite0276bfa9fd4bb418d0f82e12f09069629185863 (patch)
treeac7e40c8fa5388ae7d3c97a6b27512d62e9fab36
parent8568c8732ca36673b073688bdf99cc25d6b8065a (diff)
downloadpure-e0276bfa9fd4bb418d0f82e12f09069629185863.tar.gz
pure-e0276bfa9fd4bb418d0f82e12f09069629185863.zip
Research 140, 027's stage 2a measured: whether bytes are JSON (aup's examples/json.aup, 80 lines against the same design's 90 in Python): JSONTestSuite's 95 y_ cases taken and 188 n_ refused, 21 of the 35 i_ taken, the three paths alike, in make check (module_specs, the 316 small cases in tests/specs/json under their MIT license, the two large ones made and hashed); 116 times C's time and 1.2 times plain Python's (299 ns a byte, 339 instructions); && and || made to decide alone (writing it, i < n && d[i] read past the end) with AND and OR kept where the right side cannot fail, every other module byte for byte the same; SHA-256 again with formats and joined bytes, 42 lines and 159 times C
-rw-r--r--docs/design/027-computation-core.md11
-rw-r--r--docs/research/140-spec-suite.md41
-rw-r--r--research/experiments/044-specs/2026-10-13-stage2a.jsonl8
-rw-r--r--research/experiments/044-specs/json_check.py115
-rw-r--r--research/experiments/044-specs/json_time.c132
-rw-r--r--tests/check.py74
-rw-r--r--tests/specs/json/LICENSE21
-rw-r--r--tests/specs/json/README.md9
-rw-r--r--tests/specs/json/i_number_double_huge_neg_exp.json1
-rw-r--r--tests/specs/json/i_number_huge_exp.json1
-rwxr-xr-xtests/specs/json/i_number_neg_int_huge_exp.json1
-rwxr-xr-xtests/specs/json/i_number_pos_double_huge_exp.json1
-rw-r--r--tests/specs/json/i_number_real_neg_overflow.json1
-rw-r--r--tests/specs/json/i_number_real_pos_overflow.json1
-rw-r--r--tests/specs/json/i_number_real_underflow.json1
-rw-r--r--tests/specs/json/i_number_too_big_neg_int.json1
-rw-r--r--tests/specs/json/i_number_too_big_pos_int.json1
-rwxr-xr-xtests/specs/json/i_number_very_big_negative_int.json1
-rw-r--r--tests/specs/json/i_object_key_lone_2nd_surrogate.json1
-rw-r--r--tests/specs/json/i_string_1st_surrogate_but_2nd_missing.json1
-rw-r--r--tests/specs/json/i_string_1st_valid_surrogate_2nd_invalid.json1
-rw-r--r--tests/specs/json/i_string_UTF-16LE_with_BOM.jsonbin0 -> 12 bytes
-rwxr-xr-xtests/specs/json/i_string_UTF-8_invalid_sequence.json1
-rw-r--r--tests/specs/json/i_string_UTF8_surrogate_U+D800.json1
-rwxr-xr-xtests/specs/json/i_string_incomplete_surrogate_and_escape_valid.json1
-rwxr-xr-xtests/specs/json/i_string_incomplete_surrogate_pair.json1
-rwxr-xr-xtests/specs/json/i_string_incomplete_surrogates_escape_valid.json1
-rwxr-xr-xtests/specs/json/i_string_invalid_lonely_surrogate.json1
-rwxr-xr-xtests/specs/json/i_string_invalid_surrogate.json1
-rw-r--r--tests/specs/json/i_string_invalid_utf-8.json1
-rwxr-xr-xtests/specs/json/i_string_inverted_surrogates_U+1D11E.json1
-rw-r--r--tests/specs/json/i_string_iso_latin_1.json1
-rw-r--r--tests/specs/json/i_string_lone_second_surrogate.json1
-rw-r--r--tests/specs/json/i_string_lone_utf8_continuation_byte.json1
-rw-r--r--tests/specs/json/i_string_not_in_unicode_range.json1
-rw-r--r--tests/specs/json/i_string_overlong_sequence_2_bytes.json1
-rwxr-xr-xtests/specs/json/i_string_overlong_sequence_6_bytes.json1
-rwxr-xr-xtests/specs/json/i_string_overlong_sequence_6_bytes_null.json1
-rw-r--r--tests/specs/json/i_string_truncated-utf-8.json1
-rw-r--r--tests/specs/json/i_string_utf16BE_no_BOM.jsonbin0 -> 10 bytes
-rw-r--r--tests/specs/json/i_string_utf16LE_no_BOM.jsonbin0 -> 10 bytes
-rw-r--r--tests/specs/json/i_structure_500_nested_arrays.json1
-rwxr-xr-xtests/specs/json/i_structure_UTF-8_BOM_empty_object.json1
-rw-r--r--tests/specs/json/n_array_1_true_without_comma.json1
-rw-r--r--tests/specs/json/n_array_a_invalid_utf8.json1
-rw-r--r--tests/specs/json/n_array_colon_instead_of_comma.json1
-rw-r--r--tests/specs/json/n_array_comma_after_close.json1
-rwxr-xr-xtests/specs/json/n_array_comma_and_number.json1
-rwxr-xr-xtests/specs/json/n_array_double_comma.json1
-rw-r--r--tests/specs/json/n_array_double_extra_comma.json1
-rw-r--r--tests/specs/json/n_array_extra_close.json1
-rw-r--r--tests/specs/json/n_array_extra_comma.json1
-rw-r--r--tests/specs/json/n_array_incomplete.json1
-rw-r--r--tests/specs/json/n_array_incomplete_invalid_value.json1
-rw-r--r--tests/specs/json/n_array_inner_array_no_comma.json1
-rw-r--r--tests/specs/json/n_array_invalid_utf8.json1
-rwxr-xr-xtests/specs/json/n_array_items_separated_by_semicolon.json1
-rwxr-xr-xtests/specs/json/n_array_just_comma.json1
-rwxr-xr-xtests/specs/json/n_array_just_minus.json1
-rw-r--r--tests/specs/json/n_array_missing_value.json1
-rw-r--r--tests/specs/json/n_array_newlines_unclosed.json3
-rwxr-xr-xtests/specs/json/n_array_number_and_comma.json1
-rwxr-xr-xtests/specs/json/n_array_number_and_several_commas.json1
-rwxr-xr-xtests/specs/json/n_array_spaces_vertical_tab_formfeed.json1
-rwxr-xr-xtests/specs/json/n_array_star_inside.json1
-rw-r--r--tests/specs/json/n_array_unclosed.json1
-rw-r--r--tests/specs/json/n_array_unclosed_trailing_comma.json1
-rw-r--r--tests/specs/json/n_array_unclosed_with_new_lines.json3
-rw-r--r--tests/specs/json/n_array_unclosed_with_object_inside.json1
-rw-r--r--tests/specs/json/n_incomplete_false.json1
-rw-r--r--tests/specs/json/n_incomplete_null.json1
-rw-r--r--tests/specs/json/n_incomplete_true.json1
-rw-r--r--tests/specs/json/n_multidigit_number_then_00.jsonbin0 -> 4 bytes
-rw-r--r--tests/specs/json/n_number_++.json1
-rwxr-xr-xtests/specs/json/n_number_+1.json1
-rwxr-xr-xtests/specs/json/n_number_+Inf.json1
-rwxr-xr-xtests/specs/json/n_number_-01.json1
-rwxr-xr-xtests/specs/json/n_number_-1.0..json1
-rwxr-xr-xtests/specs/json/n_number_-2..json1
-rwxr-xr-xtests/specs/json/n_number_-NaN.json1
-rw-r--r--tests/specs/json/n_number_.-1.json1
-rwxr-xr-xtests/specs/json/n_number_.2e-3.json1
-rwxr-xr-xtests/specs/json/n_number_0.1.2.json1
-rw-r--r--tests/specs/json/n_number_0.3e+.json1
-rw-r--r--tests/specs/json/n_number_0.3e.json1
-rw-r--r--tests/specs/json/n_number_0.e1.json1
-rw-r--r--tests/specs/json/n_number_0_capital_E+.json1
-rwxr-xr-xtests/specs/json/n_number_0_capital_E.json1
-rw-r--r--tests/specs/json/n_number_0e+.json1
-rw-r--r--tests/specs/json/n_number_0e.json1
-rwxr-xr-xtests/specs/json/n_number_1.0e+.json1
-rwxr-xr-xtests/specs/json/n_number_1.0e-.json1
-rwxr-xr-xtests/specs/json/n_number_1.0e.json1
-rwxr-xr-xtests/specs/json/n_number_1_000.json1
-rwxr-xr-xtests/specs/json/n_number_1eE2.json1
-rwxr-xr-xtests/specs/json/n_number_2.e+3.json1
-rwxr-xr-xtests/specs/json/n_number_2.e-3.json1
-rwxr-xr-xtests/specs/json/n_number_2.e3.json1
-rw-r--r--tests/specs/json/n_number_9.e+.json1
-rwxr-xr-xtests/specs/json/n_number_Inf.json1
-rwxr-xr-xtests/specs/json/n_number_NaN.json1
-rw-r--r--tests/specs/json/n_number_U+FF11_fullwidth_digit_one.json1
-rw-r--r--tests/specs/json/n_number_expression.json1
-rw-r--r--tests/specs/json/n_number_hex_1_digit.json1
-rw-r--r--tests/specs/json/n_number_hex_2_digits.json1
-rwxr-xr-xtests/specs/json/n_number_infinity.json1
-rw-r--r--tests/specs/json/n_number_invalid+-.json1
-rw-r--r--tests/specs/json/n_number_invalid-negative-real.json1
-rw-r--r--tests/specs/json/n_number_invalid-utf-8-in-bigger-int.json1
-rw-r--r--tests/specs/json/n_number_invalid-utf-8-in-exponent.json1
-rw-r--r--tests/specs/json/n_number_invalid-utf-8-in-int.json1
-rwxr-xr-xtests/specs/json/n_number_minus_infinity.json1
-rw-r--r--tests/specs/json/n_number_minus_sign_with_trailing_garbage.json1
-rw-r--r--tests/specs/json/n_number_minus_space_1.json1
-rw-r--r--tests/specs/json/n_number_neg_int_starting_with_zero.json1
-rwxr-xr-xtests/specs/json/n_number_neg_real_without_int_part.json1
-rw-r--r--tests/specs/json/n_number_neg_with_garbage_at_end.json1
-rw-r--r--tests/specs/json/n_number_real_garbage_after_e.json1
-rw-r--r--tests/specs/json/n_number_real_with_invalid_utf8_after_e.json1
-rwxr-xr-xtests/specs/json/n_number_real_without_fractional_part.json1
-rwxr-xr-xtests/specs/json/n_number_starting_with_dot.json1
-rw-r--r--tests/specs/json/n_number_with_alpha.json1
-rw-r--r--tests/specs/json/n_number_with_alpha_char.json1
-rwxr-xr-xtests/specs/json/n_number_with_leading_zero.json1
-rw-r--r--tests/specs/json/n_object_bad_value.json1
-rw-r--r--tests/specs/json/n_object_bracket_key.json1
-rw-r--r--tests/specs/json/n_object_comma_instead_of_colon.json1
-rw-r--r--tests/specs/json/n_object_double_colon.json1
-rw-r--r--tests/specs/json/n_object_emoji.json1
-rw-r--r--tests/specs/json/n_object_garbage_at_end.json1
-rwxr-xr-xtests/specs/json/n_object_key_with_single_quotes.json1
-rw-r--r--tests/specs/json/n_object_lone_continuation_byte_in_key_and_trailing_comma.json1
-rw-r--r--tests/specs/json/n_object_missing_colon.json1
-rwxr-xr-xtests/specs/json/n_object_missing_key.json1
-rwxr-xr-xtests/specs/json/n_object_missing_semicolon.json1
-rw-r--r--tests/specs/json/n_object_missing_value.json1
-rw-r--r--tests/specs/json/n_object_no-colon.json1
-rwxr-xr-xtests/specs/json/n_object_non_string_key.json1
-rwxr-xr-xtests/specs/json/n_object_non_string_key_but_huge_number_instead.json1
-rwxr-xr-xtests/specs/json/n_object_repeated_null_null.json1
-rwxr-xr-xtests/specs/json/n_object_several_trailing_commas.json1
-rw-r--r--tests/specs/json/n_object_single_quote.json1
-rwxr-xr-xtests/specs/json/n_object_trailing_comma.json1
-rw-r--r--tests/specs/json/n_object_trailing_comment.json1
-rw-r--r--tests/specs/json/n_object_trailing_comment_open.json1
-rw-r--r--tests/specs/json/n_object_trailing_comment_slash_open.json1
-rw-r--r--tests/specs/json/n_object_trailing_comment_slash_open_incomplete.json1
-rwxr-xr-xtests/specs/json/n_object_two_commas_in_a_row.json1
-rw-r--r--tests/specs/json/n_object_unquoted_key.json1
-rw-r--r--tests/specs/json/n_object_unterminated-value.json1
-rw-r--r--tests/specs/json/n_object_with_single_string.json1
-rw-r--r--tests/specs/json/n_object_with_trailing_garbage.json1
-rwxr-xr-xtests/specs/json/n_single_space.json1
-rw-r--r--tests/specs/json/n_string_1_surrogate_then_escape.json1
-rw-r--r--tests/specs/json/n_string_1_surrogate_then_escape_u.json1
-rw-r--r--tests/specs/json/n_string_1_surrogate_then_escape_u1.json1
-rw-r--r--tests/specs/json/n_string_1_surrogate_then_escape_u1x.json1
-rw-r--r--tests/specs/json/n_string_accentuated_char_no_quotes.json1
-rw-r--r--tests/specs/json/n_string_backslash_00.jsonbin0 -> 6 bytes
-rw-r--r--tests/specs/json/n_string_escape_x.json1
-rwxr-xr-xtests/specs/json/n_string_escaped_backslash_bad.json1
-rw-r--r--tests/specs/json/n_string_escaped_ctrl_char_tab.json1
-rw-r--r--tests/specs/json/n_string_escaped_emoji.json1
-rwxr-xr-xtests/specs/json/n_string_incomplete_escape.json1
-rwxr-xr-xtests/specs/json/n_string_incomplete_escaped_character.json1
-rwxr-xr-xtests/specs/json/n_string_incomplete_surrogate.json1
-rwxr-xr-xtests/specs/json/n_string_incomplete_surrogate_escape_invalid.json1
-rw-r--r--tests/specs/json/n_string_invalid-utf-8-in-escape.json1
-rwxr-xr-xtests/specs/json/n_string_invalid_backslash_esc.json1
-rw-r--r--tests/specs/json/n_string_invalid_unicode_escape.json1
-rw-r--r--tests/specs/json/n_string_invalid_utf8_after_escape.json1
-rwxr-xr-xtests/specs/json/n_string_leading_uescaped_thinspace.json1
-rw-r--r--tests/specs/json/n_string_no_quotes_with_bad_escape.json1
-rwxr-xr-xtests/specs/json/n_string_single_doublequote.json1
-rw-r--r--tests/specs/json/n_string_single_quote.json1
-rwxr-xr-xtests/specs/json/n_string_single_string_no_double_quotes.json1
-rw-r--r--tests/specs/json/n_string_start_escape_unclosed.json1
-rwxr-xr-xtests/specs/json/n_string_unescaped_ctrl_char.jsonbin0 -> 7 bytes
-rw-r--r--tests/specs/json/n_string_unescaped_newline.json2
-rw-r--r--tests/specs/json/n_string_unescaped_tab.json1
-rw-r--r--tests/specs/json/n_string_unicode_CapitalU.json1
-rw-r--r--tests/specs/json/n_string_with_trailing_garbage.json1
-rw-r--r--tests/specs/json/n_structure_U+2060_word_joined.json1
-rwxr-xr-xtests/specs/json/n_structure_UTF8_BOM_no_data.json1
-rwxr-xr-xtests/specs/json/n_structure_angle_bracket_..json1
-rwxr-xr-xtests/specs/json/n_structure_angle_bracket_null.json1
-rw-r--r--tests/specs/json/n_structure_array_trailing_garbage.json1
-rwxr-xr-xtests/specs/json/n_structure_array_with_extra_array_close.json1
-rwxr-xr-xtests/specs/json/n_structure_array_with_unclosed_string.json1
-rw-r--r--tests/specs/json/n_structure_ascii-unicode-identifier.json1
-rwxr-xr-xtests/specs/json/n_structure_capitalized_True.json1
-rwxr-xr-xtests/specs/json/n_structure_close_unopened_array.json1
-rw-r--r--tests/specs/json/n_structure_comma_instead_of_closing_brace.json1
-rwxr-xr-xtests/specs/json/n_structure_double_array.json1
-rw-r--r--tests/specs/json/n_structure_end_array.json1
-rwxr-xr-xtests/specs/json/n_structure_incomplete_UTF8_BOM.json1
-rw-r--r--tests/specs/json/n_structure_lone-invalid-utf-8.json1
-rw-r--r--tests/specs/json/n_structure_lone-open-bracket.json1
-rw-r--r--tests/specs/json/n_structure_no_data.json0
-rw-r--r--tests/specs/json/n_structure_null-byte-outside-string.jsonbin0 -> 3 bytes
-rw-r--r--tests/specs/json/n_structure_number_with_trailing_garbage.json1
-rw-r--r--tests/specs/json/n_structure_object_followed_by_closing_object.json1
-rw-r--r--tests/specs/json/n_structure_object_unclosed_no_value.json1
-rw-r--r--tests/specs/json/n_structure_object_with_comment.json1
-rw-r--r--tests/specs/json/n_structure_object_with_trailing_garbage.json1
-rw-r--r--tests/specs/json/n_structure_open_array_apostrophe.json1
-rw-r--r--tests/specs/json/n_structure_open_array_comma.json1
-rw-r--r--tests/specs/json/n_structure_open_array_open_object.json1
-rw-r--r--tests/specs/json/n_structure_open_array_open_string.json1
-rw-r--r--tests/specs/json/n_structure_open_array_string.json1
-rw-r--r--tests/specs/json/n_structure_open_object.json1
-rwxr-xr-xtests/specs/json/n_structure_open_object_close_array.json1
-rw-r--r--tests/specs/json/n_structure_open_object_comma.json1
-rw-r--r--tests/specs/json/n_structure_open_object_open_array.json1
-rw-r--r--tests/specs/json/n_structure_open_object_open_string.json1
-rw-r--r--tests/specs/json/n_structure_open_object_string_with_apostrophes.json1
-rw-r--r--tests/specs/json/n_structure_open_open.json1
-rw-r--r--tests/specs/json/n_structure_single_eacute.json1
-rwxr-xr-xtests/specs/json/n_structure_single_star.json1
-rw-r--r--tests/specs/json/n_structure_trailing_#.json1
-rwxr-xr-xtests/specs/json/n_structure_uescaped_LF_before_string.json1
-rwxr-xr-xtests/specs/json/n_structure_unclosed_array.json1
-rw-r--r--tests/specs/json/n_structure_unclosed_array_partial_null.json1
-rw-r--r--tests/specs/json/n_structure_unclosed_array_unfinished_false.json1
-rw-r--r--tests/specs/json/n_structure_unclosed_array_unfinished_true.json1
-rwxr-xr-xtests/specs/json/n_structure_unclosed_object.json1
-rw-r--r--tests/specs/json/n_structure_unicode-identifier.json1
-rwxr-xr-xtests/specs/json/n_structure_whitespace_U+2060_word_joiner.json1
-rwxr-xr-xtests/specs/json/n_structure_whitespace_formfeed.json1
-rwxr-xr-xtests/specs/json/y_array_arraysWithSpaces.json1
-rw-r--r--tests/specs/json/y_array_empty-string.json1
-rwxr-xr-xtests/specs/json/y_array_empty.json1
-rwxr-xr-xtests/specs/json/y_array_ending_with_newline.json1
-rw-r--r--tests/specs/json/y_array_false.json1
-rwxr-xr-xtests/specs/json/y_array_heterogeneous.json1
-rw-r--r--tests/specs/json/y_array_null.json1
-rw-r--r--tests/specs/json/y_array_with_1_and_newline.json2
-rwxr-xr-xtests/specs/json/y_array_with_leading_space.json1
-rwxr-xr-xtests/specs/json/y_array_with_several_null.json1
-rwxr-xr-xtests/specs/json/y_array_with_trailing_space.json1
-rw-r--r--tests/specs/json/y_number.json1
-rwxr-xr-xtests/specs/json/y_number_0e+1.json1
-rwxr-xr-xtests/specs/json/y_number_0e1.json1
-rw-r--r--tests/specs/json/y_number_after_space.json1
-rwxr-xr-xtests/specs/json/y_number_double_close_to_zero.json1
-rwxr-xr-xtests/specs/json/y_number_int_with_exp.json1
-rwxr-xr-xtests/specs/json/y_number_minus_zero.json1
-rw-r--r--tests/specs/json/y_number_negative_int.json1
-rw-r--r--tests/specs/json/y_number_negative_one.json1
-rw-r--r--tests/specs/json/y_number_negative_zero.json1
-rw-r--r--tests/specs/json/y_number_real_capital_e.json1
-rw-r--r--tests/specs/json/y_number_real_capital_e_neg_exp.json1
-rw-r--r--tests/specs/json/y_number_real_capital_e_pos_exp.json1
-rw-r--r--tests/specs/json/y_number_real_exponent.json1
-rw-r--r--tests/specs/json/y_number_real_fraction_exponent.json1
-rw-r--r--tests/specs/json/y_number_real_neg_exp.json1
-rw-r--r--tests/specs/json/y_number_real_pos_exponent.json1
-rw-r--r--tests/specs/json/y_number_simple_int.json1
-rw-r--r--tests/specs/json/y_number_simple_real.json1
-rwxr-xr-xtests/specs/json/y_object.json1
-rwxr-xr-xtests/specs/json/y_object_basic.json1
-rwxr-xr-xtests/specs/json/y_object_duplicated_key.json1
-rwxr-xr-xtests/specs/json/y_object_duplicated_key_and_value.json1
-rw-r--r--tests/specs/json/y_object_empty.json1
-rwxr-xr-xtests/specs/json/y_object_empty_key.json1
-rw-r--r--tests/specs/json/y_object_escaped_null_in_key.json1
-rw-r--r--tests/specs/json/y_object_extreme_numbers.json1
-rw-r--r--tests/specs/json/y_object_long_strings.json1
-rw-r--r--tests/specs/json/y_object_simple.json1
-rw-r--r--tests/specs/json/y_object_string_unicode.json1
-rw-r--r--tests/specs/json/y_object_with_newlines.json3
-rwxr-xr-xtests/specs/json/y_string_1_2_3_bytes_UTF-8_sequences.json1
-rwxr-xr-xtests/specs/json/y_string_accepted_surrogate_pair.json1
-rwxr-xr-xtests/specs/json/y_string_accepted_surrogate_pairs.json1
-rw-r--r--tests/specs/json/y_string_allowed_escapes.json1
-rwxr-xr-xtests/specs/json/y_string_backslash_and_u_escaped_zero.json1
-rw-r--r--tests/specs/json/y_string_backslash_doublequotes.json1
-rw-r--r--tests/specs/json/y_string_comments.json1
-rw-r--r--tests/specs/json/y_string_double_escape_a.json1
-rw-r--r--tests/specs/json/y_string_double_escape_n.json1
-rw-r--r--tests/specs/json/y_string_escaped_control_character.json1
-rwxr-xr-xtests/specs/json/y_string_escaped_noncharacter.json1
-rwxr-xr-xtests/specs/json/y_string_in_array.json1
-rwxr-xr-xtests/specs/json/y_string_in_array_with_leading_space.json1
-rw-r--r--tests/specs/json/y_string_last_surrogates_1_and_2.json1
-rw-r--r--tests/specs/json/y_string_nbsp_uescaped.json1
-rwxr-xr-xtests/specs/json/y_string_nonCharacterInUTF-8_U+10FFFF.json1
-rwxr-xr-xtests/specs/json/y_string_nonCharacterInUTF-8_U+FFFF.json1
-rw-r--r--tests/specs/json/y_string_null_escape.json1
-rw-r--r--tests/specs/json/y_string_one-byte-utf-8.json1
-rw-r--r--tests/specs/json/y_string_pi.json1
-rwxr-xr-xtests/specs/json/y_string_reservedCharacterInUTF-8_U+1BFFF.json1
-rw-r--r--tests/specs/json/y_string_simple_ascii.json1
-rw-r--r--tests/specs/json/y_string_space.json1
-rwxr-xr-xtests/specs/json/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json1
-rw-r--r--tests/specs/json/y_string_three-byte-utf-8.json1
-rw-r--r--tests/specs/json/y_string_two-byte-utf-8.json1
-rwxr-xr-xtests/specs/json/y_string_u+2028_line_sep.json1
-rwxr-xr-xtests/specs/json/y_string_u+2029_par_sep.json1
-rwxr-xr-xtests/specs/json/y_string_uEscape.json1
-rw-r--r--tests/specs/json/y_string_uescaped_newline.json1
-rwxr-xr-xtests/specs/json/y_string_unescaped_char_delete.json1
-rw-r--r--tests/specs/json/y_string_unicode.json1
-rwxr-xr-xtests/specs/json/y_string_unicodeEscapedBackslash.json1
-rw-r--r--tests/specs/json/y_string_unicode_2.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+10FFFE_nonchar.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+1FFFE_nonchar.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+2064_invisible_plus.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+FDD0_nonchar.json1
-rw-r--r--tests/specs/json/y_string_unicode_U+FFFE_nonchar.json1
-rwxr-xr-xtests/specs/json/y_string_unicode_escaped_double_quote.json1
-rw-r--r--tests/specs/json/y_string_utf8.json1
-rwxr-xr-xtests/specs/json/y_string_with_del_character.json1
-rw-r--r--tests/specs/json/y_structure_lonely_false.json1
-rwxr-xr-xtests/specs/json/y_structure_lonely_int.json1
-rwxr-xr-xtests/specs/json/y_structure_lonely_negative_real.json1
-rw-r--r--tests/specs/json/y_structure_lonely_null.json1
-rwxr-xr-xtests/specs/json/y_structure_lonely_string.json1
-rwxr-xr-xtests/specs/json/y_structure_lonely_true.json1
-rw-r--r--tests/specs/json/y_structure_string_empty.json1
-rw-r--r--tests/specs/json/y_structure_trailing_newline.json1
-rw-r--r--tests/specs/json/y_structure_true_in_array.json1
-rw-r--r--tests/specs/json/y_structure_whitespace_array.json1
324 files changed, 709 insertions, 18 deletions
diff --git a/docs/design/027-computation-core.md b/docs/design/027-computation-core.md
index f26f2d5..cd8dd44 100644
--- a/docs/design/027-computation-core.md
+++ b/docs/design/027-computation-core.md
@@ -129,6 +129,17 @@
### 2단계: 중첩, 갈래, 재귀, 글자 (JSON)
+크기 때문에 셋으로 나눈다(2026-10-13). 각각 재는 일이 있다.
+- **2a(만듦):** 형식 지정, 바이트 잇기와 자르기, 바이트와 text를 담는 `let`, `while`, `&&`와 `||`의 단락 평가. JSON을 받거나
+ 거절하는 검사기로 잰다. 결과는 [140](../research/140-spec-suite.md)의 2a절이다.
+ - JSONTestSuite에서 틀린 것이 없다.
+ - 줄 수는 파이썬 이하다(80 대 90).
+ - 시간은 C의 116배, 파이썬의 1.2배다.
+ - 쓰다가 드러난 뜻의 틈 하나를 메웠다. `&&`가 양쪽을 다 계산해서 `i < n && d[i]`가 실패했다. 이제 단락 평가이고, 오른쪽이
+ 실패할 수 없을 때는 지금처럼 AND 하나를 낸다. 그래서 TPC-C를 포함한 기존 모듈 35개가 바이트까지 같다.
+- **2b:** 중첩(레코드 안의 레코드와 리스트), 갈래와 `match`, 값으로서의 리스트, 메시지 필드의 아무 값. JSON을 트리로 읽고 묻는다.
+- **2c:** 재귀(부르기와 돌아가기, 함수마다의 검증), 글자로 읽기.
+
- 레코드의 필드와 리스트의 원소가 아무 값을 가진다.
- 갈래와 `match`를 둔다.
- 재귀하는 fn과 `while`을 둔다. Pure에는 부르기와 돌아가기, 함수마다의 검증이 생긴다.
diff --git a/docs/research/140-spec-suite.md b/docs/research/140-spec-suite.md
index 60d40ff..f4c6c48 100644
--- a/docs/research/140-spec-suite.md
+++ b/docs/research/140-spec-suite.md
@@ -192,6 +192,47 @@
- 기계어 계층은 이 루프를 빠르게 하지 못했다. `PURE_JIT=all`이어도 시간이 같다. 새 명령마다 실행기의 걸음을 불러서다.
- 바이트와 비트의 일을 빠르게 하는 것은 핵이 선 뒤의 일이다(027). 그 과녁은 이제 수치 루프가 아니라 이런 일이다.
+## 027의 2a: JSON 검사기 (2026-10-13)
+
+2a에서 더한 것:
+- **Pure.**
+ - 바이트 자르기, 한 바이트
+ - 이름으로 담는 바이트와 text 32칸. 칸 번호가 타입을 정하고, 덧붙이기는 제자리에서 하며, 담은 양은 몫에 센다.
+ - NUM_TEXT의 형식, CONCAT의 바이트
+ - `pure-run`이 메시지의 바이트를 파일에서 읽는 길(`message NAME @PATH`)
+- **aup.**
+ - 형식 `{x:08x}`, `{p:.2f}`, 잇기 `+`, 자르기 `b[a .. c]`, `byte(n)`
+ - 바이트와 text의 let(`s = s + e`는 덧붙이기), `while`
+ - `&&`와 `||`의 단락 평가
+
+**JSON 검사기.** aup의 `examples/json.aup`(80줄)는 RFC 8259의 문법을 처음부터 한 번 읽는다. 열린 배열과 객체는 스택(i64 리스트)에
+둔다.
+- **맞음.** JSONTestSuite(1ef36fa)에서 틀린 것이 없다.
+ - `y_` 95개를 모두 받고 `n_` 188개를 모두 거절한다.
+ - `i_` 35개 가운데 21개를 받는다: 범위를 넘는 수, 짝 없는 서로게이트 이스케이프, 500겹.
+ - 14개는 거절한다: UTF-8이 아닌 입력, BOM, UTF-16.
+ - 세 실행 길의 출력이 바이트까지 같다.
+ - 이 대조는 Pure의 `make check`(`module_specs`)에 들어갔다. 케이스는 `tests/specs/json`에 넣었다(MIT). 큰 둘은 검사가 만들고 해시로
+ 대조한다.
+- **줄 수.** 같은 설계의 파이썬 참조 `json_check.py`가 90줄이고 aup가 80줄이다. 막대를 지난다.
+- **시간.** 10만 바이트 문서에서 바이트당 299 ns다. C로 쓴 같은 설계는 2.57 ns(116배), 파이썬은 246 ns(Pure가 1.2배 느림)다. 바이트당
+ Pure 명령이 339개다.
+
+**쓰다가 드러난 뜻의 틈.**
+- 처음 돌리자 받을 것이 모두 `limit`으로 실패했다. aup의 `&&`가 양쪽을 다 계산해서, `i < n && space(d[i])`가 끝에서 `d[n]`을 읽었다.
+- 범위를 먼저 보고 읽는 꼴은 명세 구현의 기본이라 `&&`와 `||`를 단락 평가로 바꾸었다. 식은 아무것도 바꾸지 않으므로, 달라지는
+ 것은 오른쪽이 실패할 수 있을 때뿐이다.
+- 그래서 컴파일러는 오른쪽이 실패할 수 없을 때 지금처럼 AND나 OR 하나를 낸다. 실패할 수 없는 것은 비교, 상태와 필드 읽기, 걷는
+ 항목의 필드, 작은 상수를 더하는 수의 덧셈, 그리고 왼쪽이 이미 계산한 식이다.
+- TPC-C의 `order_status` 필터는 오른쪽의 키 찾기와 곱셈을 왼쪽이 이미 계산한다. 그래서 모듈이 바이트까지 같고, Pure의 키 범위
+ 찾기도 그대로다.
+- Pure, aup, Vega의 소스 가운데 빌드되는 36개를 전후로 견주었다. 달라진 것은 JSON 검사기 하나다.
+
+**SHA-256 다시.**
+- 형식(`"{h0:08x}…"`)과 바이트 잇기(채움)로 다시 써 42줄(닫는 괄호만인 줄 5)이 됐다. 파이썬은 28줄이다.
+- 남은 차이는 리스트를 값으로 짓지 못해 생기는 것(메시지 스케줄의 미리 채움), 낱말 만들기, 선언이다.
+- 시간은 바이트당 1,437 ns(C의 159배)다. 블록당 명령이 16,476개로 줄었다.
+
## 착수 기준 (다음 일)
- **바꿀 결정.** 계산의 핵을 설계한다(027). 위 표의 여덟 후보 가운데 무엇을 어떤 모양으로 받을지 정한다.
diff --git a/research/experiments/044-specs/2026-10-13-stage2a.jsonl b/research/experiments/044-specs/2026-10-13-stage2a.jsonl
new file mode 100644
index 0000000..e536b54
--- /dev/null
+++ b/research/experiments/044-specs/2026-10-13-stage2a.jsonl
@@ -0,0 +1,8 @@
+{"size":103781,"jit":"0","batch":"0","c_ns_per_byte":2.567,"pure_ns_per_byte":298.133,"ratio":116.1,"instructions":35226511,"instructions_per_byte":339.4}
+{"size":103781,"jit":"0","batch":"","c_ns_per_byte":2.567,"pure_ns_per_byte":298.362,"ratio":116.2,"instructions":35226511,"instructions_per_byte":339.4}
+{"size":103781,"jit":"all","batch":"","c_ns_per_byte":2.569,"pure_ns_per_byte":298.453,"ratio":116.2,"instructions":35226511,"instructions_per_byte":339.4}
+{"size":103781,"jit":"","batch":"","c_ns_per_byte":2.571,"pure_ns_per_byte":299.164,"ratio":116.4,"instructions":35226511,"instructions_per_byte":339.4}
+{"size":103781,"python_ns_per_byte":247.0}
+{"size":65536,"jit":"0","batch":"0","c_ns_per_byte":9.025,"pure_ns_per_byte":1437.304,"ratio":159.3,"instructions":16887501,"instructions_per_block":16476}
+{"size":65536,"jit":"","batch":"","c_ns_per_byte":9.051,"pure_ns_per_byte":1439.504,"ratio":159.0,"instructions":16887501,"instructions_per_block":16476}
+{"messages": 142, "right": {"batches": 142, "rounds": 142, "all": 142, "default": 142}, "aup_lines": 42, "aup_brace_lines": 5, "python_lines": 28}
diff --git a/research/experiments/044-specs/json_check.py b/research/experiments/044-specs/json_check.py
new file mode 100644
index 0000000..b5d62f0
--- /dev/null
+++ b/research/experiments/044-specs/json_check.py
@@ -0,0 +1,115 @@
+# Whether bytes are one JSON text (RFC 8259): the design of aup's examples/json.aup in plain Python, the reference
+# 140 counts its lines against (read once from the start, a stack of the arrays and objects open).
+def space(b):
+ return b in (0x20, 0x09, 0x0a, 0x0d)
+
+
+def digit(b):
+ return 0x30 <= b <= 0x39
+
+
+def hexdigit(b):
+ return digit(b) or 0x61 <= b <= 0x66 or 0x41 <= b <= 0x46
+
+
+def valid(d):
+ try:
+ t = d.decode('utf-8')
+ except UnicodeDecodeError:
+ return False
+ n, i, mode, ok, open_ = len(d), 0, 0, True, [] # mode 0: a value, 1: after one, 2: a key, 3: a key or }, 4: a value or ]
+ while ok:
+ while i < n and space(d[i]):
+ i += 1
+ if i == n:
+ return mode == 1 and not open_
+ b = d[i]
+ if mode == 1:
+ if not open_:
+ ok = False
+ elif b == 0x2c:
+ mode = 0 if open_[-1] == 0x5b else 2
+ elif b == open_[-1] + 2:
+ open_.pop()
+ else:
+ ok = False
+ i += 1
+ elif mode == 3 and b == 0x7d or mode == 4 and b == 0x5d:
+ open_.pop()
+ mode = 1
+ i += 1
+ elif mode in (2, 3):
+ ok = b == 0x22
+ mode = 5
+ elif b in (0x5b, 0x7b):
+ open_.append(b)
+ mode = 4 if b == 0x5b else 3
+ i += 1
+ elif b == 0x22 or mode == 5:
+ i += 1
+ while i < n and d[i] != 0x22 and ok:
+ if d[i] < 0x20:
+ ok = False
+ elif d[i] == 0x5c and i + 1 < n and d[i + 1] == 0x75:
+ ok = i + 5 < n and all(hexdigit(x) for x in d[i + 2:i + 6])
+ i += 6
+ elif d[i] == 0x5c:
+ ok = i + 1 < n and d[i + 1] in b'"\\/bfnrt'
+ i += 2
+ else:
+ i += 1
+ ok = ok and i < n
+ i += 1
+ if mode == 5:
+ while i < n and space(d[i]):
+ i += 1
+ ok = ok and i < n and d[i] == 0x3a
+ i += 1
+ mode = 0
+ else:
+ mode = 1
+ elif b == 0x2d or digit(b):
+ if b == 0x2d:
+ i += 1
+ ok = i < n and digit(d[i])
+ if ok and d[i] == 0x30:
+ i += 1
+ else:
+ while i < n and digit(d[i]):
+ i += 1
+ if ok and i < n and d[i] == 0x2e:
+ i += 1
+ ok = i < n and digit(d[i])
+ while i < n and digit(d[i]):
+ i += 1
+ if ok and i < n and d[i] in (0x65, 0x45):
+ i += 1
+ if i < n and d[i] in (0x2b, 0x2d):
+ i += 1
+ ok = i < n and digit(d[i])
+ while i < n and digit(d[i]):
+ i += 1
+ mode = 1
+ else:
+ word = b'true' if b == 0x74 else b'false' if b == 0x66 else b'null'
+ ok = d[i:i + len(word)] == word
+ i += len(word)
+ mode = 1
+ return False
+
+
+if __name__ == '__main__':
+ import os, sys, time
+ suite = sys.argv[1]
+ files = sorted(os.listdir(suite))
+ data = [open(os.path.join(suite, f), 'rb').read() for f in files]
+ for f, d in zip(files, data):
+ assert not f.startswith('y_') or valid(d), f
+ assert not f.startswith('n_') or not valid(d), f
+ big = b'[' + b','.join(b'{"key%d": [1.5e3, true, null, "text \\u00e9 %d"]}' % (k, k) for k in range(2000)) + b']'
+ runs = []
+ for _ in range(7):
+ start = time.perf_counter()
+ valid(big)
+ runs.append((time.perf_counter() - start) * 1e9 / len(big))
+ print('{"size":%d,"python_ns_per_byte":%.1f}' % (len(big), sorted(runs)[3]))
diff --git a/research/experiments/044-specs/json_time.c b/research/experiments/044-specs/json_time.c
new file mode 100644
index 0000000..b401ece
--- /dev/null
+++ b/research/experiments/044-specs/json_time.c
@@ -0,0 +1,132 @@
+/* Research 140, design 027 stage 2a: aup's examples/json.aup (run by Pure)
+ * against the same validator in C, on the same document: both must say it is
+ * JSON, then each is timed (the median of seven runs of rounds checks).
+ *
+ * cc -O2 -std=c17 -I../../../core json_time.c ../../../build/libpure.a -lm -pthread -o json_time
+ * ./json_time json.pmod ROUNDS (PURE_JIT and PURE_BATCH choose Pure's path)
+ *
+ * The document is json_check.py's: 2,000 objects of a key and an array of a
+ * number, true, null and a string with an escape. One JSON line. */
+#define _POSIX_C_SOURCE 200809L
+#include "module.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+static int space(int b) { return b == 0x20 || b == 0x09 || b == 0x0a || b == 0x0d; }
+static int digit(int b) { return b >= 0x30 && b <= 0x39; }
+static int hex(int b) { return digit(b) || (b >= 0x61 && b <= 0x66) || (b >= 0x41 && b <= 0x46); }
+
+/* json.aup's design in C (its UTF-8 check left out: the document is ASCII). */
+static int valid(const unsigned char *d, size_t n, unsigned char *open) {
+ size_t i = 0, depth = 0;
+ int mode = 0, ok = 1;
+ while (ok) {
+ while (i < n && space(d[i])) ++i;
+ if (i == n) return mode == 1 && !depth;
+ int b = d[i];
+ if (mode == 1) {
+ if (!depth) ok = 0;
+ else if (b == 0x2c) mode = open[depth - 1] == 0x5b ? 0 : 2;
+ else if (b == open[depth - 1] + 2) --depth;
+ else ok = 0;
+ ++i;
+ } else if ((mode == 3 && b == 0x7d) || (mode == 4 && b == 0x5d)) {
+ --depth, mode = 1, ++i;
+ } else if (mode == 2 || mode == 3) {
+ ok = b == 0x22, mode = 5;
+ } else if (b == 0x5b || b == 0x7b) {
+ open[depth++] = (unsigned char)b, mode = b == 0x5b ? 4 : 3, ++i;
+ } else if (b == 0x22 || mode == 5) {
+ ++i;
+ while (i < n && d[i] != 0x22 && ok) {
+ if (d[i] < 0x20) ok = 0;
+ else if (d[i] == 0x5c && i + 1 < n && d[i + 1] == 0x75) {
+ ok = i + 5 < n && hex(d[i + 2]) && hex(d[i + 3]) && hex(d[i + 4]) && hex(d[i + 5]);
+ i += 6;
+ } else if (d[i] == 0x5c) {
+ ok = i + 1 < n && strchr("\"\\/bfnrt", d[i + 1]) && d[i + 1];
+ i += 2;
+ } else ++i;
+ }
+ ok = ok && i < n, ++i;
+ if (mode == 5) {
+ while (i < n && space(d[i])) ++i;
+ ok = ok && i < n && d[i] == 0x3a, ++i, mode = 0;
+ } else mode = 1;
+ } else if (b == 0x2d || digit(b)) {
+ if (b == 0x2d) ++i;
+ ok = i < n && digit(d[i]);
+ if (ok && d[i] == 0x30) ++i;
+ else while (i < n && digit(d[i])) ++i;
+ if (ok && i < n && d[i] == 0x2e) {
+ ++i, ok = i < n && digit(d[i]);
+ while (i < n && digit(d[i])) ++i;
+ }
+ if (ok && i < n && (d[i] == 0x65 || d[i] == 0x45)) {
+ ++i;
+ if (i < n && (d[i] == 0x2b || d[i] == 0x2d)) ++i;
+ ok = i < n && digit(d[i]);
+ while (i < n && digit(d[i])) ++i;
+ }
+ mode = 1;
+ } else {
+ const char *word = b == 0x74 ? "true" : b == 0x66 ? "false" : "null";
+ size_t length = strlen(word);
+ ok = i + length <= n && !memcmp(d + i, word, length), i += length, mode = 1;
+ }
+ }
+ return 0;
+}
+
+static double now_ns(void) {
+ struct timespec t;
+ clock_gettime(CLOCK_MONOTONIC, &t);
+ return (double)t.tv_sec * 1e9 + (double)t.tv_nsec;
+}
+
+static int by_value(const void *a, const void *b) {
+ double x = *(const double *)a, y = *(const double *)b;
+ return (x > y) - (x < y);
+}
+
+int main(int argc, char **argv) {
+ if (argc != 3) { fprintf(stderr, "usage: %s MODULE ROUNDS\n", argv[0]); return 2; }
+ int rounds = atoi(argv[2]);
+ static unsigned char doc[1 << 18], open[1 << 18];
+ size_t n = 0;
+ doc[n++] = '[';
+ for (int k = 0; k < 2000; ++k)
+ n += (size_t)sprintf((char *)doc + n, "%s{\"key%d\": [1.5e3, true, null, \"text \\u00e9 %d\"]}", k ? "," : "", k, k);
+ doc[n++] = ']';
+ PureModule module;
+ char error[160];
+ if (pure_module_read(argv[1], &module, error, sizeof(error)) != PURE_OK) { fprintf(stderr, "%s\n", error); return 1; }
+ PureApp app;
+ if (pure_app_start(&app, &module, (PureData){0}) != PURE_OK) return 1;
+ int check = pure_module_input(&module, "check");
+ if (pure_app_message(&app, (uint32_t)check, NULL, -1, (PureSpan){doc, n}) != PURE_OK) { fprintf(stderr, "event failed\n"); return 1; }
+ uint64_t work = app.work;
+ if (app.values[0].num != 1 || !valid(doc, n, open)) { fprintf(stderr, "not both valid\n"); return 1; }
+ double c_runs[7], pure_runs[7];
+ volatile int sink = 0;
+ for (int r = 0; r < 7; ++r) {
+ double start = now_ns();
+ for (int i = 0; i < rounds; ++i) sink += valid(doc, n, open);
+ c_runs[r] = (now_ns() - start) / rounds;
+ start = now_ns();
+ for (int i = 0; i < rounds; ++i)
+ if (pure_app_message(&app, (uint32_t)check, NULL, -1, (PureSpan){doc, n}) != PURE_OK) return 1;
+ pure_runs[r] = (now_ns() - start) / rounds;
+ }
+ qsort(c_runs, 7, sizeof(double), by_value);
+ qsort(pure_runs, 7, sizeof(double), by_value);
+ const char *jit = getenv("PURE_JIT"), *batch = getenv("PURE_BATCH");
+ printf("{\"size\":%zu,\"jit\":\"%s\",\"batch\":\"%s\",\"c_ns_per_byte\":%.3f,\"pure_ns_per_byte\":%.3f,\"ratio\":%.1f,"
+ "\"instructions\":%llu,\"instructions_per_byte\":%.1f}\n",
+ n, jit ? jit : "", batch ? batch : "", c_runs[3] / (double)n, pure_runs[3] / (double)n, pure_runs[3] / c_runs[3],
+ (unsigned long long)work, (double)work / (double)n);
+ pure_app_stop(&app);
+ return 0;
+}
diff --git a/tests/check.py b/tests/check.py
index eef4ae9..bf77246 100644
--- a/tests/check.py
+++ b/tests/check.py
@@ -1686,6 +1686,61 @@ on go {
}
"""
+def module_specs(aup, pure, work):
+ """Specs written in aup (docs/research/140), checked by their own cases
+ on Pure's three paths, each path's output the same byte for byte: SHA-256
+ (aup's examples/sha256.aup) against hashlib on FIPS 180-2's examples and
+ messages of every length up to two blocks; whether bytes are JSON (its
+ examples/json.aup) on JSONTestSuite's parsing cases (tests/specs/json):
+ every y_ case taken, every n_ case refused (a refusal: valid false, or
+ the event failing as encoding on bytes that are not UTF-8)."""
+ import hashlib
+ import os
+ import random
+ import struct
+ runs = {}
+ program = work / 'sha256.pmod'
+ compile_module(aup, EDITOR.parent / 'sha256.aup', program)
+ chooser = random.Random(140)
+ messages = [b'abc', b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq',
+ b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu']
+ messages += [bytes(chooser.randrange(256) for _ in range(n)) for n in list(range(130)) + [1000, 4096]]
+ given = ''.join(f"message hash {m.hex() or '-'}\n" for m in messages)
+ outputs = {name: subprocess.run([str(pure / 'build/pure-run'), str(program)], input=given, capture_output=True, text=True,
+ timeout=120, env=dict(os.environ, **env)).stdout
+ for name, env in (('batches', {'PURE_JIT': '0'}), ('rounds', {'PURE_JIT': '0', 'PURE_BATCH': '0'}), ('all', {'PURE_JIT': 'all'}))}
+ for name in ('rounds', 'all'):
+ assert outputs[name] == outputs['batches'], ('sha256', name)
+ digests = [json.loads(line)['states']['digest'] for line in outputs['batches'].splitlines()]
+ assert digests == [hashlib.sha256(m).hexdigest() for m in messages], 'sha256'
+ runs['sha256'] = len(messages)
+ program = work / 'json.pmod'
+ compile_module(aup, EDITOR.parent / 'json.aup', program)
+ suite = pure / 'tests/specs/json'
+ cases = {name: (suite / name).read_bytes() for name in sorted(os.listdir(suite)) if name.endswith('.json')}
+ cases['n_structure_100000_opening_arrays.json'] = b'[' * 100000
+ cases['n_structure_open_array_object.json'] = b'[{"":' * 50000 + b'\n'
+ assert hashlib.sha256(cases['n_structure_100000_opening_arrays.json']).hexdigest().startswith('13f86ea1e7edd116')
+ assert hashlib.sha256(cases['n_structure_open_array_object.json']).hexdigest().startswith('48b232fcd18ce2f7')
+ for name, data in cases.items():
+ (work / name).write_bytes(data)
+ given = ''.join(f'message check @{work / name}\n' for name in cases)
+ outputs = {name: subprocess.run([str(pure / 'build/pure-run'), str(program)], input=given, capture_output=True, text=True,
+ timeout=300, env=dict(os.environ, **env)).stdout
+ for name, env in (('batches', {'PURE_JIT': '0'}), ('rounds', {'PURE_JIT': '0', 'PURE_BATCH': '0'}), ('all', {'PURE_JIT': 'all'}))}
+ for name in ('rounds', 'all'):
+ assert outputs[name] == outputs['batches'], ('json', name)
+ taken = {'y': 0, 'n': 0, 'i': 0}
+ for name, line in zip(cases, outputs['batches'].splitlines()):
+ state = json.loads(line)
+ accepted = state['fault'] == 'none' and state['states']['valid'] is True
+ assert accepted or state['fault'] in ('none', 'encoding'), (name, state['fault'])
+ assert accepted == (name[0] == 'y') or name[0] == 'i', (name, accepted)
+ taken[name[0]] += accepted
+ runs['json'] = {'cases': len(cases), 'taken': taken}
+ return runs
+
+
def module_assumptions(aup, pure, work):
"""The compiled code's integers (Pure docs/design/022) where they stop
holding: a loop whose columns hold small whole numbers until, halfway,
@@ -1841,24 +1896,6 @@ def module_assumptions(aup, pure, work):
assert outputs[name] == outputs['batches'], ('view', name, next((a, b) for a, b in zip(outputs[name].splitlines(), outputs['batches'].splitlines()) if a != b))
faults = [json.loads(line)['fault'] for line in outputs['batches'].splitlines() if line.startswith('{"states"')]
assert 'none' in faults and 'work' in faults, faults
- # SHA-256 written in aup (its examples/sha256.aup, docs/design/027's stage 1: bytes by position, bit operations, lists
- # of i64): FIPS 180-2's examples and messages of every length up to two blocks, against hashlib, on every path.
- import hashlib
- import random
- program = work / 'sha256.pmod'
- compile_module(aup, EDITOR.parent / 'sha256.aup', program)
- chooser = random.Random(140)
- messages = [b'abc', b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq',
- b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu']
- messages += [bytes(chooser.randrange(256) for _ in range(n)) for n in list(range(130)) + [1000, 4096]]
- given = ''.join(f"message hash {m.hex() or '-'}\n" for m in messages)
- outputs = {name: subprocess.run([str(pure / 'build/pure-run'), str(program)], input=given, capture_output=True, text=True,
- timeout=120, env=dict(os.environ, **env)).stdout
- for name, env in (('batches', {'PURE_JIT': '0'}), ('rounds', {'PURE_JIT': '0', 'PURE_BATCH': '0'}), ('all', {'PURE_JIT': 'all'}))}
- for name in ('rounds', 'all'):
- assert outputs[name] == outputs['batches'], ('sha256', name)
- digests = [json.loads(line)['states']['digest'] for line in outputs['batches'].splitlines()]
- assert digests == [hashlib.sha256(m).hexdigest() for m in messages], 'sha256'
return len(runs)
@@ -6207,6 +6244,7 @@ def main():
work = Path(directory)
report['module_ranges'] = module_ranges(aup, pure, work)
report['module_assumptions'] = module_assumptions(aup, pure, work)
+ report['module_specs'] = module_specs(aup, pure, work)
report['module_tier'] = module_tier(aup, pure, work)
report['server_parity_requests'] = sum(server_parity(aup, pure, work, range(args.seeds), threads=threads)
for threads in (1, 3))
diff --git a/tests/specs/json/LICENSE b/tests/specs/json/LICENSE
new file mode 100644
index 0000000..c4b3621
--- /dev/null
+++ b/tests/specs/json/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Nicolas Seriot
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/tests/specs/json/README.md b/tests/specs/json/README.md
new file mode 100644
index 0000000..1000c84
--- /dev/null
+++ b/tests/specs/json/README.md
@@ -0,0 +1,9 @@
+# JSONTestSuite's parsing cases
+
+From [nst/JSONTestSuite](https://github.com/nst/JSONTestSuite) at 1ef36fa, `test_parsing/`: `y_` files are JSON texts,
+`n_` files are not, and on `i_` files a parser may go either way (MIT license, `LICENSE`). `tests/check.py`'s
+`module_specs` runs aup's `examples/json.aup` on each of them, on Pure's three paths.
+
+Two `n_` files are left out for their size and made by the check: `n_structure_100000_opening_arrays.json` is `[`
+100,000 times (SHA-256 13f86ea1e7edd116...), and `n_structure_open_array_object.json` is `[{"":` 50,000 times and a
+newline (48b232fcd18ce2f7...).
diff --git a/tests/specs/json/i_number_double_huge_neg_exp.json b/tests/specs/json/i_number_double_huge_neg_exp.json
new file mode 100644
index 0000000..ae4c7b7
--- /dev/null
+++ b/tests/specs/json/i_number_double_huge_neg_exp.json
@@ -0,0 +1 @@
+[123.456e-789] \ No newline at end of file
diff --git a/tests/specs/json/i_number_huge_exp.json b/tests/specs/json/i_number_huge_exp.json
new file mode 100644
index 0000000..9b5efa2
--- /dev/null
+++ b/tests/specs/json/i_number_huge_exp.json
@@ -0,0 +1 @@
+[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006] \ No newline at end of file
diff --git a/tests/specs/json/i_number_neg_int_huge_exp.json b/tests/specs/json/i_number_neg_int_huge_exp.json
new file mode 100755
index 0000000..3abd58a
--- /dev/null
+++ b/tests/specs/json/i_number_neg_int_huge_exp.json
@@ -0,0 +1 @@
+[-1e+9999] \ No newline at end of file
diff --git a/tests/specs/json/i_number_pos_double_huge_exp.json b/tests/specs/json/i_number_pos_double_huge_exp.json
new file mode 100755
index 0000000..e10a7eb
--- /dev/null
+++ b/tests/specs/json/i_number_pos_double_huge_exp.json
@@ -0,0 +1 @@
+[1.5e+9999] \ No newline at end of file
diff --git a/tests/specs/json/i_number_real_neg_overflow.json b/tests/specs/json/i_number_real_neg_overflow.json
new file mode 100644
index 0000000..3d628a9
--- /dev/null
+++ b/tests/specs/json/i_number_real_neg_overflow.json
@@ -0,0 +1 @@
+[-123123e100000] \ No newline at end of file
diff --git a/tests/specs/json/i_number_real_pos_overflow.json b/tests/specs/json/i_number_real_pos_overflow.json
new file mode 100644
index 0000000..54d7d3d
--- /dev/null
+++ b/tests/specs/json/i_number_real_pos_overflow.json
@@ -0,0 +1 @@
+[123123e100000] \ No newline at end of file
diff --git a/tests/specs/json/i_number_real_underflow.json b/tests/specs/json/i_number_real_underflow.json
new file mode 100644
index 0000000..c5236eb
--- /dev/null
+++ b/tests/specs/json/i_number_real_underflow.json
@@ -0,0 +1 @@
+[123e-10000000] \ No newline at end of file
diff --git a/tests/specs/json/i_number_too_big_neg_int.json b/tests/specs/json/i_number_too_big_neg_int.json
new file mode 100644
index 0000000..dfa3846
--- /dev/null
+++ b/tests/specs/json/i_number_too_big_neg_int.json
@@ -0,0 +1 @@
+[-123123123123123123123123123123] \ No newline at end of file
diff --git a/tests/specs/json/i_number_too_big_pos_int.json b/tests/specs/json/i_number_too_big_pos_int.json
new file mode 100644
index 0000000..338a8c3
--- /dev/null
+++ b/tests/specs/json/i_number_too_big_pos_int.json
@@ -0,0 +1 @@
+[100000000000000000000] \ No newline at end of file
diff --git a/tests/specs/json/i_number_very_big_negative_int.json b/tests/specs/json/i_number_very_big_negative_int.json
new file mode 100755
index 0000000..e2d9738
--- /dev/null
+++ b/tests/specs/json/i_number_very_big_negative_int.json
@@ -0,0 +1 @@
+[-237462374673276894279832749832423479823246327846] \ No newline at end of file
diff --git a/tests/specs/json/i_object_key_lone_2nd_surrogate.json b/tests/specs/json/i_object_key_lone_2nd_surrogate.json
new file mode 100644
index 0000000..5be7eba
--- /dev/null
+++ b/tests/specs/json/i_object_key_lone_2nd_surrogate.json
@@ -0,0 +1 @@
+{"\uDFAA":0} \ No newline at end of file
diff --git a/tests/specs/json/i_string_1st_surrogate_but_2nd_missing.json b/tests/specs/json/i_string_1st_surrogate_but_2nd_missing.json
new file mode 100644
index 0000000..3b9e37c
--- /dev/null
+++ b/tests/specs/json/i_string_1st_surrogate_but_2nd_missing.json
@@ -0,0 +1 @@
+["\uDADA"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_1st_valid_surrogate_2nd_invalid.json b/tests/specs/json/i_string_1st_valid_surrogate_2nd_invalid.json
new file mode 100644
index 0000000..4875928
--- /dev/null
+++ b/tests/specs/json/i_string_1st_valid_surrogate_2nd_invalid.json
@@ -0,0 +1 @@
+["\uD888\u1234"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_UTF-16LE_with_BOM.json b/tests/specs/json/i_string_UTF-16LE_with_BOM.json
new file mode 100644
index 0000000..2a79c06
--- /dev/null
+++ b/tests/specs/json/i_string_UTF-16LE_with_BOM.json
Binary files differ
diff --git a/tests/specs/json/i_string_UTF-8_invalid_sequence.json b/tests/specs/json/i_string_UTF-8_invalid_sequence.json
new file mode 100755
index 0000000..e2a968a
--- /dev/null
+++ b/tests/specs/json/i_string_UTF-8_invalid_sequence.json
@@ -0,0 +1 @@
+["日ш�"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_UTF8_surrogate_U+D800.json b/tests/specs/json/i_string_UTF8_surrogate_U+D800.json
new file mode 100644
index 0000000..916bff9
--- /dev/null
+++ b/tests/specs/json/i_string_UTF8_surrogate_U+D800.json
@@ -0,0 +1 @@
+["���"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_incomplete_surrogate_and_escape_valid.json b/tests/specs/json/i_string_incomplete_surrogate_and_escape_valid.json
new file mode 100755
index 0000000..3cb11d2
--- /dev/null
+++ b/tests/specs/json/i_string_incomplete_surrogate_and_escape_valid.json
@@ -0,0 +1 @@
+["\uD800\n"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_incomplete_surrogate_pair.json b/tests/specs/json/i_string_incomplete_surrogate_pair.json
new file mode 100755
index 0000000..38ec23b
--- /dev/null
+++ b/tests/specs/json/i_string_incomplete_surrogate_pair.json
@@ -0,0 +1 @@
+["\uDd1ea"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_incomplete_surrogates_escape_valid.json b/tests/specs/json/i_string_incomplete_surrogates_escape_valid.json
new file mode 100755
index 0000000..c9cd6f6
--- /dev/null
+++ b/tests/specs/json/i_string_incomplete_surrogates_escape_valid.json
@@ -0,0 +1 @@
+["\uD800\uD800\n"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_invalid_lonely_surrogate.json b/tests/specs/json/i_string_invalid_lonely_surrogate.json
new file mode 100755
index 0000000..3abbd8d
--- /dev/null
+++ b/tests/specs/json/i_string_invalid_lonely_surrogate.json
@@ -0,0 +1 @@
+["\ud800"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_invalid_surrogate.json b/tests/specs/json/i_string_invalid_surrogate.json
new file mode 100755
index 0000000..ffddc04
--- /dev/null
+++ b/tests/specs/json/i_string_invalid_surrogate.json
@@ -0,0 +1 @@
+["\ud800abc"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_invalid_utf-8.json b/tests/specs/json/i_string_invalid_utf-8.json
new file mode 100644
index 0000000..8e45a7e
--- /dev/null
+++ b/tests/specs/json/i_string_invalid_utf-8.json
@@ -0,0 +1 @@
+["�"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_inverted_surrogates_U+1D11E.json b/tests/specs/json/i_string_inverted_surrogates_U+1D11E.json
new file mode 100755
index 0000000..0d5456c
--- /dev/null
+++ b/tests/specs/json/i_string_inverted_surrogates_U+1D11E.json
@@ -0,0 +1 @@
+["\uDd1e\uD834"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_iso_latin_1.json b/tests/specs/json/i_string_iso_latin_1.json
new file mode 100644
index 0000000..9389c98
--- /dev/null
+++ b/tests/specs/json/i_string_iso_latin_1.json
@@ -0,0 +1 @@
+["�"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_lone_second_surrogate.json b/tests/specs/json/i_string_lone_second_surrogate.json
new file mode 100644
index 0000000..1dbd397
--- /dev/null
+++ b/tests/specs/json/i_string_lone_second_surrogate.json
@@ -0,0 +1 @@
+["\uDFAA"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_lone_utf8_continuation_byte.json b/tests/specs/json/i_string_lone_utf8_continuation_byte.json
new file mode 100644
index 0000000..729337c
--- /dev/null
+++ b/tests/specs/json/i_string_lone_utf8_continuation_byte.json
@@ -0,0 +1 @@
+["�"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_not_in_unicode_range.json b/tests/specs/json/i_string_not_in_unicode_range.json
new file mode 100644
index 0000000..df90a29
--- /dev/null
+++ b/tests/specs/json/i_string_not_in_unicode_range.json
@@ -0,0 +1 @@
+["����"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_overlong_sequence_2_bytes.json b/tests/specs/json/i_string_overlong_sequence_2_bytes.json
new file mode 100644
index 0000000..c8cee5e
--- /dev/null
+++ b/tests/specs/json/i_string_overlong_sequence_2_bytes.json
@@ -0,0 +1 @@
+["��"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_overlong_sequence_6_bytes.json b/tests/specs/json/i_string_overlong_sequence_6_bytes.json
new file mode 100755
index 0000000..9a91da7
--- /dev/null
+++ b/tests/specs/json/i_string_overlong_sequence_6_bytes.json
@@ -0,0 +1 @@
+["������"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_overlong_sequence_6_bytes_null.json b/tests/specs/json/i_string_overlong_sequence_6_bytes_null.json
new file mode 100755
index 0000000..d24fffd
--- /dev/null
+++ b/tests/specs/json/i_string_overlong_sequence_6_bytes_null.json
@@ -0,0 +1 @@
+["������"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_truncated-utf-8.json b/tests/specs/json/i_string_truncated-utf-8.json
new file mode 100644
index 0000000..63c7777
--- /dev/null
+++ b/tests/specs/json/i_string_truncated-utf-8.json
@@ -0,0 +1 @@
+["��"] \ No newline at end of file
diff --git a/tests/specs/json/i_string_utf16BE_no_BOM.json b/tests/specs/json/i_string_utf16BE_no_BOM.json
new file mode 100644
index 0000000..57e5392
--- /dev/null
+++ b/tests/specs/json/i_string_utf16BE_no_BOM.json
Binary files differ
diff --git a/tests/specs/json/i_string_utf16LE_no_BOM.json b/tests/specs/json/i_string_utf16LE_no_BOM.json
new file mode 100644
index 0000000..c49c1b2
--- /dev/null
+++ b/tests/specs/json/i_string_utf16LE_no_BOM.json
Binary files differ
diff --git a/tests/specs/json/i_structure_500_nested_arrays.json b/tests/specs/json/i_structure_500_nested_arrays.json
new file mode 100644
index 0000000..7118405
--- /dev/null
+++ b/tests/specs/json/i_structure_500_nested_arrays.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] \ No newline at end of file
diff --git a/tests/specs/json/i_structure_UTF-8_BOM_empty_object.json b/tests/specs/json/i_structure_UTF-8_BOM_empty_object.json
new file mode 100755
index 0000000..22fdca1
--- /dev/null
+++ b/tests/specs/json/i_structure_UTF-8_BOM_empty_object.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/tests/specs/json/n_array_1_true_without_comma.json b/tests/specs/json/n_array_1_true_without_comma.json
new file mode 100644
index 0000000..c14e3f6
--- /dev/null
+++ b/tests/specs/json/n_array_1_true_without_comma.json
@@ -0,0 +1 @@
+[1 true] \ No newline at end of file
diff --git a/tests/specs/json/n_array_a_invalid_utf8.json b/tests/specs/json/n_array_a_invalid_utf8.json
new file mode 100644
index 0000000..38a86e2
--- /dev/null
+++ b/tests/specs/json/n_array_a_invalid_utf8.json
@@ -0,0 +1 @@
+[a�] \ No newline at end of file
diff --git a/tests/specs/json/n_array_colon_instead_of_comma.json b/tests/specs/json/n_array_colon_instead_of_comma.json
new file mode 100644
index 0000000..0d02ad4
--- /dev/null
+++ b/tests/specs/json/n_array_colon_instead_of_comma.json
@@ -0,0 +1 @@
+["": 1] \ No newline at end of file
diff --git a/tests/specs/json/n_array_comma_after_close.json b/tests/specs/json/n_array_comma_after_close.json
new file mode 100644
index 0000000..2ccba8d
--- /dev/null
+++ b/tests/specs/json/n_array_comma_after_close.json
@@ -0,0 +1 @@
+[""], \ No newline at end of file
diff --git a/tests/specs/json/n_array_comma_and_number.json b/tests/specs/json/n_array_comma_and_number.json
new file mode 100755
index 0000000..d2c84e3
--- /dev/null
+++ b/tests/specs/json/n_array_comma_and_number.json
@@ -0,0 +1 @@
+[,1] \ No newline at end of file
diff --git a/tests/specs/json/n_array_double_comma.json b/tests/specs/json/n_array_double_comma.json
new file mode 100755
index 0000000..0431712
--- /dev/null
+++ b/tests/specs/json/n_array_double_comma.json
@@ -0,0 +1 @@
+[1,,2] \ No newline at end of file
diff --git a/tests/specs/json/n_array_double_extra_comma.json b/tests/specs/json/n_array_double_extra_comma.json
new file mode 100644
index 0000000..3f01d31
--- /dev/null
+++ b/tests/specs/json/n_array_double_extra_comma.json
@@ -0,0 +1 @@
+["x",,] \ No newline at end of file
diff --git a/tests/specs/json/n_array_extra_close.json b/tests/specs/json/n_array_extra_close.json
new file mode 100644
index 0000000..c12f9fa
--- /dev/null
+++ b/tests/specs/json/n_array_extra_close.json
@@ -0,0 +1 @@
+["x"]] \ No newline at end of file
diff --git a/tests/specs/json/n_array_extra_comma.json b/tests/specs/json/n_array_extra_comma.json
new file mode 100644
index 0000000..5f8ce18
--- /dev/null
+++ b/tests/specs/json/n_array_extra_comma.json
@@ -0,0 +1 @@
+["",] \ No newline at end of file
diff --git a/tests/specs/json/n_array_incomplete.json b/tests/specs/json/n_array_incomplete.json
new file mode 100644
index 0000000..cc65b0b
--- /dev/null
+++ b/tests/specs/json/n_array_incomplete.json
@@ -0,0 +1 @@
+["x" \ No newline at end of file
diff --git a/tests/specs/json/n_array_incomplete_invalid_value.json b/tests/specs/json/n_array_incomplete_invalid_value.json
new file mode 100644
index 0000000..c21a8f6
--- /dev/null
+++ b/tests/specs/json/n_array_incomplete_invalid_value.json
@@ -0,0 +1 @@
+[x \ No newline at end of file
diff --git a/tests/specs/json/n_array_inner_array_no_comma.json b/tests/specs/json/n_array_inner_array_no_comma.json
new file mode 100644
index 0000000..c70b716
--- /dev/null
+++ b/tests/specs/json/n_array_inner_array_no_comma.json
@@ -0,0 +1 @@
+[3[4]] \ No newline at end of file
diff --git a/tests/specs/json/n_array_invalid_utf8.json b/tests/specs/json/n_array_invalid_utf8.json
new file mode 100644
index 0000000..6099d34
--- /dev/null
+++ b/tests/specs/json/n_array_invalid_utf8.json
@@ -0,0 +1 @@
+[�] \ No newline at end of file
diff --git a/tests/specs/json/n_array_items_separated_by_semicolon.json b/tests/specs/json/n_array_items_separated_by_semicolon.json
new file mode 100755
index 0000000..d4bd731
--- /dev/null
+++ b/tests/specs/json/n_array_items_separated_by_semicolon.json
@@ -0,0 +1 @@
+[1:2] \ No newline at end of file
diff --git a/tests/specs/json/n_array_just_comma.json b/tests/specs/json/n_array_just_comma.json
new file mode 100755
index 0000000..9d7077c
--- /dev/null
+++ b/tests/specs/json/n_array_just_comma.json
@@ -0,0 +1 @@
+[,] \ No newline at end of file
diff --git a/tests/specs/json/n_array_just_minus.json b/tests/specs/json/n_array_just_minus.json
new file mode 100755
index 0000000..29501c6
--- /dev/null
+++ b/tests/specs/json/n_array_just_minus.json
@@ -0,0 +1 @@
+[-] \ No newline at end of file
diff --git a/tests/specs/json/n_array_missing_value.json b/tests/specs/json/n_array_missing_value.json
new file mode 100644
index 0000000..3a6ba86
--- /dev/null
+++ b/tests/specs/json/n_array_missing_value.json
@@ -0,0 +1 @@
+[ , ""] \ No newline at end of file
diff --git a/tests/specs/json/n_array_newlines_unclosed.json b/tests/specs/json/n_array_newlines_unclosed.json
new file mode 100644
index 0000000..6466800
--- /dev/null
+++ b/tests/specs/json/n_array_newlines_unclosed.json
@@ -0,0 +1,3 @@
+["a",
+4
+,1, \ No newline at end of file
diff --git a/tests/specs/json/n_array_number_and_comma.json b/tests/specs/json/n_array_number_and_comma.json
new file mode 100755
index 0000000..13f6f1d
--- /dev/null
+++ b/tests/specs/json/n_array_number_and_comma.json
@@ -0,0 +1 @@
+[1,] \ No newline at end of file
diff --git a/tests/specs/json/n_array_number_and_several_commas.json b/tests/specs/json/n_array_number_and_several_commas.json
new file mode 100755
index 0000000..0ac408c
--- /dev/null
+++ b/tests/specs/json/n_array_number_and_several_commas.json
@@ -0,0 +1 @@
+[1,,] \ No newline at end of file
diff --git a/tests/specs/json/n_array_spaces_vertical_tab_formfeed.json b/tests/specs/json/n_array_spaces_vertical_tab_formfeed.json
new file mode 100755
index 0000000..6cd7cf5
--- /dev/null
+++ b/tests/specs/json/n_array_spaces_vertical_tab_formfeed.json
@@ -0,0 +1 @@
+[" a"\f] \ No newline at end of file
diff --git a/tests/specs/json/n_array_star_inside.json b/tests/specs/json/n_array_star_inside.json
new file mode 100755
index 0000000..5a51946
--- /dev/null
+++ b/tests/specs/json/n_array_star_inside.json
@@ -0,0 +1 @@
+[*] \ No newline at end of file
diff --git a/tests/specs/json/n_array_unclosed.json b/tests/specs/json/n_array_unclosed.json
new file mode 100644
index 0000000..0607330
--- /dev/null
+++ b/tests/specs/json/n_array_unclosed.json
@@ -0,0 +1 @@
+["" \ No newline at end of file
diff --git a/tests/specs/json/n_array_unclosed_trailing_comma.json b/tests/specs/json/n_array_unclosed_trailing_comma.json
new file mode 100644
index 0000000..6604698
--- /dev/null
+++ b/tests/specs/json/n_array_unclosed_trailing_comma.json
@@ -0,0 +1 @@
+[1, \ No newline at end of file
diff --git a/tests/specs/json/n_array_unclosed_with_new_lines.json b/tests/specs/json/n_array_unclosed_with_new_lines.json
new file mode 100644
index 0000000..4f61de3
--- /dev/null
+++ b/tests/specs/json/n_array_unclosed_with_new_lines.json
@@ -0,0 +1,3 @@
+[1,
+1
+,1 \ No newline at end of file
diff --git a/tests/specs/json/n_array_unclosed_with_object_inside.json b/tests/specs/json/n_array_unclosed_with_object_inside.json
new file mode 100644
index 0000000..043a87e
--- /dev/null
+++ b/tests/specs/json/n_array_unclosed_with_object_inside.json
@@ -0,0 +1 @@
+[{} \ No newline at end of file
diff --git a/tests/specs/json/n_incomplete_false.json b/tests/specs/json/n_incomplete_false.json
new file mode 100644
index 0000000..eb18c6a
--- /dev/null
+++ b/tests/specs/json/n_incomplete_false.json
@@ -0,0 +1 @@
+[fals] \ No newline at end of file
diff --git a/tests/specs/json/n_incomplete_null.json b/tests/specs/json/n_incomplete_null.json
new file mode 100644
index 0000000..c18ef53
--- /dev/null
+++ b/tests/specs/json/n_incomplete_null.json
@@ -0,0 +1 @@
+[nul] \ No newline at end of file
diff --git a/tests/specs/json/n_incomplete_true.json b/tests/specs/json/n_incomplete_true.json
new file mode 100644
index 0000000..f451ac6
--- /dev/null
+++ b/tests/specs/json/n_incomplete_true.json
@@ -0,0 +1 @@
+[tru] \ No newline at end of file
diff --git a/tests/specs/json/n_multidigit_number_then_00.json b/tests/specs/json/n_multidigit_number_then_00.json
new file mode 100644
index 0000000..c22507b
--- /dev/null
+++ b/tests/specs/json/n_multidigit_number_then_00.json
Binary files differ
diff --git a/tests/specs/json/n_number_++.json b/tests/specs/json/n_number_++.json
new file mode 100644
index 0000000..bdb62aa
--- /dev/null
+++ b/tests/specs/json/n_number_++.json
@@ -0,0 +1 @@
+[++1234] \ No newline at end of file
diff --git a/tests/specs/json/n_number_+1.json b/tests/specs/json/n_number_+1.json
new file mode 100755
index 0000000..3cbe58c
--- /dev/null
+++ b/tests/specs/json/n_number_+1.json
@@ -0,0 +1 @@
+[+1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_+Inf.json b/tests/specs/json/n_number_+Inf.json
new file mode 100755
index 0000000..871ae14
--- /dev/null
+++ b/tests/specs/json/n_number_+Inf.json
@@ -0,0 +1 @@
+[+Inf] \ No newline at end of file
diff --git a/tests/specs/json/n_number_-01.json b/tests/specs/json/n_number_-01.json
new file mode 100755
index 0000000..0df32ba
--- /dev/null
+++ b/tests/specs/json/n_number_-01.json
@@ -0,0 +1 @@
+[-01] \ No newline at end of file
diff --git a/tests/specs/json/n_number_-1.0..json b/tests/specs/json/n_number_-1.0..json
new file mode 100755
index 0000000..7cf55a8
--- /dev/null
+++ b/tests/specs/json/n_number_-1.0..json
@@ -0,0 +1 @@
+[-1.0.] \ No newline at end of file
diff --git a/tests/specs/json/n_number_-2..json b/tests/specs/json/n_number_-2..json
new file mode 100755
index 0000000..9be8436
--- /dev/null
+++ b/tests/specs/json/n_number_-2..json
@@ -0,0 +1 @@
+[-2.] \ No newline at end of file
diff --git a/tests/specs/json/n_number_-NaN.json b/tests/specs/json/n_number_-NaN.json
new file mode 100755
index 0000000..f61615d
--- /dev/null
+++ b/tests/specs/json/n_number_-NaN.json
@@ -0,0 +1 @@
+[-NaN] \ No newline at end of file
diff --git a/tests/specs/json/n_number_.-1.json b/tests/specs/json/n_number_.-1.json
new file mode 100644
index 0000000..1c9f2dd
--- /dev/null
+++ b/tests/specs/json/n_number_.-1.json
@@ -0,0 +1 @@
+[.-1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_.2e-3.json b/tests/specs/json/n_number_.2e-3.json
new file mode 100755
index 0000000..c6c976f
--- /dev/null
+++ b/tests/specs/json/n_number_.2e-3.json
@@ -0,0 +1 @@
+[.2e-3] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0.1.2.json b/tests/specs/json/n_number_0.1.2.json
new file mode 100755
index 0000000..c83a256
--- /dev/null
+++ b/tests/specs/json/n_number_0.1.2.json
@@ -0,0 +1 @@
+[0.1.2] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0.3e+.json b/tests/specs/json/n_number_0.3e+.json
new file mode 100644
index 0000000..a55a1bf
--- /dev/null
+++ b/tests/specs/json/n_number_0.3e+.json
@@ -0,0 +1 @@
+[0.3e+] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0.3e.json b/tests/specs/json/n_number_0.3e.json
new file mode 100644
index 0000000..3dd5df4
--- /dev/null
+++ b/tests/specs/json/n_number_0.3e.json
@@ -0,0 +1 @@
+[0.3e] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0.e1.json b/tests/specs/json/n_number_0.e1.json
new file mode 100644
index 0000000..c92c71c
--- /dev/null
+++ b/tests/specs/json/n_number_0.e1.json
@@ -0,0 +1 @@
+[0.e1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0_capital_E+.json b/tests/specs/json/n_number_0_capital_E+.json
new file mode 100644
index 0000000..3ba2c7d
--- /dev/null
+++ b/tests/specs/json/n_number_0_capital_E+.json
@@ -0,0 +1 @@
+[0E+] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0_capital_E.json b/tests/specs/json/n_number_0_capital_E.json
new file mode 100755
index 0000000..5301840
--- /dev/null
+++ b/tests/specs/json/n_number_0_capital_E.json
@@ -0,0 +1 @@
+[0E] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0e+.json b/tests/specs/json/n_number_0e+.json
new file mode 100644
index 0000000..8ab0bc4
--- /dev/null
+++ b/tests/specs/json/n_number_0e+.json
@@ -0,0 +1 @@
+[0e+] \ No newline at end of file
diff --git a/tests/specs/json/n_number_0e.json b/tests/specs/json/n_number_0e.json
new file mode 100644
index 0000000..47ec421
--- /dev/null
+++ b/tests/specs/json/n_number_0e.json
@@ -0,0 +1 @@
+[0e] \ No newline at end of file
diff --git a/tests/specs/json/n_number_1.0e+.json b/tests/specs/json/n_number_1.0e+.json
new file mode 100755
index 0000000..cd84b9f
--- /dev/null
+++ b/tests/specs/json/n_number_1.0e+.json
@@ -0,0 +1 @@
+[1.0e+] \ No newline at end of file
diff --git a/tests/specs/json/n_number_1.0e-.json b/tests/specs/json/n_number_1.0e-.json
new file mode 100755
index 0000000..4eb7afa
--- /dev/null
+++ b/tests/specs/json/n_number_1.0e-.json
@@ -0,0 +1 @@
+[1.0e-] \ No newline at end of file
diff --git a/tests/specs/json/n_number_1.0e.json b/tests/specs/json/n_number_1.0e.json
new file mode 100755
index 0000000..21753f4
--- /dev/null
+++ b/tests/specs/json/n_number_1.0e.json
@@ -0,0 +1 @@
+[1.0e] \ No newline at end of file
diff --git a/tests/specs/json/n_number_1_000.json b/tests/specs/json/n_number_1_000.json
new file mode 100755
index 0000000..7b18b66
--- /dev/null
+++ b/tests/specs/json/n_number_1_000.json
@@ -0,0 +1 @@
+[1 000.0] \ No newline at end of file
diff --git a/tests/specs/json/n_number_1eE2.json b/tests/specs/json/n_number_1eE2.json
new file mode 100755
index 0000000..4318a34
--- /dev/null
+++ b/tests/specs/json/n_number_1eE2.json
@@ -0,0 +1 @@
+[1eE2] \ No newline at end of file
diff --git a/tests/specs/json/n_number_2.e+3.json b/tests/specs/json/n_number_2.e+3.json
new file mode 100755
index 0000000..4442f39
--- /dev/null
+++ b/tests/specs/json/n_number_2.e+3.json
@@ -0,0 +1 @@
+[2.e+3] \ No newline at end of file
diff --git a/tests/specs/json/n_number_2.e-3.json b/tests/specs/json/n_number_2.e-3.json
new file mode 100755
index 0000000..a65060e
--- /dev/null
+++ b/tests/specs/json/n_number_2.e-3.json
@@ -0,0 +1 @@
+[2.e-3] \ No newline at end of file
diff --git a/tests/specs/json/n_number_2.e3.json b/tests/specs/json/n_number_2.e3.json
new file mode 100755
index 0000000..66f7cf7
--- /dev/null
+++ b/tests/specs/json/n_number_2.e3.json
@@ -0,0 +1 @@
+[2.e3] \ No newline at end of file
diff --git a/tests/specs/json/n_number_9.e+.json b/tests/specs/json/n_number_9.e+.json
new file mode 100644
index 0000000..732a7b1
--- /dev/null
+++ b/tests/specs/json/n_number_9.e+.json
@@ -0,0 +1 @@
+[9.e+] \ No newline at end of file
diff --git a/tests/specs/json/n_number_Inf.json b/tests/specs/json/n_number_Inf.json
new file mode 100755
index 0000000..c40c734
--- /dev/null
+++ b/tests/specs/json/n_number_Inf.json
@@ -0,0 +1 @@
+[Inf] \ No newline at end of file
diff --git a/tests/specs/json/n_number_NaN.json b/tests/specs/json/n_number_NaN.json
new file mode 100755
index 0000000..4992317
--- /dev/null
+++ b/tests/specs/json/n_number_NaN.json
@@ -0,0 +1 @@
+[NaN] \ No newline at end of file
diff --git a/tests/specs/json/n_number_U+FF11_fullwidth_digit_one.json b/tests/specs/json/n_number_U+FF11_fullwidth_digit_one.json
new file mode 100644
index 0000000..b14587e
--- /dev/null
+++ b/tests/specs/json/n_number_U+FF11_fullwidth_digit_one.json
@@ -0,0 +1 @@
+[1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_expression.json b/tests/specs/json/n_number_expression.json
new file mode 100644
index 0000000..76fdbc8
--- /dev/null
+++ b/tests/specs/json/n_number_expression.json
@@ -0,0 +1 @@
+[1+2] \ No newline at end of file
diff --git a/tests/specs/json/n_number_hex_1_digit.json b/tests/specs/json/n_number_hex_1_digit.json
new file mode 100644
index 0000000..3b21488
--- /dev/null
+++ b/tests/specs/json/n_number_hex_1_digit.json
@@ -0,0 +1 @@
+[0x1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_hex_2_digits.json b/tests/specs/json/n_number_hex_2_digits.json
new file mode 100644
index 0000000..83e516a
--- /dev/null
+++ b/tests/specs/json/n_number_hex_2_digits.json
@@ -0,0 +1 @@
+[0x42] \ No newline at end of file
diff --git a/tests/specs/json/n_number_infinity.json b/tests/specs/json/n_number_infinity.json
new file mode 100755
index 0000000..8c2baf7
--- /dev/null
+++ b/tests/specs/json/n_number_infinity.json
@@ -0,0 +1 @@
+[Infinity] \ No newline at end of file
diff --git a/tests/specs/json/n_number_invalid+-.json b/tests/specs/json/n_number_invalid+-.json
new file mode 100644
index 0000000..1cce602
--- /dev/null
+++ b/tests/specs/json/n_number_invalid+-.json
@@ -0,0 +1 @@
+[0e+-1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_invalid-negative-real.json b/tests/specs/json/n_number_invalid-negative-real.json
new file mode 100644
index 0000000..5fc3c1e
--- /dev/null
+++ b/tests/specs/json/n_number_invalid-negative-real.json
@@ -0,0 +1 @@
+[-123.123foo] \ No newline at end of file
diff --git a/tests/specs/json/n_number_invalid-utf-8-in-bigger-int.json b/tests/specs/json/n_number_invalid-utf-8-in-bigger-int.json
new file mode 100644
index 0000000..3b97e58
--- /dev/null
+++ b/tests/specs/json/n_number_invalid-utf-8-in-bigger-int.json
@@ -0,0 +1 @@
+[123�] \ No newline at end of file
diff --git a/tests/specs/json/n_number_invalid-utf-8-in-exponent.json b/tests/specs/json/n_number_invalid-utf-8-in-exponent.json
new file mode 100644
index 0000000..ea35d72
--- /dev/null
+++ b/tests/specs/json/n_number_invalid-utf-8-in-exponent.json
@@ -0,0 +1 @@
+[1e1�] \ No newline at end of file
diff --git a/tests/specs/json/n_number_invalid-utf-8-in-int.json b/tests/specs/json/n_number_invalid-utf-8-in-int.json
new file mode 100644
index 0000000..371226e
--- /dev/null
+++ b/tests/specs/json/n_number_invalid-utf-8-in-int.json
@@ -0,0 +1 @@
+[0�]
diff --git a/tests/specs/json/n_number_minus_infinity.json b/tests/specs/json/n_number_minus_infinity.json
new file mode 100755
index 0000000..cf4133d
--- /dev/null
+++ b/tests/specs/json/n_number_minus_infinity.json
@@ -0,0 +1 @@
+[-Infinity] \ No newline at end of file
diff --git a/tests/specs/json/n_number_minus_sign_with_trailing_garbage.json b/tests/specs/json/n_number_minus_sign_with_trailing_garbage.json
new file mode 100644
index 0000000..a6d8e78
--- /dev/null
+++ b/tests/specs/json/n_number_minus_sign_with_trailing_garbage.json
@@ -0,0 +1 @@
+[-foo] \ No newline at end of file
diff --git a/tests/specs/json/n_number_minus_space_1.json b/tests/specs/json/n_number_minus_space_1.json
new file mode 100644
index 0000000..9a5ebed
--- /dev/null
+++ b/tests/specs/json/n_number_minus_space_1.json
@@ -0,0 +1 @@
+[- 1] \ No newline at end of file
diff --git a/tests/specs/json/n_number_neg_int_starting_with_zero.json b/tests/specs/json/n_number_neg_int_starting_with_zero.json
new file mode 100644
index 0000000..67af096
--- /dev/null
+++ b/tests/specs/json/n_number_neg_int_starting_with_zero.json
@@ -0,0 +1 @@
+[-012] \ No newline at end of file
diff --git a/tests/specs/json/n_number_neg_real_without_int_part.json b/tests/specs/json/n_number_neg_real_without_int_part.json
new file mode 100755
index 0000000..1f2a434
--- /dev/null
+++ b/tests/specs/json/n_number_neg_real_without_int_part.json
@@ -0,0 +1 @@
+[-.123] \ No newline at end of file
diff --git a/tests/specs/json/n_number_neg_with_garbage_at_end.json b/tests/specs/json/n_number_neg_with_garbage_at_end.json
new file mode 100644
index 0000000..2aa7311
--- /dev/null
+++ b/tests/specs/json/n_number_neg_with_garbage_at_end.json
@@ -0,0 +1 @@
+[-1x] \ No newline at end of file
diff --git a/tests/specs/json/n_number_real_garbage_after_e.json b/tests/specs/json/n_number_real_garbage_after_e.json
new file mode 100644
index 0000000..9213dfc
--- /dev/null
+++ b/tests/specs/json/n_number_real_garbage_after_e.json
@@ -0,0 +1 @@
+[1ea] \ No newline at end of file
diff --git a/tests/specs/json/n_number_real_with_invalid_utf8_after_e.json b/tests/specs/json/n_number_real_with_invalid_utf8_after_e.json
new file mode 100644
index 0000000..1e52ef9
--- /dev/null
+++ b/tests/specs/json/n_number_real_with_invalid_utf8_after_e.json
@@ -0,0 +1 @@
+[1e�] \ No newline at end of file
diff --git a/tests/specs/json/n_number_real_without_fractional_part.json b/tests/specs/json/n_number_real_without_fractional_part.json
new file mode 100755
index 0000000..1de287c
--- /dev/null
+++ b/tests/specs/json/n_number_real_without_fractional_part.json
@@ -0,0 +1 @@
+[1.] \ No newline at end of file
diff --git a/tests/specs/json/n_number_starting_with_dot.json b/tests/specs/json/n_number_starting_with_dot.json
new file mode 100755
index 0000000..f682dbd
--- /dev/null
+++ b/tests/specs/json/n_number_starting_with_dot.json
@@ -0,0 +1 @@
+[.123] \ No newline at end of file
diff --git a/tests/specs/json/n_number_with_alpha.json b/tests/specs/json/n_number_with_alpha.json
new file mode 100644
index 0000000..1e42d81
--- /dev/null
+++ b/tests/specs/json/n_number_with_alpha.json
@@ -0,0 +1 @@
+[1.2a-3] \ No newline at end of file
diff --git a/tests/specs/json/n_number_with_alpha_char.json b/tests/specs/json/n_number_with_alpha_char.json
new file mode 100644
index 0000000..b79dacc
--- /dev/null
+++ b/tests/specs/json/n_number_with_alpha_char.json
@@ -0,0 +1 @@
+[1.8011670033376514H-308] \ No newline at end of file
diff --git a/tests/specs/json/n_number_with_leading_zero.json b/tests/specs/json/n_number_with_leading_zero.json
new file mode 100755
index 0000000..7106da1
--- /dev/null
+++ b/tests/specs/json/n_number_with_leading_zero.json
@@ -0,0 +1 @@
+[012] \ No newline at end of file
diff --git a/tests/specs/json/n_object_bad_value.json b/tests/specs/json/n_object_bad_value.json
new file mode 100644
index 0000000..a03a8c0
--- /dev/null
+++ b/tests/specs/json/n_object_bad_value.json
@@ -0,0 +1 @@
+["x", truth] \ No newline at end of file
diff --git a/tests/specs/json/n_object_bracket_key.json b/tests/specs/json/n_object_bracket_key.json
new file mode 100644
index 0000000..cc443b4
--- /dev/null
+++ b/tests/specs/json/n_object_bracket_key.json
@@ -0,0 +1 @@
+{[: "x"}
diff --git a/tests/specs/json/n_object_comma_instead_of_colon.json b/tests/specs/json/n_object_comma_instead_of_colon.json
new file mode 100644
index 0000000..8d56377
--- /dev/null
+++ b/tests/specs/json/n_object_comma_instead_of_colon.json
@@ -0,0 +1 @@
+{"x", null} \ No newline at end of file
diff --git a/tests/specs/json/n_object_double_colon.json b/tests/specs/json/n_object_double_colon.json
new file mode 100644
index 0000000..80e8c7b
--- /dev/null
+++ b/tests/specs/json/n_object_double_colon.json
@@ -0,0 +1 @@
+{"x"::"b"} \ No newline at end of file
diff --git a/tests/specs/json/n_object_emoji.json b/tests/specs/json/n_object_emoji.json
new file mode 100644
index 0000000..cb4078e
--- /dev/null
+++ b/tests/specs/json/n_object_emoji.json
@@ -0,0 +1 @@
+{🇨🇭} \ No newline at end of file
diff --git a/tests/specs/json/n_object_garbage_at_end.json b/tests/specs/json/n_object_garbage_at_end.json
new file mode 100644
index 0000000..80c42cb
--- /dev/null
+++ b/tests/specs/json/n_object_garbage_at_end.json
@@ -0,0 +1 @@
+{"a":"a" 123} \ No newline at end of file
diff --git a/tests/specs/json/n_object_key_with_single_quotes.json b/tests/specs/json/n_object_key_with_single_quotes.json
new file mode 100755
index 0000000..77c3275
--- /dev/null
+++ b/tests/specs/json/n_object_key_with_single_quotes.json
@@ -0,0 +1 @@
+{key: 'value'} \ No newline at end of file
diff --git a/tests/specs/json/n_object_lone_continuation_byte_in_key_and_trailing_comma.json b/tests/specs/json/n_object_lone_continuation_byte_in_key_and_trailing_comma.json
new file mode 100644
index 0000000..aa2cb63
--- /dev/null
+++ b/tests/specs/json/n_object_lone_continuation_byte_in_key_and_trailing_comma.json
@@ -0,0 +1 @@
+{"�":"0",} \ No newline at end of file
diff --git a/tests/specs/json/n_object_missing_colon.json b/tests/specs/json/n_object_missing_colon.json
new file mode 100644
index 0000000..b98eff6
--- /dev/null
+++ b/tests/specs/json/n_object_missing_colon.json
@@ -0,0 +1 @@
+{"a" b} \ No newline at end of file
diff --git a/tests/specs/json/n_object_missing_key.json b/tests/specs/json/n_object_missing_key.json
new file mode 100755
index 0000000..b4fb0f5
--- /dev/null
+++ b/tests/specs/json/n_object_missing_key.json
@@ -0,0 +1 @@
+{:"b"} \ No newline at end of file
diff --git a/tests/specs/json/n_object_missing_semicolon.json b/tests/specs/json/n_object_missing_semicolon.json
new file mode 100755
index 0000000..e345138
--- /dev/null
+++ b/tests/specs/json/n_object_missing_semicolon.json
@@ -0,0 +1 @@
+{"a" "b"} \ No newline at end of file
diff --git a/tests/specs/json/n_object_missing_value.json b/tests/specs/json/n_object_missing_value.json
new file mode 100644
index 0000000..3ef538a
--- /dev/null
+++ b/tests/specs/json/n_object_missing_value.json
@@ -0,0 +1 @@
+{"a": \ No newline at end of file
diff --git a/tests/specs/json/n_object_no-colon.json b/tests/specs/json/n_object_no-colon.json
new file mode 100644
index 0000000..f3797b3
--- /dev/null
+++ b/tests/specs/json/n_object_no-colon.json
@@ -0,0 +1 @@
+{"a" \ No newline at end of file
diff --git a/tests/specs/json/n_object_non_string_key.json b/tests/specs/json/n_object_non_string_key.json
new file mode 100755
index 0000000..b9945b3
--- /dev/null
+++ b/tests/specs/json/n_object_non_string_key.json
@@ -0,0 +1 @@
+{1:1} \ No newline at end of file
diff --git a/tests/specs/json/n_object_non_string_key_but_huge_number_instead.json b/tests/specs/json/n_object_non_string_key_but_huge_number_instead.json
new file mode 100755
index 0000000..b37fa86
--- /dev/null
+++ b/tests/specs/json/n_object_non_string_key_but_huge_number_instead.json
@@ -0,0 +1 @@
+{9999E9999:1} \ No newline at end of file
diff --git a/tests/specs/json/n_object_repeated_null_null.json b/tests/specs/json/n_object_repeated_null_null.json
new file mode 100755
index 0000000..f7d2959
--- /dev/null
+++ b/tests/specs/json/n_object_repeated_null_null.json
@@ -0,0 +1 @@
+{null:null,null:null} \ No newline at end of file
diff --git a/tests/specs/json/n_object_several_trailing_commas.json b/tests/specs/json/n_object_several_trailing_commas.json
new file mode 100755
index 0000000..3c9afe8
--- /dev/null
+++ b/tests/specs/json/n_object_several_trailing_commas.json
@@ -0,0 +1 @@
+{"id":0,,,,,} \ No newline at end of file
diff --git a/tests/specs/json/n_object_single_quote.json b/tests/specs/json/n_object_single_quote.json
new file mode 100644
index 0000000..e5cdf97
--- /dev/null
+++ b/tests/specs/json/n_object_single_quote.json
@@ -0,0 +1 @@
+{'a':0} \ No newline at end of file
diff --git a/tests/specs/json/n_object_trailing_comma.json b/tests/specs/json/n_object_trailing_comma.json
new file mode 100755
index 0000000..a4b0250
--- /dev/null
+++ b/tests/specs/json/n_object_trailing_comma.json
@@ -0,0 +1 @@
+{"id":0,} \ No newline at end of file
diff --git a/tests/specs/json/n_object_trailing_comment.json b/tests/specs/json/n_object_trailing_comment.json
new file mode 100644
index 0000000..a372c65
--- /dev/null
+++ b/tests/specs/json/n_object_trailing_comment.json
@@ -0,0 +1 @@
+{"a":"b"}/**/ \ No newline at end of file
diff --git a/tests/specs/json/n_object_trailing_comment_open.json b/tests/specs/json/n_object_trailing_comment_open.json
new file mode 100644
index 0000000..d557f41
--- /dev/null
+++ b/tests/specs/json/n_object_trailing_comment_open.json
@@ -0,0 +1 @@
+{"a":"b"}/**// \ No newline at end of file
diff --git a/tests/specs/json/n_object_trailing_comment_slash_open.json b/tests/specs/json/n_object_trailing_comment_slash_open.json
new file mode 100644
index 0000000..e335136
--- /dev/null
+++ b/tests/specs/json/n_object_trailing_comment_slash_open.json
@@ -0,0 +1 @@
+{"a":"b"}// \ No newline at end of file
diff --git a/tests/specs/json/n_object_trailing_comment_slash_open_incomplete.json b/tests/specs/json/n_object_trailing_comment_slash_open_incomplete.json
new file mode 100644
index 0000000..d892e49
--- /dev/null
+++ b/tests/specs/json/n_object_trailing_comment_slash_open_incomplete.json
@@ -0,0 +1 @@
+{"a":"b"}/ \ No newline at end of file
diff --git a/tests/specs/json/n_object_two_commas_in_a_row.json b/tests/specs/json/n_object_two_commas_in_a_row.json
new file mode 100755
index 0000000..7c639ae
--- /dev/null
+++ b/tests/specs/json/n_object_two_commas_in_a_row.json
@@ -0,0 +1 @@
+{"a":"b",,"c":"d"} \ No newline at end of file
diff --git a/tests/specs/json/n_object_unquoted_key.json b/tests/specs/json/n_object_unquoted_key.json
new file mode 100644
index 0000000..8ba1372
--- /dev/null
+++ b/tests/specs/json/n_object_unquoted_key.json
@@ -0,0 +1 @@
+{a: "b"} \ No newline at end of file
diff --git a/tests/specs/json/n_object_unterminated-value.json b/tests/specs/json/n_object_unterminated-value.json
new file mode 100644
index 0000000..7fe699a
--- /dev/null
+++ b/tests/specs/json/n_object_unterminated-value.json
@@ -0,0 +1 @@
+{"a":"a \ No newline at end of file
diff --git a/tests/specs/json/n_object_with_single_string.json b/tests/specs/json/n_object_with_single_string.json
new file mode 100644
index 0000000..d63f7fb
--- /dev/null
+++ b/tests/specs/json/n_object_with_single_string.json
@@ -0,0 +1 @@
+{ "foo" : "bar", "a" } \ No newline at end of file
diff --git a/tests/specs/json/n_object_with_trailing_garbage.json b/tests/specs/json/n_object_with_trailing_garbage.json
new file mode 100644
index 0000000..787c8f0
--- /dev/null
+++ b/tests/specs/json/n_object_with_trailing_garbage.json
@@ -0,0 +1 @@
+{"a":"b"}# \ No newline at end of file
diff --git a/tests/specs/json/n_single_space.json b/tests/specs/json/n_single_space.json
new file mode 100755
index 0000000..0519ecb
--- /dev/null
+++ b/tests/specs/json/n_single_space.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/tests/specs/json/n_string_1_surrogate_then_escape.json b/tests/specs/json/n_string_1_surrogate_then_escape.json
new file mode 100644
index 0000000..acec66d
--- /dev/null
+++ b/tests/specs/json/n_string_1_surrogate_then_escape.json
@@ -0,0 +1 @@
+["\uD800\"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_1_surrogate_then_escape_u.json b/tests/specs/json/n_string_1_surrogate_then_escape_u.json
new file mode 100644
index 0000000..e834b05
--- /dev/null
+++ b/tests/specs/json/n_string_1_surrogate_then_escape_u.json
@@ -0,0 +1 @@
+["\uD800\u"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_1_surrogate_then_escape_u1.json b/tests/specs/json/n_string_1_surrogate_then_escape_u1.json
new file mode 100644
index 0000000..a04cd34
--- /dev/null
+++ b/tests/specs/json/n_string_1_surrogate_then_escape_u1.json
@@ -0,0 +1 @@
+["\uD800\u1"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_1_surrogate_then_escape_u1x.json b/tests/specs/json/n_string_1_surrogate_then_escape_u1x.json
new file mode 100644
index 0000000..bfbd234
--- /dev/null
+++ b/tests/specs/json/n_string_1_surrogate_then_escape_u1x.json
@@ -0,0 +1 @@
+["\uD800\u1x"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_accentuated_char_no_quotes.json b/tests/specs/json/n_string_accentuated_char_no_quotes.json
new file mode 100644
index 0000000..fd68956
--- /dev/null
+++ b/tests/specs/json/n_string_accentuated_char_no_quotes.json
@@ -0,0 +1 @@
+[é] \ No newline at end of file
diff --git a/tests/specs/json/n_string_backslash_00.json b/tests/specs/json/n_string_backslash_00.json
new file mode 100644
index 0000000..b5bf267
--- /dev/null
+++ b/tests/specs/json/n_string_backslash_00.json
Binary files differ
diff --git a/tests/specs/json/n_string_escape_x.json b/tests/specs/json/n_string_escape_x.json
new file mode 100644
index 0000000..fae2919
--- /dev/null
+++ b/tests/specs/json/n_string_escape_x.json
@@ -0,0 +1 @@
+["\x00"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_escaped_backslash_bad.json b/tests/specs/json/n_string_escaped_backslash_bad.json
new file mode 100755
index 0000000..016fcb4
--- /dev/null
+++ b/tests/specs/json/n_string_escaped_backslash_bad.json
@@ -0,0 +1 @@
+["\\\"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_escaped_ctrl_char_tab.json b/tests/specs/json/n_string_escaped_ctrl_char_tab.json
new file mode 100644
index 0000000..f35ea38
--- /dev/null
+++ b/tests/specs/json/n_string_escaped_ctrl_char_tab.json
@@ -0,0 +1 @@
+["\ "] \ No newline at end of file
diff --git a/tests/specs/json/n_string_escaped_emoji.json b/tests/specs/json/n_string_escaped_emoji.json
new file mode 100644
index 0000000..a277754
--- /dev/null
+++ b/tests/specs/json/n_string_escaped_emoji.json
@@ -0,0 +1 @@
+["\🌀"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_incomplete_escape.json b/tests/specs/json/n_string_incomplete_escape.json
new file mode 100755
index 0000000..3415c33
--- /dev/null
+++ b/tests/specs/json/n_string_incomplete_escape.json
@@ -0,0 +1 @@
+["\"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_incomplete_escaped_character.json b/tests/specs/json/n_string_incomplete_escaped_character.json
new file mode 100755
index 0000000..0f2197e
--- /dev/null
+++ b/tests/specs/json/n_string_incomplete_escaped_character.json
@@ -0,0 +1 @@
+["\u00A"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_incomplete_surrogate.json b/tests/specs/json/n_string_incomplete_surrogate.json
new file mode 100755
index 0000000..75504a6
--- /dev/null
+++ b/tests/specs/json/n_string_incomplete_surrogate.json
@@ -0,0 +1 @@
+["\uD834\uDd"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_incomplete_surrogate_escape_invalid.json b/tests/specs/json/n_string_incomplete_surrogate_escape_invalid.json
new file mode 100755
index 0000000..bd96560
--- /dev/null
+++ b/tests/specs/json/n_string_incomplete_surrogate_escape_invalid.json
@@ -0,0 +1 @@
+["\uD800\uD800\x"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_invalid-utf-8-in-escape.json b/tests/specs/json/n_string_invalid-utf-8-in-escape.json
new file mode 100644
index 0000000..0c43006
--- /dev/null
+++ b/tests/specs/json/n_string_invalid-utf-8-in-escape.json
@@ -0,0 +1 @@
+["\u�"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_invalid_backslash_esc.json b/tests/specs/json/n_string_invalid_backslash_esc.json
new file mode 100755
index 0000000..d1eb609
--- /dev/null
+++ b/tests/specs/json/n_string_invalid_backslash_esc.json
@@ -0,0 +1 @@
+["\a"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_invalid_unicode_escape.json b/tests/specs/json/n_string_invalid_unicode_escape.json
new file mode 100644
index 0000000..7608cb6
--- /dev/null
+++ b/tests/specs/json/n_string_invalid_unicode_escape.json
@@ -0,0 +1 @@
+["\uqqqq"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_invalid_utf8_after_escape.json b/tests/specs/json/n_string_invalid_utf8_after_escape.json
new file mode 100644
index 0000000..2f757a2
--- /dev/null
+++ b/tests/specs/json/n_string_invalid_utf8_after_escape.json
@@ -0,0 +1 @@
+["\�"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_leading_uescaped_thinspace.json b/tests/specs/json/n_string_leading_uescaped_thinspace.json
new file mode 100755
index 0000000..7b297c6
--- /dev/null
+++ b/tests/specs/json/n_string_leading_uescaped_thinspace.json
@@ -0,0 +1 @@
+[\u0020"asd"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_no_quotes_with_bad_escape.json b/tests/specs/json/n_string_no_quotes_with_bad_escape.json
new file mode 100644
index 0000000..01bc70a
--- /dev/null
+++ b/tests/specs/json/n_string_no_quotes_with_bad_escape.json
@@ -0,0 +1 @@
+[\n] \ No newline at end of file
diff --git a/tests/specs/json/n_string_single_doublequote.json b/tests/specs/json/n_string_single_doublequote.json
new file mode 100755
index 0000000..9d68933
--- /dev/null
+++ b/tests/specs/json/n_string_single_doublequote.json
@@ -0,0 +1 @@
+" \ No newline at end of file
diff --git a/tests/specs/json/n_string_single_quote.json b/tests/specs/json/n_string_single_quote.json
new file mode 100644
index 0000000..caff239
--- /dev/null
+++ b/tests/specs/json/n_string_single_quote.json
@@ -0,0 +1 @@
+['single quote'] \ No newline at end of file
diff --git a/tests/specs/json/n_string_single_string_no_double_quotes.json b/tests/specs/json/n_string_single_string_no_double_quotes.json
new file mode 100755
index 0000000..f2ba8f8
--- /dev/null
+++ b/tests/specs/json/n_string_single_string_no_double_quotes.json
@@ -0,0 +1 @@
+abc \ No newline at end of file
diff --git a/tests/specs/json/n_string_start_escape_unclosed.json b/tests/specs/json/n_string_start_escape_unclosed.json
new file mode 100644
index 0000000..db62a46
--- /dev/null
+++ b/tests/specs/json/n_string_start_escape_unclosed.json
@@ -0,0 +1 @@
+["\ \ No newline at end of file
diff --git a/tests/specs/json/n_string_unescaped_ctrl_char.json b/tests/specs/json/n_string_unescaped_ctrl_char.json
new file mode 100755
index 0000000..9f21348
--- /dev/null
+++ b/tests/specs/json/n_string_unescaped_ctrl_char.json
Binary files differ
diff --git a/tests/specs/json/n_string_unescaped_newline.json b/tests/specs/json/n_string_unescaped_newline.json
new file mode 100644
index 0000000..700d360
--- /dev/null
+++ b/tests/specs/json/n_string_unescaped_newline.json
@@ -0,0 +1,2 @@
+["new
+line"] \ No newline at end of file
diff --git a/tests/specs/json/n_string_unescaped_tab.json b/tests/specs/json/n_string_unescaped_tab.json
new file mode 100644
index 0000000..160264a
--- /dev/null
+++ b/tests/specs/json/n_string_unescaped_tab.json
@@ -0,0 +1 @@
+[" "] \ No newline at end of file
diff --git a/tests/specs/json/n_string_unicode_CapitalU.json b/tests/specs/json/n_string_unicode_CapitalU.json
new file mode 100644
index 0000000..17332bb
--- /dev/null
+++ b/tests/specs/json/n_string_unicode_CapitalU.json
@@ -0,0 +1 @@
+"\UA66D" \ No newline at end of file
diff --git a/tests/specs/json/n_string_with_trailing_garbage.json b/tests/specs/json/n_string_with_trailing_garbage.json
new file mode 100644
index 0000000..efe3bd2
--- /dev/null
+++ b/tests/specs/json/n_string_with_trailing_garbage.json
@@ -0,0 +1 @@
+""x \ No newline at end of file
diff --git a/tests/specs/json/n_structure_U+2060_word_joined.json b/tests/specs/json/n_structure_U+2060_word_joined.json
new file mode 100644
index 0000000..81156a6
--- /dev/null
+++ b/tests/specs/json/n_structure_U+2060_word_joined.json
@@ -0,0 +1 @@
+[⁠] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_UTF8_BOM_no_data.json b/tests/specs/json/n_structure_UTF8_BOM_no_data.json
new file mode 100755
index 0000000..5f28270
--- /dev/null
+++ b/tests/specs/json/n_structure_UTF8_BOM_no_data.json
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_angle_bracket_..json b/tests/specs/json/n_structure_angle_bracket_..json
new file mode 100755
index 0000000..a56fef0
--- /dev/null
+++ b/tests/specs/json/n_structure_angle_bracket_..json
@@ -0,0 +1 @@
+<.> \ No newline at end of file
diff --git a/tests/specs/json/n_structure_angle_bracket_null.json b/tests/specs/json/n_structure_angle_bracket_null.json
new file mode 100755
index 0000000..617f262
--- /dev/null
+++ b/tests/specs/json/n_structure_angle_bracket_null.json
@@ -0,0 +1 @@
+[<null>] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_array_trailing_garbage.json b/tests/specs/json/n_structure_array_trailing_garbage.json
new file mode 100644
index 0000000..5a745e6
--- /dev/null
+++ b/tests/specs/json/n_structure_array_trailing_garbage.json
@@ -0,0 +1 @@
+[1]x \ No newline at end of file
diff --git a/tests/specs/json/n_structure_array_with_extra_array_close.json b/tests/specs/json/n_structure_array_with_extra_array_close.json
new file mode 100755
index 0000000..6cfb139
--- /dev/null
+++ b/tests/specs/json/n_structure_array_with_extra_array_close.json
@@ -0,0 +1 @@
+[1]] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_array_with_unclosed_string.json b/tests/specs/json/n_structure_array_with_unclosed_string.json
new file mode 100755
index 0000000..ba6b178
--- /dev/null
+++ b/tests/specs/json/n_structure_array_with_unclosed_string.json
@@ -0,0 +1 @@
+["asd] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_ascii-unicode-identifier.json b/tests/specs/json/n_structure_ascii-unicode-identifier.json
new file mode 100644
index 0000000..ef2ab62
--- /dev/null
+++ b/tests/specs/json/n_structure_ascii-unicode-identifier.json
@@ -0,0 +1 @@
+aå \ No newline at end of file
diff --git a/tests/specs/json/n_structure_capitalized_True.json b/tests/specs/json/n_structure_capitalized_True.json
new file mode 100755
index 0000000..7cd8846
--- /dev/null
+++ b/tests/specs/json/n_structure_capitalized_True.json
@@ -0,0 +1 @@
+[True] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_close_unopened_array.json b/tests/specs/json/n_structure_close_unopened_array.json
new file mode 100755
index 0000000..d2af0c6
--- /dev/null
+++ b/tests/specs/json/n_structure_close_unopened_array.json
@@ -0,0 +1 @@
+1] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_comma_instead_of_closing_brace.json b/tests/specs/json/n_structure_comma_instead_of_closing_brace.json
new file mode 100644
index 0000000..ac61b82
--- /dev/null
+++ b/tests/specs/json/n_structure_comma_instead_of_closing_brace.json
@@ -0,0 +1 @@
+{"x": true, \ No newline at end of file
diff --git a/tests/specs/json/n_structure_double_array.json b/tests/specs/json/n_structure_double_array.json
new file mode 100755
index 0000000..058d162
--- /dev/null
+++ b/tests/specs/json/n_structure_double_array.json
@@ -0,0 +1 @@
+[][] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_end_array.json b/tests/specs/json/n_structure_end_array.json
new file mode 100644
index 0000000..54caf60
--- /dev/null
+++ b/tests/specs/json/n_structure_end_array.json
@@ -0,0 +1 @@
+] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_incomplete_UTF8_BOM.json b/tests/specs/json/n_structure_incomplete_UTF8_BOM.json
new file mode 100755
index 0000000..bfcdd51
--- /dev/null
+++ b/tests/specs/json/n_structure_incomplete_UTF8_BOM.json
@@ -0,0 +1 @@
+�{} \ No newline at end of file
diff --git a/tests/specs/json/n_structure_lone-invalid-utf-8.json b/tests/specs/json/n_structure_lone-invalid-utf-8.json
new file mode 100644
index 0000000..8b1296c
--- /dev/null
+++ b/tests/specs/json/n_structure_lone-invalid-utf-8.json
@@ -0,0 +1 @@
+� \ No newline at end of file
diff --git a/tests/specs/json/n_structure_lone-open-bracket.json b/tests/specs/json/n_structure_lone-open-bracket.json
new file mode 100644
index 0000000..8e2f0be
--- /dev/null
+++ b/tests/specs/json/n_structure_lone-open-bracket.json
@@ -0,0 +1 @@
+[ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_no_data.json b/tests/specs/json/n_structure_no_data.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/specs/json/n_structure_no_data.json
diff --git a/tests/specs/json/n_structure_null-byte-outside-string.json b/tests/specs/json/n_structure_null-byte-outside-string.json
new file mode 100644
index 0000000..326db14
--- /dev/null
+++ b/tests/specs/json/n_structure_null-byte-outside-string.json
Binary files differ
diff --git a/tests/specs/json/n_structure_number_with_trailing_garbage.json b/tests/specs/json/n_structure_number_with_trailing_garbage.json
new file mode 100644
index 0000000..0746539
--- /dev/null
+++ b/tests/specs/json/n_structure_number_with_trailing_garbage.json
@@ -0,0 +1 @@
+2@ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_object_followed_by_closing_object.json b/tests/specs/json/n_structure_object_followed_by_closing_object.json
new file mode 100644
index 0000000..aa9ebae
--- /dev/null
+++ b/tests/specs/json/n_structure_object_followed_by_closing_object.json
@@ -0,0 +1 @@
+{}} \ No newline at end of file
diff --git a/tests/specs/json/n_structure_object_unclosed_no_value.json b/tests/specs/json/n_structure_object_unclosed_no_value.json
new file mode 100644
index 0000000..17d0451
--- /dev/null
+++ b/tests/specs/json/n_structure_object_unclosed_no_value.json
@@ -0,0 +1 @@
+{"": \ No newline at end of file
diff --git a/tests/specs/json/n_structure_object_with_comment.json b/tests/specs/json/n_structure_object_with_comment.json
new file mode 100644
index 0000000..ed1b569
--- /dev/null
+++ b/tests/specs/json/n_structure_object_with_comment.json
@@ -0,0 +1 @@
+{"a":/*comment*/"b"} \ No newline at end of file
diff --git a/tests/specs/json/n_structure_object_with_trailing_garbage.json b/tests/specs/json/n_structure_object_with_trailing_garbage.json
new file mode 100644
index 0000000..9ca2336
--- /dev/null
+++ b/tests/specs/json/n_structure_object_with_trailing_garbage.json
@@ -0,0 +1 @@
+{"a": true} "x" \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_array_apostrophe.json b/tests/specs/json/n_structure_open_array_apostrophe.json
new file mode 100644
index 0000000..8bebe3a
--- /dev/null
+++ b/tests/specs/json/n_structure_open_array_apostrophe.json
@@ -0,0 +1 @@
+[' \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_array_comma.json b/tests/specs/json/n_structure_open_array_comma.json
new file mode 100644
index 0000000..6295fdc
--- /dev/null
+++ b/tests/specs/json/n_structure_open_array_comma.json
@@ -0,0 +1 @@
+[, \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_array_open_object.json b/tests/specs/json/n_structure_open_array_open_object.json
new file mode 100644
index 0000000..7a63c8c
--- /dev/null
+++ b/tests/specs/json/n_structure_open_array_open_object.json
@@ -0,0 +1 @@
+[{ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_array_open_string.json b/tests/specs/json/n_structure_open_array_open_string.json
new file mode 100644
index 0000000..9822a6b
--- /dev/null
+++ b/tests/specs/json/n_structure_open_array_open_string.json
@@ -0,0 +1 @@
+["a \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_array_string.json b/tests/specs/json/n_structure_open_array_string.json
new file mode 100644
index 0000000..42a6193
--- /dev/null
+++ b/tests/specs/json/n_structure_open_array_string.json
@@ -0,0 +1 @@
+["a" \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object.json b/tests/specs/json/n_structure_open_object.json
new file mode 100644
index 0000000..81750b9
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object.json
@@ -0,0 +1 @@
+{ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object_close_array.json b/tests/specs/json/n_structure_open_object_close_array.json
new file mode 100755
index 0000000..eebc700
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object_close_array.json
@@ -0,0 +1 @@
+{] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object_comma.json b/tests/specs/json/n_structure_open_object_comma.json
new file mode 100644
index 0000000..47bc910
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object_comma.json
@@ -0,0 +1 @@
+{, \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object_open_array.json b/tests/specs/json/n_structure_open_object_open_array.json
new file mode 100644
index 0000000..381ede5
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object_open_array.json
@@ -0,0 +1 @@
+{[ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object_open_string.json b/tests/specs/json/n_structure_open_object_open_string.json
new file mode 100644
index 0000000..328c30c
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object_open_string.json
@@ -0,0 +1 @@
+{"a \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_object_string_with_apostrophes.json b/tests/specs/json/n_structure_open_object_string_with_apostrophes.json
new file mode 100644
index 0000000..9dba170
--- /dev/null
+++ b/tests/specs/json/n_structure_open_object_string_with_apostrophes.json
@@ -0,0 +1 @@
+{'a' \ No newline at end of file
diff --git a/tests/specs/json/n_structure_open_open.json b/tests/specs/json/n_structure_open_open.json
new file mode 100644
index 0000000..841fd5f
--- /dev/null
+++ b/tests/specs/json/n_structure_open_open.json
@@ -0,0 +1 @@
+["\{["\{["\{["\{ \ No newline at end of file
diff --git a/tests/specs/json/n_structure_single_eacute.json b/tests/specs/json/n_structure_single_eacute.json
new file mode 100644
index 0000000..92a39f3
--- /dev/null
+++ b/tests/specs/json/n_structure_single_eacute.json
@@ -0,0 +1 @@
+� \ No newline at end of file
diff --git a/tests/specs/json/n_structure_single_star.json b/tests/specs/json/n_structure_single_star.json
new file mode 100755
index 0000000..f59ec20
--- /dev/null
+++ b/tests/specs/json/n_structure_single_star.json
@@ -0,0 +1 @@
+* \ No newline at end of file
diff --git a/tests/specs/json/n_structure_trailing_#.json b/tests/specs/json/n_structure_trailing_#.json
new file mode 100644
index 0000000..8986110
--- /dev/null
+++ b/tests/specs/json/n_structure_trailing_#.json
@@ -0,0 +1 @@
+{"a":"b"}#{} \ No newline at end of file
diff --git a/tests/specs/json/n_structure_uescaped_LF_before_string.json b/tests/specs/json/n_structure_uescaped_LF_before_string.json
new file mode 100755
index 0000000..df2f0f2
--- /dev/null
+++ b/tests/specs/json/n_structure_uescaped_LF_before_string.json
@@ -0,0 +1 @@
+[\u000A""] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unclosed_array.json b/tests/specs/json/n_structure_unclosed_array.json
new file mode 100755
index 0000000..1120951
--- /dev/null
+++ b/tests/specs/json/n_structure_unclosed_array.json
@@ -0,0 +1 @@
+[1 \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unclosed_array_partial_null.json b/tests/specs/json/n_structure_unclosed_array_partial_null.json
new file mode 100644
index 0000000..0d59176
--- /dev/null
+++ b/tests/specs/json/n_structure_unclosed_array_partial_null.json
@@ -0,0 +1 @@
+[ false, nul \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unclosed_array_unfinished_false.json b/tests/specs/json/n_structure_unclosed_array_unfinished_false.json
new file mode 100644
index 0000000..a2ff850
--- /dev/null
+++ b/tests/specs/json/n_structure_unclosed_array_unfinished_false.json
@@ -0,0 +1 @@
+[ true, fals \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unclosed_array_unfinished_true.json b/tests/specs/json/n_structure_unclosed_array_unfinished_true.json
new file mode 100644
index 0000000..3149e8f
--- /dev/null
+++ b/tests/specs/json/n_structure_unclosed_array_unfinished_true.json
@@ -0,0 +1 @@
+[ false, tru \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unclosed_object.json b/tests/specs/json/n_structure_unclosed_object.json
new file mode 100755
index 0000000..694d69d
--- /dev/null
+++ b/tests/specs/json/n_structure_unclosed_object.json
@@ -0,0 +1 @@
+{"asd":"asd" \ No newline at end of file
diff --git a/tests/specs/json/n_structure_unicode-identifier.json b/tests/specs/json/n_structure_unicode-identifier.json
new file mode 100644
index 0000000..7284aea
--- /dev/null
+++ b/tests/specs/json/n_structure_unicode-identifier.json
@@ -0,0 +1 @@
+å \ No newline at end of file
diff --git a/tests/specs/json/n_structure_whitespace_U+2060_word_joiner.json b/tests/specs/json/n_structure_whitespace_U+2060_word_joiner.json
new file mode 100755
index 0000000..81156a6
--- /dev/null
+++ b/tests/specs/json/n_structure_whitespace_U+2060_word_joiner.json
@@ -0,0 +1 @@
+[⁠] \ No newline at end of file
diff --git a/tests/specs/json/n_structure_whitespace_formfeed.json b/tests/specs/json/n_structure_whitespace_formfeed.json
new file mode 100755
index 0000000..a9ea535
--- /dev/null
+++ b/tests/specs/json/n_structure_whitespace_formfeed.json
@@ -0,0 +1 @@
+[ ] \ No newline at end of file
diff --git a/tests/specs/json/y_array_arraysWithSpaces.json b/tests/specs/json/y_array_arraysWithSpaces.json
new file mode 100755
index 0000000..5822907
--- /dev/null
+++ b/tests/specs/json/y_array_arraysWithSpaces.json
@@ -0,0 +1 @@
+[[] ] \ No newline at end of file
diff --git a/tests/specs/json/y_array_empty-string.json b/tests/specs/json/y_array_empty-string.json
new file mode 100644
index 0000000..93b6be2
--- /dev/null
+++ b/tests/specs/json/y_array_empty-string.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/tests/specs/json/y_array_empty.json b/tests/specs/json/y_array_empty.json
new file mode 100755
index 0000000..0637a08
--- /dev/null
+++ b/tests/specs/json/y_array_empty.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/tests/specs/json/y_array_ending_with_newline.json b/tests/specs/json/y_array_ending_with_newline.json
new file mode 100755
index 0000000..eac5f7b
--- /dev/null
+++ b/tests/specs/json/y_array_ending_with_newline.json
@@ -0,0 +1 @@
+["a"] \ No newline at end of file
diff --git a/tests/specs/json/y_array_false.json b/tests/specs/json/y_array_false.json
new file mode 100644
index 0000000..67b2f07
--- /dev/null
+++ b/tests/specs/json/y_array_false.json
@@ -0,0 +1 @@
+[false] \ No newline at end of file
diff --git a/tests/specs/json/y_array_heterogeneous.json b/tests/specs/json/y_array_heterogeneous.json
new file mode 100755
index 0000000..d3c1e26
--- /dev/null
+++ b/tests/specs/json/y_array_heterogeneous.json
@@ -0,0 +1 @@
+[null, 1, "1", {}] \ No newline at end of file
diff --git a/tests/specs/json/y_array_null.json b/tests/specs/json/y_array_null.json
new file mode 100644
index 0000000..500db4a
--- /dev/null
+++ b/tests/specs/json/y_array_null.json
@@ -0,0 +1 @@
+[null] \ No newline at end of file
diff --git a/tests/specs/json/y_array_with_1_and_newline.json b/tests/specs/json/y_array_with_1_and_newline.json
new file mode 100644
index 0000000..9948255
--- /dev/null
+++ b/tests/specs/json/y_array_with_1_and_newline.json
@@ -0,0 +1,2 @@
+[1
+] \ No newline at end of file
diff --git a/tests/specs/json/y_array_with_leading_space.json b/tests/specs/json/y_array_with_leading_space.json
new file mode 100755
index 0000000..18bfe64
--- /dev/null
+++ b/tests/specs/json/y_array_with_leading_space.json
@@ -0,0 +1 @@
+ [1] \ No newline at end of file
diff --git a/tests/specs/json/y_array_with_several_null.json b/tests/specs/json/y_array_with_several_null.json
new file mode 100755
index 0000000..99f6c5d
--- /dev/null
+++ b/tests/specs/json/y_array_with_several_null.json
@@ -0,0 +1 @@
+[1,null,null,null,2] \ No newline at end of file
diff --git a/tests/specs/json/y_array_with_trailing_space.json b/tests/specs/json/y_array_with_trailing_space.json
new file mode 100755
index 0000000..de9e7a9
--- /dev/null
+++ b/tests/specs/json/y_array_with_trailing_space.json
@@ -0,0 +1 @@
+[2] \ No newline at end of file
diff --git a/tests/specs/json/y_number.json b/tests/specs/json/y_number.json
new file mode 100644
index 0000000..e5f5cc3
--- /dev/null
+++ b/tests/specs/json/y_number.json
@@ -0,0 +1 @@
+[123e65] \ No newline at end of file
diff --git a/tests/specs/json/y_number_0e+1.json b/tests/specs/json/y_number_0e+1.json
new file mode 100755
index 0000000..d1d3967
--- /dev/null
+++ b/tests/specs/json/y_number_0e+1.json
@@ -0,0 +1 @@
+[0e+1] \ No newline at end of file
diff --git a/tests/specs/json/y_number_0e1.json b/tests/specs/json/y_number_0e1.json
new file mode 100755
index 0000000..3283a79
--- /dev/null
+++ b/tests/specs/json/y_number_0e1.json
@@ -0,0 +1 @@
+[0e1] \ No newline at end of file
diff --git a/tests/specs/json/y_number_after_space.json b/tests/specs/json/y_number_after_space.json
new file mode 100644
index 0000000..623570d
--- /dev/null
+++ b/tests/specs/json/y_number_after_space.json
@@ -0,0 +1 @@
+[ 4] \ No newline at end of file
diff --git a/tests/specs/json/y_number_double_close_to_zero.json b/tests/specs/json/y_number_double_close_to_zero.json
new file mode 100755
index 0000000..96555ff
--- /dev/null
+++ b/tests/specs/json/y_number_double_close_to_zero.json
@@ -0,0 +1 @@
+[-0.000000000000000000000000000000000000000000000000000000000000000000000000000001]
diff --git a/tests/specs/json/y_number_int_with_exp.json b/tests/specs/json/y_number_int_with_exp.json
new file mode 100755
index 0000000..a4ca9e7
--- /dev/null
+++ b/tests/specs/json/y_number_int_with_exp.json
@@ -0,0 +1 @@
+[20e1] \ No newline at end of file
diff --git a/tests/specs/json/y_number_minus_zero.json b/tests/specs/json/y_number_minus_zero.json
new file mode 100755
index 0000000..37af131
--- /dev/null
+++ b/tests/specs/json/y_number_minus_zero.json
@@ -0,0 +1 @@
+[-0] \ No newline at end of file
diff --git a/tests/specs/json/y_number_negative_int.json b/tests/specs/json/y_number_negative_int.json
new file mode 100644
index 0000000..8e30f8b
--- /dev/null
+++ b/tests/specs/json/y_number_negative_int.json
@@ -0,0 +1 @@
+[-123] \ No newline at end of file
diff --git a/tests/specs/json/y_number_negative_one.json b/tests/specs/json/y_number_negative_one.json
new file mode 100644
index 0000000..99d21a2
--- /dev/null
+++ b/tests/specs/json/y_number_negative_one.json
@@ -0,0 +1 @@
+[-1] \ No newline at end of file
diff --git a/tests/specs/json/y_number_negative_zero.json b/tests/specs/json/y_number_negative_zero.json
new file mode 100644
index 0000000..37af131
--- /dev/null
+++ b/tests/specs/json/y_number_negative_zero.json
@@ -0,0 +1 @@
+[-0] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_capital_e.json b/tests/specs/json/y_number_real_capital_e.json
new file mode 100644
index 0000000..6edbdfc
--- /dev/null
+++ b/tests/specs/json/y_number_real_capital_e.json
@@ -0,0 +1 @@
+[1E22] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_capital_e_neg_exp.json b/tests/specs/json/y_number_real_capital_e_neg_exp.json
new file mode 100644
index 0000000..0a01bd3
--- /dev/null
+++ b/tests/specs/json/y_number_real_capital_e_neg_exp.json
@@ -0,0 +1 @@
+[1E-2] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_capital_e_pos_exp.json b/tests/specs/json/y_number_real_capital_e_pos_exp.json
new file mode 100644
index 0000000..5a8fc09
--- /dev/null
+++ b/tests/specs/json/y_number_real_capital_e_pos_exp.json
@@ -0,0 +1 @@
+[1E+2] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_exponent.json b/tests/specs/json/y_number_real_exponent.json
new file mode 100644
index 0000000..da2522d
--- /dev/null
+++ b/tests/specs/json/y_number_real_exponent.json
@@ -0,0 +1 @@
+[123e45] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_fraction_exponent.json b/tests/specs/json/y_number_real_fraction_exponent.json
new file mode 100644
index 0000000..3944a7a
--- /dev/null
+++ b/tests/specs/json/y_number_real_fraction_exponent.json
@@ -0,0 +1 @@
+[123.456e78] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_neg_exp.json b/tests/specs/json/y_number_real_neg_exp.json
new file mode 100644
index 0000000..ca40d3c
--- /dev/null
+++ b/tests/specs/json/y_number_real_neg_exp.json
@@ -0,0 +1 @@
+[1e-2] \ No newline at end of file
diff --git a/tests/specs/json/y_number_real_pos_exponent.json b/tests/specs/json/y_number_real_pos_exponent.json
new file mode 100644
index 0000000..343601d
--- /dev/null
+++ b/tests/specs/json/y_number_real_pos_exponent.json
@@ -0,0 +1 @@
+[1e+2] \ No newline at end of file
diff --git a/tests/specs/json/y_number_simple_int.json b/tests/specs/json/y_number_simple_int.json
new file mode 100644
index 0000000..e47f69a
--- /dev/null
+++ b/tests/specs/json/y_number_simple_int.json
@@ -0,0 +1 @@
+[123] \ No newline at end of file
diff --git a/tests/specs/json/y_number_simple_real.json b/tests/specs/json/y_number_simple_real.json
new file mode 100644
index 0000000..b02878e
--- /dev/null
+++ b/tests/specs/json/y_number_simple_real.json
@@ -0,0 +1 @@
+[123.456789] \ No newline at end of file
diff --git a/tests/specs/json/y_object.json b/tests/specs/json/y_object.json
new file mode 100755
index 0000000..78262ed
--- /dev/null
+++ b/tests/specs/json/y_object.json
@@ -0,0 +1 @@
+{"asd":"sdf", "dfg":"fgh"} \ No newline at end of file
diff --git a/tests/specs/json/y_object_basic.json b/tests/specs/json/y_object_basic.json
new file mode 100755
index 0000000..646bbe7
--- /dev/null
+++ b/tests/specs/json/y_object_basic.json
@@ -0,0 +1 @@
+{"asd":"sdf"} \ No newline at end of file
diff --git a/tests/specs/json/y_object_duplicated_key.json b/tests/specs/json/y_object_duplicated_key.json
new file mode 100755
index 0000000..bbc2e1c
--- /dev/null
+++ b/tests/specs/json/y_object_duplicated_key.json
@@ -0,0 +1 @@
+{"a":"b","a":"c"} \ No newline at end of file
diff --git a/tests/specs/json/y_object_duplicated_key_and_value.json b/tests/specs/json/y_object_duplicated_key_and_value.json
new file mode 100755
index 0000000..211581c
--- /dev/null
+++ b/tests/specs/json/y_object_duplicated_key_and_value.json
@@ -0,0 +1 @@
+{"a":"b","a":"b"} \ No newline at end of file
diff --git a/tests/specs/json/y_object_empty.json b/tests/specs/json/y_object_empty.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/tests/specs/json/y_object_empty.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/tests/specs/json/y_object_empty_key.json b/tests/specs/json/y_object_empty_key.json
new file mode 100755
index 0000000..c0013d3
--- /dev/null
+++ b/tests/specs/json/y_object_empty_key.json
@@ -0,0 +1 @@
+{"":0} \ No newline at end of file
diff --git a/tests/specs/json/y_object_escaped_null_in_key.json b/tests/specs/json/y_object_escaped_null_in_key.json
new file mode 100644
index 0000000..593f0f6
--- /dev/null
+++ b/tests/specs/json/y_object_escaped_null_in_key.json
@@ -0,0 +1 @@
+{"foo\u0000bar": 42} \ No newline at end of file
diff --git a/tests/specs/json/y_object_extreme_numbers.json b/tests/specs/json/y_object_extreme_numbers.json
new file mode 100644
index 0000000..a0d3531
--- /dev/null
+++ b/tests/specs/json/y_object_extreme_numbers.json
@@ -0,0 +1 @@
+{ "min": -1.0e+28, "max": 1.0e+28 } \ No newline at end of file
diff --git a/tests/specs/json/y_object_long_strings.json b/tests/specs/json/y_object_long_strings.json
new file mode 100644
index 0000000..bdc4a08
--- /dev/null
+++ b/tests/specs/json/y_object_long_strings.json
@@ -0,0 +1 @@
+{"x":[{"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}], "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"} \ No newline at end of file
diff --git a/tests/specs/json/y_object_simple.json b/tests/specs/json/y_object_simple.json
new file mode 100644
index 0000000..dacac91
--- /dev/null
+++ b/tests/specs/json/y_object_simple.json
@@ -0,0 +1 @@
+{"a":[]} \ No newline at end of file
diff --git a/tests/specs/json/y_object_string_unicode.json b/tests/specs/json/y_object_string_unicode.json
new file mode 100644
index 0000000..8effdb2
--- /dev/null
+++ b/tests/specs/json/y_object_string_unicode.json
@@ -0,0 +1 @@
+{"title":"\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0417\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430" } \ No newline at end of file
diff --git a/tests/specs/json/y_object_with_newlines.json b/tests/specs/json/y_object_with_newlines.json
new file mode 100644
index 0000000..246ec6b
--- /dev/null
+++ b/tests/specs/json/y_object_with_newlines.json
@@ -0,0 +1,3 @@
+{
+"a": "b"
+} \ No newline at end of file
diff --git a/tests/specs/json/y_string_1_2_3_bytes_UTF-8_sequences.json b/tests/specs/json/y_string_1_2_3_bytes_UTF-8_sequences.json
new file mode 100755
index 0000000..9967dde
--- /dev/null
+++ b/tests/specs/json/y_string_1_2_3_bytes_UTF-8_sequences.json
@@ -0,0 +1 @@
+["\u0060\u012a\u12AB"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_accepted_surrogate_pair.json b/tests/specs/json/y_string_accepted_surrogate_pair.json
new file mode 100755
index 0000000..996875c
--- /dev/null
+++ b/tests/specs/json/y_string_accepted_surrogate_pair.json
@@ -0,0 +1 @@
+["\uD801\udc37"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_accepted_surrogate_pairs.json b/tests/specs/json/y_string_accepted_surrogate_pairs.json
new file mode 100755
index 0000000..3401021
--- /dev/null
+++ b/tests/specs/json/y_string_accepted_surrogate_pairs.json
@@ -0,0 +1 @@
+["\ud83d\ude39\ud83d\udc8d"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_allowed_escapes.json b/tests/specs/json/y_string_allowed_escapes.json
new file mode 100644
index 0000000..7f49553
--- /dev/null
+++ b/tests/specs/json/y_string_allowed_escapes.json
@@ -0,0 +1 @@
+["\"\\\/\b\f\n\r\t"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_backslash_and_u_escaped_zero.json b/tests/specs/json/y_string_backslash_and_u_escaped_zero.json
new file mode 100755
index 0000000..d4439ed
--- /dev/null
+++ b/tests/specs/json/y_string_backslash_and_u_escaped_zero.json
@@ -0,0 +1 @@
+["\\u0000"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_backslash_doublequotes.json b/tests/specs/json/y_string_backslash_doublequotes.json
new file mode 100644
index 0000000..ae03243
--- /dev/null
+++ b/tests/specs/json/y_string_backslash_doublequotes.json
@@ -0,0 +1 @@
+["\""] \ No newline at end of file
diff --git a/tests/specs/json/y_string_comments.json b/tests/specs/json/y_string_comments.json
new file mode 100644
index 0000000..2260c20
--- /dev/null
+++ b/tests/specs/json/y_string_comments.json
@@ -0,0 +1 @@
+["a/*b*/c/*d//e"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_double_escape_a.json b/tests/specs/json/y_string_double_escape_a.json
new file mode 100644
index 0000000..6715d6f
--- /dev/null
+++ b/tests/specs/json/y_string_double_escape_a.json
@@ -0,0 +1 @@
+["\\a"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_double_escape_n.json b/tests/specs/json/y_string_double_escape_n.json
new file mode 100644
index 0000000..44ca56c
--- /dev/null
+++ b/tests/specs/json/y_string_double_escape_n.json
@@ -0,0 +1 @@
+["\\n"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_escaped_control_character.json b/tests/specs/json/y_string_escaped_control_character.json
new file mode 100644
index 0000000..5b014a9
--- /dev/null
+++ b/tests/specs/json/y_string_escaped_control_character.json
@@ -0,0 +1 @@
+["\u0012"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_escaped_noncharacter.json b/tests/specs/json/y_string_escaped_noncharacter.json
new file mode 100755
index 0000000..2ff52e2
--- /dev/null
+++ b/tests/specs/json/y_string_escaped_noncharacter.json
@@ -0,0 +1 @@
+["\uFFFF"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_in_array.json b/tests/specs/json/y_string_in_array.json
new file mode 100755
index 0000000..21d7ae4
--- /dev/null
+++ b/tests/specs/json/y_string_in_array.json
@@ -0,0 +1 @@
+["asd"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_in_array_with_leading_space.json b/tests/specs/json/y_string_in_array_with_leading_space.json
new file mode 100755
index 0000000..9e1887c
--- /dev/null
+++ b/tests/specs/json/y_string_in_array_with_leading_space.json
@@ -0,0 +1 @@
+[ "asd"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_last_surrogates_1_and_2.json b/tests/specs/json/y_string_last_surrogates_1_and_2.json
new file mode 100644
index 0000000..3919cef
--- /dev/null
+++ b/tests/specs/json/y_string_last_surrogates_1_and_2.json
@@ -0,0 +1 @@
+["\uDBFF\uDFFF"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_nbsp_uescaped.json b/tests/specs/json/y_string_nbsp_uescaped.json
new file mode 100644
index 0000000..2085ab1
--- /dev/null
+++ b/tests/specs/json/y_string_nbsp_uescaped.json
@@ -0,0 +1 @@
+["new\u00A0line"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_nonCharacterInUTF-8_U+10FFFF.json b/tests/specs/json/y_string_nonCharacterInUTF-8_U+10FFFF.json
new file mode 100755
index 0000000..059e4d9
--- /dev/null
+++ b/tests/specs/json/y_string_nonCharacterInUTF-8_U+10FFFF.json
@@ -0,0 +1 @@
+["􏿿"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_nonCharacterInUTF-8_U+FFFF.json b/tests/specs/json/y_string_nonCharacterInUTF-8_U+FFFF.json
new file mode 100755
index 0000000..4c913bd
--- /dev/null
+++ b/tests/specs/json/y_string_nonCharacterInUTF-8_U+FFFF.json
@@ -0,0 +1 @@
+["￿"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_null_escape.json b/tests/specs/json/y_string_null_escape.json
new file mode 100644
index 0000000..c1ad844
--- /dev/null
+++ b/tests/specs/json/y_string_null_escape.json
@@ -0,0 +1 @@
+["\u0000"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_one-byte-utf-8.json b/tests/specs/json/y_string_one-byte-utf-8.json
new file mode 100644
index 0000000..1571859
--- /dev/null
+++ b/tests/specs/json/y_string_one-byte-utf-8.json
@@ -0,0 +1 @@
+["\u002c"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_pi.json b/tests/specs/json/y_string_pi.json
new file mode 100644
index 0000000..9df11ae
--- /dev/null
+++ b/tests/specs/json/y_string_pi.json
@@ -0,0 +1 @@
+["π"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_reservedCharacterInUTF-8_U+1BFFF.json b/tests/specs/json/y_string_reservedCharacterInUTF-8_U+1BFFF.json
new file mode 100755
index 0000000..10a33a1
--- /dev/null
+++ b/tests/specs/json/y_string_reservedCharacterInUTF-8_U+1BFFF.json
@@ -0,0 +1 @@
+["𛿿"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_simple_ascii.json b/tests/specs/json/y_string_simple_ascii.json
new file mode 100644
index 0000000..8cadf7d
--- /dev/null
+++ b/tests/specs/json/y_string_simple_ascii.json
@@ -0,0 +1 @@
+["asd "] \ No newline at end of file
diff --git a/tests/specs/json/y_string_space.json b/tests/specs/json/y_string_space.json
new file mode 100644
index 0000000..efd782c
--- /dev/null
+++ b/tests/specs/json/y_string_space.json
@@ -0,0 +1 @@
+" " \ No newline at end of file
diff --git a/tests/specs/json/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json b/tests/specs/json/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json
new file mode 100755
index 0000000..7620b66
--- /dev/null
+++ b/tests/specs/json/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json
@@ -0,0 +1 @@
+["\uD834\uDd1e"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_three-byte-utf-8.json b/tests/specs/json/y_string_three-byte-utf-8.json
new file mode 100644
index 0000000..108f1d6
--- /dev/null
+++ b/tests/specs/json/y_string_three-byte-utf-8.json
@@ -0,0 +1 @@
+["\u0821"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_two-byte-utf-8.json b/tests/specs/json/y_string_two-byte-utf-8.json
new file mode 100644
index 0000000..461503c
--- /dev/null
+++ b/tests/specs/json/y_string_two-byte-utf-8.json
@@ -0,0 +1 @@
+["\u0123"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_u+2028_line_sep.json b/tests/specs/json/y_string_u+2028_line_sep.json
new file mode 100755
index 0000000..897b602
--- /dev/null
+++ b/tests/specs/json/y_string_u+2028_line_sep.json
@@ -0,0 +1 @@
+["
"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_u+2029_par_sep.json b/tests/specs/json/y_string_u+2029_par_sep.json
new file mode 100755
index 0000000..8cd998c
--- /dev/null
+++ b/tests/specs/json/y_string_u+2029_par_sep.json
@@ -0,0 +1 @@
+["
"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_uEscape.json b/tests/specs/json/y_string_uEscape.json
new file mode 100755
index 0000000..f7b41a0
--- /dev/null
+++ b/tests/specs/json/y_string_uEscape.json
@@ -0,0 +1 @@
+["\u0061\u30af\u30EA\u30b9"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_uescaped_newline.json b/tests/specs/json/y_string_uescaped_newline.json
new file mode 100644
index 0000000..3a5a220
--- /dev/null
+++ b/tests/specs/json/y_string_uescaped_newline.json
@@ -0,0 +1 @@
+["new\u000Aline"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unescaped_char_delete.json b/tests/specs/json/y_string_unescaped_char_delete.json
new file mode 100755
index 0000000..7d064f4
--- /dev/null
+++ b/tests/specs/json/y_string_unescaped_char_delete.json
@@ -0,0 +1 @@
+[""] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode.json b/tests/specs/json/y_string_unicode.json
new file mode 100644
index 0000000..3598095
--- /dev/null
+++ b/tests/specs/json/y_string_unicode.json
@@ -0,0 +1 @@
+["\uA66D"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicodeEscapedBackslash.json b/tests/specs/json/y_string_unicodeEscapedBackslash.json
new file mode 100755
index 0000000..0bb3b51
--- /dev/null
+++ b/tests/specs/json/y_string_unicodeEscapedBackslash.json
@@ -0,0 +1 @@
+["\u005C"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_2.json b/tests/specs/json/y_string_unicode_2.json
new file mode 100644
index 0000000..a7dcb97
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_2.json
@@ -0,0 +1 @@
+["⍂㈴⍂"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+10FFFE_nonchar.json b/tests/specs/json/y_string_unicode_U+10FFFE_nonchar.json
new file mode 100644
index 0000000..9a8370b
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+10FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uDBFF\uDFFE"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+1FFFE_nonchar.json b/tests/specs/json/y_string_unicode_U+1FFFE_nonchar.json
new file mode 100644
index 0000000..c51f8ae
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+1FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uD83F\uDFFE"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json b/tests/specs/json/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json
new file mode 100644
index 0000000..626d5f8
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json
@@ -0,0 +1 @@
+["\u200B"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+2064_invisible_plus.json b/tests/specs/json/y_string_unicode_U+2064_invisible_plus.json
new file mode 100644
index 0000000..1e23972
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+2064_invisible_plus.json
@@ -0,0 +1 @@
+["\u2064"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+FDD0_nonchar.json b/tests/specs/json/y_string_unicode_U+FDD0_nonchar.json
new file mode 100644
index 0000000..18ef151
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+FDD0_nonchar.json
@@ -0,0 +1 @@
+["\uFDD0"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_U+FFFE_nonchar.json b/tests/specs/json/y_string_unicode_U+FFFE_nonchar.json
new file mode 100644
index 0000000..13d261f
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_U+FFFE_nonchar.json
@@ -0,0 +1 @@
+["\uFFFE"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_unicode_escaped_double_quote.json b/tests/specs/json/y_string_unicode_escaped_double_quote.json
new file mode 100755
index 0000000..4e62578
--- /dev/null
+++ b/tests/specs/json/y_string_unicode_escaped_double_quote.json
@@ -0,0 +1 @@
+["\u0022"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_utf8.json b/tests/specs/json/y_string_utf8.json
new file mode 100644
index 0000000..4087843
--- /dev/null
+++ b/tests/specs/json/y_string_utf8.json
@@ -0,0 +1 @@
+["€𝄞"] \ No newline at end of file
diff --git a/tests/specs/json/y_string_with_del_character.json b/tests/specs/json/y_string_with_del_character.json
new file mode 100755
index 0000000..8bd2490
--- /dev/null
+++ b/tests/specs/json/y_string_with_del_character.json
@@ -0,0 +1 @@
+["aa"] \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_false.json b/tests/specs/json/y_structure_lonely_false.json
new file mode 100644
index 0000000..02e4a84
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_false.json
@@ -0,0 +1 @@
+false \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_int.json b/tests/specs/json/y_structure_lonely_int.json
new file mode 100755
index 0000000..f70d7bb
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_int.json
@@ -0,0 +1 @@
+42 \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_negative_real.json b/tests/specs/json/y_structure_lonely_negative_real.json
new file mode 100755
index 0000000..b5135a2
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_negative_real.json
@@ -0,0 +1 @@
+-0.1 \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_null.json b/tests/specs/json/y_structure_lonely_null.json
new file mode 100644
index 0000000..ec747fa
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_null.json
@@ -0,0 +1 @@
+null \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_string.json b/tests/specs/json/y_structure_lonely_string.json
new file mode 100755
index 0000000..b6e982c
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_string.json
@@ -0,0 +1 @@
+"asd" \ No newline at end of file
diff --git a/tests/specs/json/y_structure_lonely_true.json b/tests/specs/json/y_structure_lonely_true.json
new file mode 100755
index 0000000..f32a580
--- /dev/null
+++ b/tests/specs/json/y_structure_lonely_true.json
@@ -0,0 +1 @@
+true \ No newline at end of file
diff --git a/tests/specs/json/y_structure_string_empty.json b/tests/specs/json/y_structure_string_empty.json
new file mode 100644
index 0000000..3cc762b
--- /dev/null
+++ b/tests/specs/json/y_structure_string_empty.json
@@ -0,0 +1 @@
+"" \ No newline at end of file
diff --git a/tests/specs/json/y_structure_trailing_newline.json b/tests/specs/json/y_structure_trailing_newline.json
new file mode 100644
index 0000000..0c3426d
--- /dev/null
+++ b/tests/specs/json/y_structure_trailing_newline.json
@@ -0,0 +1 @@
+["a"]
diff --git a/tests/specs/json/y_structure_true_in_array.json b/tests/specs/json/y_structure_true_in_array.json
new file mode 100644
index 0000000..de601e3
--- /dev/null
+++ b/tests/specs/json/y_structure_true_in_array.json
@@ -0,0 +1 @@
+[true] \ No newline at end of file
diff --git a/tests/specs/json/y_structure_whitespace_array.json b/tests/specs/json/y_structure_whitespace_array.json
new file mode 100644
index 0000000..2bedf7f
--- /dev/null
+++ b/tests/specs/json/y_structure_whitespace_array.json
@@ -0,0 +1 @@
+ [] \ No newline at end of file