From 45e7e490beef5f26441bd594860a2d760b1c38ad Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Thu, 7 Dec 2023 07:40:45 +0000 Subject: [PATCH] Update toml-test --- decode_test.go | 197 ------------------ encode_test.go | 40 ---- error_test.go | 10 +- internal/toml-test/json.go | 44 ++-- internal/toml-test/runner.go | 169 +++++++++++---- .../toml-test/tests/invalid/array/array.multi | 18 ++ .../tests/invalid/array/double-comma-1.toml | 2 +- .../tests/invalid/array/double-comma-2.toml | 3 +- .../invalid/array/extend-defined-aot.toml | 3 + .../invalid/array/missing-separator-1.toml | 1 + ...eparator.toml => missing-separator-2.toml} | 0 .../tests/invalid/array/no-close-1.toml | 1 + .../tests/invalid/array/no-close-2.toml | 2 +- .../tests/invalid/array/no-close-3.toml | 1 + .../tests/invalid/array/no-close-4.toml | 1 + .../tests/invalid/array/no-close-5.toml | 1 + .../tests/invalid/array/no-close-6.toml | 1 + .../tests/invalid/array/no-close-7.toml | 1 + .../tests/invalid/array/no-close-8.toml | 1 + ...close-table.toml => no-close-table-1.toml} | 0 .../tests/invalid/array/no-close.toml | 1 - .../tests/invalid/array/no-comma-1.toml | 1 + .../tests/invalid/array/no-comma-2.toml | 1 + .../tests/invalid/array/no-comma-3.toml | 1 + .../tests/invalid/array/only-comma-1.toml | 1 + .../tests/invalid/array/only-comma-2.toml | 1 + .../invalid/bool/almost-false-with-extra.toml | 2 +- .../tests/invalid/bool/almost-false.toml | 2 +- .../invalid/bool/almost-true-with-extra.toml | 2 +- .../tests/invalid/bool/almost-true.toml | 2 +- .../toml-test/tests/invalid/bool/bool.multi | 15 ++ .../tests/invalid/bool/capitalized-false.toml | 1 + .../tests/invalid/bool/capitalized-true.toml | 1 + .../toml-test/tests/invalid/bool/just-f.toml | 2 +- .../toml-test/tests/invalid/bool/just-t.toml | 2 +- .../tests/invalid/bool/mixed-case-false.toml | 1 + .../tests/invalid/bool/mixed-case-true.toml | 1 + .../tests/invalid/bool/mixed-case.toml | 2 +- .../invalid/bool/starting-same-false.toml | 2 +- .../invalid/bool/starting-same-true.toml | 2 +- .../tests/invalid/bool/wrong-case-false.toml | 2 +- .../tests/invalid/bool/wrong-case-true.toml | 2 +- .../tests/invalid/control/bare-formfeed.toml | 2 +- .../tests/invalid/control/bare-null.toml | Bin 27 -> 35 bytes .../tests/invalid/control/comment-cr.toml | 2 +- .../tests/invalid/control/comment-del.toml | 2 +- .../tests/invalid/control/comment-ff.toml | 1 + .../tests/invalid/control/comment-lf.toml | 2 +- .../tests/invalid/control/comment-null.toml | Bin 26 -> 28 bytes .../tests/invalid/control/comment-us.toml | 2 +- .../tests/invalid/control/control.multi | 47 +++-- .../tests/invalid/control/multi-cr.toml | 1 + .../tests/invalid/control/multi-del.toml | 2 +- .../tests/invalid/control/multi-lf.toml | 2 +- .../tests/invalid/control/multi-us.toml | 2 +- .../tests/invalid/control/rawmulti-cd.toml | 1 + .../tests/invalid/control/rawmulti-del.toml | 2 +- .../tests/invalid/control/rawmulti-lf.toml | 2 +- .../tests/invalid/control/rawmulti-us.toml | 2 +- .../tests/invalid/control/rawstring-cr.toml | 1 + .../tests/invalid/control/rawstring-del.toml | 2 +- .../tests/invalid/control/rawstring-lf.toml | 2 +- .../tests/invalid/control/rawstring-us.toml | 2 +- .../tests/invalid/control/string-bs.toml | 2 +- .../tests/invalid/control/string-cr.toml | 1 + .../tests/invalid/control/string-del.toml | 2 +- .../tests/invalid/control/string-lf.toml | 2 +- .../tests/invalid/control/string-us.toml | 2 +- .../tests/invalid/datetime/feb-29.toml | 1 + .../tests/invalid/datetime/feb-30.toml | 1 + .../tests/invalid/datetime/y10k.toml | 2 + .../{utf16.toml => utf16-comment.toml} | Bin .../tests/invalid/encoding/utf16-key.toml | Bin 0 -> 16 bytes .../tests/invalid/float/exp-point-3.toml | 1 + .../invalid/float/exp-trailing-us-1.toml | 1 + .../invalid/float/exp-trailing-us-2.toml | 1 + .../toml-test/tests/invalid/float/float.multi | 7 +- ...uplicate-key.toml => duplicate-key-1.toml} | 0 .../invalid/inline-table/duplicate-key-2.toml | 1 + ...key_conflict.toml => duplicate-key-3.toml} | 0 ...key-conflict.toml => duplicate-key-4.toml} | 0 .../inline-table/{empty.toml => empty-1.toml} | 0 .../tests/invalid/inline-table/empty-2.toml | 2 + .../tests/invalid/inline-table/empty-3.toml | 3 + .../invalid/inline-table/no-close-1.toml | 1 + .../invalid/inline-table/no-close-2.toml | 1 + .../{no-comma.toml => no-comma-1.toml} | 0 .../invalid/inline-table/no-comma-2.toml | 1 + .../{overwrite.toml => overwrite-1.toml} | 0 .../{add.toml => overwrite-2.toml} | 0 .../invalid/inline-table/overwrite-3.toml | 2 + .../invalid/inline-table/overwrite-4.toml | 3 + .../invalid/inline-table/overwrite-5.toml | 3 + .../invalid/inline-table/overwrite-6.toml | 1 + .../invalid/inline-table/overwrite-7.toml | 1 + .../invalid/inline-table/overwrite-8.toml | 1 + .../invalid/inline-table/overwrite-9.toml | 5 + .../tests/invalid/integer/integer.multi | 11 +- .../tests/invalid/integer/invalid-hex-1.toml | 1 + .../tests/invalid/integer/invalid-hex-2.toml | 1 + .../tests/invalid/integer/leading-us-bin.toml | 2 +- .../tests/invalid/integer/leading-us-hex.toml | 2 +- .../tests/invalid/integer/negative-oct.toml | 2 +- .../tests/invalid/integer/positive-oct.toml | 2 +- .../invalid/key/dotted-redefine-table-1.toml | 2 + ...able.toml => dotted-redefine-table-2.toml} | 0 .../{duplicate.toml => duplicate-keys-1.toml} | 1 - ...licate-keys.toml => duplicate-keys-2.toml} | 0 .../tests/invalid/key/duplicate-keys-3.toml | 2 + .../tests/invalid/key/duplicate-keys-4.toml | 2 + .../tests/invalid/key/end-in-escape.toml | 1 + .../tests/invalid/key/newline-1.toml | 2 + .../tests/invalid/key/newline-2.toml | 2 + .../tests/invalid/key/newline-3.toml | 2 + .../key/{multiline.toml => newline-4.toml} | 0 .../tests/invalid/key/newline-5.toml | 2 + .../toml-test/tests/invalid/key/newline.toml | 2 - .../{two-equals.toml => two-equals-1.toml} | 0 .../{two-equals2.toml => two-equals-2.toml} | 0 .../{two-equals3.toml => two-equals-3.toml} | 0 .../tests/invalid/key/without-value-5.toml | 1 + .../tests/invalid/key/without-value-6.toml | 1 + .../tests/invalid/key/without-value-7.toml | 1 + .../tests/invalid/local-date/feb-29.toml | 1 + .../tests/invalid/local-date/feb-30.toml | 2 + .../tests/invalid/local-date/y10k.toml | 2 + .../tests/invalid/local-datetime/feb-29.toml | 1 + .../tests/invalid/local-datetime/feb-30.toml | 2 + .../tests/invalid/local-datetime/y10k.toml | 2 + .../tests/invalid/string/bad-codepoint.toml | 1 - .../tests/invalid/string/bad-escape-3.toml | 1 + .../tests/invalid/string/bad-hex-esc.multi | 4 - .../tests/invalid/string/bad-uni-esc-1.toml | 2 +- .../tests/invalid/string/bad-uni-esc-2.toml | 2 +- .../tests/invalid/string/bad-uni-esc-3.toml | 3 +- .../tests/invalid/string/bad-uni-esc-4.toml | 2 +- .../tests/invalid/string/bad-uni-esc-5.toml | 2 +- .../tests/invalid/string/bad-uni-esc-6.toml | 1 + .../tests/invalid/string/bad-uni-esc-7.toml | 1 + .../string/multiline-bad-escape-4.toml | 1 + ...ace.toml => multiline-escape-space-1.toml} | 0 .../string/multiline-escape-space-2.toml | 4 + .../string/multiline-lit-no-close-1.toml | 2 + .../string/multiline-lit-no-close-2.toml | 1 + .../string/multiline-lit-no-close-3.toml | 4 + .../string/multiline-lit-no-close-4.toml | 3 + ...o-close.toml => multiline-no-close-1.toml} | 0 .../invalid/string/multiline-no-close-3.toml | 4 + .../invalid/string/multiline-no-close-4.toml | 3 + .../invalid/string/multiline-no-close-5.toml | 3 + .../string/{no-close.toml => no-close-1.toml} | 0 .../tests/invalid/string/no-close-2.toml | 1 + .../tests/invalid/string/no-close-3.toml | 1 + .../tests/invalid/string/no-close-4.toml | 1 + .../tests/invalid/string/string.multi | 12 ++ ...ing-bracket.toml => array-no-close-1.toml} | 0 .../tests/invalid/table/array-no-close-2.toml | 2 + .../tests/invalid/table/no-close-1.toml | 3 + .../tests/invalid/table/no-close-2.toml | 2 + .../{quoted-no-close.toml => no-close-3.toml} | 1 + .../tests/invalid/table/no-close-4.toml | 1 + .../tests/invalid/table/no-close-5.toml | 1 + .../table/overwrite-array-in-parent.toml | 4 + .../table/overwrite-bool-with-array.toml | 2 + .../table/overwrite-with-deep-table.toml | 2 + .../table/{redefine.toml => redefine-1.toml} | 0 .../tests/invalid/table/redefine-2.toml | 3 + .../tests/invalid/table/redefine-3.toml | 3 + .../tests/invalid/table/super-twice.toml | 3 + .../tests/valid/array/array-subtables.json | 20 ++ .../tests/valid/array/array-subtables.toml | 7 + .../tests/valid/array/open-parent-table.json | 12 ++ .../tests/valid/array/open-parent-table.toml | 4 + .../tests/valid/array/trailing-comma.json | 34 +++ .../tests/valid/array/trailing-comma.toml | 11 + .../valid/comment/after-literal-no-ws.json | 18 ++ .../valid/comment/after-literal-no-ws.toml | 4 + .../tests/valid/comment/everywhere.json | 8 +- .../toml-test/tests/valid/datetime/edge.json | 26 +++ .../toml-test/tests/valid/datetime/edge.toml | 7 + .../tests/valid/datetime/leap-year.json | 26 +++ .../tests/valid/datetime/leap-year.toml | 7 + .../toml-test/tests/valid/float/zero.json | 20 +- .../valid/inline-table/array-values.json | 27 +++ .../valid/inline-table/array-values.toml | 13 ++ .../tests/valid/inline-table/array.json | 14 ++ .../tests/valid/inline-table/array.toml | 2 + .../tests/valid/inline-table/empty.json | 3 +- .../tests/valid/inline-table/empty.toml | 1 + .../valid/inline-table/key-dotted-1.json | 42 ++++ .../valid/inline-table/key-dotted-1.toml | 5 + .../valid/inline-table/key-dotted-2.json | 26 +++ .../valid/inline-table/key-dotted-2.toml | 1 + .../valid/inline-table/key-dotted-3.json | 30 +++ .../valid/inline-table/key-dotted-3.toml | 5 + .../valid/inline-table/key-dotted-4.json | 40 ++++ .../valid/inline-table/key-dotted-4.toml | 7 + .../tests/valid/inline-table/key-dotted.json | 140 ------------- .../tests/valid/inline-table/key-dotted.toml | 23 -- .../tests/valid/inline-table/spaces.json | 50 +++++ .../tests/valid/inline-table/spaces.toml | 5 + .../toml-test/tests/valid/key/dotted-1.json | 24 +++ .../toml-test/tests/valid/key/dotted-1.toml | 4 + .../toml-test/tests/valid/key/dotted-2.json | 52 +++++ .../valid/key/{dotted.toml => dotted-2.toml} | 20 -- .../toml-test/tests/valid/key/dotted-3.json | 34 +++ .../toml-test/tests/valid/key/dotted-3.toml | 9 + .../toml-test/tests/valid/key/dotted-4.json | 38 ++++ .../toml-test/tests/valid/key/dotted-4.toml | 10 + .../tests/valid/key/dotted-empty.json | 12 +- .../toml-test/tests/valid/key/dotted.json | 132 ------------ .../valid/key/{empty.json => empty-1.json} | 0 .../valid/key/{empty.toml => empty-1.toml} | 0 .../toml-test/tests/valid/key/empty-2.json | 6 + .../toml-test/tests/valid/key/empty-2.toml | 1 + .../toml-test/tests/valid/key/empty-3.json | 6 + .../toml-test/tests/valid/key/empty-3.toml | 1 + .../toml-test/tests/valid/key/escapes.json | 4 + .../toml-test/tests/valid/key/escapes.toml | 1 + .../tests/valid/key/quoted-unicode.json | 14 +- internal/toml-test/tests/valid/key/start.json | 72 +++++++ internal/toml-test/tests/valid/key/start.toml | 32 +++ internal/toml-test/tests/valid/key/zero.json | 6 + internal/toml-test/tests/valid/key/zero.toml | 1 + .../toml-test/tests/valid/spec/float-2.json | 6 +- .../string/ends-in-whitespace-escape.json | 6 + .../string/ends-in-whitespace-escape.toml | 6 + .../toml-test/tests/valid/string/escapes.json | 26 +-- .../toml-test/tests/valid/string/escapes.toml | 28 +-- .../tests/valid/string/multiline-empty.json | 18 ++ .../tests/valid/string/multiline-empty.toml | 15 ++ .../tests/valid/string/multiline-quotes.json | 8 + .../tests/valid/string/multiline-quotes.toml | 7 + .../tests/valid/string/multiline.json | 16 -- .../tests/valid/string/multiline.toml | 15 -- .../tests/valid/string/quoted-unicode.json | 16 +- .../tests/valid/string/raw-multiline.json | 8 +- .../tests/valid/string/raw-multiline.toml | 4 + .../tests/valid/string/unicode-escape.json | 52 ++++- .../tests/valid/string/unicode-escape.toml | 17 +- .../tests/valid/table/empty-name.json | 8 +- .../toml-test/tests/valid/table/keyword.json | 4 +- internal/toml-test/toml.go | 37 +++- toml_test.go | 81 ++++--- 244 files changed, 1459 insertions(+), 844 deletions(-) create mode 100644 internal/toml-test/tests/invalid/array/array.multi create mode 100644 internal/toml-test/tests/invalid/array/extend-defined-aot.toml create mode 100644 internal/toml-test/tests/invalid/array/missing-separator-1.toml rename internal/toml-test/tests/invalid/array/{missing-separator.toml => missing-separator-2.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/array/no-close-1.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-3.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-4.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-5.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-6.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-7.toml create mode 100644 internal/toml-test/tests/invalid/array/no-close-8.toml rename internal/toml-test/tests/invalid/array/{no-close-table.toml => no-close-table-1.toml} (100%) delete mode 100644 internal/toml-test/tests/invalid/array/no-close.toml create mode 100644 internal/toml-test/tests/invalid/array/no-comma-1.toml create mode 100644 internal/toml-test/tests/invalid/array/no-comma-2.toml create mode 100644 internal/toml-test/tests/invalid/array/no-comma-3.toml create mode 100644 internal/toml-test/tests/invalid/array/only-comma-1.toml create mode 100644 internal/toml-test/tests/invalid/array/only-comma-2.toml create mode 100644 internal/toml-test/tests/invalid/bool/bool.multi create mode 100644 internal/toml-test/tests/invalid/bool/capitalized-false.toml create mode 100644 internal/toml-test/tests/invalid/bool/capitalized-true.toml create mode 100644 internal/toml-test/tests/invalid/bool/mixed-case-false.toml create mode 100644 internal/toml-test/tests/invalid/bool/mixed-case-true.toml create mode 100644 internal/toml-test/tests/invalid/control/comment-ff.toml create mode 100644 internal/toml-test/tests/invalid/control/multi-cr.toml create mode 100644 internal/toml-test/tests/invalid/control/rawmulti-cd.toml create mode 100644 internal/toml-test/tests/invalid/control/rawstring-cr.toml create mode 100644 internal/toml-test/tests/invalid/control/string-cr.toml create mode 100644 internal/toml-test/tests/invalid/datetime/feb-29.toml create mode 100644 internal/toml-test/tests/invalid/datetime/feb-30.toml create mode 100644 internal/toml-test/tests/invalid/datetime/y10k.toml rename internal/toml-test/tests/invalid/encoding/{utf16.toml => utf16-comment.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/encoding/utf16-key.toml create mode 100644 internal/toml-test/tests/invalid/float/exp-point-3.toml create mode 100644 internal/toml-test/tests/invalid/float/exp-trailing-us-1.toml create mode 100644 internal/toml-test/tests/invalid/float/exp-trailing-us-2.toml rename internal/toml-test/tests/invalid/inline-table/{duplicate-key.toml => duplicate-key-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/inline-table/duplicate-key-2.toml rename internal/toml-test/tests/invalid/inline-table/{nested_key_conflict.toml => duplicate-key-3.toml} (100%) rename internal/toml-test/tests/invalid/inline-table/{dotted-key-conflict.toml => duplicate-key-4.toml} (100%) rename internal/toml-test/tests/invalid/inline-table/{empty.toml => empty-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/inline-table/empty-2.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/empty-3.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/no-close-1.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/no-close-2.toml rename internal/toml-test/tests/invalid/inline-table/{no-comma.toml => no-comma-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/inline-table/no-comma-2.toml rename internal/toml-test/tests/invalid/inline-table/{overwrite.toml => overwrite-1.toml} (100%) rename internal/toml-test/tests/invalid/inline-table/{add.toml => overwrite-2.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-3.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-4.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-5.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-6.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-7.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-8.toml create mode 100644 internal/toml-test/tests/invalid/inline-table/overwrite-9.toml create mode 100644 internal/toml-test/tests/invalid/integer/invalid-hex-1.toml create mode 100644 internal/toml-test/tests/invalid/integer/invalid-hex-2.toml create mode 100644 internal/toml-test/tests/invalid/key/dotted-redefine-table-1.toml rename internal/toml-test/tests/invalid/key/{dotted-redefine-table.toml => dotted-redefine-table-2.toml} (100%) rename internal/toml-test/tests/invalid/key/{duplicate.toml => duplicate-keys-1.toml} (63%) rename internal/toml-test/tests/invalid/key/{duplicate-keys.toml => duplicate-keys-2.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/key/duplicate-keys-3.toml create mode 100644 internal/toml-test/tests/invalid/key/duplicate-keys-4.toml create mode 100644 internal/toml-test/tests/invalid/key/end-in-escape.toml create mode 100644 internal/toml-test/tests/invalid/key/newline-1.toml create mode 100644 internal/toml-test/tests/invalid/key/newline-2.toml create mode 100644 internal/toml-test/tests/invalid/key/newline-3.toml rename internal/toml-test/tests/invalid/key/{multiline.toml => newline-4.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/key/newline-5.toml delete mode 100644 internal/toml-test/tests/invalid/key/newline.toml rename internal/toml-test/tests/invalid/key/{two-equals.toml => two-equals-1.toml} (100%) rename internal/toml-test/tests/invalid/key/{two-equals2.toml => two-equals-2.toml} (100%) rename internal/toml-test/tests/invalid/key/{two-equals3.toml => two-equals-3.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/key/without-value-5.toml create mode 100644 internal/toml-test/tests/invalid/key/without-value-6.toml create mode 100644 internal/toml-test/tests/invalid/key/without-value-7.toml create mode 100644 internal/toml-test/tests/invalid/local-date/feb-29.toml create mode 100644 internal/toml-test/tests/invalid/local-date/feb-30.toml create mode 100644 internal/toml-test/tests/invalid/local-date/y10k.toml create mode 100644 internal/toml-test/tests/invalid/local-datetime/feb-29.toml create mode 100644 internal/toml-test/tests/invalid/local-datetime/feb-30.toml create mode 100644 internal/toml-test/tests/invalid/local-datetime/y10k.toml delete mode 100644 internal/toml-test/tests/invalid/string/bad-codepoint.toml create mode 100644 internal/toml-test/tests/invalid/string/bad-escape-3.toml delete mode 100644 internal/toml-test/tests/invalid/string/bad-hex-esc.multi create mode 100644 internal/toml-test/tests/invalid/string/bad-uni-esc-6.toml create mode 100644 internal/toml-test/tests/invalid/string/bad-uni-esc-7.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-bad-escape-4.toml rename internal/toml-test/tests/invalid/string/{multiline-escape-space.toml => multiline-escape-space-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/string/multiline-escape-space-2.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-lit-no-close-1.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-lit-no-close-2.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-lit-no-close-3.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-lit-no-close-4.toml rename internal/toml-test/tests/invalid/string/{multiline-no-close.toml => multiline-no-close-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/string/multiline-no-close-3.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-no-close-4.toml create mode 100644 internal/toml-test/tests/invalid/string/multiline-no-close-5.toml rename internal/toml-test/tests/invalid/string/{no-close.toml => no-close-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/string/no-close-2.toml create mode 100644 internal/toml-test/tests/invalid/string/no-close-3.toml create mode 100644 internal/toml-test/tests/invalid/string/no-close-4.toml create mode 100644 internal/toml-test/tests/invalid/string/string.multi rename internal/toml-test/tests/invalid/table/{array-missing-bracket.toml => array-no-close-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/table/array-no-close-2.toml create mode 100644 internal/toml-test/tests/invalid/table/no-close-1.toml create mode 100644 internal/toml-test/tests/invalid/table/no-close-2.toml rename internal/toml-test/tests/invalid/table/{quoted-no-close.toml => no-close-3.toml} (97%) create mode 100644 internal/toml-test/tests/invalid/table/no-close-4.toml create mode 100644 internal/toml-test/tests/invalid/table/no-close-5.toml create mode 100644 internal/toml-test/tests/invalid/table/overwrite-array-in-parent.toml create mode 100644 internal/toml-test/tests/invalid/table/overwrite-bool-with-array.toml create mode 100644 internal/toml-test/tests/invalid/table/overwrite-with-deep-table.toml rename internal/toml-test/tests/invalid/table/{redefine.toml => redefine-1.toml} (100%) create mode 100644 internal/toml-test/tests/invalid/table/redefine-2.toml create mode 100644 internal/toml-test/tests/invalid/table/redefine-3.toml create mode 100644 internal/toml-test/tests/invalid/table/super-twice.toml create mode 100644 internal/toml-test/tests/valid/array/array-subtables.json create mode 100644 internal/toml-test/tests/valid/array/array-subtables.toml create mode 100644 internal/toml-test/tests/valid/array/open-parent-table.json create mode 100644 internal/toml-test/tests/valid/array/open-parent-table.toml create mode 100644 internal/toml-test/tests/valid/array/trailing-comma.json create mode 100644 internal/toml-test/tests/valid/array/trailing-comma.toml create mode 100644 internal/toml-test/tests/valid/comment/after-literal-no-ws.json create mode 100644 internal/toml-test/tests/valid/comment/after-literal-no-ws.toml create mode 100644 internal/toml-test/tests/valid/datetime/edge.json create mode 100644 internal/toml-test/tests/valid/datetime/edge.toml create mode 100644 internal/toml-test/tests/valid/datetime/leap-year.json create mode 100644 internal/toml-test/tests/valid/datetime/leap-year.toml create mode 100644 internal/toml-test/tests/valid/inline-table/array-values.json create mode 100644 internal/toml-test/tests/valid/inline-table/array-values.toml create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-1.json create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-1.toml create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-2.json create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-2.toml create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-3.json create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-3.toml create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-4.json create mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted-4.toml delete mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted.json delete mode 100644 internal/toml-test/tests/valid/inline-table/key-dotted.toml create mode 100644 internal/toml-test/tests/valid/inline-table/spaces.json create mode 100644 internal/toml-test/tests/valid/inline-table/spaces.toml create mode 100644 internal/toml-test/tests/valid/key/dotted-1.json create mode 100644 internal/toml-test/tests/valid/key/dotted-1.toml create mode 100644 internal/toml-test/tests/valid/key/dotted-2.json rename internal/toml-test/tests/valid/key/{dotted.toml => dotted-2.toml} (60%) create mode 100644 internal/toml-test/tests/valid/key/dotted-3.json create mode 100644 internal/toml-test/tests/valid/key/dotted-3.toml create mode 100644 internal/toml-test/tests/valid/key/dotted-4.json create mode 100644 internal/toml-test/tests/valid/key/dotted-4.toml delete mode 100644 internal/toml-test/tests/valid/key/dotted.json rename internal/toml-test/tests/valid/key/{empty.json => empty-1.json} (100%) rename internal/toml-test/tests/valid/key/{empty.toml => empty-1.toml} (100%) create mode 100644 internal/toml-test/tests/valid/key/empty-2.json create mode 100644 internal/toml-test/tests/valid/key/empty-2.toml create mode 100644 internal/toml-test/tests/valid/key/empty-3.json create mode 100644 internal/toml-test/tests/valid/key/empty-3.toml create mode 100644 internal/toml-test/tests/valid/key/start.json create mode 100644 internal/toml-test/tests/valid/key/start.toml create mode 100644 internal/toml-test/tests/valid/key/zero.json create mode 100644 internal/toml-test/tests/valid/key/zero.toml create mode 100644 internal/toml-test/tests/valid/string/ends-in-whitespace-escape.json create mode 100644 internal/toml-test/tests/valid/string/ends-in-whitespace-escape.toml create mode 100644 internal/toml-test/tests/valid/string/multiline-empty.json create mode 100644 internal/toml-test/tests/valid/string/multiline-empty.toml diff --git a/decode_test.go b/decode_test.go index 33453962..b547990c 100644 --- a/decode_test.go +++ b/decode_test.go @@ -253,53 +253,6 @@ Number = 123 } } -func TestDecodeTableArrays(t *testing.T) { - var tomlTableArrays = ` -[[albums]] -name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] -name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" -` - - type Song struct { - Name string - } - - type Album struct { - Name string - Songs []Song - } - - type Music struct { - Albums []Album - } - - expected := Music{[]Album{ - {"Born to Run", []Song{{"Jungleland"}, {"Meeting Across the River"}}}, - {"Born in the USA", []Song{{"Glory Days"}, {"Dancing in the Dark"}}}, - }} - var got Music - if _, err := Decode(tomlTableArrays, &got); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(expected, got) { - t.Fatalf("\n%#v\n!=\n%#v\n", expected, got) - } -} - func TestDecodePointers(t *testing.T) { type Object struct { Type string @@ -659,92 +612,6 @@ name = "Rice" } -func TestDecodeInlineTable(t *testing.T) { - input := ` -[CookieJar] -Types = {Chocolate = "yummy", Oatmeal = "best ever"} - -[Seasons] -Locations = {NY = {Temp = "not cold", Rating = 4}, MI = {Temp = "freezing", Rating = 9}} -` - type cookieJar struct { - Types map[string]string - } - type properties struct { - Temp string - Rating int - } - type seasons struct { - Locations map[string]properties - } - type wrapper struct { - CookieJar cookieJar - Seasons seasons - } - var got wrapper - - meta, err := Decode(input, &got) - if err != nil { - t.Fatal(err) - } - want := wrapper{ - CookieJar: cookieJar{ - Types: map[string]string{ - "Chocolate": "yummy", - "Oatmeal": "best ever", - }, - }, - Seasons: seasons{ - Locations: map[string]properties{ - "NY": { - Temp: "not cold", - Rating: 4, - }, - "MI": { - Temp: "freezing", - Rating: 9, - }, - }, - }, - } - if !reflect.DeepEqual(got, want) { - t.Fatalf("after decode, got:\n\n%#v\n\nwant:\n\n%#v", got, want) - } - if len(meta.keys) != 12 { - t.Errorf("after decode, got %d meta keys; want 12", len(meta.keys)) - } - if len(meta.keyInfo) != 12 { - t.Errorf("after decode, got %d meta keyInfo; want 12", len(meta.keyInfo)) - } -} - -func TestDecodeInlineTableArray(t *testing.T) { - type point struct { - X, Y, Z int - } - var got struct { - Points []point - } - // Example inline table array from the spec. - const in = ` -points = [ { x = 1, y = 2, z = 3 }, - { x = 7, y = 8, z = 9 }, - { x = 2, y = 4, z = 8 } ] - -` - if _, err := Decode(in, &got); err != nil { - t.Fatal(err) - } - want := []point{ - {X: 1, Y: 2, Z: 3}, - {X: 7, Y: 8, Z: 9}, - {X: 2, Y: 4, Z: 8}, - } - if !reflect.DeepEqual(got.Points, want) { - t.Errorf("got %#v; want %#v", got.Points, want) - } -} - type menu struct { Dishes map[string]dish } @@ -789,70 +656,6 @@ type ingredient struct { Name string } -func TestDecodeSlices(t *testing.T) { - type ( - T struct { - Arr []string - Tbl map[string]any - } - M map[string]any - ) - tests := []struct { - input string - in, want T - }{ - {"", - T{}, T{}}, - - // Leave existing values alone. - {"", - T{[]string{}, M{"arr": []string{}}}, - T{[]string{}, M{"arr": []string{}}}}, - {"", - T{[]string{"a"}, M{"arr": []string{"b"}}}, - T{[]string{"a"}, M{"arr": []string{"b"}}}}, - - // Empty array always allocates (see #339) - {`arr = [] - tbl = {arr = []}`, - T{}, - T{[]string{}, M{"arr": []any{}}}}, - {`arr = [] - tbl = {}`, - T{[]string{}, M{}}, - T{[]string{}, M{}}}, - - {`arr = []`, - T{[]string{"a"}, M{}}, - T{[]string{}, M{}}}, - - {`arr = ["x"] - tbl = {arr=["y"]}`, - T{}, - T{[]string{"x"}, M{"arr": []any{"y"}}}}, - {`arr = ["x"] - tbl = {arr=["y"]}`, - T{[]string{}, M{}}, - T{[]string{"x"}, M{"arr": []any{"y"}}}}, - {`arr = ["x"] - tbl = {arr=["y"]}`, - T{[]string{"a", "b"}, M{"arr": []any{"c", "d"}}}, - T{[]string{"x"}, M{"arr": []any{"y"}}}}, - } - - for _, tt := range tests { - t.Run("", func(t *testing.T) { - _, err := Decode(tt.input, &tt.in) - if err != nil { - t.Error(err) - } - if !reflect.DeepEqual(tt.in, tt.want) { - t.Errorf("\nhave: %#v\nwant: %#v", tt.in, tt.want) - } - }) - } -} - func TestDecodePrimitive(t *testing.T) { type S struct { P Primitive diff --git a/encode_test.go b/encode_test.go index 4a1b2239..4605e2c9 100644 --- a/encode_test.go +++ b/encode_test.go @@ -55,46 +55,6 @@ func TestEncodeRoundTrip(t *testing.T) { } } -func TestEncodeNestedTableArrays(t *testing.T) { - type song struct { - Name string `toml:"name"` - } - type album struct { - Name string `toml:"name"` - Songs []song `toml:"songs"` - } - type springsteen struct { - Albums []album `toml:"albums"` - } - value := springsteen{ - []album{ - {"Born to Run", - []song{{"Jungleland"}, {"Meeting Across the River"}}}, - {"Born in the USA", - []song{{"Glory Days"}, {"Dancing in the Dark"}}}, - }, - } - expected := `[[albums]] - name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] - name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" -` - encodeExpected(t, "nested table arrays", value, expected, nil) -} - func TestEncodeArrayHashWithNormalHashOrder(t *testing.T) { type Alpha struct { V int diff --git a/error_test.go b/error_test.go index 5f4010d6..ce2171f6 100644 --- a/error_test.go +++ b/error_test.go @@ -18,7 +18,7 @@ func TestErrorPosition(t *testing.T) { tests := []struct { test, err string }{ - {"array/missing-separator.toml", ` + {"array/missing-separator-2.toml", ` toml: error: expected a comma (',') or array terminator (']'), but got '2' At line 1, column 13: @@ -26,13 +26,13 @@ At line 1, column 13: 1 | wrong = [ 1 2 3 ] ^`}, - {"array/no-close-2.toml", ` + {"array/no-close-1.toml", ` toml: error: expected a comma (',') or array terminator (']'), but got end of file -At line 1, column 10: +At line 1, column 23: - 1 | x = [42 # - ^`}, + 1 | no-close-1 = [ 1, 2, 3 + ^`}, {"array/tables-2.toml", ` toml: error: Key 'fruit.variety' has already been defined. diff --git a/internal/toml-test/json.go b/internal/toml-test/json.go index c5a37c7f..83fcf403 100644 --- a/internal/toml-test/json.go +++ b/internal/toml-test/json.go @@ -21,7 +21,7 @@ func (r Test) CompareJSON(want, have any) Test { case []any: return r.cmpJSONArrays(w, have) default: - return r.fail("Key '%s' in expected output should be a map or a list of maps, but it's a %s", r.Key, fmtType(want)) + return r.fail("Key %q in expected output should be a map or a list of maps, but it's a %s", r.Key, fmtType(want)) } } @@ -33,31 +33,33 @@ func (r Test) cmpJSONMaps(want map[string]any, have any) Test { // Check to make sure both or neither are values. if isValue(want) && !isValue(haveMap) { - return r.fail("Key '%s' is supposed to be a value, but the parser reports it as a table", r.Key) + return r.fail("Key %q is supposed to be a value, but the parser reports it as a table", r.Key) } if !isValue(want) && isValue(haveMap) { - return r.fail("Key '%s' is supposed to be a table, but the parser reports it as a value", r.Key) + return r.fail("Key %q is supposed to be a table, but the parser reports it as a value", r.Key) } if isValue(want) && isValue(haveMap) { return r.cmpJSONValues(want, haveMap) } + wantKeys, haveKeys := mapKeys(want), mapKeys(haveMap) + // Check that the keys of each map are equivalent. - for k := range want { + for _, k := range wantKeys { if _, ok := haveMap[k]; !ok { bunk := r.kjoin(k) - return bunk.fail("Could not find key '%s' in parser output.", bunk.Key) + return bunk.fail("Could not find key %q in parser output.", bunk.Key) } } - for k := range haveMap { + for _, k := range haveKeys { if _, ok := want[k]; !ok { bunk := r.kjoin(k) - return bunk.fail("Could not find key '%s' in expected output.", bunk.Key) + return bunk.fail("Could not find key %q in expected output.", bunk.Key) } } // Okay, now make sure that each value is equivalent. - for k := range want { + for _, k := range wantKeys { if sub := r.kjoin(k).CompareJSON(want[k], haveMap[k]); sub.Failed() { return sub } @@ -78,7 +80,7 @@ func (r Test) cmpJSONArrays(want, have any) Test { } if len(wantSlice) != len(haveSlice) { - return r.fail("Array lengths differ for key '%s':\n"+ + return r.fail("Array lengths differ for key %q:\n"+ " Expected: %d\n"+ " Your encoder: %d", r.Key, len(wantSlice), len(haveSlice)) @@ -102,6 +104,10 @@ func (r Test) cmpJSONValues(want, have map[string]any) Test { return r.fail("Malformed output from your encoder: 'type' is not a string: %s", fmtType(have["type"])) } + if wantType == "integer" && r.IntAsFloat { + wantType = "float" + } + if wantType != haveType { return r.valMismatch(wantType, haveType, want, have) } @@ -129,13 +135,16 @@ func (r Test) cmpJSONValues(want, have map[string]any) Test { case "datetime", "datetime-local", "date-local", "time-local": return r.cmpAsDatetimes(wantType, wantVal, haveVal) default: + if wantType == "bool" { + wantVal, haveVal = strings.ToLower(wantVal), strings.ToLower(haveVal) + } return r.cmpAsStrings(wantVal, haveVal) } } func (r Test) cmpAsStrings(want, have string) Test { if want != have { - return r.fail("Values for key '%s' don't match:\n"+ + return r.fail("Values for key %q don't match:\n"+ " Expected: %s\n"+ " Your encoder: %s", r.Key, want, have) @@ -145,10 +154,11 @@ func (r Test) cmpAsStrings(want, have string) Test { func (r Test) cmpFloats(want, have string) Test { // Special case for NaN, since NaN != NaN. + want, have = strings.ToLower(want), strings.ToLower(have) if strings.HasSuffix(want, "nan") || strings.HasSuffix(have, "nan") { want, have := strings.TrimLeft(want, "-+"), strings.TrimLeft(have, "-+") if want != have { - return r.fail("Values for key '%s' don't match:\n"+ + return r.fail("Values for key %q don't match:\n"+ " Expected: %v\n"+ " Your encoder: %v", r.Key, want, have) @@ -158,16 +168,16 @@ func (r Test) cmpFloats(want, have string) Test { wantF, err := strconv.ParseFloat(want, 64) if err != nil { - return r.bug("Could not read '%s' as a float value for key '%s'", want, r.Key) + return r.bug("Could not read %q as a float value for key %q", want, r.Key) } haveF, err := strconv.ParseFloat(have, 64) if err != nil { - return r.fail("Malformed output from your encoder: key '%s' is not a float: '%s'", r.Key, have) + return r.fail("Malformed output from your encoder: key %q is not a float: %q", r.Key, have) } if wantF != haveF { - return r.fail("Values for key '%s' don't match:\n"+ + return r.fail("Values for key %q don't match:\n"+ " Expected: %v\n"+ " Your encoder: %v", r.Key, wantF, haveF) @@ -195,15 +205,15 @@ func (r Test) cmpAsDatetimes(kind, want, have string) Test { wantT, err := time.Parse(layout, datetimeRepl.Replace(want)) if err != nil { - return r.bug("Could not read '%s' as a datetime value for key '%s'", want, r.Key) + return r.bug("Could not read %q as a datetime value for key %q", want, r.Key) } haveT, err := time.Parse(layout, datetimeRepl.Replace(want)) if err != nil { - return r.fail("Malformed output from your encoder: key '%s' is not a datetime: '%s'", r.Key, have) + return r.fail("Malformed output from your encoder: key %q is not a datetime: %q", r.Key, have) } if !wantT.Equal(haveT) { - return r.fail("Values for key '%s' don't match:\n"+ + return r.fail("Values for key %q don't match:\n"+ " Expected: %v\n"+ " Your encoder: %v", r.Key, wantT, haveT) diff --git a/internal/toml-test/runner.go b/internal/toml-test/runner.go index 9c4b7882..666e8edb 100644 --- a/internal/toml-test/runner.go +++ b/internal/toml-test/runner.go @@ -4,15 +4,19 @@ package tomltest import ( "bytes" + "context" "embed" "encoding/json" "errors" "fmt" "io/fs" "os/exec" + "path" "path/filepath" "sort" "strings" + "sync" + "time" "github.com/BurntSushi/toml" ) @@ -42,12 +46,16 @@ func EmbeddedTests() fs.FS { // The validity of the parameters is not checked extensively; the caller should // verify this if need be. See ./cmd/toml-test for an example. type Runner struct { - Files fs.FS // Test files. - Encoder bool // Are we testing an encoder? - RunTests []string // Tests to run; run all if blank. - SkipTests []string // Tests to skip. - Parser Parser // Send data to a parser. - Version string // TOML version to run tests for. + Files fs.FS // Test files. + Encoder bool // Are we testing an encoder? + RunTests []string // Tests to run; run all if blank. + SkipTests []string // Tests to skip. + Parser Parser // Send data to a parser. + Version string // TOML version to run tests for. + Parallel int // Number of tests to run in parallel + Timeout time.Duration // Maximum time for parse. + IntAsFloat bool // Int values have type=float. + Errors map[string]string // Expected errors list. } // A Parser instance is used to call the TOML parser we test. @@ -62,10 +70,10 @@ type Parser interface { // An error return should only be used in case an unrecoverable error // occurred; failing to encode to TOML is not an error, but the encoder // unexpectedly panicking is. - Encode(jsonInput string) (output string, outputIsError bool, err error) + Encode(ctx context.Context, jsonInput string) (output string, outputIsError bool, err error) // Decode a TOML string to JSON. The same semantics as Encode apply. - Decode(tomlInput string) (output string, outputIsError bool, err error) + Decode(ctx context.Context, tomlInput string) (output string, outputIsError bool, err error) } // CommandParser calls an external command. @@ -91,14 +99,22 @@ type Test struct { // Set when a test is run. - Skipped bool // Skipped this test? - Failure string // Failure message. - Key string // TOML key the failure occured on; may be blank. - Encoder bool // Encoder test? - Input string // The test case that we sent to the external program. - Output string // Output from the external program. - Want string // The output we want. - OutputFromStderr bool // The Output came from stderr, not stdout. + Skipped bool // Skipped this test? + Failure string // Failure message. + Key string // TOML key the failure occured on; may be blank. + Encoder bool // Encoder test? + Input string // The test case that we sent to the external program. + Output string // Output from the external program. + Want string // The output we want. + OutputFromStderr bool // The Output came from stderr, not stdout. + Timeout time.Duration // Maximum time for parse. + IntAsFloat bool // Int values have type=float. +} + +type timeoutError struct{ d time.Duration } + +func (err timeoutError) Error() string { + return fmt.Sprintf("command timed out after %s; increase -timeout if this isn't an infinite loop or pathological behaviour", err.d) } // List all tests in Files for the current TOML version. @@ -152,35 +168,94 @@ func (r Runner) Run() (Tests, error) { if err != nil { return Tests{}, fmt.Errorf("tomltest.Runner.Run: %w", err) } + if r.Parallel == 0 { + r.Parallel = 1 + } + if r.Timeout == 0 { + r.Timeout = 1 * time.Second + } + if r.Errors == nil { + r.Errors = make(map[string]string) + } + nerr := make(map[string]string) + for k, v := range r.Errors { + if !strings.HasPrefix(k, "invalid/") { + k = path.Join("invalid", k) + } + nerr[strings.TrimSuffix(k, ".toml")] = v + } + r.Errors = nerr - tests := Tests{ - Tests: make([]Test, 0, len(r.RunTests)), Skipped: skipped} + var ( + tests = Tests{ + Tests: make([]Test, 0, len(r.RunTests)), + Skipped: skipped, + } + limit = make(chan struct{}, r.Parallel) + wg sync.WaitGroup + mu sync.Mutex + ) for _, p := range r.RunTests { invalid := strings.Contains(p, "invalid/") + t := Test{ + Path: p, + Encoder: r.Encoder, + Timeout: r.Timeout, + IntAsFloat: r.IntAsFloat, + } if r.hasSkip(p) { tests.Skipped++ - tests.Tests = append(tests.Tests, Test{Path: p, Skipped: true, Encoder: r.Encoder}) + mu.Lock() + t.Skipped = true + tests.Tests = append(tests.Tests, t) + mu.Unlock() continue } - t := Test{Path: p, Encoder: r.Encoder}.Run(r.Parser, r.Files) - tests.Tests = append(tests.Tests, t) + limit <- struct{}{} + wg.Add(1) + go func(p string) { + defer func() { <-limit; wg.Done() }() - if t.Failed() { - if invalid { - tests.FailedInvalid++ - } else { - tests.FailedValid++ + t = t.Run(r.Parser, r.Files) + + mu.Lock() + if e, ok := r.Errors[p]; invalid && ok && !t.Failed() && !strings.Contains(t.Output, e) { + t.Failure = fmt.Sprintf("%q does not contain %q", t.Output, e) } - } else { - if invalid { - tests.PassedInvalid++ + delete(r.Errors, p) + + tests.Tests = append(tests.Tests, t) + if t.Failed() { + if invalid { + tests.FailedInvalid++ + } else { + tests.FailedValid++ + } } else { - tests.PassedValid++ + if invalid { + tests.PassedInvalid++ + } else { + tests.PassedValid++ + } } - } + mu.Unlock() + }(p) } + wg.Wait() + sort.Slice(tests.Tests, func(i, j int) bool { + return strings.Replace(tests.Tests[i].Path, "invalid/", "zinvalid", 1) < + strings.Replace(tests.Tests[j].Path, "invalid/", "zinvalid", 1) + }) + + if len(r.Errors) > 0 { + keys := make([]string, 0, len(r.Errors)) + for k := range r.Errors { + keys = append(keys, k) + } + return tests, fmt.Errorf("errors didn't match anything: %q", keys) + } return tests, nil } @@ -263,16 +338,16 @@ func (r Runner) hasSkip(path string) bool { return false } -func (c CommandParser) Encode(input string) (output string, outputIsError bool, err error) { +func (c CommandParser) Encode(ctx context.Context, input string) (output string, outputIsError bool, err error) { stdout, stderr := new(bytes.Buffer), new(bytes.Buffer) - cmd := exec.Command(c.cmd[0]) + cmd := exec.CommandContext(ctx, c.cmd[0]) cmd.Args = c.cmd cmd.Stdin, cmd.Stdout, cmd.Stderr = strings.NewReader(input), stdout, stderr err = cmd.Run() if err != nil { eErr := &exec.ExitError{} - if errors.As(err, &eErr) { + if errors.As(err, &eErr) && eErr.ExitCode() == 1 { fmt.Fprintf(stderr, "\nExit %d\n", eErr.ProcessState.ExitCode()) err = nil } @@ -283,8 +358,10 @@ func (c CommandParser) Encode(input string) (output string, outputIsError bool, } return strings.TrimSpace(stdout.String()) + "\n", false, err } -func NewCommandParser(fsys fs.FS, cmd []string) CommandParser { return CommandParser{fsys, cmd} } -func (c CommandParser) Decode(input string) (string, bool, error) { return c.Encode(input) } +func NewCommandParser(fsys fs.FS, cmd []string) CommandParser { return CommandParser{fsys, cmd} } +func (c CommandParser) Decode(ctx context.Context, input string) (string, bool, error) { + return c.Encode(ctx, input) +} // Run this test. func (t Test) Run(p Parser, fsys fs.FS) Test { @@ -301,10 +378,16 @@ func (t Test) runInvalid(p Parser, fsys fs.FS) Test { return t.bug(err.Error()) } + ctx, cancel := context.WithTimeout(context.Background(), t.Timeout) + defer cancel() + if t.Encoder { - t.Output, t.OutputFromStderr, err = p.Encode(t.Input) + t.Output, t.OutputFromStderr, err = p.Encode(ctx, t.Input) } else { - t.Output, t.OutputFromStderr, err = p.Decode(t.Input) + t.Output, t.OutputFromStderr, err = p.Decode(ctx, t.Input) + } + if ctx.Err() != nil { + err = timeoutError{t.Timeout} } if err != nil { return t.fail(err.Error()) @@ -322,10 +405,16 @@ func (t Test) runValid(p Parser, fsys fs.FS) Test { return t.bug(err.Error()) } + ctx, cancel := context.WithTimeout(context.Background(), t.Timeout) + defer cancel() + if t.Encoder { - t.Output, t.OutputFromStderr, err = p.Encode(t.Input) + t.Output, t.OutputFromStderr, err = p.Encode(ctx, t.Input) } else { - t.Output, t.OutputFromStderr, err = p.Decode(t.Input) + t.Output, t.OutputFromStderr, err = p.Decode(ctx, t.Input) + } + if ctx.Err() != nil { + err = timeoutError{t.Timeout} } if err != nil { return t.fail(err.Error()) diff --git a/internal/toml-test/tests/invalid/array/array.multi b/internal/toml-test/tests/invalid/array/array.multi new file mode 100644 index 00000000..1c666912 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/array.multi @@ -0,0 +1,18 @@ +double-comma-1 = [1,,2] +double-comma-2 = [1,2,,] + +only-comma-1 = [,] +only-comma-2 = [,,] + +no-comma-1 = [true false] +no-comma-2 = [ 1 2 3 ] +no-comma-3 = [ 1 #,] + +no-close-1 = [ 1, 2, 3 +no-close-2 = [1, +no-close-3 = [42 #] +no-close-4 = [{ key = 42 +no-close-5 = [{ key = 42} +no-close-6 = [{ key = 42 #}] +no-close-7 = [{ key = 42} #] +no-close-8 = [ diff --git a/internal/toml-test/tests/invalid/array/double-comma-1.toml b/internal/toml-test/tests/invalid/array/double-comma-1.toml index 339aad2c..87602c04 100644 --- a/internal/toml-test/tests/invalid/array/double-comma-1.toml +++ b/internal/toml-test/tests/invalid/array/double-comma-1.toml @@ -1 +1 @@ -array = [1,,2] +double-comma-1 = [1,,2] diff --git a/internal/toml-test/tests/invalid/array/double-comma-2.toml b/internal/toml-test/tests/invalid/array/double-comma-2.toml index ce3565c2..8019b501 100644 --- a/internal/toml-test/tests/invalid/array/double-comma-2.toml +++ b/internal/toml-test/tests/invalid/array/double-comma-2.toml @@ -1,2 +1 @@ -array = [1,2,,] - +double-comma-2 = [1,2,,] diff --git a/internal/toml-test/tests/invalid/array/extend-defined-aot.toml b/internal/toml-test/tests/invalid/array/extend-defined-aot.toml new file mode 100644 index 00000000..1c3c34b8 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/extend-defined-aot.toml @@ -0,0 +1,3 @@ +[[tab.arr]] +[tab] +arr.val1=1 diff --git a/internal/toml-test/tests/invalid/array/missing-separator-1.toml b/internal/toml-test/tests/invalid/array/missing-separator-1.toml new file mode 100644 index 00000000..9431d907 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/missing-separator-1.toml @@ -0,0 +1 @@ +arrr = [true false] diff --git a/internal/toml-test/tests/invalid/array/missing-separator.toml b/internal/toml-test/tests/invalid/array/missing-separator-2.toml similarity index 100% rename from internal/toml-test/tests/invalid/array/missing-separator.toml rename to internal/toml-test/tests/invalid/array/missing-separator-2.toml diff --git a/internal/toml-test/tests/invalid/array/no-close-1.toml b/internal/toml-test/tests/invalid/array/no-close-1.toml new file mode 100644 index 00000000..fa72e49b --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-1.toml @@ -0,0 +1 @@ +no-close-1 = [ 1, 2, 3 diff --git a/internal/toml-test/tests/invalid/array/no-close-2.toml b/internal/toml-test/tests/invalid/array/no-close-2.toml index 2f46123f..01874ad4 100644 --- a/internal/toml-test/tests/invalid/array/no-close-2.toml +++ b/internal/toml-test/tests/invalid/array/no-close-2.toml @@ -1 +1 @@ -x = [42 # +no-close-2 = [1, diff --git a/internal/toml-test/tests/invalid/array/no-close-3.toml b/internal/toml-test/tests/invalid/array/no-close-3.toml new file mode 100644 index 00000000..7edcc439 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-3.toml @@ -0,0 +1 @@ +no-close-3 = [42 #] diff --git a/internal/toml-test/tests/invalid/array/no-close-4.toml b/internal/toml-test/tests/invalid/array/no-close-4.toml new file mode 100644 index 00000000..8c64b5e2 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-4.toml @@ -0,0 +1 @@ +no-close-4 = [{ key = 42 diff --git a/internal/toml-test/tests/invalid/array/no-close-5.toml b/internal/toml-test/tests/invalid/array/no-close-5.toml new file mode 100644 index 00000000..fba61097 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-5.toml @@ -0,0 +1 @@ +no-close-5 = [{ key = 42} diff --git a/internal/toml-test/tests/invalid/array/no-close-6.toml b/internal/toml-test/tests/invalid/array/no-close-6.toml new file mode 100644 index 00000000..551e7114 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-6.toml @@ -0,0 +1 @@ +no-close-6 = [{ key = 42 #}] diff --git a/internal/toml-test/tests/invalid/array/no-close-7.toml b/internal/toml-test/tests/invalid/array/no-close-7.toml new file mode 100644 index 00000000..fe8c8fdd --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-7.toml @@ -0,0 +1 @@ +no-close-7 = [{ key = 42} #] diff --git a/internal/toml-test/tests/invalid/array/no-close-8.toml b/internal/toml-test/tests/invalid/array/no-close-8.toml new file mode 100644 index 00000000..3378bf3d --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-close-8.toml @@ -0,0 +1 @@ +no-close-8 = [ diff --git a/internal/toml-test/tests/invalid/array/no-close-table.toml b/internal/toml-test/tests/invalid/array/no-close-table-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/array/no-close-table.toml rename to internal/toml-test/tests/invalid/array/no-close-table-1.toml diff --git a/internal/toml-test/tests/invalid/array/no-close.toml b/internal/toml-test/tests/invalid/array/no-close.toml deleted file mode 100644 index 032ebcc2..00000000 --- a/internal/toml-test/tests/invalid/array/no-close.toml +++ /dev/null @@ -1 +0,0 @@ -long_array = [ 1, 2, 3 diff --git a/internal/toml-test/tests/invalid/array/no-comma-1.toml b/internal/toml-test/tests/invalid/array/no-comma-1.toml new file mode 100644 index 00000000..ae7ab249 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-comma-1.toml @@ -0,0 +1 @@ +no-comma-1 = [true false] diff --git a/internal/toml-test/tests/invalid/array/no-comma-2.toml b/internal/toml-test/tests/invalid/array/no-comma-2.toml new file mode 100644 index 00000000..a8bc6071 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-comma-2.toml @@ -0,0 +1 @@ +no-comma-2 = [ 1 2 3 ] diff --git a/internal/toml-test/tests/invalid/array/no-comma-3.toml b/internal/toml-test/tests/invalid/array/no-comma-3.toml new file mode 100644 index 00000000..1a636d6d --- /dev/null +++ b/internal/toml-test/tests/invalid/array/no-comma-3.toml @@ -0,0 +1 @@ +no-comma-3 = [ 1 #,] diff --git a/internal/toml-test/tests/invalid/array/only-comma-1.toml b/internal/toml-test/tests/invalid/array/only-comma-1.toml new file mode 100644 index 00000000..dca0f1b4 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/only-comma-1.toml @@ -0,0 +1 @@ +only-comma-1 = [,] diff --git a/internal/toml-test/tests/invalid/array/only-comma-2.toml b/internal/toml-test/tests/invalid/array/only-comma-2.toml new file mode 100644 index 00000000..3e46ca62 --- /dev/null +++ b/internal/toml-test/tests/invalid/array/only-comma-2.toml @@ -0,0 +1 @@ +only-comma-2 = [,,] diff --git a/internal/toml-test/tests/invalid/bool/almost-false-with-extra.toml b/internal/toml-test/tests/invalid/bool/almost-false-with-extra.toml index 047911e1..1f041082 100644 --- a/internal/toml-test/tests/invalid/bool/almost-false-with-extra.toml +++ b/internal/toml-test/tests/invalid/bool/almost-false-with-extra.toml @@ -1 +1 @@ -a = falsify +almost-false-with-extra = falsify diff --git a/internal/toml-test/tests/invalid/bool/almost-false.toml b/internal/toml-test/tests/invalid/bool/almost-false.toml index 90d612dd..34a71f50 100644 --- a/internal/toml-test/tests/invalid/bool/almost-false.toml +++ b/internal/toml-test/tests/invalid/bool/almost-false.toml @@ -1 +1 @@ -a = fals +almost-false = fals diff --git a/internal/toml-test/tests/invalid/bool/almost-true-with-extra.toml b/internal/toml-test/tests/invalid/bool/almost-true-with-extra.toml index b8946f32..218838a7 100644 --- a/internal/toml-test/tests/invalid/bool/almost-true-with-extra.toml +++ b/internal/toml-test/tests/invalid/bool/almost-true-with-extra.toml @@ -1 +1 @@ -a = truthy +almost-true-with-extra = truthy diff --git a/internal/toml-test/tests/invalid/bool/almost-true.toml b/internal/toml-test/tests/invalid/bool/almost-true.toml index e9a61459..9146eccf 100644 --- a/internal/toml-test/tests/invalid/bool/almost-true.toml +++ b/internal/toml-test/tests/invalid/bool/almost-true.toml @@ -1 +1 @@ -a = tru +almost-true = tru diff --git a/internal/toml-test/tests/invalid/bool/bool.multi b/internal/toml-test/tests/invalid/bool/bool.multi new file mode 100644 index 00000000..ed59e326 --- /dev/null +++ b/internal/toml-test/tests/invalid/bool/bool.multi @@ -0,0 +1,15 @@ +almost-false-with-extra = falsify +almost-false = fals +almost-true-with-extra = truthy +almost-true = tru +just-f = f +just-t = t +mixed-case = valid = False +starting-same-false = falsey +starting-same-true = truer +wrong-case-false = FALSE +wrong-case-true = TRUE +mixed-case-false = falsE +mixed-case-true = trUe +capitalized-false = False +capitalized-true = True diff --git a/internal/toml-test/tests/invalid/bool/capitalized-false.toml b/internal/toml-test/tests/invalid/bool/capitalized-false.toml new file mode 100644 index 00000000..a8217fa7 --- /dev/null +++ b/internal/toml-test/tests/invalid/bool/capitalized-false.toml @@ -0,0 +1 @@ +capitalized-false = False diff --git a/internal/toml-test/tests/invalid/bool/capitalized-true.toml b/internal/toml-test/tests/invalid/bool/capitalized-true.toml new file mode 100644 index 00000000..99cbcbc7 --- /dev/null +++ b/internal/toml-test/tests/invalid/bool/capitalized-true.toml @@ -0,0 +1 @@ +capitalized-true = True diff --git a/internal/toml-test/tests/invalid/bool/just-f.toml b/internal/toml-test/tests/invalid/bool/just-f.toml index b7dfb900..4c2af490 100644 --- a/internal/toml-test/tests/invalid/bool/just-f.toml +++ b/internal/toml-test/tests/invalid/bool/just-f.toml @@ -1 +1 @@ -a = f +just-f = f diff --git a/internal/toml-test/tests/invalid/bool/just-t.toml b/internal/toml-test/tests/invalid/bool/just-t.toml index 26e457a9..66e4c474 100644 --- a/internal/toml-test/tests/invalid/bool/just-t.toml +++ b/internal/toml-test/tests/invalid/bool/just-t.toml @@ -1 +1 @@ -a = t +just-t = t diff --git a/internal/toml-test/tests/invalid/bool/mixed-case-false.toml b/internal/toml-test/tests/invalid/bool/mixed-case-false.toml new file mode 100644 index 00000000..1dceaa63 --- /dev/null +++ b/internal/toml-test/tests/invalid/bool/mixed-case-false.toml @@ -0,0 +1 @@ +mixed-case-false = falsE diff --git a/internal/toml-test/tests/invalid/bool/mixed-case-true.toml b/internal/toml-test/tests/invalid/bool/mixed-case-true.toml new file mode 100644 index 00000000..d26a0840 --- /dev/null +++ b/internal/toml-test/tests/invalid/bool/mixed-case-true.toml @@ -0,0 +1 @@ +mixed-case-true = trUe diff --git a/internal/toml-test/tests/invalid/bool/mixed-case.toml b/internal/toml-test/tests/invalid/bool/mixed-case.toml index 41d995a2..1cdb181a 100644 --- a/internal/toml-test/tests/invalid/bool/mixed-case.toml +++ b/internal/toml-test/tests/invalid/bool/mixed-case.toml @@ -1 +1 @@ -valid = False +mixed-case = valid = False diff --git a/internal/toml-test/tests/invalid/bool/starting-same-false.toml b/internal/toml-test/tests/invalid/bool/starting-same-false.toml index 19dfb8d0..b4fae316 100644 --- a/internal/toml-test/tests/invalid/bool/starting-same-false.toml +++ b/internal/toml-test/tests/invalid/bool/starting-same-false.toml @@ -1 +1 @@ -a = falsey +starting-same-false = falsey diff --git a/internal/toml-test/tests/invalid/bool/starting-same-true.toml b/internal/toml-test/tests/invalid/bool/starting-same-true.toml index bf2f7842..785ccf86 100644 --- a/internal/toml-test/tests/invalid/bool/starting-same-true.toml +++ b/internal/toml-test/tests/invalid/bool/starting-same-true.toml @@ -1 +1 @@ -a = truer +starting-same-true = truer diff --git a/internal/toml-test/tests/invalid/bool/wrong-case-false.toml b/internal/toml-test/tests/invalid/bool/wrong-case-false.toml index 39822209..97cb27a0 100644 --- a/internal/toml-test/tests/invalid/bool/wrong-case-false.toml +++ b/internal/toml-test/tests/invalid/bool/wrong-case-false.toml @@ -1 +1 @@ -b = FALSE +wrong-case-false = FALSE diff --git a/internal/toml-test/tests/invalid/bool/wrong-case-true.toml b/internal/toml-test/tests/invalid/bool/wrong-case-true.toml index 85e34c5e..e184224d 100644 --- a/internal/toml-test/tests/invalid/bool/wrong-case-true.toml +++ b/internal/toml-test/tests/invalid/bool/wrong-case-true.toml @@ -1 +1 @@ -a = TRUE +wrong-case-true = TRUE diff --git a/internal/toml-test/tests/invalid/control/bare-formfeed.toml b/internal/toml-test/tests/invalid/control/bare-formfeed.toml index 508a6508..6c8d3b90 100644 --- a/internal/toml-test/tests/invalid/control/bare-formfeed.toml +++ b/internal/toml-test/tests/invalid/control/bare-formfeed.toml @@ -1 +1 @@ -bare-formfeed = +bare-formfeed = diff --git a/internal/toml-test/tests/invalid/control/bare-null.toml b/internal/toml-test/tests/invalid/control/bare-null.toml index cf15002ae4e5866dc8a6aabc98730c9f4d6b5ee3..afdb456a0f07069cfacee63bc3e996a07d72e994 100644 GIT binary patch literal 35 jcmYdFEK1eQE6vGKfB{8?T1!5(JG9cyx01sdRtpET3 literal 0 HcmV?d00001 diff --git a/internal/toml-test/tests/invalid/float/exp-point-3.toml b/internal/toml-test/tests/invalid/float/exp-point-3.toml new file mode 100644 index 00000000..dd53e98a --- /dev/null +++ b/internal/toml-test/tests/invalid/float/exp-point-3.toml @@ -0,0 +1 @@ +exp-point-3 = 3.e+20 diff --git a/internal/toml-test/tests/invalid/float/exp-trailing-us-1.toml b/internal/toml-test/tests/invalid/float/exp-trailing-us-1.toml new file mode 100644 index 00000000..b0fb70e2 --- /dev/null +++ b/internal/toml-test/tests/invalid/float/exp-trailing-us-1.toml @@ -0,0 +1 @@ +exp-trailing-us-1 = 1_e2 diff --git a/internal/toml-test/tests/invalid/float/exp-trailing-us-2.toml b/internal/toml-test/tests/invalid/float/exp-trailing-us-2.toml new file mode 100644 index 00000000..e35f3e3f --- /dev/null +++ b/internal/toml-test/tests/invalid/float/exp-trailing-us-2.toml @@ -0,0 +1 @@ +exp-trailing-us-2 = 1.2_e2 diff --git a/internal/toml-test/tests/invalid/float/float.multi b/internal/toml-test/tests/invalid/float/float.multi index c686d0a9..ff67bb86 100644 --- a/internal/toml-test/tests/invalid/float/float.multi +++ b/internal/toml-test/tests/invalid/float/float.multi @@ -20,6 +20,7 @@ double-point-2 = 0.1.2 exp-point-1 = 1e2.3 exp-point-2 = 1.e2 +exp-point-3 = 3.e+20 exp-double-e-1 = 1ee2 exp-double-e-2 = 1e2e3 @@ -28,6 +29,9 @@ exp-leading-us = 1e_23 exp-trailing-us = 1e23_ exp-double-us = 1e__23 +exp-trailing-us-1 = 1_e2 +exp-trailing-us-2 = 1.2_e2 + inf-incomplete-1 = in inf-incomplete-2 = +in inf-incomplete-3 = -in @@ -38,6 +42,3 @@ nan-incomplete-3 = -na nan_underscore = na_n inf_underscore = in_f - -trailing-us-exp-1 = 1_e2 -trailing-us-exp-2 = 1.2_e2 diff --git a/internal/toml-test/tests/invalid/inline-table/duplicate-key.toml b/internal/toml-test/tests/invalid/inline-table/duplicate-key-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/duplicate-key.toml rename to internal/toml-test/tests/invalid/inline-table/duplicate-key-1.toml diff --git a/internal/toml-test/tests/invalid/inline-table/duplicate-key-2.toml b/internal/toml-test/tests/invalid/inline-table/duplicate-key-2.toml new file mode 100644 index 00000000..a9426798 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/duplicate-key-2.toml @@ -0,0 +1 @@ +table1 = { table2.dupe = 1, table2.dupe = 2 } diff --git a/internal/toml-test/tests/invalid/inline-table/nested_key_conflict.toml b/internal/toml-test/tests/invalid/inline-table/duplicate-key-3.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/nested_key_conflict.toml rename to internal/toml-test/tests/invalid/inline-table/duplicate-key-3.toml diff --git a/internal/toml-test/tests/invalid/inline-table/dotted-key-conflict.toml b/internal/toml-test/tests/invalid/inline-table/duplicate-key-4.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/dotted-key-conflict.toml rename to internal/toml-test/tests/invalid/inline-table/duplicate-key-4.toml diff --git a/internal/toml-test/tests/invalid/inline-table/empty.toml b/internal/toml-test/tests/invalid/inline-table/empty-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/empty.toml rename to internal/toml-test/tests/invalid/inline-table/empty-1.toml diff --git a/internal/toml-test/tests/invalid/inline-table/empty-2.toml b/internal/toml-test/tests/invalid/inline-table/empty-2.toml new file mode 100644 index 00000000..646a8970 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/empty-2.toml @@ -0,0 +1,2 @@ +t = {, +} diff --git a/internal/toml-test/tests/invalid/inline-table/empty-3.toml b/internal/toml-test/tests/invalid/inline-table/empty-3.toml new file mode 100644 index 00000000..f69a0709 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/empty-3.toml @@ -0,0 +1,3 @@ +t = { +, +} diff --git a/internal/toml-test/tests/invalid/inline-table/no-close-1.toml b/internal/toml-test/tests/invalid/inline-table/no-close-1.toml new file mode 100644 index 00000000..e269d228 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/no-close-1.toml @@ -0,0 +1 @@ +a={ diff --git a/internal/toml-test/tests/invalid/inline-table/no-close-2.toml b/internal/toml-test/tests/invalid/inline-table/no-close-2.toml new file mode 100644 index 00000000..64a9e7dd --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/no-close-2.toml @@ -0,0 +1 @@ +a={b=1 diff --git a/internal/toml-test/tests/invalid/inline-table/no-comma.toml b/internal/toml-test/tests/invalid/inline-table/no-comma-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/no-comma.toml rename to internal/toml-test/tests/invalid/inline-table/no-comma-1.toml diff --git a/internal/toml-test/tests/invalid/inline-table/no-comma-2.toml b/internal/toml-test/tests/invalid/inline-table/no-comma-2.toml new file mode 100644 index 00000000..d98b41dd --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/no-comma-2.toml @@ -0,0 +1 @@ +arrr = { comma-missing = true valid-toml = false } diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/overwrite.toml rename to internal/toml-test/tests/invalid/inline-table/overwrite-1.toml diff --git a/internal/toml-test/tests/invalid/inline-table/add.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-2.toml similarity index 100% rename from internal/toml-test/tests/invalid/inline-table/add.toml rename to internal/toml-test/tests/invalid/inline-table/overwrite-2.toml diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-3.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-3.toml new file mode 100644 index 00000000..0f20d18f --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-3.toml @@ -0,0 +1,2 @@ +a = { b = 1 } +a.b = 2 diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-4.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-4.toml new file mode 100644 index 00000000..79b4f325 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-4.toml @@ -0,0 +1,3 @@ +inline-t = { nest = {} } + +[[inline-t.nest]] diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-5.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-5.toml new file mode 100644 index 00000000..d0cd6b64 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-5.toml @@ -0,0 +1,3 @@ +inline-t = { nest = {} } + +[inline-t.nest] diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-6.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-6.toml new file mode 100644 index 00000000..462c28f1 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-6.toml @@ -0,0 +1 @@ +a = { b = 1, b.c = 2 } diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-7.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-7.toml new file mode 100644 index 00000000..34ddb85e --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-7.toml @@ -0,0 +1 @@ +tab = { inner.table = [{}], inner.table.val = "bad" } \ No newline at end of file diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-8.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-8.toml new file mode 100644 index 00000000..750853f0 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-8.toml @@ -0,0 +1 @@ +tab = { inner = { dog = "best" }, inner.cat = "worst" } \ No newline at end of file diff --git a/internal/toml-test/tests/invalid/inline-table/overwrite-9.toml b/internal/toml-test/tests/invalid/inline-table/overwrite-9.toml new file mode 100644 index 00000000..6e87cfa4 --- /dev/null +++ b/internal/toml-test/tests/invalid/inline-table/overwrite-9.toml @@ -0,0 +1,5 @@ +[tab.nested] +inline-t = { nest = {} } + +[tab] +nested.inline-t.nest = 2 diff --git a/internal/toml-test/tests/invalid/integer/integer.multi b/internal/toml-test/tests/invalid/integer/integer.multi index 40ac4093..cbfaeca8 100644 --- a/internal/toml-test/tests/invalid/integer/integer.multi +++ b/internal/toml-test/tests/invalid/integer/integer.multi @@ -10,11 +10,11 @@ double-sign-nex = --99 negative-hex = -0xff negative-bin = -0b11010110 -negative-oct = -0o99 +negative-oct = -0o755 positive-hex = +0xff positive-bin = +0b11010110 -positive-oct = +0o99 +positive-oct = +0o755 trailing-us = 123_ leading-us = _123 @@ -28,11 +28,12 @@ trailing-us-hex = 0x1_ trailing-us-oct = 0o1_ trailing-us-bin = 0b1_ -leading-us-hex = _0o1 +leading-us-hex = _0x1 leading-us-oct = _0o1 -leading-us-bin = _0o1 +leading-us-bin = _0b1 -invalid-hex = 0xaafz +invalid-hex-1 = 0xaafz +invalid-hex-2 = 0xgabba00f1 invalid-oct = 0o778 invalid-bin = 0b0012 diff --git a/internal/toml-test/tests/invalid/integer/invalid-hex-1.toml b/internal/toml-test/tests/invalid/integer/invalid-hex-1.toml new file mode 100644 index 00000000..9b6c7013 --- /dev/null +++ b/internal/toml-test/tests/invalid/integer/invalid-hex-1.toml @@ -0,0 +1 @@ +invalid-hex-1 = 0xaafz diff --git a/internal/toml-test/tests/invalid/integer/invalid-hex-2.toml b/internal/toml-test/tests/invalid/integer/invalid-hex-2.toml new file mode 100644 index 00000000..f0079aa0 --- /dev/null +++ b/internal/toml-test/tests/invalid/integer/invalid-hex-2.toml @@ -0,0 +1 @@ +invalid-hex-2 = 0xgabba00f1 diff --git a/internal/toml-test/tests/invalid/integer/leading-us-bin.toml b/internal/toml-test/tests/invalid/integer/leading-us-bin.toml index 8885c031..638fd79e 100644 --- a/internal/toml-test/tests/invalid/integer/leading-us-bin.toml +++ b/internal/toml-test/tests/invalid/integer/leading-us-bin.toml @@ -1 +1 @@ -leading-us-bin = _0o1 +leading-us-bin = _0b1 diff --git a/internal/toml-test/tests/invalid/integer/leading-us-hex.toml b/internal/toml-test/tests/invalid/integer/leading-us-hex.toml index 9f193f80..ebfabb13 100644 --- a/internal/toml-test/tests/invalid/integer/leading-us-hex.toml +++ b/internal/toml-test/tests/invalid/integer/leading-us-hex.toml @@ -1 +1 @@ -leading-us-hex = _0o1 +leading-us-hex = _0x1 diff --git a/internal/toml-test/tests/invalid/integer/negative-oct.toml b/internal/toml-test/tests/invalid/integer/negative-oct.toml index b0c5ab0d..d828a43e 100644 --- a/internal/toml-test/tests/invalid/integer/negative-oct.toml +++ b/internal/toml-test/tests/invalid/integer/negative-oct.toml @@ -1 +1 @@ -negative-oct = -0o99 +negative-oct = -0o755 diff --git a/internal/toml-test/tests/invalid/integer/positive-oct.toml b/internal/toml-test/tests/invalid/integer/positive-oct.toml index d77aa521..8b962f41 100644 --- a/internal/toml-test/tests/invalid/integer/positive-oct.toml +++ b/internal/toml-test/tests/invalid/integer/positive-oct.toml @@ -1 +1 @@ -positive-oct = +0o99 +positive-oct = +0o755 diff --git a/internal/toml-test/tests/invalid/key/dotted-redefine-table-1.toml b/internal/toml-test/tests/invalid/key/dotted-redefine-table-1.toml new file mode 100644 index 00000000..9be1c56a --- /dev/null +++ b/internal/toml-test/tests/invalid/key/dotted-redefine-table-1.toml @@ -0,0 +1,2 @@ +a = false +a.b = true diff --git a/internal/toml-test/tests/invalid/key/dotted-redefine-table.toml b/internal/toml-test/tests/invalid/key/dotted-redefine-table-2.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/dotted-redefine-table.toml rename to internal/toml-test/tests/invalid/key/dotted-redefine-table-2.toml diff --git a/internal/toml-test/tests/invalid/key/duplicate.toml b/internal/toml-test/tests/invalid/key/duplicate-keys-1.toml similarity index 63% rename from internal/toml-test/tests/invalid/key/duplicate.toml rename to internal/toml-test/tests/invalid/key/duplicate-keys-1.toml index 7847bd40..36ee311c 100644 --- a/internal/toml-test/tests/invalid/key/duplicate.toml +++ b/internal/toml-test/tests/invalid/key/duplicate-keys-1.toml @@ -1,3 +1,2 @@ -# DO NOT DO THIS name = "Tom" name = "Pradyun" diff --git a/internal/toml-test/tests/invalid/key/duplicate-keys.toml b/internal/toml-test/tests/invalid/key/duplicate-keys-2.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/duplicate-keys.toml rename to internal/toml-test/tests/invalid/key/duplicate-keys-2.toml diff --git a/internal/toml-test/tests/invalid/key/duplicate-keys-3.toml b/internal/toml-test/tests/invalid/key/duplicate-keys-3.toml new file mode 100644 index 00000000..05c0860d --- /dev/null +++ b/internal/toml-test/tests/invalid/key/duplicate-keys-3.toml @@ -0,0 +1,2 @@ +spelling = "favorite" +"spelling" = "favourite" diff --git a/internal/toml-test/tests/invalid/key/duplicate-keys-4.toml b/internal/toml-test/tests/invalid/key/duplicate-keys-4.toml new file mode 100644 index 00000000..886ee819 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/duplicate-keys-4.toml @@ -0,0 +1,2 @@ +spelling = "favorite" +'spelling' = "favourite" diff --git a/internal/toml-test/tests/invalid/key/end-in-escape.toml b/internal/toml-test/tests/invalid/key/end-in-escape.toml new file mode 100644 index 00000000..3eb1a33b --- /dev/null +++ b/internal/toml-test/tests/invalid/key/end-in-escape.toml @@ -0,0 +1 @@ +"backslash is the last char\ diff --git a/internal/toml-test/tests/invalid/key/newline-1.toml b/internal/toml-test/tests/invalid/key/newline-1.toml new file mode 100644 index 00000000..b3f335c1 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/newline-1.toml @@ -0,0 +1,2 @@ +barekey + = 1 diff --git a/internal/toml-test/tests/invalid/key/newline-2.toml b/internal/toml-test/tests/invalid/key/newline-2.toml new file mode 100644 index 00000000..95abce59 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/newline-2.toml @@ -0,0 +1,2 @@ +"quoted +key" = 1 diff --git a/internal/toml-test/tests/invalid/key/newline-3.toml b/internal/toml-test/tests/invalid/key/newline-3.toml new file mode 100644 index 00000000..c90cc3a7 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/newline-3.toml @@ -0,0 +1,2 @@ +'quoted +key' = 1 diff --git a/internal/toml-test/tests/invalid/key/multiline.toml b/internal/toml-test/tests/invalid/key/newline-4.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/multiline.toml rename to internal/toml-test/tests/invalid/key/newline-4.toml diff --git a/internal/toml-test/tests/invalid/key/newline-5.toml b/internal/toml-test/tests/invalid/key/newline-5.toml new file mode 100644 index 00000000..3cf9ef18 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/newline-5.toml @@ -0,0 +1,2 @@ +'''long +key''' = 1 diff --git a/internal/toml-test/tests/invalid/key/newline.toml b/internal/toml-test/tests/invalid/key/newline.toml deleted file mode 100644 index 24acaa1b..00000000 --- a/internal/toml-test/tests/invalid/key/newline.toml +++ /dev/null @@ -1,2 +0,0 @@ -barekey - = 123 diff --git a/internal/toml-test/tests/invalid/key/two-equals.toml b/internal/toml-test/tests/invalid/key/two-equals-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/two-equals.toml rename to internal/toml-test/tests/invalid/key/two-equals-1.toml diff --git a/internal/toml-test/tests/invalid/key/two-equals2.toml b/internal/toml-test/tests/invalid/key/two-equals-2.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/two-equals2.toml rename to internal/toml-test/tests/invalid/key/two-equals-2.toml diff --git a/internal/toml-test/tests/invalid/key/two-equals3.toml b/internal/toml-test/tests/invalid/key/two-equals-3.toml similarity index 100% rename from internal/toml-test/tests/invalid/key/two-equals3.toml rename to internal/toml-test/tests/invalid/key/two-equals-3.toml diff --git a/internal/toml-test/tests/invalid/key/without-value-5.toml b/internal/toml-test/tests/invalid/key/without-value-5.toml new file mode 100644 index 00000000..c3261d5e --- /dev/null +++ b/internal/toml-test/tests/invalid/key/without-value-5.toml @@ -0,0 +1 @@ +fs.fw diff --git a/internal/toml-test/tests/invalid/key/without-value-6.toml b/internal/toml-test/tests/invalid/key/without-value-6.toml new file mode 100644 index 00000000..090b43a7 --- /dev/null +++ b/internal/toml-test/tests/invalid/key/without-value-6.toml @@ -0,0 +1 @@ +fs.fw = diff --git a/internal/toml-test/tests/invalid/key/without-value-7.toml b/internal/toml-test/tests/invalid/key/without-value-7.toml new file mode 100644 index 00000000..f298c44a --- /dev/null +++ b/internal/toml-test/tests/invalid/key/without-value-7.toml @@ -0,0 +1 @@ +fs. diff --git a/internal/toml-test/tests/invalid/local-date/feb-29.toml b/internal/toml-test/tests/invalid/local-date/feb-29.toml new file mode 100644 index 00000000..c68ee231 --- /dev/null +++ b/internal/toml-test/tests/invalid/local-date/feb-29.toml @@ -0,0 +1 @@ +"not a leap year" = 2100-02-29 diff --git a/internal/toml-test/tests/invalid/local-date/feb-30.toml b/internal/toml-test/tests/invalid/local-date/feb-30.toml new file mode 100644 index 00000000..bde82c41 --- /dev/null +++ b/internal/toml-test/tests/invalid/local-date/feb-30.toml @@ -0,0 +1,2 @@ +"only 28 or 29 days in february" = 1988-02-30 + diff --git a/internal/toml-test/tests/invalid/local-date/y10k.toml b/internal/toml-test/tests/invalid/local-date/y10k.toml new file mode 100644 index 00000000..6931d56b --- /dev/null +++ b/internal/toml-test/tests/invalid/local-date/y10k.toml @@ -0,0 +1,2 @@ +# Maximum RFC3399 year is 9999. +d = 10000-01-01 diff --git a/internal/toml-test/tests/invalid/local-datetime/feb-29.toml b/internal/toml-test/tests/invalid/local-datetime/feb-29.toml new file mode 100644 index 00000000..a8a70aa1 --- /dev/null +++ b/internal/toml-test/tests/invalid/local-datetime/feb-29.toml @@ -0,0 +1 @@ +"not a leap year" = 2100-02-29T15:15:15 diff --git a/internal/toml-test/tests/invalid/local-datetime/feb-30.toml b/internal/toml-test/tests/invalid/local-datetime/feb-30.toml new file mode 100644 index 00000000..ceec30a6 --- /dev/null +++ b/internal/toml-test/tests/invalid/local-datetime/feb-30.toml @@ -0,0 +1,2 @@ +"only 28 or 29 days in february" = 1988-02-30T15:15:15 + diff --git a/internal/toml-test/tests/invalid/local-datetime/y10k.toml b/internal/toml-test/tests/invalid/local-datetime/y10k.toml new file mode 100644 index 00000000..e1543892 --- /dev/null +++ b/internal/toml-test/tests/invalid/local-datetime/y10k.toml @@ -0,0 +1,2 @@ +# Maximum RFC3399 year is 9999. +d = 10000-01-01 00:00:00 diff --git a/internal/toml-test/tests/invalid/string/bad-codepoint.toml b/internal/toml-test/tests/invalid/string/bad-codepoint.toml deleted file mode 100644 index 592db75b..00000000 --- a/internal/toml-test/tests/invalid/string/bad-codepoint.toml +++ /dev/null @@ -1 +0,0 @@ -invalid-codepoint = "This string contains a non scalar unicode codepoint \uD801" diff --git a/internal/toml-test/tests/invalid/string/bad-escape-3.toml b/internal/toml-test/tests/invalid/string/bad-escape-3.toml new file mode 100644 index 00000000..e3ee41b0 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/bad-escape-3.toml @@ -0,0 +1 @@ +backslash = "\" diff --git a/internal/toml-test/tests/invalid/string/bad-hex-esc.multi b/internal/toml-test/tests/invalid/string/bad-hex-esc.multi deleted file mode 100644 index 5216ce00..00000000 --- a/internal/toml-test/tests/invalid/string/bad-hex-esc.multi +++ /dev/null @@ -1,4 +0,0 @@ -bad-hex-esc-1 = "\x0g" -bad-hex-esc-2 = "\xG0" -bad-hex-esc-3 = "\x" -bad-hex-esc-4 = "\x 50" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-1.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-1.toml index 9eae4ab9..36de1d1e 100644 --- a/internal/toml-test/tests/invalid/string/bad-uni-esc-1.toml +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-1.toml @@ -1 +1 @@ -str = "val\ue" +bad-uni-esc-1 = "val\ue" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-2.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-2.toml index dce8b089..0c5a6e34 100644 --- a/internal/toml-test/tests/invalid/string/bad-uni-esc-2.toml +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-2.toml @@ -1 +1 @@ -str = "val\Ux" +bad-uni-esc-2 = "val\Ux" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-3.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-3.toml index 95ea0982..1909da7a 100644 --- a/internal/toml-test/tests/invalid/string/bad-uni-esc-3.toml +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-3.toml @@ -1,2 +1 @@ -str = "val\U0000000" - +bad-uni-esc-3 = "val\U0000000" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-4.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-4.toml index b90d0fb3..68f0942b 100644 --- a/internal/toml-test/tests/invalid/string/bad-uni-esc-4.toml +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-4.toml @@ -1 +1 @@ -str = "val\U0000" +bad-uni-esc-4 = "val\U0000" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-5.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-5.toml index 448d3c6d..be5322ba 100644 --- a/internal/toml-test/tests/invalid/string/bad-uni-esc-5.toml +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-5.toml @@ -1 +1 @@ -str = "val\Ugggggggg" +bad-uni-esc-5 = "val\Ugggggggg" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-6.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-6.toml new file mode 100644 index 00000000..aa67c4b8 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-6.toml @@ -0,0 +1 @@ +bad-uni-esc-6 = "This string contains a non scalar unicode codepoint \uD801" diff --git a/internal/toml-test/tests/invalid/string/bad-uni-esc-7.toml b/internal/toml-test/tests/invalid/string/bad-uni-esc-7.toml new file mode 100644 index 00000000..bda89b37 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/bad-uni-esc-7.toml @@ -0,0 +1 @@ +bad-uni-esc-7 = "\uabag" diff --git a/internal/toml-test/tests/invalid/string/multiline-bad-escape-4.toml b/internal/toml-test/tests/invalid/string/multiline-bad-escape-4.toml new file mode 100644 index 00000000..c23fdb27 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-bad-escape-4.toml @@ -0,0 +1 @@ +backslash = """\""" diff --git a/internal/toml-test/tests/invalid/string/multiline-escape-space.toml b/internal/toml-test/tests/invalid/string/multiline-escape-space-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/string/multiline-escape-space.toml rename to internal/toml-test/tests/invalid/string/multiline-escape-space-1.toml diff --git a/internal/toml-test/tests/invalid/string/multiline-escape-space-2.toml b/internal/toml-test/tests/invalid/string/multiline-escape-space-2.toml new file mode 100644 index 00000000..92b22b06 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-escape-space-2.toml @@ -0,0 +1,4 @@ +bee = """ +hee \ + +gee \ """ diff --git a/internal/toml-test/tests/invalid/string/multiline-lit-no-close-1.toml b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-1.toml new file mode 100644 index 00000000..c2a8464b --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-1.toml @@ -0,0 +1,2 @@ +invalid = ''' + this will fail diff --git a/internal/toml-test/tests/invalid/string/multiline-lit-no-close-2.toml b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-2.toml new file mode 100644 index 00000000..499efb68 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-2.toml @@ -0,0 +1 @@ +x=''' diff --git a/internal/toml-test/tests/invalid/string/multiline-lit-no-close-3.toml b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-3.toml new file mode 100644 index 00000000..848f08bc --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-3.toml @@ -0,0 +1,4 @@ +not-closed= ''' +diibaa +blibae ete +eteta diff --git a/internal/toml-test/tests/invalid/string/multiline-lit-no-close-4.toml b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-4.toml new file mode 100644 index 00000000..10e17783 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-lit-no-close-4.toml @@ -0,0 +1,3 @@ +bee = ''' +hee +gee '' diff --git a/internal/toml-test/tests/invalid/string/multiline-no-close.toml b/internal/toml-test/tests/invalid/string/multiline-no-close-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/string/multiline-no-close.toml rename to internal/toml-test/tests/invalid/string/multiline-no-close-1.toml diff --git a/internal/toml-test/tests/invalid/string/multiline-no-close-3.toml b/internal/toml-test/tests/invalid/string/multiline-no-close-3.toml new file mode 100644 index 00000000..401adec2 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-no-close-3.toml @@ -0,0 +1,4 @@ +not-closed= """ +diibaa +blibae ete +eteta diff --git a/internal/toml-test/tests/invalid/string/multiline-no-close-4.toml b/internal/toml-test/tests/invalid/string/multiline-no-close-4.toml new file mode 100644 index 00000000..cc613cf8 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-no-close-4.toml @@ -0,0 +1,3 @@ +bee = """ +hee +gee "" diff --git a/internal/toml-test/tests/invalid/string/multiline-no-close-5.toml b/internal/toml-test/tests/invalid/string/multiline-no-close-5.toml new file mode 100644 index 00000000..00da5444 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/multiline-no-close-5.toml @@ -0,0 +1,3 @@ +bee = """ +hee +gee\ diff --git a/internal/toml-test/tests/invalid/string/no-close.toml b/internal/toml-test/tests/invalid/string/no-close-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/string/no-close.toml rename to internal/toml-test/tests/invalid/string/no-close-1.toml diff --git a/internal/toml-test/tests/invalid/string/no-close-2.toml b/internal/toml-test/tests/invalid/string/no-close-2.toml new file mode 100644 index 00000000..4cce5348 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/no-close-2.toml @@ -0,0 +1 @@ +"a-string".must-be = "closed diff --git a/internal/toml-test/tests/invalid/string/no-close-3.toml b/internal/toml-test/tests/invalid/string/no-close-3.toml new file mode 100644 index 00000000..a118c17c --- /dev/null +++ b/internal/toml-test/tests/invalid/string/no-close-3.toml @@ -0,0 +1 @@ +no-ending-quote = 'One time, at band camp diff --git a/internal/toml-test/tests/invalid/string/no-close-4.toml b/internal/toml-test/tests/invalid/string/no-close-4.toml new file mode 100644 index 00000000..a689b67d --- /dev/null +++ b/internal/toml-test/tests/invalid/string/no-close-4.toml @@ -0,0 +1 @@ +'a-string'.must-be = 'closed diff --git a/internal/toml-test/tests/invalid/string/string.multi b/internal/toml-test/tests/invalid/string/string.multi new file mode 100644 index 00000000..c4c763b5 --- /dev/null +++ b/internal/toml-test/tests/invalid/string/string.multi @@ -0,0 +1,12 @@ +bad-hex-esc-1 = "\x0g" +bad-hex-esc-2 = "\xG0" +bad-hex-esc-3 = "\x" +bad-hex-esc-4 = "\x 50" + +bad-uni-esc-1 = "val\ue" +bad-uni-esc-2 = "val\Ux" +bad-uni-esc-3 = "val\U0000000" +bad-uni-esc-4 = "val\U0000" +bad-uni-esc-5 = "val\Ugggggggg" +bad-uni-esc-6 = "This string contains a non scalar unicode codepoint \uD801" +bad-uni-esc-7 = "\uabag" diff --git a/internal/toml-test/tests/invalid/table/array-missing-bracket.toml b/internal/toml-test/tests/invalid/table/array-no-close-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/table/array-missing-bracket.toml rename to internal/toml-test/tests/invalid/table/array-no-close-1.toml diff --git a/internal/toml-test/tests/invalid/table/array-no-close-2.toml b/internal/toml-test/tests/invalid/table/array-no-close-2.toml new file mode 100644 index 00000000..ae1d0d9c --- /dev/null +++ b/internal/toml-test/tests/invalid/table/array-no-close-2.toml @@ -0,0 +1,2 @@ +[[closing-bracket.missing] +blaa=2 diff --git a/internal/toml-test/tests/invalid/table/no-close-1.toml b/internal/toml-test/tests/invalid/table/no-close-1.toml new file mode 100644 index 00000000..52a6acc8 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/no-close-1.toml @@ -0,0 +1,3 @@ +[where will it end +name = value + diff --git a/internal/toml-test/tests/invalid/table/no-close-2.toml b/internal/toml-test/tests/invalid/table/no-close-2.toml new file mode 100644 index 00000000..354d0167 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/no-close-2.toml @@ -0,0 +1,2 @@ +[closing-bracket.missingö +blaa=2 diff --git a/internal/toml-test/tests/invalid/table/quoted-no-close.toml b/internal/toml-test/tests/invalid/table/no-close-3.toml similarity index 97% rename from internal/toml-test/tests/invalid/table/quoted-no-close.toml rename to internal/toml-test/tests/invalid/table/no-close-3.toml index 6e7c1a1e..4b0a0e45 100644 --- a/internal/toml-test/tests/invalid/table/quoted-no-close.toml +++ b/internal/toml-test/tests/invalid/table/no-close-3.toml @@ -1,2 +1,3 @@ ["where will it end] name = value + diff --git a/internal/toml-test/tests/invalid/table/no-close-4.toml b/internal/toml-test/tests/invalid/table/no-close-4.toml new file mode 100644 index 00000000..558ed37d --- /dev/null +++ b/internal/toml-test/tests/invalid/table/no-close-4.toml @@ -0,0 +1 @@ +[ diff --git a/internal/toml-test/tests/invalid/table/no-close-5.toml b/internal/toml-test/tests/invalid/table/no-close-5.toml new file mode 100644 index 00000000..e16460f3 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/no-close-5.toml @@ -0,0 +1 @@ +[fwfw.wafw diff --git a/internal/toml-test/tests/invalid/table/overwrite-array-in-parent.toml b/internal/toml-test/tests/invalid/table/overwrite-array-in-parent.toml new file mode 100644 index 00000000..f867c28d --- /dev/null +++ b/internal/toml-test/tests/invalid/table/overwrite-array-in-parent.toml @@ -0,0 +1,4 @@ +[[parent-table.arr]] +[parent-table] +not-arr = 1 +arr = 2 diff --git a/internal/toml-test/tests/invalid/table/overwrite-bool-with-array.toml b/internal/toml-test/tests/invalid/table/overwrite-bool-with-array.toml new file mode 100644 index 00000000..69b26ed2 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/overwrite-bool-with-array.toml @@ -0,0 +1,2 @@ +a=true +[[a]] diff --git a/internal/toml-test/tests/invalid/table/overwrite-with-deep-table.toml b/internal/toml-test/tests/invalid/table/overwrite-with-deep-table.toml new file mode 100644 index 00000000..103d928b --- /dev/null +++ b/internal/toml-test/tests/invalid/table/overwrite-with-deep-table.toml @@ -0,0 +1,2 @@ +a=1 +[a.b.c.d] diff --git a/internal/toml-test/tests/invalid/table/redefine.toml b/internal/toml-test/tests/invalid/table/redefine-1.toml similarity index 100% rename from internal/toml-test/tests/invalid/table/redefine.toml rename to internal/toml-test/tests/invalid/table/redefine-1.toml diff --git a/internal/toml-test/tests/invalid/table/redefine-2.toml b/internal/toml-test/tests/invalid/table/redefine-2.toml new file mode 100644 index 00000000..d2c66eb3 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/redefine-2.toml @@ -0,0 +1,3 @@ +[t1] +t2.t3.v = 0 +[t1.t2] diff --git a/internal/toml-test/tests/invalid/table/redefine-3.toml b/internal/toml-test/tests/invalid/table/redefine-3.toml new file mode 100644 index 00000000..918017f8 --- /dev/null +++ b/internal/toml-test/tests/invalid/table/redefine-3.toml @@ -0,0 +1,3 @@ +[t1] +t2.t3.v = 0 +[t1.t2.t3] diff --git a/internal/toml-test/tests/invalid/table/super-twice.toml b/internal/toml-test/tests/invalid/table/super-twice.toml new file mode 100644 index 00000000..5dee724d --- /dev/null +++ b/internal/toml-test/tests/invalid/table/super-twice.toml @@ -0,0 +1,3 @@ +[a.b] +[a] +[a] diff --git a/internal/toml-test/tests/valid/array/array-subtables.json b/internal/toml-test/tests/valid/array/array-subtables.json new file mode 100644 index 00000000..b5d2e887 --- /dev/null +++ b/internal/toml-test/tests/valid/array/array-subtables.json @@ -0,0 +1,20 @@ +{ + "arr": [ + { + "subtab": { + "val": { + "type": "integer", + "value": "1" + } + } + }, + { + "subtab": { + "val": { + "type": "integer", + "value": "2" + } + } + } + ] +} diff --git a/internal/toml-test/tests/valid/array/array-subtables.toml b/internal/toml-test/tests/valid/array/array-subtables.toml new file mode 100644 index 00000000..70753078 --- /dev/null +++ b/internal/toml-test/tests/valid/array/array-subtables.toml @@ -0,0 +1,7 @@ +[[arr]] +[arr.subtab] +val=1 + +[[arr]] +[arr.subtab] +val=2 diff --git a/internal/toml-test/tests/valid/array/open-parent-table.json b/internal/toml-test/tests/valid/array/open-parent-table.json new file mode 100644 index 00000000..73700c6e --- /dev/null +++ b/internal/toml-test/tests/valid/array/open-parent-table.json @@ -0,0 +1,12 @@ +{ + "parent-table": { + "arr": [ + {}, + {} + ], + "not-arr": { + "type": "integer", + "value": "1" + } + } +} diff --git a/internal/toml-test/tests/valid/array/open-parent-table.toml b/internal/toml-test/tests/valid/array/open-parent-table.toml new file mode 100644 index 00000000..8eaad12f --- /dev/null +++ b/internal/toml-test/tests/valid/array/open-parent-table.toml @@ -0,0 +1,4 @@ +[[parent-table.arr]] +[[parent-table.arr]] +[parent-table] +not-arr = 1 diff --git a/internal/toml-test/tests/valid/array/trailing-comma.json b/internal/toml-test/tests/valid/array/trailing-comma.json new file mode 100644 index 00000000..2fd6f7e1 --- /dev/null +++ b/internal/toml-test/tests/valid/array/trailing-comma.json @@ -0,0 +1,34 @@ +{ + "arr-1": [ + { + "type": "integer", + "value": "1" + } + ], + "arr-2": [ + { + "type": "integer", + "value": "2" + }, + { + "type": "integer", + "value": "3" + } + ], + "arr-3": [ + { + "type": "integer", + "value": "4" + } + ], + "arr-4": [ + { + "type": "integer", + "value": "5" + }, + { + "type": "integer", + "value": "6" + } + ] +} diff --git a/internal/toml-test/tests/valid/array/trailing-comma.toml b/internal/toml-test/tests/valid/array/trailing-comma.toml new file mode 100644 index 00000000..26d17ee1 --- /dev/null +++ b/internal/toml-test/tests/valid/array/trailing-comma.toml @@ -0,0 +1,11 @@ +arr-1 = [1,] + +arr-2 = [2,3,] + +arr-3 = [4, +] + +arr-4 = [ + 5, + 6, +] diff --git a/internal/toml-test/tests/valid/comment/after-literal-no-ws.json b/internal/toml-test/tests/valid/comment/after-literal-no-ws.json new file mode 100644 index 00000000..8a68af00 --- /dev/null +++ b/internal/toml-test/tests/valid/comment/after-literal-no-ws.json @@ -0,0 +1,18 @@ +{ + "false": { + "type": "bool", + "value": "false" + }, + "inf": { + "type": "float", + "value": "inf" + }, + "nan": { + "type": "float", + "value": "nan" + }, + "true": { + "type": "bool", + "value": "true" + } +} diff --git a/internal/toml-test/tests/valid/comment/after-literal-no-ws.toml b/internal/toml-test/tests/valid/comment/after-literal-no-ws.toml new file mode 100644 index 00000000..41287a54 --- /dev/null +++ b/internal/toml-test/tests/valid/comment/after-literal-no-ws.toml @@ -0,0 +1,4 @@ +inf=inf#infinity +nan=nan#not a number +true=true#true +false=false#false diff --git a/internal/toml-test/tests/valid/comment/everywhere.json b/internal/toml-test/tests/valid/comment/everywhere.json index 6e714d1c..029a6795 100644 --- a/internal/toml-test/tests/valid/comment/everywhere.json +++ b/internal/toml-test/tests/valid/comment/everywhere.json @@ -4,14 +4,14 @@ "type": "integer", "value": "42" }, - "dt": { - "type": "datetime", - "value": "1979-05-27T07:32:12-07:00" - }, "d": { "type": "date-local", "value": "1979-05-27" }, + "dt": { + "type": "datetime", + "value": "1979-05-27T07:32:12-07:00" + }, "more": [ { "type": "integer", diff --git a/internal/toml-test/tests/valid/datetime/edge.json b/internal/toml-test/tests/valid/datetime/edge.json new file mode 100644 index 00000000..46170bb2 --- /dev/null +++ b/internal/toml-test/tests/valid/datetime/edge.json @@ -0,0 +1,26 @@ +{ + "first-date": { + "type": "date-local", + "value": "0001-01-01" + }, + "first-local": { + "type": "datetime-local", + "value": "0001-01-01T00:00:00" + }, + "first-offset": { + "type": "datetime", + "value": "0001-01-01T00:00:00Z" + }, + "last-date": { + "type": "date-local", + "value": "9999-12-31" + }, + "last-local": { + "type": "datetime-local", + "value": "9999-12-31T23:59:59" + }, + "last-offset": { + "type": "datetime", + "value": "9999-12-31T23:59:59Z" + } +} diff --git a/internal/toml-test/tests/valid/datetime/edge.toml b/internal/toml-test/tests/valid/datetime/edge.toml new file mode 100644 index 00000000..81625e7c --- /dev/null +++ b/internal/toml-test/tests/valid/datetime/edge.toml @@ -0,0 +1,7 @@ +first-offset = 0001-01-01 00:00:00Z +first-local = 0001-01-01 00:00:00 +first-date = 0001-01-01 + +last-offset = 9999-12-31 23:59:59Z +last-local = 9999-12-31 23:59:59 +last-date = 9999-12-31 diff --git a/internal/toml-test/tests/valid/datetime/leap-year.json b/internal/toml-test/tests/valid/datetime/leap-year.json new file mode 100644 index 00000000..9e1797c3 --- /dev/null +++ b/internal/toml-test/tests/valid/datetime/leap-year.json @@ -0,0 +1,26 @@ +{ + "2000-date": { + "type": "date-local", + "value": "2000-02-29" + }, + "2000-datetime": { + "type": "datetime", + "value": "2000-02-29T15:15:15Z" + }, + "2000-datetime-local": { + "type": "datetime-local", + "value": "2000-02-29T15:15:15" + }, + "2024-date": { + "type": "date-local", + "value": "2024-02-29" + }, + "2024-datetime": { + "type": "datetime", + "value": "2024-02-29T15:15:15Z" + }, + "2024-datetime-local": { + "type": "datetime-local", + "value": "2024-02-29T15:15:15" + } +} diff --git a/internal/toml-test/tests/valid/datetime/leap-year.toml b/internal/toml-test/tests/valid/datetime/leap-year.toml new file mode 100644 index 00000000..25c02e73 --- /dev/null +++ b/internal/toml-test/tests/valid/datetime/leap-year.toml @@ -0,0 +1,7 @@ +2000-datetime = 2000-02-29 15:15:15Z +2000-datetime-local = 2000-02-29 15:15:15 +2000-date = 2000-02-29 + +2024-datetime = 2024-02-29 15:15:15Z +2024-datetime-local = 2024-02-29 15:15:15 +2024-date = 2024-02-29 diff --git a/internal/toml-test/tests/valid/float/zero.json b/internal/toml-test/tests/valid/float/zero.json index 99fba0be..5edfb15c 100644 --- a/internal/toml-test/tests/valid/float/zero.json +++ b/internal/toml-test/tests/valid/float/zero.json @@ -1,17 +1,13 @@ { - "zero": { - "type": "float", - "value": "0" - }, - "signed-pos": { + "exponent": { "type": "float", "value": "0" }, - "signed-neg": { + "exponent-signed-neg": { "type": "float", "value": "-0" }, - "exponent": { + "exponent-signed-pos": { "type": "float", "value": "0" }, @@ -19,12 +15,16 @@ "type": "float", "value": "0" }, - "exponent-signed-pos": { + "signed-neg": { + "type": "float", + "value": "-0" + }, + "signed-pos": { "type": "float", "value": "0" }, - "exponent-signed-neg": { + "zero": { "type": "float", - "value": "-0" + "value": "0" } } diff --git a/internal/toml-test/tests/valid/inline-table/array-values.json b/internal/toml-test/tests/valid/inline-table/array-values.json new file mode 100644 index 00000000..eac1a5d8 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/array-values.json @@ -0,0 +1,27 @@ +{ + "a": { + "a": [] + }, + "b": { + "a": [ + { + "type": "integer", + "value": "1" + }, + { + "type": "integer", + "value": "2" + } + ], + "b": [ + { + "type": "integer", + "value": "3" + }, + { + "type": "integer", + "value": "4" + } + ] + } +} diff --git a/internal/toml-test/tests/valid/inline-table/array-values.toml b/internal/toml-test/tests/valid/inline-table/array-values.toml new file mode 100644 index 00000000..5ba59d2c --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/array-values.toml @@ -0,0 +1,13 @@ +# "No newlines are allowed between the curly braces unless they are valid within +# a value" + +a = { a = [ +]} + +b = { a = [ + 1, + 2, + ], b = [ + 3, + 4, + ]} diff --git a/internal/toml-test/tests/valid/inline-table/array.json b/internal/toml-test/tests/valid/inline-table/array.json index fe78bf6b..db99d7a6 100644 --- a/internal/toml-test/tests/valid/inline-table/array.json +++ b/internal/toml-test/tests/valid/inline-table/array.json @@ -1,4 +1,18 @@ { + "arr": [ + { + "a": { + "type": "integer", + "value": "1" + } + }, + { + "a": { + "type": "integer", + "value": "2" + } + } + ], "people": [ { "first_name": { diff --git a/internal/toml-test/tests/valid/inline-table/array.toml b/internal/toml-test/tests/valid/inline-table/array.toml index 3fa60d66..da22f56f 100644 --- a/internal/toml-test/tests/valid/inline-table/array.toml +++ b/internal/toml-test/tests/valid/inline-table/array.toml @@ -1,3 +1,5 @@ +arr = [ {'a'= 1}, {'a'= 2} ] + people = [{first_name = "Bruce", last_name = "Springsteen"}, {first_name = "Eric", last_name = "Clapton"}, {first_name = "Bob", last_name = "Seger"}] diff --git a/internal/toml-test/tests/valid/inline-table/empty.json b/internal/toml-test/tests/valid/inline-table/empty.json index 28beacf8..c97472f7 100644 --- a/internal/toml-test/tests/valid/inline-table/empty.json +++ b/internal/toml-test/tests/valid/inline-table/empty.json @@ -26,5 +26,6 @@ ], "nested_empty": { "empty": {} - } + }, + "with_cmt": {} } diff --git a/internal/toml-test/tests/valid/inline-table/empty.toml b/internal/toml-test/tests/valid/inline-table/empty.toml index 910d458f..918417e1 100644 --- a/internal/toml-test/tests/valid/inline-table/empty.toml +++ b/internal/toml-test/tests/valid/inline-table/empty.toml @@ -4,3 +4,4 @@ empty_in_array = [ { not_empty = 1 }, {} ] empty_in_array2 = [{},{not_empty=1}] many_empty = [{},{},{}] nested_empty = {"empty"={}} +with_cmt ={ }#nothing here diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-1.json b/internal/toml-test/tests/valid/inline-table/key-dotted-1.json new file mode 100644 index 00000000..c7af0fa6 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-1.json @@ -0,0 +1,42 @@ +{ + "a": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + }, + "b": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + }, + "c": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + }, + "d": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + }, + "e": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + } +} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-1.toml b/internal/toml-test/tests/valid/inline-table/key-dotted-1.toml new file mode 100644 index 00000000..e4fe1ac9 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-1.toml @@ -0,0 +1,5 @@ +a = { a.b = 1 } +b = { "a"."b" = 1 } +c = { a . b = 1 } +d = { 'a' . "b" = 1 } +e = {a.b=1} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-2.json b/internal/toml-test/tests/valid/inline-table/key-dotted-2.json new file mode 100644 index 00000000..6a3c6ed4 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-2.json @@ -0,0 +1,26 @@ +{ + "many": { + "dots": { + "here": { + "dot": { + "dot": { + "dot": { + "a": { + "b": { + "c": { + "type": "integer", + "value": "1" + }, + "d": { + "type": "integer", + "value": "2" + } + } + } + } + } + } + } + } + } +} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-2.toml b/internal/toml-test/tests/valid/inline-table/key-dotted-2.toml new file mode 100644 index 00000000..c248f4f9 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-2.toml @@ -0,0 +1 @@ +many.dots.here.dot.dot.dot = {a.b.c = 1, a.b.d = 2} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-3.json b/internal/toml-test/tests/valid/inline-table/key-dotted-3.json new file mode 100644 index 00000000..a989ab77 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-3.json @@ -0,0 +1,30 @@ +{ + "tbl": { + "a": { + "b": { + "c": { + "d": { + "e": { + "type": "integer", + "value": "1" + } + } + } + } + }, + "x": { + "a": { + "b": { + "c": { + "d": { + "e": { + "type": "integer", + "value": "1" + } + } + } + } + } + } + } +} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-3.toml b/internal/toml-test/tests/valid/inline-table/key-dotted-3.toml new file mode 100644 index 00000000..1b21ae44 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-3.toml @@ -0,0 +1,5 @@ +[tbl] +a.b.c = {d.e=1} + +[tbl.x] +a.b.c = {d.e=1} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-4.json b/internal/toml-test/tests/valid/inline-table/key-dotted-4.json new file mode 100644 index 00000000..07e56285 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-4.json @@ -0,0 +1,40 @@ +{ + "arr": [ + { + "T": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + }, + "t": { + "a": { + "b": { + "type": "integer", + "value": "1" + } + } + } + }, + { + "T": { + "a": { + "b": { + "type": "integer", + "value": "2" + } + } + }, + "t": { + "a": { + "b": { + "type": "integer", + "value": "2" + } + } + } + } + ] +} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted-4.toml b/internal/toml-test/tests/valid/inline-table/key-dotted-4.toml new file mode 100644 index 00000000..93d511d6 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/key-dotted-4.toml @@ -0,0 +1,7 @@ +[[arr]] +t = {a.b=1} +T = {a.b=1} + +[[arr]] +t = {a.b=2} +T = {a.b=2} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted.json b/internal/toml-test/tests/valid/inline-table/key-dotted.json deleted file mode 100644 index 38868032..00000000 --- a/internal/toml-test/tests/valid/inline-table/key-dotted.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "a": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "arr": [ - { - "T": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "t": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - } - }, - { - "T": { - "a": { - "b": { - "type": "integer", - "value": "2" - } - } - }, - "t": { - "a": { - "b": { - "type": "integer", - "value": "2" - } - } - } - } - ], - "b": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "c": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "d": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "e": { - "a": { - "b": { - "type": "integer", - "value": "1" - } - } - }, - "inline": { - "a": { - "b": { - "type": "integer", - "value": "42" - } - } - }, - "many": { - "dots": { - "here": { - "dot": { - "dot": { - "dot": { - "a": { - "b": { - "c": { - "type": "integer", - "value": "1" - }, - "d": { - "type": "integer", - "value": "2" - } - } - } - } - } - } - } - } - }, - "tbl": { - "a": { - "b": { - "c": { - "d": { - "e": { - "type": "integer", - "value": "1" - } - } - } - } - }, - "x": { - "a": { - "b": { - "c": { - "d": { - "e": { - "type": "integer", - "value": "1" - } - } - } - } - } - } - } -} diff --git a/internal/toml-test/tests/valid/inline-table/key-dotted.toml b/internal/toml-test/tests/valid/inline-table/key-dotted.toml deleted file mode 100644 index e812943a..00000000 --- a/internal/toml-test/tests/valid/inline-table/key-dotted.toml +++ /dev/null @@ -1,23 +0,0 @@ -inline = {a.b = 42} - -many.dots.here.dot.dot.dot = {a.b.c = 1, a.b.d = 2} - -a = { a.b = 1 } -b = { "a"."b" = 1 } -c = { a . b = 1 } -d = { 'a' . "b" = 1 } -e = {a.b=1} - -[tbl] -a.b.c = {d.e=1} - -[tbl.x] -a.b.c = {d.e=1} - -[[arr]] -t = {a.b=1} -T = {a.b=1} - -[[arr]] -t = {a.b=2} -T = {a.b=2} diff --git a/internal/toml-test/tests/valid/inline-table/spaces.json b/internal/toml-test/tests/valid/inline-table/spaces.json new file mode 100644 index 00000000..f3a7de19 --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/spaces.json @@ -0,0 +1,50 @@ +{ + "clap-1": { + "features": [ + { + "type": "string", + "value": "derive" + }, + { + "type": "string", + "value": "cargo" + } + ], + "version": { + "type": "string", + "value": "4" + } + }, + "clap-2": { + "features": [ + { + "type": "string", + "value": "derive" + }, + { + "type": "string", + "value": "cargo" + } + ], + "nest": { + "a": { + "type": "string", + "value": "x" + }, + "b": [ + { + "type": "float", + "value": "1.5" + }, + { + "type": "float", + "value": "9" + } + ] + }, + "version": { + "type": "string", + "value": "4" + } + } +} diff --git a/internal/toml-test/tests/valid/inline-table/spaces.toml b/internal/toml-test/tests/valid/inline-table/spaces.toml new file mode 100644 index 00000000..b8c93dcb --- /dev/null +++ b/internal/toml-test/tests/valid/inline-table/spaces.toml @@ -0,0 +1,5 @@ +# https://github.com/toml-lang/toml-test/issues/146 +clap-1 = { version = "4" , features = ["derive", "cargo"] } + +# Contains some literal tabs! +clap-2 = { version = "4" , features = [ "derive" , "cargo" ] , nest = { "a" = 'x' , 'b' = [ 1.5 , 9.0 ] } } diff --git a/internal/toml-test/tests/valid/key/dotted-1.json b/internal/toml-test/tests/valid/key/dotted-1.json new file mode 100644 index 00000000..d5720fdc --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-1.json @@ -0,0 +1,24 @@ +{ + "many": { + "dots": { + "dot": { + "dot": { + "dot": { + "type": "integer", + "value": "42" + } + } + } + } + }, + "name": { + "first": { + "type": "string", + "value": "Arthur" + }, + "last": { + "type": "string", + "value": "Dent" + } + } +} diff --git a/internal/toml-test/tests/valid/key/dotted-1.toml b/internal/toml-test/tests/valid/key/dotted-1.toml new file mode 100644 index 00000000..47567f85 --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-1.toml @@ -0,0 +1,4 @@ +name.first = "Arthur" +"name".'last' = "Dent" + +many.dots.dot.dot.dot = 42 diff --git a/internal/toml-test/tests/valid/key/dotted-2.json b/internal/toml-test/tests/valid/key/dotted-2.json new file mode 100644 index 00000000..aa6bdba5 --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-2.json @@ -0,0 +1,52 @@ +{ + "count": { + "a": { + "type": "integer", + "value": "1" + }, + "b": { + "type": "integer", + "value": "2" + }, + "c": { + "type": "integer", + "value": "3" + }, + "d": { + "type": "integer", + "value": "4" + }, + "e": { + "type": "integer", + "value": "5" + }, + "f": { + "type": "integer", + "value": "6" + }, + "g": { + "type": "integer", + "value": "7" + }, + "h": { + "type": "integer", + "value": "8" + }, + "i": { + "type": "integer", + "value": "9" + }, + "j": { + "type": "integer", + "value": "10" + }, + "k": { + "type": "integer", + "value": "11" + }, + "l": { + "type": "integer", + "value": "12" + } + } +} diff --git a/internal/toml-test/tests/valid/key/dotted.toml b/internal/toml-test/tests/valid/key/dotted-2.toml similarity index 60% rename from internal/toml-test/tests/valid/key/dotted.toml rename to internal/toml-test/tests/valid/key/dotted-2.toml index 52d62d72..1bdf17a0 100644 --- a/internal/toml-test/tests/valid/key/dotted.toml +++ b/internal/toml-test/tests/valid/key/dotted-2.toml @@ -1,10 +1,5 @@ # Note: this file contains literal tab characters. -name.first = "Arthur" -"name".'last' = "Dent" - -many.dots.here.dot.dot.dot = 42 - # Space are ignored, and key parts can be quoted. count.a = 1 count . b = 2 @@ -18,18 +13,3 @@ count.'i' = 9 count . 'j' = 10 "count".k = 11 "count" . l = 12 - -[tbl] -a.b.c = 42.666 - -[a.few.dots] -polka.dot = "again?" -polka.dance-with = "Dot" - -[[arr]] -a.b.c=1 -a.b.d=2 - -[[arr]] -a.b.c=3 -a.b.d=4 diff --git a/internal/toml-test/tests/valid/key/dotted-3.json b/internal/toml-test/tests/valid/key/dotted-3.json new file mode 100644 index 00000000..1c0ac090 --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-3.json @@ -0,0 +1,34 @@ +{ + "a": { + "few": { + "dots": { + "polka": { + "dance-with": { + "type": "string", + "value": "Dot" + }, + "dot": { + "type": "string", + "value": "again?" + } + } + } + } + }, + "tbl": { + "a": { + "b": { + "c": { + "type": "float", + "value": "42.666" + } + } + } + }, + "top": { + "key": { + "type": "integer", + "value": "1" + } + } +} diff --git a/internal/toml-test/tests/valid/key/dotted-3.toml b/internal/toml-test/tests/valid/key/dotted-3.toml new file mode 100644 index 00000000..52866268 --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-3.toml @@ -0,0 +1,9 @@ +top.key = 1 + +[tbl] +a.b.c = 42.666 + +[a.few.dots] +polka.dot = "again?" +polka.dance-with = "Dot" + diff --git a/internal/toml-test/tests/valid/key/dotted-4.json b/internal/toml-test/tests/valid/key/dotted-4.json new file mode 100644 index 00000000..ca997b2c --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-4.json @@ -0,0 +1,38 @@ +{ + "arr": [ + { + "a": { + "b": { + "c": { + "type": "integer", + "value": "1" + }, + "d": { + "type": "integer", + "value": "2" + } + } + } + }, + { + "a": { + "b": { + "c": { + "type": "integer", + "value": "3" + }, + "d": { + "type": "integer", + "value": "4" + } + } + } + } + ], + "top": { + "key": { + "type": "integer", + "value": "1" + } + } +} diff --git a/internal/toml-test/tests/valid/key/dotted-4.toml b/internal/toml-test/tests/valid/key/dotted-4.toml new file mode 100644 index 00000000..ecf581cc --- /dev/null +++ b/internal/toml-test/tests/valid/key/dotted-4.toml @@ -0,0 +1,10 @@ +top.key = 1 + +[[arr]] +a.b.c=1 +a.b.d=2 + +[[arr]] +a.b.c=3 +a.b.d=4 + diff --git a/internal/toml-test/tests/valid/key/dotted-empty.json b/internal/toml-test/tests/valid/key/dotted-empty.json index 4ca4b507..5694e6b4 100644 --- a/internal/toml-test/tests/valid/key/dotted-empty.json +++ b/internal/toml-test/tests/valid/key/dotted-empty.json @@ -5,12 +5,6 @@ "value": "empty.x" } }, - "x": { - "": { - "type": "string", - "value": "x.empty" - } - }, "a": { "": { "": { @@ -18,5 +12,11 @@ "value": "empty.empty" } } + }, + "x": { + "": { + "type": "string", + "value": "x.empty" + } } } diff --git a/internal/toml-test/tests/valid/key/dotted.json b/internal/toml-test/tests/valid/key/dotted.json deleted file mode 100644 index a527a72c..00000000 --- a/internal/toml-test/tests/valid/key/dotted.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "a": { - "few": { - "dots": { - "polka": { - "dance-with": { - "type": "string", - "value": "Dot" - }, - "dot": { - "type": "string", - "value": "again?" - } - } - } - } - }, - "arr": [ - { - "a": { - "b": { - "c": { - "type": "integer", - "value": "1" - }, - "d": { - "type": "integer", - "value": "2" - } - } - } - }, - { - "a": { - "b": { - "c": { - "type": "integer", - "value": "3" - }, - "d": { - "type": "integer", - "value": "4" - } - } - } - } - ], - "count": { - "a": { - "type": "integer", - "value": "1" - }, - "b": { - "type": "integer", - "value": "2" - }, - "c": { - "type": "integer", - "value": "3" - }, - "d": { - "type": "integer", - "value": "4" - }, - "e": { - "type": "integer", - "value": "5" - }, - "f": { - "type": "integer", - "value": "6" - }, - "g": { - "type": "integer", - "value": "7" - }, - "h": { - "type": "integer", - "value": "8" - }, - "i": { - "type": "integer", - "value": "9" - }, - "j": { - "type": "integer", - "value": "10" - }, - "k": { - "type": "integer", - "value": "11" - }, - "l": { - "type": "integer", - "value": "12" - } - }, - "many": { - "dots": { - "here": { - "dot": { - "dot": { - "dot": { - "type": "integer", - "value": "42" - } - } - } - } - } - }, - "name": { - "first": { - "type": "string", - "value": "Arthur" - }, - "last": { - "type": "string", - "value": "Dent" - } - }, - "tbl": { - "a": { - "b": { - "c": { - "type": "float", - "value": "42.666" - } - } - } - } -} diff --git a/internal/toml-test/tests/valid/key/empty.json b/internal/toml-test/tests/valid/key/empty-1.json similarity index 100% rename from internal/toml-test/tests/valid/key/empty.json rename to internal/toml-test/tests/valid/key/empty-1.json diff --git a/internal/toml-test/tests/valid/key/empty.toml b/internal/toml-test/tests/valid/key/empty-1.toml similarity index 100% rename from internal/toml-test/tests/valid/key/empty.toml rename to internal/toml-test/tests/valid/key/empty-1.toml diff --git a/internal/toml-test/tests/valid/key/empty-2.json b/internal/toml-test/tests/valid/key/empty-2.json new file mode 100644 index 00000000..44948a9e --- /dev/null +++ b/internal/toml-test/tests/valid/key/empty-2.json @@ -0,0 +1,6 @@ +{ + "": { + "type": "string", + "value": "blank" + } +} diff --git a/internal/toml-test/tests/valid/key/empty-2.toml b/internal/toml-test/tests/valid/key/empty-2.toml new file mode 100644 index 00000000..4b8c5cdc --- /dev/null +++ b/internal/toml-test/tests/valid/key/empty-2.toml @@ -0,0 +1 @@ +'' = "blank" diff --git a/internal/toml-test/tests/valid/key/empty-3.json b/internal/toml-test/tests/valid/key/empty-3.json new file mode 100644 index 00000000..5301f710 --- /dev/null +++ b/internal/toml-test/tests/valid/key/empty-3.json @@ -0,0 +1,6 @@ +{ + "": { + "type": "integer", + "value": "0" + } +} diff --git a/internal/toml-test/tests/valid/key/empty-3.toml b/internal/toml-test/tests/valid/key/empty-3.toml new file mode 100644 index 00000000..bb8815fd --- /dev/null +++ b/internal/toml-test/tests/valid/key/empty-3.toml @@ -0,0 +1 @@ +''=0 diff --git a/internal/toml-test/tests/valid/key/escapes.json b/internal/toml-test/tests/valid/key/escapes.json index e62b3a14..1349f295 100644 --- a/internal/toml-test/tests/valid/key/escapes.json +++ b/internal/toml-test/tests/valid/key/escapes.json @@ -1,4 +1,8 @@ { + "\u0008": { + "type": "string", + "value": "bell" + }, "\n": { "type": "string", "value": "newline" diff --git a/internal/toml-test/tests/valid/key/escapes.toml b/internal/toml-test/tests/valid/key/escapes.toml index aac3c0a5..9fd59314 100644 --- a/internal/toml-test/tests/valid/key/escapes.toml +++ b/internal/toml-test/tests/valid/key/escapes.toml @@ -1,4 +1,5 @@ "\n" = "newline" +"\b" = "bell" "\u00c0" = "latin capital letter A with grave" "\"" = "just a quote" diff --git a/internal/toml-test/tests/valid/key/quoted-unicode.json b/internal/toml-test/tests/valid/key/quoted-unicode.json index a51cc01f..04f0d3a5 100644 --- a/internal/toml-test/tests/valid/key/quoted-unicode.json +++ b/internal/toml-test/tests/valid/key/quoted-unicode.json @@ -3,20 +3,20 @@ "type": "string", "value": "null" }, + "\u0008 \u000c A  € ÿ ퟿  ￿ 𐀀 􏿿": { + "type": "string", + "value": "escaped key" + }, "\\u0000": { "type": "string", "value": "different key" }, - "\b \f A \u007f \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff": { + "l ~ € ÿ ퟿  ￿ 𐀀 􏿿": { "type": "string", - "value": "escaped key" + "value": "literal key" }, - "~ \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff": { + "~ € ÿ ퟿  ￿ 𐀀 􏿿": { "type": "string", "value": "basic key" - }, - "l ~ \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff": { - "type": "string", - "value": "literal key" } } diff --git a/internal/toml-test/tests/valid/key/start.json b/internal/toml-test/tests/valid/key/start.json new file mode 100644 index 00000000..76872f07 --- /dev/null +++ b/internal/toml-test/tests/valid/key/start.json @@ -0,0 +1,72 @@ +{ + "-": { + "-": { + "type": "integer", + "value": "4" + } + }, + "---": { + "---": { + "type": "integer", + "value": "7" + } + }, + "-key": { + "-key": { + "type": "integer", + "value": "1" + } + }, + "1": { + "1": { + "type": "integer", + "value": "6" + } + }, + "111": { + "111": { + "type": "integer", + "value": "9" + } + }, + "1key": { + "1key": { + "type": "integer", + "value": "3" + } + }, + "_": { + "_": { + "type": "integer", + "value": "5" + } + }, + "___": { + "___": { + "type": "integer", + "value": "8" + } + }, + "_key": { + "_key": { + "type": "integer", + "value": "2" + } + }, + "inline": { + "---": { + "---": { + "type": "integer", + "value": "10" + }, + "111": { + "type": "integer", + "value": "12" + }, + "___": { + "type": "integer", + "value": "11" + } + } + } +} diff --git a/internal/toml-test/tests/valid/key/start.toml b/internal/toml-test/tests/valid/key/start.toml new file mode 100644 index 00000000..5cd1cbd7 --- /dev/null +++ b/internal/toml-test/tests/valid/key/start.toml @@ -0,0 +1,32 @@ +# Table and keys can start with any character; there is no requirement for it to +# start with a letter. + +[-key] +-key = 1 + +[_key] +_key = 2 + +[1key] +1key = 3 + +[-] +- = 4 + +[_] +_ = 5 + +[1] +1 = 6 + +[---] +--- = 7 + +[___] +___ = 8 + +[111] +111 = 9 + +[inline] +--- = {--- = 10, ___ = 11, 111 = 12} diff --git a/internal/toml-test/tests/valid/key/zero.json b/internal/toml-test/tests/valid/key/zero.json new file mode 100644 index 00000000..3d06f09c --- /dev/null +++ b/internal/toml-test/tests/valid/key/zero.json @@ -0,0 +1,6 @@ +{ + "0": { + "type": "integer", + "value": "0" + } +} diff --git a/internal/toml-test/tests/valid/key/zero.toml b/internal/toml-test/tests/valid/key/zero.toml new file mode 100644 index 00000000..0197832b --- /dev/null +++ b/internal/toml-test/tests/valid/key/zero.toml @@ -0,0 +1 @@ +0=0 diff --git a/internal/toml-test/tests/valid/spec/float-2.json b/internal/toml-test/tests/valid/spec/float-2.json index 95077204..67e5521d 100644 --- a/internal/toml-test/tests/valid/spec/float-2.json +++ b/internal/toml-test/tests/valid/spec/float-2.json @@ -1,15 +1,15 @@ { "sf1": { "type": "float", - "value": "+Inf" + "value": "+inf" }, "sf2": { "type": "float", - "value": "+Inf" + "value": "+inf" }, "sf3": { "type": "float", - "value": "-Inf" + "value": "-inf" }, "sf4": { "type": "float", diff --git a/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.json b/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.json new file mode 100644 index 00000000..c4d0c413 --- /dev/null +++ b/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.json @@ -0,0 +1,6 @@ +{ + "beee": { + "type": "string", + "value": "heeee\ngeeee" + } +} diff --git a/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.toml b/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.toml new file mode 100644 index 00000000..4dffe55f --- /dev/null +++ b/internal/toml-test/tests/valid/string/ends-in-whitespace-escape.toml @@ -0,0 +1,6 @@ +beee = """ +heeee +geeee\ + + + """ diff --git a/internal/toml-test/tests/valid/string/escapes.json b/internal/toml-test/tests/valid/string/escapes.json index d849574a..0a741225 100644 --- a/internal/toml-test/tests/valid/string/escapes.json +++ b/internal/toml-test/tests/valid/string/escapes.json @@ -1,54 +1,54 @@ { "backslash": { "type": "string", - "value": "This string has a \\ backslash character." + "value": "|\\." }, "backspace": { "type": "string", - "value": "This string has a \u0008 backspace character." + "value": "|\u0008." }, "carriage": { "type": "string", - "value": "This string has a \r carriage return character." + "value": "|\r." }, "delete": { "type": "string", - "value": "This string has a  delete control code." + "value": "|." }, "formfeed": { "type": "string", - "value": "This string has a \u000c form feed character." + "value": "|\u000c." }, "newline": { "type": "string", - "value": "This string has a \n new line character." + "value": "|\n." }, "notunicode1": { "type": "string", - "value": "This string does not have a unicode \\u escape." + "value": "|\\u." }, "notunicode2": { "type": "string", - "value": "This string does not have a unicode \\u escape." + "value": "|\\u." }, "notunicode3": { "type": "string", - "value": "This string does not have a unicode \\u0075 escape." + "value": "|\\u0075." }, "notunicode4": { "type": "string", - "value": "This string does not have a unicode \\u escape." + "value": "|\\u." }, "quote": { "type": "string", - "value": "This string has a \" quote character." + "value": "|\"." }, "tab": { "type": "string", - "value": "This string has a \t tab character." + "value": "|\t." }, "unitseparator": { "type": "string", - "value": "This string has a \u001f unit separator control code." + "value": "|\u001f." } } diff --git a/internal/toml-test/tests/valid/string/escapes.toml b/internal/toml-test/tests/valid/string/escapes.toml index 78f7ebdf..51460650 100644 --- a/internal/toml-test/tests/valid/string/escapes.toml +++ b/internal/toml-test/tests/valid/string/escapes.toml @@ -1,13 +1,15 @@ -backspace = "This string has a \b backspace character." -tab = "This string has a \t tab character." -newline = "This string has a \n new line character." -formfeed = "This string has a \f form feed character." -carriage = "This string has a \r carriage return character." -quote = "This string has a \" quote character." -backslash = "This string has a \\ backslash character." -notunicode1 = "This string does not have a unicode \\u escape." -notunicode2 = "This string does not have a unicode \u005Cu escape." -notunicode3 = "This string does not have a unicode \\u0075 escape." -notunicode4 = "This string does not have a unicode \\\u0075 escape." -delete = "This string has a \u007F delete control code." -unitseparator = "This string has a \u001F unit separator control code." +backspace = "|\b." +tab = "|\t." +newline = "|\n." +formfeed = "|\f." +carriage = "|\r." +quote = "|\"." +backslash = "|\\." +delete = "|\u007F." +unitseparator = "|\u001F." + +# \u is escaped, so should NOT be interperted as a \u escape. +notunicode1 = "|\\u." +notunicode2 = "|\u005Cu." +notunicode3 = "|\\u0075." +notunicode4 = "|\\\u0075." diff --git a/internal/toml-test/tests/valid/string/multiline-empty.json b/internal/toml-test/tests/valid/string/multiline-empty.json new file mode 100644 index 00000000..f89f6ad3 --- /dev/null +++ b/internal/toml-test/tests/valid/string/multiline-empty.json @@ -0,0 +1,18 @@ +{ + "empty-1": { + "type": "string", + "value": "" + }, + "empty-2": { + "type": "string", + "value": "" + }, + "empty-3": { + "type": "string", + "value": "" + }, + "empty-4": { + "type": "string", + "value": "" + } +} diff --git a/internal/toml-test/tests/valid/string/multiline-empty.toml b/internal/toml-test/tests/valid/string/multiline-empty.toml new file mode 100644 index 00000000..66f29a3e --- /dev/null +++ b/internal/toml-test/tests/valid/string/multiline-empty.toml @@ -0,0 +1,15 @@ +empty-1 = """""" + +# A newline immediately following the opening delimiter will be trimmed. +empty-2 = """ +""" + +# \ at the end of line trims newlines as well; note that last \ is followed by +# two spaces, which are ignored. +empty-3 = """\ + """ +empty-4 = """\ + \ + \ + """ + diff --git a/internal/toml-test/tests/valid/string/multiline-quotes.json b/internal/toml-test/tests/valid/string/multiline-quotes.json index af9c4c80..631517c0 100644 --- a/internal/toml-test/tests/valid/string/multiline-quotes.json +++ b/internal/toml-test/tests/valid/string/multiline-quotes.json @@ -3,6 +3,14 @@ "type": "string", "value": "lol\"\"\"" }, + "five-quotes": { + "type": "string", + "value": "Closing with five quotes\n\"\"" + }, + "four-quotes": { + "type": "string", + "value": "Closing with four quotes\n\"" + }, "lit_one": { "type": "string", "value": "'one quote'" diff --git a/internal/toml-test/tests/valid/string/multiline-quotes.toml b/internal/toml-test/tests/valid/string/multiline-quotes.toml index 085e127f..cf523d1b 100644 --- a/internal/toml-test/tests/valid/string/multiline-quotes.toml +++ b/internal/toml-test/tests/valid/string/multiline-quotes.toml @@ -17,3 +17,10 @@ mismatch2 = '''aaa"""bbb''' # Three opening """, then one escaped ", then two "" (allowed), and then three # closing """ escaped = """lol\"""""" + +five-quotes = """ +Closing with five quotes +""""" +four-quotes = """ +Closing with four quotes +"""" diff --git a/internal/toml-test/tests/valid/string/multiline.json b/internal/toml-test/tests/valid/string/multiline.json index 66e572bd..1c89b124 100644 --- a/internal/toml-test/tests/valid/string/multiline.json +++ b/internal/toml-test/tests/valid/string/multiline.json @@ -27,22 +27,6 @@ "type": "string", "value": "a \tb" }, - "multiline_empty_four": { - "type": "string", - "value": "" - }, - "multiline_empty_one": { - "type": "string", - "value": "" - }, - "multiline_empty_three": { - "type": "string", - "value": "" - }, - "multiline_empty_two": { - "type": "string", - "value": "" - }, "no-space": { "type": "string", "value": "ab" diff --git a/internal/toml-test/tests/valid/string/multiline.toml b/internal/toml-test/tests/valid/string/multiline.toml index f3b3c2ed..c38187d4 100644 --- a/internal/toml-test/tests/valid/string/multiline.toml +++ b/internal/toml-test/tests/valid/string/multiline.toml @@ -1,20 +1,5 @@ # NOTE: this file includes some literal tab characters. -multiline_empty_one = """""" - -# A newline immediately following the opening delimiter will be trimmed. -multiline_empty_two = """ -""" - -# \ at the end of line trims newlines as well; note that last \ is followed by -# two spaces, which are ignored. -multiline_empty_three = """\ - """ -multiline_empty_four = """\ - \ - \ - """ - equivalent_one = "The quick brown fox jumps over the lazy dog." equivalent_two = """ The quick brown \ diff --git a/internal/toml-test/tests/valid/string/quoted-unicode.json b/internal/toml-test/tests/valid/string/quoted-unicode.json index 9c6cc955..8b929a7c 100644 --- a/internal/toml-test/tests/valid/string/quoted-unicode.json +++ b/internal/toml-test/tests/valid/string/quoted-unicode.json @@ -1,18 +1,18 @@ { - "escaped_string": { + "basic_string": { "type": "string", - "value": "\u0000 \b \f A \u007f \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff" + "value": "~ € ÿ ퟿  ￿ 𐀀 􏿿" }, - "not_escaped_string": { + "escaped_string": { "type": "string", - "value": "\\u0000 \\u0008 \\u000c \\U00000041 \\u007f \\u0080 \\u00ff \\ud7ff \\ue000 \\uffff \\U00010000 \\U0010ffff" + "value": "\u0000 \u0008 \u000c A  € ÿ ퟿  ￿ 𐀀 􏿿" }, - "basic_string": { + "literal_string": { "type": "string", - "value": "~ \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff" + "value": "~ € ÿ ퟿  ￿ 𐀀 􏿿" }, - "literal_string": { + "not_escaped_string": { "type": "string", - "value": "~ \u0080 \u00ff \ud7ff \ue000 \uffff \ud800\udc00 \udbff\udfff" + "value": "\\u0000 \\u0008 \\u000c \\U00000041 \\u007f \\u0080 \\u00ff \\ud7ff \\ue000 \\uffff \\U00010000 \\U0010ffff" } } diff --git a/internal/toml-test/tests/valid/string/raw-multiline.json b/internal/toml-test/tests/valid/string/raw-multiline.json index 4159eb01..a17bf683 100644 --- a/internal/toml-test/tests/valid/string/raw-multiline.json +++ b/internal/toml-test/tests/valid/string/raw-multiline.json @@ -7,12 +7,16 @@ "type": "string", "value": "This string\nhas ' a quote character\nand more than\none newline\nin it." }, + "multiline_with_tab": { + "type": "string", + "value": "First line\n\t Followed by a tab" + }, "oneline": { "type": "string", "value": "This string has a ' quote character." }, - "multiline_with_tab": { + "this-str-has-apostrophes": { "type": "string", - "value": "First line\n\t Followed by a tab" + "value": "' there's one already\n'' two more\n''" } } diff --git a/internal/toml-test/tests/valid/string/raw-multiline.toml b/internal/toml-test/tests/valid/string/raw-multiline.toml index fff00d9c..ff263350 100644 --- a/internal/toml-test/tests/valid/string/raw-multiline.toml +++ b/internal/toml-test/tests/valid/string/raw-multiline.toml @@ -16,3 +16,7 @@ in it.''' # Tab character in literal string does not need to be escaped multiline_with_tab = '''First line Followed by a tab''' + +this-str-has-apostrophes='''' there's one already +'' two more +''''' diff --git a/internal/toml-test/tests/valid/string/unicode-escape.json b/internal/toml-test/tests/valid/string/unicode-escape.json index 9ae728ba..2b9707b4 100644 --- a/internal/toml-test/tests/valid/string/unicode-escape.json +++ b/internal/toml-test/tests/valid/string/unicode-escape.json @@ -1,10 +1,58 @@ { - "answer4": { + "a": { + "type": "string", + "value": "a" + }, + "b": { + "type": "string", + "value": "b" + }, + "c": { + "type": "string", + "value": "c" + }, + "delta-1": { + "type": "string", + "value": "δ" + }, + "delta-2": { + "type": "string", + "value": "δ" + }, + "ml-a": { + "type": "string", + "value": "a" + }, + "ml-b": { + "type": "string", + "value": "b" + }, + "ml-c": { + "type": "string", + "value": "c" + }, + "ml-delta-1": { "type": "string", "value": "δ" }, - "answer8": { + "ml-delta-2": { "type": "string", "value": "δ" + }, + "ml-null-1": { + "type": "string", + "value": "\u0000" + }, + "ml-null-2": { + "type": "string", + "value": "\u0000" + }, + "null-1": { + "type": "string", + "value": "\u0000" + }, + "null-2": { + "type": "string", + "value": "\u0000" } } diff --git a/internal/toml-test/tests/valid/string/unicode-escape.toml b/internal/toml-test/tests/valid/string/unicode-escape.toml index 82faecbf..4c5e2d3c 100644 --- a/internal/toml-test/tests/valid/string/unicode-escape.toml +++ b/internal/toml-test/tests/valid/string/unicode-escape.toml @@ -1,2 +1,15 @@ -answer4 = "\u03B4" -answer8 = "\U000003B4" +delta-1 = "\u03B4" +delta-2 = "\U000003B4" +a = "\u0061" +b = "\u0062" +c = "\U00000063" +null-1 = "\u0000" +null-2 = "\U00000000" + +ml-delta-1 = """\u03B4""" +ml-delta-2 = """\U000003B4""" +ml-a = """\u0061""" +ml-b = """\u0062""" +ml-c = """\U00000063""" +ml-null-1 = """\u0000""" +ml-null-2 = """\U00000000""" diff --git a/internal/toml-test/tests/valid/table/empty-name.json b/internal/toml-test/tests/valid/table/empty-name.json index fc58e386..7c6ad1dd 100644 --- a/internal/toml-test/tests/valid/table/empty-name.json +++ b/internal/toml-test/tests/valid/table/empty-name.json @@ -1,14 +1,14 @@ { "": { - "x": { - "type": "integer", - "value": "1" - }, "a": { "x": { "type": "integer", "value": "2" } + }, + "x": { + "type": "integer", + "value": "1" } }, "a": { diff --git a/internal/toml-test/tests/valid/table/keyword.json b/internal/toml-test/tests/valid/table/keyword.json index a15dfae0..9874f7b0 100644 --- a/internal/toml-test/tests/valid/table/keyword.json +++ b/internal/toml-test/tests/valid/table/keyword.json @@ -1,6 +1,6 @@ { - "true": {}, "false": {}, "inf": {}, - "nan": {} + "nan": {}, + "true": {} } diff --git a/internal/toml-test/toml.go b/internal/toml-test/toml.go index 935abec4..8786af64 100644 --- a/internal/toml-test/toml.go +++ b/internal/toml-test/toml.go @@ -4,7 +4,9 @@ import ( "fmt" "math" "reflect" + "sort" "strings" + "time" ) // CompareTOML compares the given arguments. @@ -18,14 +20,14 @@ import ( func (r Test) CompareTOML(want, have any) Test { if isTomlValue(want) { if !isTomlValue(have) { - return r.fail("Type for key '%s' differs:\n"+ + return r.fail("Type for key %q differs:\n"+ " Expected: %v (%s)\n"+ " Your encoder: %v (%s)", r.Key, want, fmtType(want), have, fmtType(have)) } if !deepEqual(want, have) { - return r.fail("Values for key '%s' differ:\n"+ + return r.fail("Values for key %q differ:\n"+ " Expected: %v (%s)\n"+ " Your encoder: %v (%s)", r.Key, want, fmtType(want), have, fmtType(have)) @@ -55,22 +57,24 @@ func (r Test) cmpTOMLMap(want map[string]any, have any) Test { return r.mismatch("table", want, haveMap) } + wantKeys, haveKeys := mapKeys(want), mapKeys(haveMap) + // Check that the keys of each map are equivalent. - for k := range want { + for _, k := range wantKeys { if _, ok := haveMap[k]; !ok { bunk := r.kjoin(k) - return bunk.fail("Could not find key '%s' in encoder output", bunk.Key) + return bunk.fail("Could not find key %q in encoder output", bunk.Key) } } - for k := range haveMap { + for _, k := range haveKeys { if _, ok := want[k]; !ok { bunk := r.kjoin(k) - return bunk.fail("Could not find key '%s' in expected output", bunk.Key) + return bunk.fail("Could not find key %q in expected output", bunk.Key) } } // Okay, now make sure that each value is equivalent. - for k := range want { + for _, k := range wantKeys { if sub := r.kjoin(k).CompareTOML(want[k], haveMap[k]); sub.Failed() { return sub } @@ -97,7 +101,7 @@ func (r Test) cmpTOMLArrays(want []any, have any) Test { } if len(want) != len(haveSlice) { - return r.fail("Array lengths differ for key '%s'"+ + return r.fail("Array lengths differ for key %q"+ " Expected: %[2]v (len=%[4]d)\n"+ " Your encoder: %[3]v (len=%[5]d)", r.Key, want, haveSlice, len(want), len(haveSlice)) @@ -129,6 +133,14 @@ func deepEqual(want, have any) bool { return true } + // Time.Equal deals with some edge-cases such as offset +0000 and Z being + // identical. + if haveT, ok := have.(time.Time); ok { + if wantT, ok := want.(time.Time); ok { + return wantT.Equal(haveT) + } + } + return reflect.DeepEqual(want, have) } @@ -143,3 +155,12 @@ func isTomlValue(v any) bool { // fmt %T with "interface {}" replaced with "any", which is far more readable. func fmtType(t any) string { return strings.ReplaceAll(fmt.Sprintf("%T", t), "interface {}", "any") } func fmtHashV(t any) string { return strings.ReplaceAll(fmt.Sprintf("%#v", t), "interface {}", "any") } + +func mapKeys[M ~map[string]V, V any](m M) []string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} diff --git a/toml_test.go b/toml_test.go index 920f96dc..b460564a 100644 --- a/toml_test.go +++ b/toml_test.go @@ -2,6 +2,7 @@ package toml_test import ( "bytes" + "context" "encoding/json" "fmt" "os" @@ -22,7 +23,7 @@ import ( var errorTests = map[string][]string{ "encoding/bad-utf8*": {"invalid UTF-8 byte"}, "encoding/utf16*": {"files cannot contain NULL bytes; probably using UTF-16"}, - "string/multiline-escape-space": {`invalid escape: '\ '`}, + "string/multiline-bad-escape-2": {`invalid escape: '\ '`}, } // Test metadata; all keys listed as "keyname: type". @@ -51,35 +52,43 @@ var metaTests = map[string]string{ Section."Μ": String Section.M: String `, - "key/dotted": ` - name.first: String - name.last: String - many.dots.here.dot.dot.dot: Integer - count.a: Integer - count.b: Integer - count.c: Integer - count.d: Integer - count.e: Integer - count.f: Integer - count.g: Integer - count.h: Integer - count.i: Integer - count.j: Integer - count.k: Integer - count.l: Integer - tbl: Hash - tbl.a.b.c: Float + "key/dotted-1": ` + name.first: String + name.last: String + many.dots.dot.dot.dot: Integer + `, + "key/dotted-2": ` + count.a: Integer + count.b: Integer + count.c: Integer + count.d: Integer + count.e: Integer + count.f: Integer + count.g: Integer + count.h: Integer + count.i: Integer + count.j: Integer + count.k: Integer + count.l: Integer + `, + "key/dotted-3": ` + top.key: Integer + tbl: Hash + tbl.a.b.c: Float a.few.dots: Hash a.few.dots.polka.dot: String a.few.dots.polka.dance-with: String - arr: ArrayHash - arr.a.b.c: Integer - arr.a.b.d: Integer - arr: ArrayHash - arr.a.b.c: Integer - arr.a.b.d: Integer + `, + "key/dotted-4": ` + top.key: Integer + arr: ArrayHash + arr.a.b.c: Integer + arr.a.b.d: Integer + arr: ArrayHash + arr.a.b.c: Integer + arr.a.b.d: Integer `, - "key/empty": ` + "key/empty-1": ` "": String `, "key/quoted-dots": ` @@ -309,14 +318,20 @@ func runTomlTest(t *testing.T, includeNext bool, wantFail ...string) { "valid/comment/nonascii", // TODO: fix this; we allow appending to tables, but shouldn't. - "invalid/table/append-with-dotted*", - "invalid/inline-table/add", - "invalid/table/duplicate-key-dotted-table", - "invalid/table/duplicate-key-dotted-table2", + "invalid/array/extend-defined-aot", + "invalid/inline-table/duplicate-key-3", + "invalid/inline-table/overwrite-2", + "invalid/inline-table/overwrite-7", + "invalid/inline-table/overwrite-8", "invalid/spec/inline-table-2-0", "invalid/spec/table-9-1", - "invalid/inline-table/nested_key_conflict", "invalid/table/append-to-array-with-dotted-keys", + "invalid/table/append-with-dotted-keys-1", + "invalid/table/append-with-dotted-keys-2", + "invalid/table/duplicate-key-dotted-table", + "invalid/table/duplicate-key-dotted-table2", + "invalid/table/redefine-2", + "invalid/table/redefine-3", }, } if includeNext { @@ -449,7 +464,7 @@ func testError(t *testing.T, test tomltest.Test, shouldExist map[string]struct{} type parser struct{} -func (p parser) Encode(input string) (output string, outputIsError bool, retErr error) { +func (p parser) Encode(ctx context.Context, input string) (output string, outputIsError bool, retErr error) { defer func() { if r := recover(); r != nil { switch rr := r.(type) { @@ -481,7 +496,7 @@ func (p parser) Encode(input string) (output string, outputIsError bool, retErr return buf.String(), false, retErr } -func (p parser) Decode(input string) (output string, outputIsError bool, retErr error) { +func (p parser) Decode(ctx context.Context, input string) (output string, outputIsError bool, retErr error) { defer func() { if r := recover(); r != nil { switch rr := r.(type) {