Files
go-toml/toml_testgen_test.go
T
Thomas Pelletier 405d48dc28 Port toml-test to pure Go (#264)
* Port toml-test to pure Go

This change basically ports the toml-test examples test suite to pure
Go. This removes the snowflake test.sh required to run such tests, and
allows us to the example tests on any platform (which includes Windows
as part of the pull-request testing).

* Allow CircleCI failure for go tip
2019-03-20 00:23:14 -07:00

944 lines
22 KiB
Go

// Generated by tomltestgen for toml-test ref 39e37e6 on 2019-03-19T23:58:45-07:00
package toml
import (
"testing"
)
func TestInvalidArrayMixedTypesArraysAndInts(t *testing.T) {
input := `arrays-and-ints = [1, ["Arrays are not integers."]]`
testgenInvalid(t, input)
}
func TestInvalidArrayMixedTypesIntsAndFloats(t *testing.T) {
input := `ints-and-floats = [1, 1.1]`
testgenInvalid(t, input)
}
func TestInvalidArrayMixedTypesStringsAndInts(t *testing.T) {
input := `strings-and-ints = ["hi", 42]`
testgenInvalid(t, input)
}
func TestInvalidDatetimeMalformedNoLeads(t *testing.T) {
input := `no-leads = 1987-7-05T17:45:00Z`
testgenInvalid(t, input)
}
func TestInvalidDatetimeMalformedNoSecs(t *testing.T) {
input := `no-secs = 1987-07-05T17:45Z`
testgenInvalid(t, input)
}
func TestInvalidDatetimeMalformedNoT(t *testing.T) {
input := `no-t = 1987-07-0517:45:00Z`
testgenInvalid(t, input)
}
func TestInvalidDatetimeMalformedWithMilli(t *testing.T) {
input := `with-milli = 1987-07-5T17:45:00.12Z`
testgenInvalid(t, input)
}
func TestInvalidDuplicateKeyTable(t *testing.T) {
input := `[fruit]
type = "apple"
[fruit.type]
apple = "yes"`
testgenInvalid(t, input)
}
func TestInvalidDuplicateKeys(t *testing.T) {
input := `dupe = false
dupe = true`
testgenInvalid(t, input)
}
func TestInvalidDuplicateTables(t *testing.T) {
input := `[a]
[a]`
testgenInvalid(t, input)
}
func TestInvalidEmptyImplicitTable(t *testing.T) {
input := `[naughty..naughty]`
testgenInvalid(t, input)
}
func TestInvalidEmptyTable(t *testing.T) {
input := `[]`
testgenInvalid(t, input)
}
func TestInvalidFloatNoLeadingZero(t *testing.T) {
input := `answer = .12345
neganswer = -.12345`
testgenInvalid(t, input)
}
func TestInvalidFloatNoTrailingDigits(t *testing.T) {
input := `answer = 1.
neganswer = -1.`
testgenInvalid(t, input)
}
func TestInvalidKeyEmpty(t *testing.T) {
input := ` = 1`
testgenInvalid(t, input)
}
func TestInvalidKeyHash(t *testing.T) {
input := `a# = 1`
testgenInvalid(t, input)
}
func TestInvalidKeyNewline(t *testing.T) {
input := `a
= 1`
testgenInvalid(t, input)
}
func TestInvalidKeyOpenBracket(t *testing.T) {
input := `[abc = 1`
testgenInvalid(t, input)
}
func TestInvalidKeySingleOpenBracket(t *testing.T) {
input := `[`
testgenInvalid(t, input)
}
func TestInvalidKeySpace(t *testing.T) {
input := `a b = 1`
testgenInvalid(t, input)
}
func TestInvalidKeyStartBracket(t *testing.T) {
input := `[a]
[xyz = 5
[b]`
testgenInvalid(t, input)
}
func TestInvalidKeyTwoEquals(t *testing.T) {
input := `key= = 1`
testgenInvalid(t, input)
}
func TestInvalidStringBadByteEscape(t *testing.T) {
input := `naughty = "\xAg"`
testgenInvalid(t, input)
}
func TestInvalidStringBadEscape(t *testing.T) {
input := `invalid-escape = "This string has a bad \a escape character."`
testgenInvalid(t, input)
}
func TestInvalidStringByteEscapes(t *testing.T) {
input := `answer = "\x33"`
testgenInvalid(t, input)
}
func TestInvalidStringNoClose(t *testing.T) {
input := `no-ending-quote = "One time, at band camp`
testgenInvalid(t, input)
}
func TestInvalidTableArrayImplicit(t *testing.T) {
input := "# This test is a bit tricky. It should fail because the first use of\n" +
"# `[[albums.songs]]` without first declaring `albums` implies that `albums`\n" +
"# must be a table. The alternative would be quite weird. Namely, it wouldn't\n" +
"# comply with the TOML spec: \"Each double-bracketed sub-table will belong to \n" +
"# the most *recently* defined table element *above* it.\"\n" +
"#\n" +
"# This is in contrast to the *valid* test, table-array-implicit where\n" +
"# `[[albums.songs]]` works by itself, so long as `[[albums]]` isn't declared\n" +
"# later. (Although, `[albums]` could be.)\n" +
"[[albums.songs]]\n" +
"name = \"Glory Days\"\n" +
"\n" +
"[[albums]]\n" +
"name = \"Born in the USA\"\n"
testgenInvalid(t, input)
}
func TestInvalidTableArrayMalformedBracket(t *testing.T) {
input := `[[albums]
name = "Born to Run"`
testgenInvalid(t, input)
}
func TestInvalidTableArrayMalformedEmpty(t *testing.T) {
input := `[[]]
name = "Born to Run"`
testgenInvalid(t, input)
}
func TestInvalidTableEmpty(t *testing.T) {
input := `[]`
testgenInvalid(t, input)
}
func TestInvalidTableNestedBracketsClose(t *testing.T) {
input := `[a]b]
zyx = 42`
testgenInvalid(t, input)
}
func TestInvalidTableNestedBracketsOpen(t *testing.T) {
input := `[a[b]
zyx = 42`
testgenInvalid(t, input)
}
func TestInvalidTableWhitespace(t *testing.T) {
input := `[invalid key]`
testgenInvalid(t, input)
}
func TestInvalidTableWithPound(t *testing.T) {
input := `[key#group]
answer = 42`
testgenInvalid(t, input)
}
func TestInvalidTextAfterArrayEntries(t *testing.T) {
input := `array = [
"Is there life after an array separator?", No
"Entry"
]`
testgenInvalid(t, input)
}
func TestInvalidTextAfterInteger(t *testing.T) {
input := `answer = 42 the ultimate answer?`
testgenInvalid(t, input)
}
func TestInvalidTextAfterString(t *testing.T) {
input := `string = "Is there life after strings?" No.`
testgenInvalid(t, input)
}
func TestInvalidTextAfterTable(t *testing.T) {
input := `[error] this shouldn't be here`
testgenInvalid(t, input)
}
func TestInvalidTextBeforeArraySeparator(t *testing.T) {
input := `array = [
"Is there life before an array separator?" No,
"Entry"
]`
testgenInvalid(t, input)
}
func TestInvalidTextInArray(t *testing.T) {
input := `array = [
"Entry 1",
I don't belong,
"Entry 2",
]`
testgenInvalid(t, input)
}
func TestValidArrayEmpty(t *testing.T) {
input := `thevoid = [[[[[]]]]]`
jsonRef := `{
"thevoid": { "type": "array", "value": [
{"type": "array", "value": [
{"type": "array", "value": [
{"type": "array", "value": [
{"type": "array", "value": []}
]}
]}
]}
]}
}`
testgenValid(t, input, jsonRef)
}
func TestValidArrayNospaces(t *testing.T) {
input := `ints = [1,2,3]`
jsonRef := `{
"ints": {
"type": "array",
"value": [
{"type": "integer", "value": "1"},
{"type": "integer", "value": "2"},
{"type": "integer", "value": "3"}
]
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidArraysHetergeneous(t *testing.T) {
input := `mixed = [[1, 2], ["a", "b"], [1.1, 2.1]]`
jsonRef := `{
"mixed": {
"type": "array",
"value": [
{"type": "array", "value": [
{"type": "integer", "value": "1"},
{"type": "integer", "value": "2"}
]},
{"type": "array", "value": [
{"type": "string", "value": "a"},
{"type": "string", "value": "b"}
]},
{"type": "array", "value": [
{"type": "float", "value": "1.1"},
{"type": "float", "value": "2.1"}
]}
]
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidArraysNested(t *testing.T) {
input := `nest = [["a"], ["b"]]`
jsonRef := `{
"nest": {
"type": "array",
"value": [
{"type": "array", "value": [
{"type": "string", "value": "a"}
]},
{"type": "array", "value": [
{"type": "string", "value": "b"}
]}
]
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidArrays(t *testing.T) {
input := `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,
]`
jsonRef := `{
"ints": {
"type": "array",
"value": [
{"type": "integer", "value": "1"},
{"type": "integer", "value": "2"},
{"type": "integer", "value": "3"}
]
},
"floats": {
"type": "array",
"value": [
{"type": "float", "value": "1.1"},
{"type": "float", "value": "2.1"},
{"type": "float", "value": "3.1"}
]
},
"strings": {
"type": "array",
"value": [
{"type": "string", "value": "a"},
{"type": "string", "value": "b"},
{"type": "string", "value": "c"}
]
},
"dates": {
"type": "array",
"value": [
{"type": "datetime", "value": "1987-07-05T17:45:00Z"},
{"type": "datetime", "value": "1979-05-27T07:32:00Z"},
{"type": "datetime", "value": "2006-06-01T11:00:00Z"}
]
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidBool(t *testing.T) {
input := `t = true
f = false`
jsonRef := `{
"f": {"type": "bool", "value": "false"},
"t": {"type": "bool", "value": "true"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidCommentsEverywhere(t *testing.T) {
input := `# 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.`
jsonRef := `{
"group": {
"answer": {"type": "integer", "value": "42"},
"more": {
"type": "array",
"value": [
{"type": "integer", "value": "42"},
{"type": "integer", "value": "42"}
]
}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidDatetime(t *testing.T) {
input := `bestdayever = 1987-07-05T17:45:00Z`
jsonRef := `{
"bestdayever": {"type": "datetime", "value": "1987-07-05T17:45:00Z"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidEmpty(t *testing.T) {
input := ``
jsonRef := `{}`
testgenValid(t, input, jsonRef)
}
func TestValidExample(t *testing.T) {
input := `best-day-ever = 1987-07-05T17:45:00Z
[numtheory]
boring = false
perfection = [6, 28, 496]`
jsonRef := `{
"best-day-ever": {"type": "datetime", "value": "1987-07-05T17:45:00Z"},
"numtheory": {
"boring": {"type": "bool", "value": "false"},
"perfection": {
"type": "array",
"value": [
{"type": "integer", "value": "6"},
{"type": "integer", "value": "28"},
{"type": "integer", "value": "496"}
]
}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidFloat(t *testing.T) {
input := `pi = 3.14
negpi = -3.14`
jsonRef := `{
"pi": {"type": "float", "value": "3.14"},
"negpi": {"type": "float", "value": "-3.14"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidImplicitAndExplicitAfter(t *testing.T) {
input := `[a.b.c]
answer = 42
[a]
better = 43`
jsonRef := `{
"a": {
"better": {"type": "integer", "value": "43"},
"b": {
"c": {
"answer": {"type": "integer", "value": "42"}
}
}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidImplicitAndExplicitBefore(t *testing.T) {
input := `[a]
better = 43
[a.b.c]
answer = 42`
jsonRef := `{
"a": {
"better": {"type": "integer", "value": "43"},
"b": {
"c": {
"answer": {"type": "integer", "value": "42"}
}
}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidImplicitGroups(t *testing.T) {
input := `[a.b.c]
answer = 42`
jsonRef := `{
"a": {
"b": {
"c": {
"answer": {"type": "integer", "value": "42"}
}
}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidInteger(t *testing.T) {
input := `answer = 42
neganswer = -42`
jsonRef := `{
"answer": {"type": "integer", "value": "42"},
"neganswer": {"type": "integer", "value": "-42"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidKeyEqualsNospace(t *testing.T) {
input := `answer=42`
jsonRef := `{
"answer": {"type": "integer", "value": "42"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidKeySpace(t *testing.T) {
input := `"a b" = 1`
jsonRef := `{
"a b": {"type": "integer", "value": "1"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidKeySpecialChars(t *testing.T) {
input := "\"~!@$^&*()_+-`1234567890[]|/?><.,;:'\" = 1\n"
jsonRef := "{\n" +
" \"~!@$^&*()_+-`1234567890[]|/?><.,;:'\": {\n" +
" \"type\": \"integer\", \"value\": \"1\"\n" +
" }\n" +
"}\n"
testgenValid(t, input, jsonRef)
}
func TestValidLongFloat(t *testing.T) {
input := `longpi = 3.141592653589793
neglongpi = -3.141592653589793`
jsonRef := `{
"longpi": {"type": "float", "value": "3.141592653589793"},
"neglongpi": {"type": "float", "value": "-3.141592653589793"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidLongInteger(t *testing.T) {
input := `answer = 9223372036854775807
neganswer = -9223372036854775808`
jsonRef := `{
"answer": {"type": "integer", "value": "9223372036854775807"},
"neganswer": {"type": "integer", "value": "-9223372036854775808"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidMultilineString(t *testing.T) {
input := `multiline_empty_one = """"""
multiline_empty_two = """
"""
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.\
"""`
jsonRef := `{
"multiline_empty_one": {
"type": "string",
"value": ""
},
"multiline_empty_two": {
"type": "string",
"value": ""
},
"multiline_empty_three": {
"type": "string",
"value": ""
},
"multiline_empty_four": {
"type": "string",
"value": ""
},
"equivalent_one": {
"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."
},
"equivalent_three": {
"type": "string",
"value": "The quick brown fox jumps over the lazy dog."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidRawMultilineString(t *testing.T) {
input := `oneline = '''This string has a ' quote character.'''
firstnl = '''
This string has a ' quote character.'''
multiline = '''
This string
has ' a quote character
and more than
one newline
in it.'''`
jsonRef := `{
"oneline": {
"type": "string",
"value": "This string has a ' quote character."
},
"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."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidRawString(t *testing.T) {
input := `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.'`
jsonRef := `{
"backspace": {
"type": "string",
"value": "This string has a \\b backspace character."
},
"tab": {
"type": "string",
"value": "This string has a \\t tab character."
},
"newline": {
"type": "string",
"value": "This string has a \\n new line character."
},
"formfeed": {
"type": "string",
"value": "This string has a \\f form feed character."
},
"carriage": {
"type": "string",
"value": "This string has a \\r carriage return character."
},
"slash": {
"type": "string",
"value": "This string has a \\/ slash character."
},
"backslash": {
"type": "string",
"value": "This string has a \\\\ backslash character."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidStringEmpty(t *testing.T) {
input := `answer = ""`
jsonRef := `{
"answer": {
"type": "string",
"value": ""
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidStringEscapes(t *testing.T) {
input := `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."`
jsonRef := `{
"backspace": {
"type": "string",
"value": "This string has a \u0008 backspace character."
},
"tab": {
"type": "string",
"value": "This string has a \u0009 tab character."
},
"newline": {
"type": "string",
"value": "This string has a \u000A new line character."
},
"formfeed": {
"type": "string",
"value": "This string has a \u000C form feed character."
},
"carriage": {
"type": "string",
"value": "This string has a \u000D carriage return character."
},
"quote": {
"type": "string",
"value": "This string has a \u0022 quote character."
},
"backslash": {
"type": "string",
"value": "This string has a \u005C backslash 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 \u005Cu 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 \\\u0075 escape."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidStringSimple(t *testing.T) {
input := `answer = "You are not drinking enough whisky."`
jsonRef := `{
"answer": {
"type": "string",
"value": "You are not drinking enough whisky."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidStringWithPound(t *testing.T) {
input := `pound = "We see no # comments here."
poundcomment = "But there are # some comments here." # Did I # mess you up?`
jsonRef := `{
"pound": {"type": "string", "value": "We see no # comments here."},
"poundcomment": {
"type": "string",
"value": "But there are # some comments here."
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableArrayImplicit(t *testing.T) {
input := `[[albums.songs]]
name = "Glory Days"`
jsonRef := `{
"albums": {
"songs": [
{"name": {"type": "string", "value": "Glory Days"}}
]
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableArrayMany(t *testing.T) {
input := `[[people]]
first_name = "Bruce"
last_name = "Springsteen"
[[people]]
first_name = "Eric"
last_name = "Clapton"
[[people]]
first_name = "Bob"
last_name = "Seger"`
jsonRef := `{
"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"}
}
]
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableArrayNest(t *testing.T) {
input := `[[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"`
jsonRef := `{
"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"}}
]
}
]
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableArrayOne(t *testing.T) {
input := `[[people]]
first_name = "Bruce"
last_name = "Springsteen"`
jsonRef := `{
"people": [
{
"first_name": {"type": "string", "value": "Bruce"},
"last_name": {"type": "string", "value": "Springsteen"}
}
]
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableEmpty(t *testing.T) {
input := `[a]`
jsonRef := `{
"a": {}
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableSubEmpty(t *testing.T) {
input := `[a]
[a.b]`
jsonRef := `{
"a": { "b": {} }
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableWhitespace(t *testing.T) {
input := `["valid key"]`
jsonRef := `{
"valid key": {}
}`
testgenValid(t, input, jsonRef)
}
func TestValidTableWithPound(t *testing.T) {
input := `["key#group"]
answer = 42`
jsonRef := `{
"key#group": {
"answer": {"type": "integer", "value": "42"}
}
}`
testgenValid(t, input, jsonRef)
}
func TestValidUnicodeEscape(t *testing.T) {
input := `answer4 = "\u03B4"
answer8 = "\U000003B4"`
jsonRef := `{
"answer4": {"type": "string", "value": "\u03B4"},
"answer8": {"type": "string", "value": "\u03B4"}
}`
testgenValid(t, input, jsonRef)
}
func TestValidUnicodeLiteral(t *testing.T) {
input := `answer = "δ"`
jsonRef := `{
"answer": {"type": "string", "value": "δ"}
}`
testgenValid(t, input, jsonRef)
}