go-toml/keyvaluepair_test.go

145 lines
9.2 KiB
Go

package parser
import "testing"
func TestKey(t *testing.T) {
for _, test := range []parseTest{
{"", []string{`Error: unexpected end of file (expected a key name) at start of file`}},
// Bare key tests
{"barekey", []string{`key("barekey")`}},
{"1234567", []string{`key("1234567")`}},
{"mix-12_34", []string{`key("mix-12_34")`}},
{"-hey_good_Lookin123-", []string{`key("-hey_good_Lookin123-")`}},
{"wrong!", []string{`key("wrong")`, `Error: unexpected input (expected end of file) at line 1, column 6`}},
{"key1.", []string{`key("key1")`, `keydot`, `Error: unexpected end of file (expected a key name) at line 1, column 6`}},
{"key1.key2", []string{`key("key1")`, `keydot`, `key("key2")`}},
{"key . with . spaces", []string{`key("key")`, `keydot`, `key("with")`, `keydot`, `key("spaces")`}},
{"key \t . \twithtabs\t . \tandspaces", []string{`key("key")`, `keydot`, `key("withtabs")`, `keydot`, `key("andspaces")`}},
// Single quoted key tests
{"''", []string{`key("")`}},
{"'single quoted'", []string{`key("single quoted")`}},
{`'escape\s are literal'`, []string{`key("escape\\s are literal")`}},
{`'"using inner quotes"'`, []string{`key("\"using inner quotes\"")`}},
// Double quoted key tests
{`""`, []string{`key("")`}},
{`"double quoted"`, []string{`key("double quoted")`}},
{`"escapes are in\terpreted"`, []string{`key("escapes are in\terpreted")`}},
{`"using 'inner' \"quotes\""`, []string{`key("using 'inner' \"quotes\"")`}},
// Mixed key types
{`this.'i\s'."madness\t".''`, []string{`key("this")`, `keydot`, `key("i\\s")`, `keydot`, `key("madness\t")`, `keydot`, `key("")`}},
} {
p := &parser{}
testParseHandler(t, p, p.startKey, test)
}
}
func TestAssignment(t *testing.T) {
for _, test := range []parseTest{
{"", []string{`Error: unexpected end of file (expected a value assignment) at start of file`}},
{"=", []string{`assign`}},
{" \t = \t ", []string{`assign`}},
{" \n = \n ", []string{`Error: unexpected input (expected a value assignment) at start of file`}},
} {
p := &parser{}
testParseHandler(t, p, p.startAssignment, test)
}
}
func TestKeyValuePair(t *testing.T) {
for _, test := range []parseTest{
{"", []string{}},
{" ", []string{}},
{" \t ", []string{}},
{" key ", []string{`key("key")`, `Error: unexpected input (expected a value assignment) at line 1, column 5`}},
{" key \t=", []string{`key("key")`, `assign`, `Error: unexpected end of file (expected a value) at line 1, column 8`}},
{"key = # INVALID", []string{`key("key")`, `assign`, `Error: unexpected input (expected a value) at line 1, column 7`}},
{" key \t =\t \"The Value\" \r\n", []string{`key("key")`, `assign`, `string("The Value")`}},
{`3.14159 = "pi"`, []string{`key("3")`, `keydot`, `key("14159")`, `assign`, `string("pi")`}},
{`"ʎǝʞ" = "value"`, []string{`key("ʎǝʞ")`, `assign`, `string("value")`}},
{`key = "value" # This is a comment at the end of a line`, []string{`key("key")`, `assign`, `string("value")`, `comment("# This is a comment at the end of a line")`}},
{`another = "# This is not a comment"`, []string{`key("another")`, `assign`, `string("# This is not a comment")`}},
{"key1=\"value1\"key2=\"value2\"\r\nkey3=\"value3\"", []string{
`key("key1")`, `assign`, `string("value1")`,
`key("key2")`, `assign`, `string("value2")`,
`key("key3")`, `assign`, `string("value3")`}},
{"with=\"comments\"# boring \nanother.cool =\"one\" \t # to the end\r\n", []string{
`key("with")`, `assign`, `string("comments")`, `comment("# boring ")`,
`key("another")`, `keydot`, `key("cool")`, `assign`, `string("one")`, `comment("# to the end")`}},
} {
p := &parser{}
testParseHandler(t, p, p.startKeyValuePair, test)
}
}
func TestKeyValuePair_ForAllTypes(t *testing.T) {
for _, test := range []parseTest{
{"string='literal'", []string{`key("string")`, `assign`, `string("literal")`}},
{"string='''literal\nmulti-line'''", []string{`key("string")`, `assign`, `string("literal\nmulti-line")`}},
{`string="basic"`, []string{`key("string")`, `assign`, `string("basic")`}},
{"string=\"\"\"basic\nmulti-line\"\"\"", []string{`key("string")`, `assign`, `string("basic\nmulti-line")`}},
{"integer=1_234_567", []string{`key("integer")`, `assign`, `integer(1234567)`}},
{"integer=42", []string{`key("integer")`, `assign`, `integer(42)`}},
{"integer=0x42", []string{`key("integer")`, `assign`, `integer(66)`}},
{"integer=0o42", []string{`key("integer")`, `assign`, `integer(34)`}},
{"integer=0b101010", []string{`key("integer")`, `assign`, `integer(42)`}},
{"float=42.37", []string{`key("float")`, `assign`, `float(42.37)`}},
{"float=42e+37", []string{`key("float")`, `assign`, `float(4.2e+38)`}},
{"float=42.37e-11", []string{`key("float")`, `assign`, `float(4.237e-10)`}},
{"boolean=true", []string{`key("boolean")`, `assign`, `boolean(true)`}},
{"boolean=false", []string{`key("boolean")`, `assign`, `boolean(false)`}},
{"date=2019-01-01", []string{`key("date")`, `assign`, `date(2019-01-01 00:00:00 +0000 UTC)`}},
{"time=15:03:11", []string{`key("time")`, `assign`, `time(0000-01-01 15:03:11 +0000 UTC)`}},
{"datetime=2021-02-01 15:03:11.123", []string{`key("datetime")`, `assign`, `datetime(2021-02-01 15:03:11.123 +0000 UTC)`}},
{"offset_datetime=1111-11-11 11:11:11.111111111+11:11", []string{`key("offset_datetime")`, `assign`, `offset_datetime(1111-11-11 11:11:11.111111111 +1111 +1111)`}},
} {
p := &parser{}
testParseHandler(t, p, p.startKeyValuePair, test)
}
}
func TestKeyValuePair_ExamplesFromSpecification(t *testing.T) {
for _, test := range []parseTest{
{"int1 = +99", []string{`key("int1")`, `assign`, `integer(99)`}},
{"int2 = 42", []string{`key("int2")`, `assign`, `integer(42)`}},
{"int3 = 0", []string{`key("int3")`, `assign`, `integer(0)`}},
{"int4 = -17", []string{`key("int4")`, `assign`, `integer(-17)`}},
{"int5 = 1_000", []string{`key("int5")`, `assign`, `integer(1000)`}},
{"int6 = 5_349_221", []string{`key("int6")`, `assign`, `integer(5349221)`}},
{"int7 = 1_2_3_4_5 # VALID but discouraged", []string{`key("int7")`, `assign`, `integer(12345)`, `comment("# VALID but discouraged")`}},
{"hex1 = 0xDEADBEEF", []string{`key("hex1")`, `assign`, `integer(3735928559)`}},
{"hex2 = 0xdeadbeef", []string{`key("hex2")`, `assign`, `integer(3735928559)`}},
{"hex3 = 0xdead_beef", []string{`key("hex3")`, `assign`, `integer(3735928559)`}},
{"oct1 = 0o01234567", []string{`key("oct1")`, `assign`, `integer(342391)`}},
{"oct2 = 0o755", []string{`key("oct2")`, `assign`, `integer(493)`}},
{"bin1 = 0b11010110", []string{`key("bin1")`, `assign`, `integer(214)`}},
{"flt1 = +1.0", []string{`key("flt1")`, `assign`, `float(1)`}},
{"flt2 = 3.1415", []string{`key("flt2")`, `assign`, `float(3.1415)`}},
{"flt3 = -0.01", []string{`key("flt3")`, `assign`, `float(-0.01)`}},
{"flt4 = 5e+22", []string{`key("flt4")`, `assign`, `float(5e+22)`}},
{"flt5 = 1e6", []string{`key("flt5")`, `assign`, `float(1e+06)`}},
{"flt6 = -2E-2", []string{`key("flt6")`, `assign`, `float(-0.02)`}},
{"flt7 = 6.626e-34", []string{`key("flt7")`, `assign`, `float(6.626e-34)`}},
{"flt8 = 224_617.445_991_228", []string{`key("flt8")`, `assign`, `float(224617.445991228)`}},
{"sf1 = inf # positive infinity", []string{`key("sf1")`, `assign`, `float(+Inf)`, `comment("# positive infinity")`}},
{"sf2 = +inf # positive infinity", []string{`key("sf2")`, `assign`, `float(+Inf)`, `comment("# positive infinity")`}},
{"sf3 = -inf # negative infinity", []string{`key("sf3")`, `assign`, `float(-Inf)`, `comment("# negative infinity")`}},
{"sf4 = nan # actual sNaN/qNaN encoding is implementation-specific", []string{`key("sf4")`, `assign`, `float(NaN)`, `comment("# actual sNaN/qNaN encoding is implementation-specific")`}},
{"sf5 = +nan # same as `nan`", []string{`key("sf5")`, `assign`, `float(NaN)`, "comment(\"# same as `nan`\")"}},
{"sf6 = -nan # valid, actual encoding is implementation-specific", []string{`key("sf6")`, `assign`, `float(NaN)`, `comment("# valid, actual encoding is implementation-specific")`}},
{"bool1 = true", []string{`key("bool1")`, `assign`, `boolean(true)`}},
{"bool2 = false", []string{`key("bool2")`, `assign`, `boolean(false)`}},
{"odt1 = 1979-05-27T07:32:00Z", []string{`key("odt1")`, `assign`, `offset_datetime(1979-05-27 07:32:00 +0000 UTC)`}},
{"odt2 = 1979-05-27T00:32:00-07:00", []string{`key("odt2")`, `assign`, `offset_datetime(1979-05-27 00:32:00 -0700 -0700)`}},
{"odt3 = 1979-05-27T00:32:00.999999-07:00", []string{`key("odt3")`, `assign`, `offset_datetime(1979-05-27 00:32:00.999999 -0700 -0700)`}},
{"odt4 = 1979-05-27 07:32:00Z", []string{`key("odt4")`, `assign`, `offset_datetime(1979-05-27 07:32:00 +0000 UTC)`}},
{"ldt1 = 1979-05-27T07:32:00", []string{`key("ldt1")`, `assign`, `datetime(1979-05-27 07:32:00 +0000 UTC)`}},
{"ldt2 = 1979-05-27T00:32:00.999999", []string{`key("ldt2")`, `assign`, `datetime(1979-05-27 00:32:00.999999 +0000 UTC)`}},
{"ld1 = 1979-05-27", []string{`key("ld1")`, `assign`, `date(1979-05-27 00:00:00 +0000 UTC)`}},
{"lt1 = 07:32:00", []string{`key("lt1")`, `assign`, `time(0000-01-01 07:32:00 +0000 UTC)`}},
{"lt2 = 00:32:00.999999", []string{`key("lt2")`, `assign`, `time(0000-01-01 00:32:00.999999 +0000 UTC)`}},
} {
p := &parser{}
testParseHandler(t, p, p.startKeyValuePair, test)
}
}