summaryrefslogtreecommitdiffstats
path: root/tests/data/valid/burntsushi
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:21:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:21:29 +0000
commit683f1f3ddde13390781318b9fe4a6841ea35d145 (patch)
treec21fddf99f2e5233bb3f22bbafd0d711fe7c5d95 /tests/data/valid/burntsushi
parentInitial commit. (diff)
downloadpython-tomli-683f1f3ddde13390781318b9fe4a6841ea35d145.tar.xz
python-tomli-683f1f3ddde13390781318b9fe4a6841ea35d145.zip
Adding upstream version 2.0.1.upstream/2.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/data/valid/burntsushi')
-rw-r--r--tests/data/valid/burntsushi/COPYING21
-rw-r--r--tests/data/valid/burntsushi/valid/array/array.json68
-rw-r--r--tests/data/valid/burntsushi/valid/array/array.toml12
-rw-r--r--tests/data/valid/burntsushi/valid/array/bool.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/empty.json11
-rw-r--r--tests/data/valid/burntsushi/valid/array/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/hetergeneous.json34
-rw-r--r--tests/data/valid/burntsushi/valid/array/hetergeneous.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-array.json14
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-array.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-float.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-float.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-string.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-string.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-string-table.json22
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-string-table.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-double.json28
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-double.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-inline-table.json7
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-inline-table.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested.json16
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/nospaces.json16
-rw-r--r--tests/data/valid/burntsushi/valid/array/nospaces.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json8
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-with-comma.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-with-comma.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/strings.json20
-rw-r--r--tests/data/valid/burntsushi/valid/array/strings.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json10
-rw-r--r--tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/bool/bool.json10
-rw-r--r--tests/data/valid/burntsushi/valid/bool/bool.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof.json6
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof2.json6
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof2.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/everywhere.json26
-rw-r--r--tests/data/valid/burntsushi/valid/comment/everywhere.toml28
-rw-r--r--tests/data/valid/burntsushi/valid/comment/noeol.json1
-rw-r--r--tests/data/valid/burntsushi/valid/comment/noeol.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/comment/tricky.json98
-rw-r--r--tests/data/valid/burntsushi/valid/comment/tricky.toml31
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/datetime.json10
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/datetime.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-date.json6
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-date.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-time.json10
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-time.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local.json14
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/milliseconds.json18
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/milliseconds.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/timezone.json18
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/timezone.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/empty-file.json1
-rw-r--r--tests/data/valid/burntsushi/valid/empty-file.toml0
-rw-r--r--tests/data/valid/burntsushi/valid/example.json26
-rw-r--r--tests/data/valid/burntsushi/valid/example.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/float/exponent.json34
-rw-r--r--tests/data/valid/burntsushi/valid/float/exponent.toml8
-rw-r--r--tests/data/valid/burntsushi/valid/float/float.json18
-rw-r--r--tests/data/valid/burntsushi/valid/float/float.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/float/inf-and-nan.json26
-rw-r--r--tests/data/valid/burntsushi/valid/float/inf-and-nan.toml8
-rw-r--r--tests/data/valid/burntsushi/valid/float/long.json10
-rw-r--r--tests/data/valid/burntsushi/valid/float/long.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/float/underscore.json14
-rw-r--r--tests/data/valid/burntsushi/valid/float/underscore.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/float/zero.json30
-rw-r--r--tests/data/valid/burntsushi/valid/float/zero.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json16
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json16
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-groups.json12
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-groups.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/array.json34
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/array.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/bool.json12
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/empty.json30
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/empty.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json16
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/inline-table.json48
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/inline-table.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/key-dotted.json140
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml23
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/multiline.json20
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/multiline.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/nest.json64
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/nest.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/integer.json18
-rw-r--r--tests/data/valid/burntsushi/valid/integer/integer.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/integer/literals.json38
-rw-r--r--tests/data/valid/burntsushi/valid/integer/literals.toml11
-rw-r--r--tests/data/valid/burntsushi/valid/integer/long.json10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/long.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/integer/underscore.json10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/underscore.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/integer/zero.json50
-rw-r--r--tests/data/valid/burntsushi/valid/integer/zero.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/key/alphanum.json46
-rw-r--r--tests/data/valid/burntsushi/valid/key/alphanum.toml14
-rw-r--r--tests/data/valid/burntsushi/valid/key/case-sensitive.json38
-rw-r--r--tests/data/valid/burntsushi/valid/key/case-sensitive.toml13
-rw-r--r--tests/data/valid/burntsushi/valid/key/dotted.json132
-rw-r--r--tests/data/valid/burntsushi/valid/key/dotted.toml35
-rw-r--r--tests/data/valid/burntsushi/valid/key/empty.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/equals-nospace.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/equals-nospace.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/escapes.json24
-rw-r--r--tests/data/valid/burntsushi/valid/key/escapes.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric-dotted.json8
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric-dotted.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/quoted-dots.json32
-rw-r--r--tests/data/valid/burntsushi/valid/key/quoted-dots.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/key/space.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/space.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-chars.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-chars.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-word.json18
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-word.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/newline-crlf.json10
-rw-r--r--tests/data/valid/burntsushi/valid/newline-crlf.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/newline-lf.json10
-rw-r--r--tests/data/valid/burntsushi/valid/newline-lf.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1-compact.json100
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1-compact.toml23
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1.json100
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1.toml33
-rw-r--r--tests/data/valid/burntsushi/valid/string/double-quote-escape.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/double-quote-escape.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/empty.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/escape-tricky.json30
-rw-r--r--tests/data/valid/burntsushi/valid/string/escape-tricky.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/string/escaped-escape.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/escaped-escape.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/escapes.json54
-rw-r--r--tests/data/valid/burntsushi/valid/string/escapes.toml13
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline-quotes.json42
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline-quotes.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline.json54
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline.toml52
-rw-r--r--tests/data/valid/burntsushi/valid/string/nl.json22
-rw-r--r--tests/data/valid/burntsushi/valid/string/nl.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw-multiline.json14
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw-multiline.toml14
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw.json30
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/string/simple.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/simple.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-escape.json10
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-escape.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-literal.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-literal.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/with-pound.json10
-rw-r--r--tests/data/valid/burntsushi/valid/string/with-pound.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-implicit.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-implicit.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-many.json34
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-many.toml11
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-nest.json44
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-nest.toml17
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-one.json14
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-one.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-table-array.json24
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-table-array.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/table/empty.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/keyword.json6
-rw-r--r--tests/data/valid/burntsushi/valid/table/keyword.toml9
-rw-r--r--tests/data/valid/burntsushi/valid/table/names.json30
-rw-r--r--tests/data/valid/burntsushi/valid/table/names.toml9
-rw-r--r--tests/data/valid/burntsushi/valid/table/no-eol.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/no-eol.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/sub-empty.json5
-rw-r--r--tests/data/valid/burntsushi/valid/table/sub-empty.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/whitespace.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/whitespace.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-literal-string.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-literal-string.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-pound.json8
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-pound.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-single-quotes.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-single-quotes.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/table/without-super.json9
-rw-r--r--tests/data/valid/burntsushi/valid/table/without-super.toml5
197 files changed, 2936 insertions, 0 deletions
diff --git a/tests/data/valid/burntsushi/COPYING b/tests/data/valid/burntsushi/COPYING
new file mode 100644
index 0000000..93b2202
--- /dev/null
+++ b/tests/data/valid/burntsushi/COPYING
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 TOML authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tests/data/valid/burntsushi/valid/array/array.json b/tests/data/valid/burntsushi/valid/array/array.json
new file mode 100644
index 0000000..4e9d45b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/array.json
@@ -0,0 +1,68 @@
+{
+ "comments": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ],
+ "dates": [
+ {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00Z"
+ },
+ {
+ "type": "datetime",
+ "value": "2006-06-01T11:00:00Z"
+ }
+ ],
+ "floats": [
+ {
+ "type": "float",
+ "value": "1.1"
+ },
+ {
+ "type": "float",
+ "value": "2.1"
+ },
+ {
+ "type": "float",
+ "value": "3.1"
+ }
+ ],
+ "ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ],
+ "strings": [
+ {
+ "type": "string",
+ "value": "a"
+ },
+ {
+ "type": "string",
+ "value": "b"
+ },
+ {
+ "type": "string",
+ "value": "c"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/array.toml b/tests/data/valid/burntsushi/valid/array/array.toml
new file mode 100644
index 0000000..ab88465
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/array.toml
@@ -0,0 +1,12 @@
+ints = [1, 2, 3, ]
+floats = [1.1, 2.1, 3.1]
+strings = ["a", "b", "c"]
+dates = [
+ 1987-07-05T17:45:00Z,
+ 1979-05-27T07:32:00Z,
+ 2006-06-01T11:00:00Z,
+]
+comments = [
+ 1,
+ 2, #this is ok
+]
diff --git a/tests/data/valid/burntsushi/valid/array/bool.json b/tests/data/valid/burntsushi/valid/array/bool.json
new file mode 100644
index 0000000..7cede3f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/bool.json
@@ -0,0 +1,12 @@
+{
+ "a": [
+ {
+ "type": "bool",
+ "value": "true"
+ },
+ {
+ "type": "bool",
+ "value": "false"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/bool.toml b/tests/data/valid/burntsushi/valid/array/bool.toml
new file mode 100644
index 0000000..d2010c5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/bool.toml
@@ -0,0 +1 @@
+a = [true, false]
diff --git a/tests/data/valid/burntsushi/valid/array/empty.json b/tests/data/valid/burntsushi/valid/array/empty.json
new file mode 100644
index 0000000..7b1ca0c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/empty.json
@@ -0,0 +1,11 @@
+{
+ "thevoid": [
+ [
+ [
+ [
+ []
+ ]
+ ]
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/empty.toml b/tests/data/valid/burntsushi/valid/array/empty.toml
new file mode 100644
index 0000000..fa58dc6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/empty.toml
@@ -0,0 +1 @@
+thevoid = [[[[[]]]]]
diff --git a/tests/data/valid/burntsushi/valid/array/hetergeneous.json b/tests/data/valid/burntsushi/valid/array/hetergeneous.json
new file mode 100644
index 0000000..751b624
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/hetergeneous.json
@@ -0,0 +1,34 @@
+{
+ "mixed": [
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ],
+ [
+ {
+ "type": "string",
+ "value": "a"
+ },
+ {
+ "type": "string",
+ "value": "b"
+ }
+ ],
+ [
+ {
+ "type": "float",
+ "value": "1.1"
+ },
+ {
+ "type": "float",
+ "value": "2.1"
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/hetergeneous.toml b/tests/data/valid/burntsushi/valid/array/hetergeneous.toml
new file mode 100644
index 0000000..a246fcf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/hetergeneous.toml
@@ -0,0 +1 @@
+mixed = [[1, 2], ["a", "b"], [1.1, 2.1]]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-array.json b/tests/data/valid/burntsushi/valid/array/mixed-int-array.json
new file mode 100644
index 0000000..2f3ac5e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-array.json
@@ -0,0 +1,14 @@
+{
+ "arrays-and-ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ [
+ {
+ "type": "string",
+ "value": "Arrays are not integers."
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml
new file mode 100644
index 0000000..051ec73
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml
@@ -0,0 +1 @@
+arrays-and-ints = [1, ["Arrays are not integers."]]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-float.json b/tests/data/valid/burntsushi/valid/array/mixed-int-float.json
new file mode 100644
index 0000000..e73059b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-float.json
@@ -0,0 +1,12 @@
+{
+ "ints-and-floats": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "float",
+ "value": "1.1"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml
new file mode 100644
index 0000000..a5aa9b7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml
@@ -0,0 +1 @@
+ints-and-floats = [1, 1.1]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-string.json b/tests/data/valid/burntsushi/valid/array/mixed-int-string.json
new file mode 100644
index 0000000..c6acc76
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-string.json
@@ -0,0 +1,12 @@
+{
+ "strings-and-ints": [
+ {
+ "type": "string",
+ "value": "hi"
+ },
+ {
+ "type": "integer",
+ "value": "42"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml
new file mode 100644
index 0000000..f348308
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml
@@ -0,0 +1 @@
+strings-and-ints = ["hi", 42]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-string-table.json b/tests/data/valid/burntsushi/valid/array/mixed-string-table.json
new file mode 100644
index 0000000..6185aa9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-string-table.json
@@ -0,0 +1,22 @@
+{
+ "contributors": [
+ {
+ "type": "string",
+ "value": "Foo Bar \u003cfoo@example.com\u003e"
+ },
+ {
+ "email": {
+ "type": "string",
+ "value": "bazqux@example.com"
+ },
+ "name": {
+ "type": "string",
+ "value": "Baz Qux"
+ },
+ "url": {
+ "type": "string",
+ "value": "https://example.com/bazqux"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml b/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml
new file mode 100644
index 0000000..bd7ada8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml
@@ -0,0 +1,4 @@
+contributors = [
+ "Foo Bar <foo@example.com>",
+ { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
+]
diff --git a/tests/data/valid/burntsushi/valid/array/nested-double.json b/tests/data/valid/burntsushi/valid/array/nested-double.json
new file mode 100644
index 0000000..c89a8c9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-double.json
@@ -0,0 +1,28 @@
+{
+ "nest": [
+ [
+ [
+ {
+ "type": "string",
+ "value": "a"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ [
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ]
+ ]
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested-double.toml b/tests/data/valid/burntsushi/valid/array/nested-double.toml
new file mode 100644
index 0000000..c1de747
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-double.toml
@@ -0,0 +1,6 @@
+nest = [
+ [
+ ["a"],
+ [1, 2, [3]]
+ ]
+]
diff --git a/tests/data/valid/burntsushi/valid/array/nested-inline-table.json b/tests/data/valid/burntsushi/valid/array/nested-inline-table.json
new file mode 100644
index 0000000..2ae5fa7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-inline-table.json
@@ -0,0 +1,7 @@
+{
+ "a": [
+ {
+ "b": {}
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml b/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml
new file mode 100644
index 0000000..e1e24f6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml
@@ -0,0 +1 @@
+a = [ { b = {} } ]
diff --git a/tests/data/valid/burntsushi/valid/array/nested.json b/tests/data/valid/burntsushi/valid/array/nested.json
new file mode 100644
index 0000000..72c7589
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested.json
@@ -0,0 +1,16 @@
+{
+ "nest": [
+ [
+ {
+ "type": "string",
+ "value": "a"
+ }
+ ],
+ [
+ {
+ "type": "string",
+ "value": "b"
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested.toml b/tests/data/valid/burntsushi/valid/array/nested.toml
new file mode 100644
index 0000000..ce33022
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested.toml
@@ -0,0 +1 @@
+nest = [["a"], ["b"]]
diff --git a/tests/data/valid/burntsushi/valid/array/nospaces.json b/tests/data/valid/burntsushi/valid/array/nospaces.json
new file mode 100644
index 0000000..6c89fce
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nospaces.json
@@ -0,0 +1,16 @@
+{
+ "ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nospaces.toml b/tests/data/valid/burntsushi/valid/array/nospaces.toml
new file mode 100644
index 0000000..6618936
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nospaces.toml
@@ -0,0 +1 @@
+ints = [1,2,3]
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json
new file mode 100644
index 0000000..7cd5406
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json
@@ -0,0 +1,8 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": " \", "
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml
new file mode 100644
index 0000000..4758ddc
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml
@@ -0,0 +1 @@
+title = [ " \", ",]
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma.json b/tests/data/valid/burntsushi/valid/array/string-quote-comma.json
new file mode 100644
index 0000000..b78db42
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma.json
@@ -0,0 +1,12 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": "Client: \"XXXX\", Job: XXXX"
+ },
+ {
+ "type": "string",
+ "value": "Code: XXXX"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml b/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml
new file mode 100644
index 0000000..6b458e1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml
@@ -0,0 +1,4 @@
+title = [
+"Client: \"XXXX\", Job: XXXX",
+"Code: XXXX"
+]
diff --git a/tests/data/valid/burntsushi/valid/array/string-with-comma.json b/tests/data/valid/burntsushi/valid/array/string-with-comma.json
new file mode 100644
index 0000000..42b77ef
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-with-comma.json
@@ -0,0 +1,12 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": "Client: XXXX, Job: XXXX"
+ },
+ {
+ "type": "string",
+ "value": "Code: XXXX"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-with-comma.toml b/tests/data/valid/burntsushi/valid/array/string-with-comma.toml
new file mode 100644
index 0000000..655c40e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-with-comma.toml
@@ -0,0 +1,4 @@
+title = [
+"Client: XXXX, Job: XXXX",
+"Code: XXXX"
+]
diff --git a/tests/data/valid/burntsushi/valid/array/strings.json b/tests/data/valid/burntsushi/valid/array/strings.json
new file mode 100644
index 0000000..27617b4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/strings.json
@@ -0,0 +1,20 @@
+{
+ "string_array": [
+ {
+ "type": "string",
+ "value": "all"
+ },
+ {
+ "type": "string",
+ "value": "strings"
+ },
+ {
+ "type": "string",
+ "value": "are the same"
+ },
+ {
+ "type": "string",
+ "value": "type"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/strings.toml b/tests/data/valid/burntsushi/valid/array/strings.toml
new file mode 100644
index 0000000..51894ce
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/strings.toml
@@ -0,0 +1 @@
+string_array = [ "all", 'strings', """are the same""", '''type''']
diff --git a/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json
new file mode 100644
index 0000000..2c0feb1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json
@@ -0,0 +1,10 @@
+{
+ "foo": [
+ {
+ "bar": {
+ "type": "string",
+ "value": "\"{{baz}}\""
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml
new file mode 100644
index 0000000..f0de81e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml
@@ -0,0 +1 @@
+foo = [ { bar="\"{{baz}}\""} ]
diff --git a/tests/data/valid/burntsushi/valid/bool/bool.json b/tests/data/valid/burntsushi/valid/bool/bool.json
new file mode 100644
index 0000000..be47d6d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/bool/bool.json
@@ -0,0 +1,10 @@
+{
+ "f": {
+ "type": "bool",
+ "value": "false"
+ },
+ "t": {
+ "type": "bool",
+ "value": "true"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/bool/bool.toml b/tests/data/valid/burntsushi/valid/bool/bool.toml
new file mode 100644
index 0000000..a8a829b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/bool/bool.toml
@@ -0,0 +1,2 @@
+t = true
+f = false
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof.json b/tests/data/valid/burntsushi/valid/comment/at-eof.json
new file mode 100644
index 0000000..af3154a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof.json
@@ -0,0 +1,6 @@
+{
+ "key": {
+ "type": "string",
+ "value": "value"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof.toml b/tests/data/valid/burntsushi/valid/comment/at-eof.toml
new file mode 100644
index 0000000..090b474
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment
+key = "value" # This is a comment at the end of a line
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof2.json b/tests/data/valid/burntsushi/valid/comment/at-eof2.json
new file mode 100644
index 0000000..af3154a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof2.json
@@ -0,0 +1,6 @@
+{
+ "key": {
+ "type": "string",
+ "value": "value"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof2.toml b/tests/data/valid/burntsushi/valid/comment/at-eof2.toml
new file mode 100644
index 0000000..090b474
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof2.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment
+key = "value" # This is a comment at the end of a line
diff --git a/tests/data/valid/burntsushi/valid/comment/everywhere.json b/tests/data/valid/burntsushi/valid/comment/everywhere.json
new file mode 100644
index 0000000..6e714d1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/everywhere.json
@@ -0,0 +1,26 @@
+{
+ "group": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "dt": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:12-07:00"
+ },
+ "d": {
+ "type": "date-local",
+ "value": "1979-05-27"
+ },
+ "more": [
+ {
+ "type": "integer",
+ "value": "42"
+ },
+ {
+ "type": "integer",
+ "value": "42"
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/everywhere.toml b/tests/data/valid/burntsushi/valid/comment/everywhere.toml
new file mode 100644
index 0000000..a5da1d7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/everywhere.toml
@@ -0,0 +1,28 @@
+# Top comment.
+ # Top comment.
+# Top comment.
+
+# [no-extraneous-groups-please]
+
+[group] # Comment
+answer = 42 # Comment
+# no-extraneous-keys-please = 999
+# Inbetween comment.
+more = [ # Comment
+ # What about multiple # comments?
+ # Can you handle it?
+ #
+ # Evil.
+# Evil.
+ 42, 42, # Comments within arrays are fun.
+ # What about multiple # comments?
+ # Can you handle it?
+ #
+ # Evil.
+# Evil.
+# ] Did I fool you?
+] # Hopefully not.
+
+# Make sure the space between the datetime and "#" isn't lexed.
+dt = 1979-05-27T07:32:12-07:00 # c
+d = 1979-05-27 # Comment
diff --git a/tests/data/valid/burntsushi/valid/comment/noeol.json b/tests/data/valid/burntsushi/valid/comment/noeol.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/noeol.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/data/valid/burntsushi/valid/comment/noeol.toml b/tests/data/valid/burntsushi/valid/comment/noeol.toml
new file mode 100644
index 0000000..7662df8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/noeol.toml
@@ -0,0 +1 @@
+# single comment without any eol characters \ No newline at end of file
diff --git a/tests/data/valid/burntsushi/valid/comment/tricky.json b/tests/data/valid/burntsushi/valid/comment/tricky.json
new file mode 100644
index 0000000..0994864
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/tricky.json
@@ -0,0 +1,98 @@
+{
+ "hash#tag": {
+ "#!": {
+ "type": "string",
+ "value": "hash bang"
+ },
+ "arr3": [
+ {
+ "type": "string",
+ "value": "#"
+ },
+ {
+ "type": "string",
+ "value": "#"
+ },
+ {
+ "type": "string",
+ "value": "###"
+ }
+ ],
+ "arr4": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ },
+ {
+ "type": "integer",
+ "value": "4"
+ }
+ ],
+ "arr5": [
+ [
+ [
+ [
+ [
+ {
+ "type": "string",
+ "value": "#"
+ }
+ ]
+ ]
+ ]
+ ]
+ ],
+ "tbl1": {
+ "#": {
+ "type": "string",
+ "value": "}#"
+ }
+ }
+ },
+ "section": {
+ "8": {
+ "type": "string",
+ "value": "eight"
+ },
+ "eleven": {
+ "type": "float",
+ "value": "11.1"
+ },
+ "five": {
+ "type": "float",
+ "value": "5.5"
+ },
+ "four": {
+ "type": "string",
+ "value": "# no comment\n# nor this\n#also not comment"
+ },
+ "one": {
+ "type": "string",
+ "value": "11"
+ },
+ "six": {
+ "type": "integer",
+ "value": "6"
+ },
+ "ten": {
+ "type": "float",
+ "value": "1000.0"
+ },
+ "three": {
+ "type": "string",
+ "value": "#"
+ },
+ "two": {
+ "type": "string",
+ "value": "22#"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/tricky.toml b/tests/data/valid/burntsushi/valid/comment/tricky.toml
new file mode 100644
index 0000000..c95f94d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/tricky.toml
@@ -0,0 +1,31 @@
+[section]#attached comment
+#[notsection]
+one = "11"#cmt
+two = "22#"
+three = '#'
+
+four = """# no comment
+# nor this
+#also not comment"""#is_comment
+
+five = 5.5#66
+six = 6#7
+8 = "eight"
+#nine = 99
+ten = 10e2#1
+eleven = 1.11e1#23
+
+["hash#tag"]
+"#!" = "hash bang"
+arr3 = [ "#", '#', """###""" ]
+arr4 = [ 1,# 9, 9,
+2#,9
+,#9
+3#]
+,4]
+arr5 = [[[[#["#"],
+["#"]]]]#]
+]
+tbl1 = { "#" = '}#'}#}}
+
+
diff --git a/tests/data/valid/burntsushi/valid/datetime/datetime.json b/tests/data/valid/burntsushi/valid/datetime/datetime.json
new file mode 100644
index 0000000..5146335
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/datetime.json
@@ -0,0 +1,10 @@
+{
+ "lower": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ "space": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/datetime.toml b/tests/data/valid/burntsushi/valid/datetime/datetime.toml
new file mode 100644
index 0000000..653d521
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/datetime.toml
@@ -0,0 +1,2 @@
+space = 1987-07-05 17:45:00Z
+lower = 1987-07-05t17:45:00z
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-date.json b/tests/data/valid/burntsushi/valid/datetime/local-date.json
new file mode 100644
index 0000000..8fea2fe
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-date.json
@@ -0,0 +1,6 @@
+{
+ "bestdayever": {
+ "type": "date-local",
+ "value": "1987-07-05"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-date.toml b/tests/data/valid/burntsushi/valid/datetime/local-date.toml
new file mode 100644
index 0000000..1be4a5f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-date.toml
@@ -0,0 +1 @@
+bestdayever = 1987-07-05
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-time.json b/tests/data/valid/burntsushi/valid/datetime/local-time.json
new file mode 100644
index 0000000..5e527e9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-time.json
@@ -0,0 +1,10 @@
+{
+ "besttimeever": {
+ "type": "time-local",
+ "value": "17:45:00"
+ },
+ "milliseconds": {
+ "type": "time-local",
+ "value": "10:32:00.555"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-time.toml b/tests/data/valid/burntsushi/valid/datetime/local-time.toml
new file mode 100644
index 0000000..6b07f6f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-time.toml
@@ -0,0 +1,2 @@
+besttimeever = 17:45:00
+milliseconds = 10:32:00.555
diff --git a/tests/data/valid/burntsushi/valid/datetime/local.json b/tests/data/valid/burntsushi/valid/datetime/local.json
new file mode 100644
index 0000000..12f8df5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local.json
@@ -0,0 +1,14 @@
+{
+ "local": {
+ "type": "datetime-local",
+ "value": "1987-07-05T17:45:00"
+ },
+ "milli": {
+ "type": "datetime-local",
+ "value": "1977-12-21T10:32:00.555"
+ },
+ "space": {
+ "type": "datetime-local",
+ "value": "1987-07-05T17:45:00"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local.toml b/tests/data/valid/burntsushi/valid/datetime/local.toml
new file mode 100644
index 0000000..ab425ec
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local.toml
@@ -0,0 +1,3 @@
+local = 1987-07-05T17:45:00
+milli = 1977-12-21T10:32:00.555
+space = 1987-07-05 17:45:00
diff --git a/tests/data/valid/burntsushi/valid/datetime/milliseconds.json b/tests/data/valid/burntsushi/valid/datetime/milliseconds.json
new file mode 100644
index 0000000..c49e400
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/milliseconds.json
@@ -0,0 +1,18 @@
+{
+ "utc1": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.1234Z"
+ },
+ "utc2": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.6000Z"
+ },
+ "wita1": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.1234+08:00"
+ },
+ "wita2": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.6000+08:00"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml b/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml
new file mode 100644
index 0000000..24b81f8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml
@@ -0,0 +1,4 @@
+utc1 = 1987-07-05T17:45:56.1234Z
+utc2 = 1987-07-05T17:45:56.6Z
+wita1 = 1987-07-05T17:45:56.1234+08:00
+wita2 = 1987-07-05T17:45:56.6+08:00
diff --git a/tests/data/valid/burntsushi/valid/datetime/timezone.json b/tests/data/valid/burntsushi/valid/datetime/timezone.json
new file mode 100644
index 0000000..8dc8328
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/timezone.json
@@ -0,0 +1,18 @@
+{
+ "nzdt": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56+13:00"
+ },
+ "nzst": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56+12:00"
+ },
+ "pdt": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56-05:00"
+ },
+ "utc": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56Z"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/timezone.toml b/tests/data/valid/burntsushi/valid/datetime/timezone.toml
new file mode 100644
index 0000000..20f3835
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/timezone.toml
@@ -0,0 +1,4 @@
+utc = 1987-07-05T17:45:56Z
+pdt = 1987-07-05T17:45:56-05:00
+nzst = 1987-07-05T17:45:56+12:00
+nzdt = 1987-07-05T17:45:56+13:00 # DST
diff --git a/tests/data/valid/burntsushi/valid/empty-file.json b/tests/data/valid/burntsushi/valid/empty-file.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/empty-file.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/data/valid/burntsushi/valid/empty-file.toml b/tests/data/valid/burntsushi/valid/empty-file.toml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/empty-file.toml
diff --git a/tests/data/valid/burntsushi/valid/example.json b/tests/data/valid/burntsushi/valid/example.json
new file mode 100644
index 0000000..2ea95a2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/example.json
@@ -0,0 +1,26 @@
+{
+ "best-day-ever": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ "numtheory": {
+ "boring": {
+ "type": "bool",
+ "value": "false"
+ },
+ "perfection": [
+ {
+ "type": "integer",
+ "value": "6"
+ },
+ {
+ "type": "integer",
+ "value": "28"
+ },
+ {
+ "type": "integer",
+ "value": "496"
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/example.toml b/tests/data/valid/burntsushi/valid/example.toml
new file mode 100644
index 0000000..8cb02e0
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/example.toml
@@ -0,0 +1,5 @@
+best-day-ever = 1987-07-05T17:45:00Z
+
+[numtheory]
+boring = false
+perfection = [6, 28, 496]
diff --git a/tests/data/valid/burntsushi/valid/float/exponent.json b/tests/data/valid/burntsushi/valid/float/exponent.json
new file mode 100644
index 0000000..e79a6e1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/exponent.json
@@ -0,0 +1,34 @@
+{
+ "lower": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "minustenth": {
+ "type": "float",
+ "value": "-0.1"
+ },
+ "neg": {
+ "type": "float",
+ "value": "0.03"
+ },
+ "pointlower": {
+ "type": "float",
+ "value": "310.0"
+ },
+ "pointupper": {
+ "type": "float",
+ "value": "310.0"
+ },
+ "pos": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "upper": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "zero": {
+ "type": "float",
+ "value": "3.0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/exponent.toml b/tests/data/valid/burntsushi/valid/float/exponent.toml
new file mode 100644
index 0000000..573e0a8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/exponent.toml
@@ -0,0 +1,8 @@
+lower = 3e2
+upper = 3E2
+neg = 3e-2
+pos = 3E+2
+zero = 3e0
+pointlower = 3.1e2
+pointupper = 3.1E2
+minustenth = -1E-1
diff --git a/tests/data/valid/burntsushi/valid/float/float.json b/tests/data/valid/burntsushi/valid/float/float.json
new file mode 100644
index 0000000..f92d8d8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/float.json
@@ -0,0 +1,18 @@
+{
+ "negpi": {
+ "type": "float",
+ "value": "-3.14"
+ },
+ "pi": {
+ "type": "float",
+ "value": "3.14"
+ },
+ "pospi": {
+ "type": "float",
+ "value": "3.14"
+ },
+ "zero-intpart": {
+ "type": "float",
+ "value": "0.123"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/float.toml b/tests/data/valid/burntsushi/valid/float/float.toml
new file mode 100644
index 0000000..5f02322
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/float.toml
@@ -0,0 +1,4 @@
+pi = 3.14
+pospi = +3.14
+negpi = -3.14
+zero-intpart = 0.123
diff --git a/tests/data/valid/burntsushi/valid/float/inf-and-nan.json b/tests/data/valid/burntsushi/valid/float/inf-and-nan.json
new file mode 100644
index 0000000..e3f1ba3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/inf-and-nan.json
@@ -0,0 +1,26 @@
+{
+ "infinity": {
+ "type": "float",
+ "value": "inf"
+ },
+ "infinity_neg": {
+ "type": "float",
+ "value": "-inf"
+ },
+ "infinity_plus": {
+ "type": "float",
+ "value": "+inf"
+ },
+ "nan": {
+ "type": "float",
+ "value": "nan"
+ },
+ "nan_neg": {
+ "type": "float",
+ "value": "nan"
+ },
+ "nan_plus": {
+ "type": "float",
+ "value": "nan"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml b/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml
new file mode 100644
index 0000000..c8f8459
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml
@@ -0,0 +1,8 @@
+# We don't encode +nan and -nan back with the signs; many languages don't
+# support a sign on NaN (it doesn't really make much sense).
+nan = nan
+nan_neg = -nan
+nan_plus = +nan
+infinity = inf
+infinity_neg = -inf
+infinity_plus = +inf
diff --git a/tests/data/valid/burntsushi/valid/float/long.json b/tests/data/valid/burntsushi/valid/float/long.json
new file mode 100644
index 0000000..73d7505
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/long.json
@@ -0,0 +1,10 @@
+{
+ "longpi": {
+ "type": "float",
+ "value": "3.141592653589793"
+ },
+ "neglongpi": {
+ "type": "float",
+ "value": "-3.141592653589793"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/long.toml b/tests/data/valid/burntsushi/valid/float/long.toml
new file mode 100644
index 0000000..9558ae4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/long.toml
@@ -0,0 +1,2 @@
+longpi = 3.141592653589793
+neglongpi = -3.141592653589793
diff --git a/tests/data/valid/burntsushi/valid/float/underscore.json b/tests/data/valid/burntsushi/valid/float/underscore.json
new file mode 100644
index 0000000..f54f7b5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/underscore.json
@@ -0,0 +1,14 @@
+{
+ "after": {
+ "type": "float",
+ "value": "3141.5927"
+ },
+ "before": {
+ "type": "float",
+ "value": "3141.5927"
+ },
+ "exponent": {
+ "type": "float",
+ "value": "3.0e14"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/underscore.toml b/tests/data/valid/burntsushi/valid/float/underscore.toml
new file mode 100644
index 0000000..343353a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/underscore.toml
@@ -0,0 +1,3 @@
+before = 3_141.5927
+after = 3141.592_7
+exponent = 3e1_4
diff --git a/tests/data/valid/burntsushi/valid/float/zero.json b/tests/data/valid/burntsushi/valid/float/zero.json
new file mode 100644
index 0000000..61551e8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/zero.json
@@ -0,0 +1,30 @@
+{
+ "zero": {
+ "type": "float",
+ "value": "0"
+ },
+ "signed-pos": {
+ "type": "float",
+ "value": "0"
+ },
+ "signed-neg": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-two-0": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-signed-pos": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-signed-neg": {
+ "type": "float",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/zero.toml b/tests/data/valid/burntsushi/valid/float/zero.toml
new file mode 100644
index 0000000..e7efb1f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/zero.toml
@@ -0,0 +1,7 @@
+zero = 0.0
+signed-pos = +0.0
+signed-neg = -0.0
+exponent = 0e0
+exponent-two-0 = 0e00
+exponent-signed-pos = +0e0
+exponent-signed-neg = -0e0
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json
new file mode 100644
index 0000000..663a34e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json
@@ -0,0 +1,16 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ },
+ "better": {
+ "type": "integer",
+ "value": "43"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml
new file mode 100644
index 0000000..c0e8865
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml
@@ -0,0 +1,5 @@
+[a.b.c]
+answer = 42
+
+[a]
+better = 43
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json
new file mode 100644
index 0000000..663a34e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json
@@ -0,0 +1,16 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ },
+ "better": {
+ "type": "integer",
+ "value": "43"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml
new file mode 100644
index 0000000..eee68ff
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml
@@ -0,0 +1,5 @@
+[a]
+better = 43
+
+[a.b.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/implicit-groups.json b/tests/data/valid/burntsushi/valid/implicit-groups.json
new file mode 100644
index 0000000..347c693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-groups.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-groups.toml b/tests/data/valid/burntsushi/valid/implicit-groups.toml
new file mode 100644
index 0000000..b6333e4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-groups.toml
@@ -0,0 +1,2 @@
+[a.b.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/inline-table/array.json b/tests/data/valid/burntsushi/valid/inline-table/array.json
new file mode 100644
index 0000000..fe78bf6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/array.json
@@ -0,0 +1,34 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Eric"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Clapton"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bob"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Seger"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/array.toml b/tests/data/valid/burntsushi/valid/inline-table/array.toml
new file mode 100644
index 0000000..3fa60d6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/array.toml
@@ -0,0 +1,3 @@
+people = [{first_name = "Bruce", last_name = "Springsteen"},
+ {first_name = "Eric", last_name = "Clapton"},
+ {first_name = "Bob", last_name = "Seger"}]
diff --git a/tests/data/valid/burntsushi/valid/inline-table/bool.json b/tests/data/valid/burntsushi/valid/inline-table/bool.json
new file mode 100644
index 0000000..717952f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/bool.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "a": {
+ "type": "bool",
+ "value": "true"
+ },
+ "b": {
+ "type": "bool",
+ "value": "false"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/bool.toml b/tests/data/valid/burntsushi/valid/inline-table/bool.toml
new file mode 100644
index 0000000..d228fc2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/bool.toml
@@ -0,0 +1 @@
+a = {a = true, b = false}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/empty.json b/tests/data/valid/burntsushi/valid/inline-table/empty.json
new file mode 100644
index 0000000..28beacf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/empty.json
@@ -0,0 +1,30 @@
+{
+ "empty1": {},
+ "empty2": {},
+ "empty_in_array": [
+ {
+ "not_empty": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {}
+ ],
+ "empty_in_array2": [
+ {},
+ {
+ "not_empty": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ],
+ "many_empty": [
+ {},
+ {},
+ {}
+ ],
+ "nested_empty": {
+ "empty": {}
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/empty.toml b/tests/data/valid/burntsushi/valid/inline-table/empty.toml
new file mode 100644
index 0000000..910d458
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/empty.toml
@@ -0,0 +1,6 @@
+empty1 = {}
+empty2 = { }
+empty_in_array = [ { not_empty = 1 }, {} ]
+empty_in_array2 = [{},{not_empty=1}]
+many_empty = [{},{},{}]
+nested_empty = {"empty"={}}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json
new file mode 100644
index 0000000..90e700a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json
@@ -0,0 +1,16 @@
+{
+ "black": {
+ "allow_prereleases": {
+ "type": "bool",
+ "value": "true"
+ },
+ "python": {
+ "type": "string",
+ "value": "\u003e3.6"
+ },
+ "version": {
+ "type": "string",
+ "value": "\u003e=18.9b0"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml
new file mode 100644
index 0000000..94e5651
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml
@@ -0,0 +1 @@
+black = { python=">3.6", version=">=18.9b0", allow_prereleases=true }
diff --git a/tests/data/valid/burntsushi/valid/inline-table/inline-table.json b/tests/data/valid/burntsushi/valid/inline-table/inline-table.json
new file mode 100644
index 0000000..2468f62
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/inline-table.json
@@ -0,0 +1,48 @@
+{
+ "name": {
+ "first": {
+ "type": "string",
+ "value": "Tom"
+ },
+ "last": {
+ "type": "string",
+ "value": "Preston-Werner"
+ }
+ },
+ "point": {
+ "x": {
+ "type": "integer",
+ "value": "1"
+ },
+ "y": {
+ "type": "integer",
+ "value": "2"
+ }
+ },
+ "simple": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "str-key": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "table-array": [
+ {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {
+ "b": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml b/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml
new file mode 100644
index 0000000..257047e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml
@@ -0,0 +1,5 @@
+name = { first = "Tom", last = "Preston-Werner" }
+point = { x = 1, y = 2 }
+simple = { a = 1 }
+str-key = { "a" = 1 }
+table-array = [{ "a" = 1 }, { "b" = 2 }]
diff --git a/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json
new file mode 100644
index 0000000..3886803
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json
@@ -0,0 +1,140 @@
+{
+ "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/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml
new file mode 100644
index 0000000..e812943
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml
@@ -0,0 +1,23 @@
+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/tests/data/valid/burntsushi/valid/inline-table/multiline.json b/tests/data/valid/burntsushi/valid/inline-table/multiline.json
new file mode 100644
index 0000000..f946d81
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/multiline.json
@@ -0,0 +1,20 @@
+{
+ "tbl_multiline": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ },
+ "b": {
+ "type": "string",
+ "value": "multiline\n"
+ },
+ "c": {
+ "type": "string",
+ "value": "and yet\nanother line"
+ },
+ "d": {
+ "type": "integer",
+ "value": "4"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/multiline.toml b/tests/data/valid/burntsushi/valid/inline-table/multiline.toml
new file mode 100644
index 0000000..a653b18
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/multiline.toml
@@ -0,0 +1,4 @@
+tbl_multiline = { a = 1, b = """
+multiline
+""", c = """and yet
+another line""", d = 4 }
diff --git a/tests/data/valid/burntsushi/valid/inline-table/nest.json b/tests/data/valid/burntsushi/valid/inline-table/nest.json
new file mode 100644
index 0000000..70aebb3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/nest.json
@@ -0,0 +1,64 @@
+{
+ "arr_arr_tbl_empty": [
+ [
+ {}
+ ]
+ ],
+ "arr_arr_tbl_val": [
+ [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ]
+ ],
+ "arr_arr_tbls": [
+ [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {
+ "two": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ ]
+ ],
+ "arr_tbl_tbl": [
+ {
+ "tbl": {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+ ],
+ "tbl_arr_tbl": {
+ "arr_tbl": [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ]
+ },
+ "tbl_tbl_empty": {
+ "tbl_0": {}
+ },
+ "tbl_tbl_val": {
+ "tbl_1": {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/nest.toml b/tests/data/valid/burntsushi/valid/inline-table/nest.toml
new file mode 100644
index 0000000..2624c1d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/nest.toml
@@ -0,0 +1,10 @@
+tbl_tbl_empty = { tbl_0 = {} }
+tbl_tbl_val = { tbl_1 = { one = 1 } }
+tbl_arr_tbl = { arr_tbl = [ { one = 1 } ] }
+arr_tbl_tbl = [ { tbl = { one = 1 } } ]
+
+# Array-of-array-of-table is interesting because it can only
+# be represented in inline form.
+arr_arr_tbl_empty = [ [ {} ] ]
+arr_arr_tbl_val = [ [ { one = 1 } ] ]
+arr_arr_tbls = [ [ { one = 1 }, { two = 2 } ] ]
diff --git a/tests/data/valid/burntsushi/valid/integer/integer.json b/tests/data/valid/burntsushi/valid/integer/integer.json
new file mode 100644
index 0000000..eee9758
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/integer.json
@@ -0,0 +1,18 @@
+{
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "neganswer": {
+ "type": "integer",
+ "value": "-42"
+ },
+ "posanswer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "zero": {
+ "type": "integer",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/integer.toml b/tests/data/valid/burntsushi/valid/integer/integer.toml
new file mode 100644
index 0000000..b62de30
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/integer.toml
@@ -0,0 +1,4 @@
+answer = 42
+posanswer = +42
+neganswer = -42
+zero = 0
diff --git a/tests/data/valid/burntsushi/valid/integer/literals.json b/tests/data/valid/burntsushi/valid/integer/literals.json
new file mode 100644
index 0000000..1a8555b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/literals.json
@@ -0,0 +1,38 @@
+{
+ "bin1": {
+ "type": "integer",
+ "value": "214"
+ },
+ "bin2": {
+ "type": "integer",
+ "value": "5"
+ },
+ "hex1": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex2": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex3": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex4": {
+ "type": "integer",
+ "value": "2439"
+ },
+ "oct1": {
+ "type": "integer",
+ "value": "342391"
+ },
+ "oct2": {
+ "type": "integer",
+ "value": "493"
+ },
+ "oct3": {
+ "type": "integer",
+ "value": "501"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/literals.toml b/tests/data/valid/burntsushi/valid/integer/literals.toml
new file mode 100644
index 0000000..a078590
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/literals.toml
@@ -0,0 +1,11 @@
+bin1 = 0b11010110
+bin2 = 0b1_0_1
+
+oct1 = 0o01234567
+oct2 = 0o755
+oct3 = 0o7_6_5
+
+hex1 = 0xDEADBEEF
+hex2 = 0xdeadbeef
+hex3 = 0xdead_beef
+hex4 = 0x00987
diff --git a/tests/data/valid/burntsushi/valid/integer/long.json b/tests/data/valid/burntsushi/valid/integer/long.json
new file mode 100644
index 0000000..6f4f0a7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/long.json
@@ -0,0 +1,10 @@
+{
+ "int64-max": {
+ "type": "integer",
+ "value": "9223372036854775807"
+ },
+ "int64-max-neg": {
+ "type": "integer",
+ "value": "-9223372036854775808"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/long.toml b/tests/data/valid/burntsushi/valid/integer/long.toml
new file mode 100644
index 0000000..5db5ed7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/long.toml
@@ -0,0 +1,2 @@
+int64-max = 9223372036854775807
+int64-max-neg = -9223372036854775808
diff --git a/tests/data/valid/burntsushi/valid/integer/underscore.json b/tests/data/valid/burntsushi/valid/integer/underscore.json
new file mode 100644
index 0000000..10b9b59
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/underscore.json
@@ -0,0 +1,10 @@
+{
+ "kilo": {
+ "type": "integer",
+ "value": "1000"
+ },
+ "x": {
+ "type": "integer",
+ "value": "1111"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/underscore.toml b/tests/data/valid/burntsushi/valid/integer/underscore.toml
new file mode 100644
index 0000000..7c2da5f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/underscore.toml
@@ -0,0 +1,2 @@
+kilo = 1_000
+x = 1_1_1_1
diff --git a/tests/data/valid/burntsushi/valid/integer/zero.json b/tests/data/valid/burntsushi/valid/integer/zero.json
new file mode 100644
index 0000000..9d5c707
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/zero.json
@@ -0,0 +1,50 @@
+{
+ "a2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "a3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "o1": {
+ "type": "integer",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/zero.toml b/tests/data/valid/burntsushi/valid/integer/zero.toml
new file mode 100644
index 0000000..4687c28
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/zero.toml
@@ -0,0 +1,15 @@
+d1 = 0
+d2 = +0
+d3 = -0
+
+h1 = 0x0
+h2 = 0x00
+h3 = 0x00000
+
+o1 = 0o0
+a2 = 0o00
+a3 = 0o00000
+
+b1 = 0b0
+b2 = 0b00
+b3 = 0b00000
diff --git a/tests/data/valid/burntsushi/valid/key/alphanum.json b/tests/data/valid/burntsushi/valid/key/alphanum.json
new file mode 100644
index 0000000..a54e1d3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/alphanum.json
@@ -0,0 +1,46 @@
+{
+ "000111": {
+ "type": "string",
+ "value": "leading"
+ },
+ "10e3": {
+ "type": "string",
+ "value": "false float"
+ },
+ "123": {
+ "type": "string",
+ "value": "num"
+ },
+ "2018_10": {
+ "001": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "34-11": {
+ "type": "integer",
+ "value": "23"
+ },
+ "a-a-a": {
+ "_": {
+ "type": "bool",
+ "value": "false"
+ }
+ },
+ "alpha": {
+ "type": "string",
+ "value": "a"
+ },
+ "one1two2": {
+ "type": "string",
+ "value": "mixed"
+ },
+ "under_score": {
+ "type": "string",
+ "value": "___"
+ },
+ "with-dash": {
+ "type": "string",
+ "value": "dashed"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/alphanum.toml b/tests/data/valid/burntsushi/valid/key/alphanum.toml
new file mode 100644
index 0000000..0632e9c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/alphanum.toml
@@ -0,0 +1,14 @@
+alpha = "a"
+123 = "num"
+000111 = "leading"
+10e3 = "false float"
+one1two2 = "mixed"
+with-dash = "dashed"
+under_score = "___"
+34-11 = 23
+
+[2018_10]
+001 = 1
+
+[a-a-a]
+_ = false
diff --git a/tests/data/valid/burntsushi/valid/key/case-sensitive.json b/tests/data/valid/burntsushi/valid/key/case-sensitive.json
new file mode 100644
index 0000000..1f205d2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/case-sensitive.json
@@ -0,0 +1,38 @@
+{
+ "Section": {
+ "M": {
+ "type": "string",
+ "value": "latin letter M"
+ },
+ "name": {
+ "type": "string",
+ "value": "different section!!"
+ },
+ "Μ": {
+ "type": "string",
+ "value": "greek capital letter MU"
+ },
+ "μ": {
+ "type": "string",
+ "value": "greek small letter mu"
+ }
+ },
+ "sectioN": {
+ "type": "string",
+ "value": "NN"
+ },
+ "section": {
+ "NAME": {
+ "type": "string",
+ "value": "upper"
+ },
+ "Name": {
+ "type": "string",
+ "value": "capitalized"
+ },
+ "name": {
+ "type": "string",
+ "value": "lower"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/case-sensitive.toml b/tests/data/valid/burntsushi/valid/key/case-sensitive.toml
new file mode 100644
index 0000000..e02b3a5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/case-sensitive.toml
@@ -0,0 +1,13 @@
+sectioN = "NN"
+
+[section]
+name = "lower"
+NAME = "upper"
+Name = "capitalized"
+
+[Section]
+name = "different section!!"
+"μ" = "greek small letter mu"
+"Μ" = "greek capital letter MU"
+M = "latin letter M"
+
diff --git a/tests/data/valid/burntsushi/valid/key/dotted.json b/tests/data/valid/burntsushi/valid/key/dotted.json
new file mode 100644
index 0000000..a527a72
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/dotted.json
@@ -0,0 +1,132 @@
+{
+ "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/tests/data/valid/burntsushi/valid/key/dotted.toml b/tests/data/valid/burntsushi/valid/key/dotted.toml
new file mode 100644
index 0000000..52d62d7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/dotted.toml
@@ -0,0 +1,35 @@
+# 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
+"count"."c" = 3
+"count" . "d" = 4
+'count'.'e' = 5
+'count' . 'f' = 6
+"count".'g' = 7
+"count" . 'h' = 8
+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/tests/data/valid/burntsushi/valid/key/empty.json b/tests/data/valid/burntsushi/valid/key/empty.json
new file mode 100644
index 0000000..44948a9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/empty.json
@@ -0,0 +1,6 @@
+{
+ "": {
+ "type": "string",
+ "value": "blank"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/empty.toml b/tests/data/valid/burntsushi/valid/key/empty.toml
new file mode 100644
index 0000000..0a1640d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/empty.toml
@@ -0,0 +1 @@
+"" = "blank"
diff --git a/tests/data/valid/burntsushi/valid/key/equals-nospace.json b/tests/data/valid/burntsushi/valid/key/equals-nospace.json
new file mode 100644
index 0000000..9394e56
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/equals-nospace.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/equals-nospace.toml b/tests/data/valid/burntsushi/valid/key/equals-nospace.toml
new file mode 100644
index 0000000..560901c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/equals-nospace.toml
@@ -0,0 +1 @@
+answer=42
diff --git a/tests/data/valid/burntsushi/valid/key/escapes.json b/tests/data/valid/burntsushi/valid/key/escapes.json
new file mode 100644
index 0000000..e62b3a1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/escapes.json
@@ -0,0 +1,24 @@
+{
+ "\n": {
+ "type": "string",
+ "value": "newline"
+ },
+ "\"": {
+ "type": "string",
+ "value": "just a quote"
+ },
+ "\"quoted\"": {
+ "quote": {
+ "type": "bool",
+ "value": "true"
+ }
+ },
+ "a.b": {
+ "À": {}
+ },
+ "backsp\u0008\u0008": {},
+ "À": {
+ "type": "string",
+ "value": "latin capital letter A with grave"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/escapes.toml b/tests/data/valid/burntsushi/valid/key/escapes.toml
new file mode 100644
index 0000000..aac3c0a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/escapes.toml
@@ -0,0 +1,10 @@
+"\n" = "newline"
+"\u00c0" = "latin capital letter A with grave"
+"\"" = "just a quote"
+
+["backsp\b\b"]
+
+["\"quoted\""]
+quote = true
+
+["a.b"."\u00c0"]
diff --git a/tests/data/valid/burntsushi/valid/key/numeric-dotted.json b/tests/data/valid/burntsushi/valid/key/numeric-dotted.json
new file mode 100644
index 0000000..43dd4d1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric-dotted.json
@@ -0,0 +1,8 @@
+{
+ "1": {
+ "2": {
+ "type": "integer",
+ "value": "3"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml b/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml
new file mode 100644
index 0000000..538204c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml
@@ -0,0 +1 @@
+1.2 = 3
diff --git a/tests/data/valid/burntsushi/valid/key/numeric.json b/tests/data/valid/burntsushi/valid/key/numeric.json
new file mode 100644
index 0000000..eddb88b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric.json
@@ -0,0 +1,6 @@
+{
+ "1": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/numeric.toml b/tests/data/valid/burntsushi/valid/key/numeric.toml
new file mode 100644
index 0000000..532356f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric.toml
@@ -0,0 +1 @@
+1 = 1
diff --git a/tests/data/valid/burntsushi/valid/key/quoted-dots.json b/tests/data/valid/burntsushi/valid/key/quoted-dots.json
new file mode 100644
index 0000000..1582c5b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/quoted-dots.json
@@ -0,0 +1,32 @@
+{
+ "plain": {
+ "type": "integer",
+ "value": "1"
+ },
+ "plain_table": {
+ "plain": {
+ "type": "integer",
+ "value": "3"
+ },
+ "with.dot": {
+ "type": "integer",
+ "value": "4"
+ }
+ },
+ "table": {
+ "withdot": {
+ "key.with.dots": {
+ "type": "integer",
+ "value": "6"
+ },
+ "plain": {
+ "type": "integer",
+ "value": "5"
+ }
+ }
+ },
+ "with.dot": {
+ "type": "integer",
+ "value": "2"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/quoted-dots.toml b/tests/data/valid/burntsushi/valid/key/quoted-dots.toml
new file mode 100644
index 0000000..65fcddf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/quoted-dots.toml
@@ -0,0 +1,10 @@
+plain = 1
+"with.dot" = 2
+
+[plain_table]
+plain = 3
+"with.dot" = 4
+
+[table.withdot]
+plain = 5
+"key.with.dots" = 6
diff --git a/tests/data/valid/burntsushi/valid/key/space.json b/tests/data/valid/burntsushi/valid/key/space.json
new file mode 100644
index 0000000..6d95f1a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/space.json
@@ -0,0 +1,6 @@
+{
+ "a b": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/space.toml b/tests/data/valid/burntsushi/valid/key/space.toml
new file mode 100644
index 0000000..f4f36c4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/space.toml
@@ -0,0 +1 @@
+"a b" = 1
diff --git a/tests/data/valid/burntsushi/valid/key/special-chars.json b/tests/data/valid/burntsushi/valid/key/special-chars.json
new file mode 100644
index 0000000..6084047
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-chars.json
@@ -0,0 +1,6 @@
+{
+ "~!@$^\u0026*()_+-`1234567890[]|/?\u003e\u003c.,;:'": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/special-chars.toml b/tests/data/valid/burntsushi/valid/key/special-chars.toml
new file mode 100644
index 0000000..cc572be
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-chars.toml
@@ -0,0 +1 @@
+"~!@$^&*()_+-`1234567890[]|/?><.,;:'" = 1
diff --git a/tests/data/valid/burntsushi/valid/key/special-word.json b/tests/data/valid/burntsushi/valid/key/special-word.json
new file mode 100644
index 0000000..59ce693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-word.json
@@ -0,0 +1,18 @@
+{
+ "false": {
+ "type": "bool",
+ "value": "false"
+ },
+ "inf": {
+ "type": "integer",
+ "value": "100000000"
+ },
+ "nan": {
+ "type": "string",
+ "value": "ceci n'est pas un nombre"
+ },
+ "true": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/special-word.toml b/tests/data/valid/burntsushi/valid/key/special-word.toml
new file mode 100644
index 0000000..0b836f1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-word.toml
@@ -0,0 +1,5 @@
+false = false
+true = 1
+inf = 100000000
+nan = "ceci n'est pas un nombre"
+
diff --git a/tests/data/valid/burntsushi/valid/newline-crlf.json b/tests/data/valid/burntsushi/valid/newline-crlf.json
new file mode 100644
index 0000000..acf617e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-crlf.json
@@ -0,0 +1,10 @@
+{
+ "newline": {
+ "type": "string",
+ "value": "crlf"
+ },
+ "os": {
+ "type": "string",
+ "value": "DOS"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/newline-crlf.toml b/tests/data/valid/burntsushi/valid/newline-crlf.toml
new file mode 100644
index 0000000..0030024
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-crlf.toml
@@ -0,0 +1,2 @@
+os = "DOS"
+newline = "crlf"
diff --git a/tests/data/valid/burntsushi/valid/newline-lf.json b/tests/data/valid/burntsushi/valid/newline-lf.json
new file mode 100644
index 0000000..66cf871
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-lf.json
@@ -0,0 +1,10 @@
+{
+ "newline": {
+ "type": "string",
+ "value": "lf"
+ },
+ "os": {
+ "type": "string",
+ "value": "unix"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/newline-lf.toml b/tests/data/valid/burntsushi/valid/newline-lf.toml
new file mode 100644
index 0000000..0f3377c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-lf.toml
@@ -0,0 +1,2 @@
+os = "unix"
+newline = "lf"
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1-compact.json b/tests/data/valid/burntsushi/valid/spec-example-1-compact.json
new file mode 100644
index 0000000..9f4078a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1-compact.json
@@ -0,0 +1,100 @@
+{
+ "clients": {
+ "data": [
+ [
+ {
+ "type": "string",
+ "value": "gamma"
+ },
+ {
+ "type": "string",
+ "value": "delta"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ]
+ ],
+ "hosts": [
+ {
+ "type": "string",
+ "value": "alpha"
+ },
+ {
+ "type": "string",
+ "value": "omega"
+ }
+ ]
+ },
+ "database": {
+ "connection_max": {
+ "type": "integer",
+ "value": "5000"
+ },
+ "enabled": {
+ "type": "bool",
+ "value": "true"
+ },
+ "ports": [
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8002"
+ }
+ ],
+ "server": {
+ "type": "string",
+ "value": "192.168.1.1"
+ }
+ },
+ "owner": {
+ "dob": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00-08:00"
+ },
+ "name": {
+ "type": "string",
+ "value": "Lance Uppercut"
+ }
+ },
+ "servers": {
+ "alpha": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.1"
+ }
+ },
+ "beta": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.2"
+ }
+ }
+ },
+ "title": {
+ "type": "string",
+ "value": "TOML Example"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml b/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml
new file mode 100644
index 0000000..15e2b84
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml
@@ -0,0 +1,23 @@
+#Useless spaces eliminated.
+title="TOML Example"
+[owner]
+name="Lance Uppercut"
+dob=1979-05-27T07:32:00-08:00#First class dates
+[database]
+server="192.168.1.1"
+ports=[8001,8001,8002]
+connection_max=5000
+enabled=true
+[servers]
+[servers.alpha]
+ip="10.0.0.1"
+dc="eqdc10"
+[servers.beta]
+ip="10.0.0.2"
+dc="eqdc10"
+[clients]
+data=[["gamma","delta"],[1,2]]
+hosts=[
+"alpha",
+"omega"
+]
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1.json b/tests/data/valid/burntsushi/valid/spec-example-1.json
new file mode 100644
index 0000000..9f4078a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1.json
@@ -0,0 +1,100 @@
+{
+ "clients": {
+ "data": [
+ [
+ {
+ "type": "string",
+ "value": "gamma"
+ },
+ {
+ "type": "string",
+ "value": "delta"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ]
+ ],
+ "hosts": [
+ {
+ "type": "string",
+ "value": "alpha"
+ },
+ {
+ "type": "string",
+ "value": "omega"
+ }
+ ]
+ },
+ "database": {
+ "connection_max": {
+ "type": "integer",
+ "value": "5000"
+ },
+ "enabled": {
+ "type": "bool",
+ "value": "true"
+ },
+ "ports": [
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8002"
+ }
+ ],
+ "server": {
+ "type": "string",
+ "value": "192.168.1.1"
+ }
+ },
+ "owner": {
+ "dob": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00-08:00"
+ },
+ "name": {
+ "type": "string",
+ "value": "Lance Uppercut"
+ }
+ },
+ "servers": {
+ "alpha": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.1"
+ }
+ },
+ "beta": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.2"
+ }
+ }
+ },
+ "title": {
+ "type": "string",
+ "value": "TOML Example"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1.toml b/tests/data/valid/burntsushi/valid/spec-example-1.toml
new file mode 100644
index 0000000..52fd1e8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1.toml
@@ -0,0 +1,33 @@
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Lance Uppercut"
+dob = 1979-05-27T07:32:00-08:00 # First class dates? Why not?
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # You can indent as you please. Tabs or spaces. TOML don't care.
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ]
+
+# Line breaks are OK when inside arrays
+hosts = [
+ "alpha",
+ "omega"
+]
diff --git a/tests/data/valid/burntsushi/valid/string/double-quote-escape.json b/tests/data/valid/burntsushi/valid/string/double-quote-escape.json
new file mode 100644
index 0000000..0c4ac37
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/double-quote-escape.json
@@ -0,0 +1,6 @@
+{
+ "test": {
+ "type": "string",
+ "value": "\"one\""
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml b/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml
new file mode 100644
index 0000000..78e7e72
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml
@@ -0,0 +1 @@
+test = "\"one\""
diff --git a/tests/data/valid/burntsushi/valid/string/empty.json b/tests/data/valid/burntsushi/valid/string/empty.json
new file mode 100644
index 0000000..efe96c3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/empty.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": ""
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/empty.toml b/tests/data/valid/burntsushi/valid/string/empty.toml
new file mode 100644
index 0000000..e37e681
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/empty.toml
@@ -0,0 +1 @@
+answer = ""
diff --git a/tests/data/valid/burntsushi/valid/string/escape-tricky.json b/tests/data/valid/burntsushi/valid/string/escape-tricky.json
new file mode 100644
index 0000000..572e0a5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escape-tricky.json
@@ -0,0 +1,30 @@
+{
+ "end_esc": {
+ "type": "string",
+ "value": "String does not end here\" but ends here\\"
+ },
+ "lit_end_esc": {
+ "type": "string",
+ "value": "String ends here\\"
+ },
+ "lit_multiline_end": {
+ "type": "string",
+ "value": "There is no escape\\"
+ },
+ "lit_multiline_not_unicode": {
+ "type": "string",
+ "value": "\\u007f"
+ },
+ "multiline_end_esc": {
+ "type": "string",
+ "value": "When will it end? \"\"\"...\"\"\" should be here\""
+ },
+ "multiline_not_unicode": {
+ "type": "string",
+ "value": "\\u0041"
+ },
+ "multiline_unicode": {
+ "type": "string",
+ "value": " "
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escape-tricky.toml b/tests/data/valid/burntsushi/valid/string/escape-tricky.toml
new file mode 100644
index 0000000..dc204cb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escape-tricky.toml
@@ -0,0 +1,15 @@
+end_esc = "String does not end here\" but ends here\\"
+lit_end_esc = 'String ends here\'
+
+multiline_unicode = """
+\u00a0"""
+
+multiline_not_unicode = """
+\\u0041"""
+
+multiline_end_esc = """When will it end? \"""...""\" should be here\""""
+
+lit_multiline_not_unicode = '''
+\u007f'''
+
+lit_multiline_end = '''There is no escape\'''
diff --git a/tests/data/valid/burntsushi/valid/string/escaped-escape.json b/tests/data/valid/burntsushi/valid/string/escaped-escape.json
new file mode 100644
index 0000000..112c0c9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escaped-escape.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "\\x64"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escaped-escape.toml b/tests/data/valid/burntsushi/valid/string/escaped-escape.toml
new file mode 100644
index 0000000..d575876
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escaped-escape.toml
@@ -0,0 +1 @@
+answer = "\\x64"
diff --git a/tests/data/valid/burntsushi/valid/string/escapes.json b/tests/data/valid/burntsushi/valid/string/escapes.json
new file mode 100644
index 0000000..d849574
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escapes.json
@@ -0,0 +1,54 @@
+{
+ "backslash": {
+ "type": "string",
+ "value": "This string has a \\ backslash character."
+ },
+ "backspace": {
+ "type": "string",
+ "value": "This string has a \u0008 backspace character."
+ },
+ "carriage": {
+ "type": "string",
+ "value": "This string has a \r carriage return character."
+ },
+ "delete": {
+ "type": "string",
+ "value": "This string has a  delete control code."
+ },
+ "formfeed": {
+ "type": "string",
+ "value": "This string has a \u000c form feed character."
+ },
+ "newline": {
+ "type": "string",
+ "value": "This string has a \n new line character."
+ },
+ "notunicode1": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "notunicode2": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "notunicode3": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u0075 escape."
+ },
+ "notunicode4": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "quote": {
+ "type": "string",
+ "value": "This string has a \" quote character."
+ },
+ "tab": {
+ "type": "string",
+ "value": "This string has a \t tab character."
+ },
+ "unitseparator": {
+ "type": "string",
+ "value": "This string has a \u001f unit separator control code."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escapes.toml b/tests/data/valid/burntsushi/valid/string/escapes.toml
new file mode 100644
index 0000000..78f7ebd
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escapes.toml
@@ -0,0 +1,13 @@
+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."
diff --git a/tests/data/valid/burntsushi/valid/string/multiline-quotes.json b/tests/data/valid/burntsushi/valid/string/multiline-quotes.json
new file mode 100644
index 0000000..c134f67
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline-quotes.json
@@ -0,0 +1,42 @@
+{
+ "lit_one": {
+ "type": "string",
+ "value": "'one quote'"
+ },
+ "lit_one_space": {
+ "type": "string",
+ "value": " 'one quote' "
+ },
+ "lit_two": {
+ "type": "string",
+ "value": "''two quotes''"
+ },
+ "lit_two_space": {
+ "type": "string",
+ "value": " ''two quotes'' "
+ },
+ "mismatch1": {
+ "type": "string",
+ "value": "aaa'''bbb"
+ },
+ "mismatch2": {
+ "type": "string",
+ "value": "aaa\"\"\"bbb"
+ },
+ "one": {
+ "type": "string",
+ "value": "\"one quote\""
+ },
+ "one_space": {
+ "type": "string",
+ "value": " \"one quote\" "
+ },
+ "two": {
+ "type": "string",
+ "value": "\"\"two quotes\"\""
+ },
+ "two_space": {
+ "type": "string",
+ "value": " \"\"two quotes\"\" "
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml b/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml
new file mode 100644
index 0000000..e138e2f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml
@@ -0,0 +1,15 @@
+# Make sure that quotes inside multiline strings are allowed, including right
+# after the opening '''/""" and before the closing '''/"""
+
+lit_one = ''''one quote''''
+lit_two = '''''two quotes'''''
+lit_one_space = ''' 'one quote' '''
+lit_two_space = ''' ''two quotes'' '''
+
+one = """"one quote""""
+two = """""two quotes"""""
+one_space = """ "one quote" """
+two_space = """ ""two quotes"" """
+
+mismatch1 = """aaa'''bbb"""
+mismatch2 = '''aaa"""bbb'''
diff --git a/tests/data/valid/burntsushi/valid/string/multiline.json b/tests/data/valid/burntsushi/valid/string/multiline.json
new file mode 100644
index 0000000..66e572b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline.json
@@ -0,0 +1,54 @@
+{
+ "equivalent_one": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "equivalent_three": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "equivalent_two": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "escape-bs-1": {
+ "type": "string",
+ "value": "a \\\nb"
+ },
+ "escape-bs-2": {
+ "type": "string",
+ "value": "a \\b"
+ },
+ "escape-bs-3": {
+ "type": "string",
+ "value": "a \\\\\n b"
+ },
+ "keep-ws-before": {
+ "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"
+ },
+ "whitespace-after-bs": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/multiline.toml b/tests/data/valid/burntsushi/valid/string/multiline.toml
new file mode 100644
index 0000000..f3b3c2e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline.toml
@@ -0,0 +1,52 @@
+# 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 \
+
+
+ fox jumps over \
+ the lazy dog."""
+
+equivalent_three = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
+
+whitespace-after-bs = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
+
+no-space = """a\
+ b"""
+
+# Has tab character.
+keep-ws-before = """a \
+ b"""
+
+escape-bs-1 = """a \\
+b"""
+
+escape-bs-2 = """a \\\
+b"""
+
+escape-bs-3 = """a \\\\
+ b"""
diff --git a/tests/data/valid/burntsushi/valid/string/nl.json b/tests/data/valid/burntsushi/valid/string/nl.json
new file mode 100644
index 0000000..8eae09a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/nl.json
@@ -0,0 +1,22 @@
+{
+ "lit_nl_end": {
+ "type": "string",
+ "value": "value\\n"
+ },
+ "lit_nl_mid": {
+ "type": "string",
+ "value": "val\\nue"
+ },
+ "lit_nl_uni": {
+ "type": "string",
+ "value": "val\\ue"
+ },
+ "nl_end": {
+ "type": "string",
+ "value": "value\n"
+ },
+ "nl_mid": {
+ "type": "string",
+ "value": "val\nue"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/nl.toml b/tests/data/valid/burntsushi/valid/string/nl.toml
new file mode 100644
index 0000000..1e09a8b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/nl.toml
@@ -0,0 +1,6 @@
+nl_mid = "val\nue"
+nl_end = """value\n"""
+
+lit_nl_end = '''value\n'''
+lit_nl_mid = 'val\nue'
+lit_nl_uni = 'val\ue'
diff --git a/tests/data/valid/burntsushi/valid/string/raw-multiline.json b/tests/data/valid/burntsushi/valid/string/raw-multiline.json
new file mode 100644
index 0000000..4d195ec
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw-multiline.json
@@ -0,0 +1,14 @@
+{
+ "firstnl": {
+ "type": "string",
+ "value": "This string has a ' quote character."
+ },
+ "multiline": {
+ "type": "string",
+ "value": "This string\nhas ' a quote character\nand more than\none newline\nin it."
+ },
+ "oneline": {
+ "type": "string",
+ "value": "This string has a ' quote character."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/raw-multiline.toml b/tests/data/valid/burntsushi/valid/string/raw-multiline.toml
new file mode 100644
index 0000000..293f803
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw-multiline.toml
@@ -0,0 +1,14 @@
+# Single ' should be allowed.
+oneline = '''This string has a ' quote character.'''
+
+# A newline immediately following the opening delimiter will be trimmed.
+firstnl = '''
+This string has a ' quote character.'''
+
+# All other whitespace and newline characters remain intact.
+multiline = '''
+This string
+has ' a quote character
+and more than
+one newline
+in it.'''
diff --git a/tests/data/valid/burntsushi/valid/string/raw.json b/tests/data/valid/burntsushi/valid/string/raw.json
new file mode 100644
index 0000000..6b753a3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw.json
@@ -0,0 +1,30 @@
+{
+ "backslash": {
+ "type": "string",
+ "value": "This string has a \\\\ backslash character."
+ },
+ "backspace": {
+ "type": "string",
+ "value": "This string has a \\b backspace character."
+ },
+ "carriage": {
+ "type": "string",
+ "value": "This string has a \\r carriage return character."
+ },
+ "formfeed": {
+ "type": "string",
+ "value": "This string has a \\f form feed character."
+ },
+ "newline": {
+ "type": "string",
+ "value": "This string has a \\n new line character."
+ },
+ "slash": {
+ "type": "string",
+ "value": "This string has a \\/ slash character."
+ },
+ "tab": {
+ "type": "string",
+ "value": "This string has a \\t tab character."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/raw.toml b/tests/data/valid/burntsushi/valid/string/raw.toml
new file mode 100644
index 0000000..92acd25
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw.toml
@@ -0,0 +1,7 @@
+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.'
+slash = 'This string has a \/ slash character.'
+backslash = 'This string has a \\ backslash character.'
diff --git a/tests/data/valid/burntsushi/valid/string/simple.json b/tests/data/valid/burntsushi/valid/string/simple.json
new file mode 100644
index 0000000..2561cda
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/simple.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "You are not drinking enough whisky."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/simple.toml b/tests/data/valid/burntsushi/valid/string/simple.toml
new file mode 100644
index 0000000..e17ade6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/simple.toml
@@ -0,0 +1 @@
+answer = "You are not drinking enough whisky."
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-escape.json b/tests/data/valid/burntsushi/valid/string/unicode-escape.json
new file mode 100644
index 0000000..9ae728b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-escape.json
@@ -0,0 +1,10 @@
+{
+ "answer4": {
+ "type": "string",
+ "value": "δ"
+ },
+ "answer8": {
+ "type": "string",
+ "value": "δ"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-escape.toml b/tests/data/valid/burntsushi/valid/string/unicode-escape.toml
new file mode 100644
index 0000000..82faecb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-escape.toml
@@ -0,0 +1,2 @@
+answer4 = "\u03B4"
+answer8 = "\U000003B4"
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-literal.json b/tests/data/valid/burntsushi/valid/string/unicode-literal.json
new file mode 100644
index 0000000..7f15df4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-literal.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "δ"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-literal.toml b/tests/data/valid/burntsushi/valid/string/unicode-literal.toml
new file mode 100644
index 0000000..c65723c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-literal.toml
@@ -0,0 +1 @@
+answer = "δ"
diff --git a/tests/data/valid/burntsushi/valid/string/with-pound.json b/tests/data/valid/burntsushi/valid/string/with-pound.json
new file mode 100644
index 0000000..2cb8beb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/with-pound.json
@@ -0,0 +1,10 @@
+{
+ "pound": {
+ "type": "string",
+ "value": "We see no # comments here."
+ },
+ "poundcomment": {
+ "type": "string",
+ "value": "But there are # some comments here."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/with-pound.toml b/tests/data/valid/burntsushi/valid/string/with-pound.toml
new file mode 100644
index 0000000..5fd8746
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/with-pound.toml
@@ -0,0 +1,2 @@
+pound = "We see no # comments here."
+poundcomment = "But there are # some comments here." # Did I # mess you up?
diff --git a/tests/data/valid/burntsushi/valid/table/array-implicit.json b/tests/data/valid/burntsushi/valid/table/array-implicit.json
new file mode 100644
index 0000000..ee164c5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-implicit.json
@@ -0,0 +1,12 @@
+{
+ "albums": {
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Glory Days"
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-implicit.toml b/tests/data/valid/burntsushi/valid/table/array-implicit.toml
new file mode 100644
index 0000000..3157ac9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-implicit.toml
@@ -0,0 +1,2 @@
+[[albums.songs]]
+name = "Glory Days"
diff --git a/tests/data/valid/burntsushi/valid/table/array-many.json b/tests/data/valid/burntsushi/valid/table/array-many.json
new file mode 100644
index 0000000..fe78bf6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-many.json
@@ -0,0 +1,34 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Eric"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Clapton"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bob"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Seger"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-many.toml b/tests/data/valid/burntsushi/valid/table/array-many.toml
new file mode 100644
index 0000000..46062be
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-many.toml
@@ -0,0 +1,11 @@
+[[people]]
+first_name = "Bruce"
+last_name = "Springsteen"
+
+[[people]]
+first_name = "Eric"
+last_name = "Clapton"
+
+[[people]]
+first_name = "Bob"
+last_name = "Seger"
diff --git a/tests/data/valid/burntsushi/valid/table/array-nest.json b/tests/data/valid/burntsushi/valid/table/array-nest.json
new file mode 100644
index 0000000..97f55c8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-nest.json
@@ -0,0 +1,44 @@
+{
+ "albums": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Born to Run"
+ },
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Jungleland"
+ }
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Meeting Across the River"
+ }
+ }
+ ]
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Born in the USA"
+ },
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Glory Days"
+ }
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Dancing in the Dark"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-nest.toml b/tests/data/valid/burntsushi/valid/table/array-nest.toml
new file mode 100644
index 0000000..d659a3d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-nest.toml
@@ -0,0 +1,17 @@
+[[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"
diff --git a/tests/data/valid/burntsushi/valid/table/array-one.json b/tests/data/valid/burntsushi/valid/table/array-one.json
new file mode 100644
index 0000000..5cd67de
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-one.json
@@ -0,0 +1,14 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-one.toml b/tests/data/valid/burntsushi/valid/table/array-one.toml
new file mode 100644
index 0000000..cd7e1b6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-one.toml
@@ -0,0 +1,3 @@
+[[people]]
+first_name = "Bruce"
+last_name = "Springsteen"
diff --git a/tests/data/valid/burntsushi/valid/table/array-table-array.json b/tests/data/valid/burntsushi/valid/table/array-table-array.json
new file mode 100644
index 0000000..5c3d649
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-table-array.json
@@ -0,0 +1,24 @@
+{
+ "a": [
+ {
+ "b": [
+ {
+ "c": {
+ "d": {
+ "type": "string",
+ "value": "val0"
+ }
+ }
+ },
+ {
+ "c": {
+ "d": {
+ "type": "string",
+ "value": "val1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-table-array.toml b/tests/data/valid/burntsushi/valid/table/array-table-array.toml
new file mode 100644
index 0000000..a07b0c7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-table-array.toml
@@ -0,0 +1,7 @@
+[[a]]
+ [[a.b]]
+ [a.b.c]
+ d = "val0"
+ [[a.b]]
+ [a.b.c]
+ d = "val1"
diff --git a/tests/data/valid/burntsushi/valid/table/empty.json b/tests/data/valid/burntsushi/valid/table/empty.json
new file mode 100644
index 0000000..3e82cda
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/empty.json
@@ -0,0 +1,3 @@
+{
+ "a": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/empty.toml b/tests/data/valid/burntsushi/valid/table/empty.toml
new file mode 100644
index 0000000..8bb6a0a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/empty.toml
@@ -0,0 +1 @@
+[a]
diff --git a/tests/data/valid/burntsushi/valid/table/keyword.json b/tests/data/valid/burntsushi/valid/table/keyword.json
new file mode 100644
index 0000000..a15dfae
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/keyword.json
@@ -0,0 +1,6 @@
+{
+ "true": {},
+ "false": {},
+ "inf": {},
+ "nan": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/keyword.toml b/tests/data/valid/burntsushi/valid/table/keyword.toml
new file mode 100644
index 0000000..bc3d52a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/keyword.toml
@@ -0,0 +1,9 @@
+[true]
+
+[false]
+
+[inf]
+
+[nan]
+
+
diff --git a/tests/data/valid/burntsushi/valid/table/names.json b/tests/data/valid/burntsushi/valid/table/names.json
new file mode 100644
index 0000000..66d8ea5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/names.json
@@ -0,0 +1,30 @@
+{
+ "a": {
+ " x ": {},
+ "b": {
+ "c": {}
+ },
+ "b.c": {},
+ "d.e": {}
+ },
+ "d": {
+ "e": {
+ "f": {}
+ }
+ },
+ "g": {
+ "h": {
+ "i": {}
+ }
+ },
+ "j": {
+ "ʞ": {
+ "l": {}
+ }
+ },
+ "x": {
+ "1": {
+ "2": {}
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/names.toml b/tests/data/valid/burntsushi/valid/table/names.toml
new file mode 100644
index 0000000..092da2f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/names.toml
@@ -0,0 +1,9 @@
+[a.b.c]
+[a."b.c"]
+[a.'d.e']
+[a.' x ']
+[ d.e.f ]
+[ g . h . i ]
+[ j . "ʞ" . 'l' ]
+
+[x.1.2]
diff --git a/tests/data/valid/burntsushi/valid/table/no-eol.json b/tests/data/valid/burntsushi/valid/table/no-eol.json
new file mode 100644
index 0000000..b6e7fb5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/no-eol.json
@@ -0,0 +1,3 @@
+{
+ "table": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/no-eol.toml b/tests/data/valid/burntsushi/valid/table/no-eol.toml
new file mode 100644
index 0000000..f1098fd
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/no-eol.toml
@@ -0,0 +1 @@
+[table]
diff --git a/tests/data/valid/burntsushi/valid/table/sub-empty.json b/tests/data/valid/burntsushi/valid/table/sub-empty.json
new file mode 100644
index 0000000..ed10cd2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/sub-empty.json
@@ -0,0 +1,5 @@
+{
+ "a": {
+ "b": {}
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/sub-empty.toml b/tests/data/valid/burntsushi/valid/table/sub-empty.toml
new file mode 100644
index 0000000..70b7fe1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/sub-empty.toml
@@ -0,0 +1,2 @@
+[a]
+[a.b]
diff --git a/tests/data/valid/burntsushi/valid/table/whitespace.json b/tests/data/valid/burntsushi/valid/table/whitespace.json
new file mode 100644
index 0000000..c770470
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/whitespace.json
@@ -0,0 +1,3 @@
+{
+ "valid key": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/whitespace.toml b/tests/data/valid/burntsushi/valid/table/whitespace.toml
new file mode 100644
index 0000000..daf881d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/whitespace.toml
@@ -0,0 +1 @@
+["valid key"]
diff --git a/tests/data/valid/burntsushi/valid/table/with-literal-string.json b/tests/data/valid/burntsushi/valid/table/with-literal-string.json
new file mode 100644
index 0000000..7784695
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-literal-string.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "\"b\"": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-literal-string.toml b/tests/data/valid/burntsushi/valid/table/with-literal-string.toml
new file mode 100644
index 0000000..b81643d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-literal-string.toml
@@ -0,0 +1,4 @@
+['a']
+[a.'"b"']
+[a.'"b"'.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/with-pound.json b/tests/data/valid/burntsushi/valid/table/with-pound.json
new file mode 100644
index 0000000..f32d2f2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-pound.json
@@ -0,0 +1,8 @@
+{
+ "key#group": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-pound.toml b/tests/data/valid/burntsushi/valid/table/with-pound.toml
new file mode 100644
index 0000000..33f2c4f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-pound.toml
@@ -0,0 +1,2 @@
+["key#group"]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/with-single-quotes.json b/tests/data/valid/burntsushi/valid/table/with-single-quotes.json
new file mode 100644
index 0000000..347c693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-single-quotes.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml b/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml
new file mode 100644
index 0000000..56e52cc
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml
@@ -0,0 +1,4 @@
+['a']
+[a.'b']
+[a.'b'.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/without-super.json b/tests/data/valid/burntsushi/valid/table/without-super.json
new file mode 100644
index 0000000..3c390c6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/without-super.json
@@ -0,0 +1,9 @@
+{
+ "x": {
+ "y": {
+ "z": {
+ "w": {}
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/without-super.toml b/tests/data/valid/burntsushi/valid/table/without-super.toml
new file mode 100644
index 0000000..73ed68b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/without-super.toml
@@ -0,0 +1,5 @@
+# [x] you
+# [x.y] don't
+# [x.y.z] need these
+[x.y.z.w] # for this to work
+[x] # defining a super-table afterwards is ok