From b0e44a63e76d13996937dab721a361eddc61c465 Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Thu, 7 Apr 2022 20:13:21 -0400 Subject: [PATCH] decoder: support \e escape sequence --- parser.go | 4 ++ toml_testgen_test.go | 98 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 94 insertions(+), 8 deletions(-) diff --git a/parser.go b/parser.go index 071807df..9859a795 100644 --- a/parser.go +++ b/parser.go @@ -617,6 +617,8 @@ func (p *parser) parseMultilineBasicString(b []byte) ([]byte, []byte, []byte, er builder.WriteByte('\r') case 't': builder.WriteByte('\t') + case 'e': + builder.WriteByte(0x1B) case 'u': x, err := hexToRune(atmost(token[i+1:], 4), 4) if err != nil { @@ -774,6 +776,8 @@ func (p *parser) parseBasicString(b []byte) ([]byte, []byte, []byte, error) { builder.WriteByte('\r') case 't': builder.WriteByte('\t') + case 'e': + builder.WriteByte(0x1B) case 'u': x, err := hexToRune(token[i+1:len(token)-1], 4) if err != nil { diff --git a/toml_testgen_test.go b/toml_testgen_test.go index eb31e154..9f8d29d4 100644 --- a/toml_testgen_test.go +++ b/toml_testgen_test.go @@ -1,4 +1,4 @@ -// Generated by tomltestgen for toml-test ref master on 2021-12-31T17:10:15-05:00 +// Generated by tomltestgen for toml-test ref master on 2022-04-07T20:09:42-04:00 package toml_test import ( @@ -55,11 +55,51 @@ func TestTOMLTest_Invalid_Array_TextInArray(t *testing.T) { testgenInvalid(t, input) } +func TestTOMLTest_Invalid_Bool_AlmostFalseWithExtra(t *testing.T) { + input := "a = falsify\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_AlmostFalse(t *testing.T) { + input := "a = fals\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_AlmostTrueWithExtra(t *testing.T) { + input := "a = truthy\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_AlmostTrue(t *testing.T) { + input := "a = tru\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_JustF(t *testing.T) { + input := "a = f\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_JustT(t *testing.T) { + input := "a = t\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_Bool_MixedCase(t *testing.T) { input := "valid = False\n" testgenInvalid(t, input) } +func TestTOMLTest_Invalid_Bool_StartingSameFalse(t *testing.T) { + input := "a = falsey\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Bool_StartingSameTrue(t *testing.T) { + input := "a = truer\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_Bool_WrongCaseFalse(t *testing.T) { input := "b = FALSE\n" testgenInvalid(t, input) @@ -70,11 +110,26 @@ func TestTOMLTest_Invalid_Bool_WrongCaseTrue(t *testing.T) { testgenInvalid(t, input) } +func TestTOMLTest_Invalid_Control_BareCr(t *testing.T) { + input := "# The following line contains a single carriage return control character\r\n\r" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Control_BareFormfeed(t *testing.T) { + input := "bare-formfeed = \f\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_Control_BareNull(t *testing.T) { input := "bare-null = \"some value\" \x00\n" testgenInvalid(t, input) } +func TestTOMLTest_Invalid_Control_BareVerticalTab(t *testing.T) { + input := "bare-vertical-tab = \v\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_Control_CommentCr(t *testing.T) { input := "comment-cr = \"Carriage return in comment\" # \ra=1\n" testgenInvalid(t, input) @@ -445,6 +500,11 @@ func TestTOMLTest_Invalid_Float_UsBeforePoint(t *testing.T) { testgenInvalid(t, input) } +func TestTOMLTest_Invalid_InlineTable_Add(t *testing.T) { + input := "a={}\n# Inline tables are immutable and can't be extended\n[a.b]\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_InlineTable_DoubleComma(t *testing.T) { input := "t = {x=3,,y=4}\n" testgenInvalid(t, input) @@ -525,6 +585,21 @@ func TestTOMLTest_Invalid_Integer_DoubleUs(t *testing.T) { testgenInvalid(t, input) } +func TestTOMLTest_Invalid_Integer_IncompleteBin(t *testing.T) { + input := "incomplete-bin = 0b\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Integer_IncompleteHex(t *testing.T) { + input := "incomplete-hex = 0x\n" + testgenInvalid(t, input) +} + +func TestTOMLTest_Invalid_Integer_IncompleteOct(t *testing.T) { + input := "incomplete-oct = 0o\n" + testgenInvalid(t, input) +} + func TestTOMLTest_Invalid_Integer_InvalidBin(t *testing.T) { input := "invalid-bin = 0b0012\n" testgenInvalid(t, input) @@ -910,11 +985,6 @@ func TestTOMLTest_Invalid_String_MultilineQuotes1(t *testing.T) { testgenInvalid(t, input) } -func TestTOMLTest_Invalid_String_MultilineQuotes2(t *testing.T) { - input := "a = \"\"\"6 quotes: \"\"\"\"\"\"\n" - testgenInvalid(t, input) -} - func TestTOMLTest_Invalid_String_NoClose(t *testing.T) { input := "no-ending-quote = \"One time, at band camp\n" testgenInvalid(t, input) @@ -1471,6 +1541,12 @@ func TestTOMLTest_Valid_String_Empty(t *testing.T) { testgenValid(t, input, jsonRef) } +func TestTOMLTest_Valid_String_EscapeEsc(t *testing.T) { + input := "esc = \"\\e There is no escape! \\e\"\n" + jsonRef := "{\n \"esc\": {\n \"type\": \"string\",\n \"value\": \"\\u001b There is no escape! \\u001b\"\n }\n}\n" + testgenValid(t, input, jsonRef) +} + func TestTOMLTest_Valid_String_EscapeTricky(t *testing.T) { input := "end_esc = \"String does not end here\\\" but ends here\\\\\"\nlit_end_esc = 'String ends here\\'\n\nmultiline_unicode = \"\"\"\n\\u00a0\"\"\"\n\nmultiline_not_unicode = \"\"\"\n\\\\u0041\"\"\"\n\nmultiline_end_esc = \"\"\"When will it end? \\\"\"\"...\"\"\\\" should be here\\\"\"\"\"\n\nlit_multiline_not_unicode = '''\n\\u007f'''\n\nlit_multiline_end = '''There is no escape\\'''\n" jsonRef := "{\n \"end_esc\": {\n \"type\": \"string\",\n \"value\": \"String does not end here\\\" but ends here\\\\\"\n },\n \"lit_end_esc\": {\n \"type\": \"string\",\n \"value\": \"String ends here\\\\\"\n },\n \"lit_multiline_end\": {\n \"type\": \"string\",\n \"value\": \"There is no escape\\\\\"\n },\n \"lit_multiline_not_unicode\": {\n \"type\": \"string\",\n \"value\": \"\\\\u007f\"\n },\n \"multiline_end_esc\": {\n \"type\": \"string\",\n \"value\": \"When will it end? \\\"\\\"\\\"...\\\"\\\"\\\" should be here\\\"\"\n },\n \"multiline_not_unicode\": {\n \"type\": \"string\",\n \"value\": \"\\\\u0041\"\n },\n \"multiline_unicode\": {\n \"type\": \"string\",\n \"value\": \"\u00a0\"\n }\n}\n" @@ -1489,9 +1565,15 @@ func TestTOMLTest_Valid_String_Escapes(t *testing.T) { testgenValid(t, input, jsonRef) } +func TestTOMLTest_Valid_String_MultilineEscapedCrlf(t *testing.T) { + input := "# The following line should be an unescaped backslash followed by a Windows\r\n# newline sequence (\"\\r\\n\")\r\n0=\"\"\"\\\r\n\"\"\"\r\n" + jsonRef := "{\n \"0\": {\n \"type\": \"string\",\n \"value\": \"\"\n }\n}\n" + testgenValid(t, input, jsonRef) +} + func TestTOMLTest_Valid_String_MultilineQuotes(t *testing.T) { - input := "# Make sure that quotes inside multiline strings are allowed, including right\n# after the opening '''/\"\"\" and before the closing '''/\"\"\"\n\nlit_one = ''''one quote''''\nlit_two = '''''two quotes'''''\nlit_one_space = ''' 'one quote' '''\nlit_two_space = ''' ''two quotes'' '''\n\none = \"\"\"\"one quote\"\"\"\"\ntwo = \"\"\"\"\"two quotes\"\"\"\"\"\none_space = \"\"\" \"one quote\" \"\"\"\ntwo_space = \"\"\" \"\"two quotes\"\" \"\"\"\n\nmismatch1 = \"\"\"aaa'''bbb\"\"\"\nmismatch2 = '''aaa\"\"\"bbb'''\n" - jsonRef := "{\n \"lit_one\": {\n \"type\": \"string\",\n \"value\": \"'one quote'\"\n },\n \"lit_one_space\": {\n \"type\": \"string\",\n \"value\": \" 'one quote' \"\n },\n \"lit_two\": {\n \"type\": \"string\",\n \"value\": \"''two quotes''\"\n },\n \"lit_two_space\": {\n \"type\": \"string\",\n \"value\": \" ''two quotes'' \"\n },\n \"mismatch1\": {\n \"type\": \"string\",\n \"value\": \"aaa'''bbb\"\n },\n \"mismatch2\": {\n \"type\": \"string\",\n \"value\": \"aaa\\\"\\\"\\\"bbb\"\n },\n \"one\": {\n \"type\": \"string\",\n \"value\": \"\\\"one quote\\\"\"\n },\n \"one_space\": {\n \"type\": \"string\",\n \"value\": \" \\\"one quote\\\" \"\n },\n \"two\": {\n \"type\": \"string\",\n \"value\": \"\\\"\\\"two quotes\\\"\\\"\"\n },\n \"two_space\": {\n \"type\": \"string\",\n \"value\": \" \\\"\\\"two quotes\\\"\\\" \"\n }\n}\n" + input := "# Make sure that quotes inside multiline strings are allowed, including right\n# after the opening '''/\"\"\" and before the closing '''/\"\"\"\n\nlit_one = ''''one quote''''\nlit_two = '''''two quotes'''''\nlit_one_space = ''' 'one quote' '''\nlit_two_space = ''' ''two quotes'' '''\n\none = \"\"\"\"one quote\"\"\"\"\ntwo = \"\"\"\"\"two quotes\"\"\"\"\"\none_space = \"\"\" \"one quote\" \"\"\"\ntwo_space = \"\"\" \"\"two quotes\"\" \"\"\"\n\nmismatch1 = \"\"\"aaa'''bbb\"\"\"\nmismatch2 = '''aaa\"\"\"bbb'''\n\n# Three opening \"\"\", then one escaped \", then two \"\" (allowed), and then three\n# closing \"\"\"\nescaped = \"\"\"lol\\\"\"\"\"\"\"\n" + jsonRef := "{\n \"escaped\": {\n \"type\": \"string\",\n \"value\": \"lol\\\"\\\"\\\"\"\n },\n \"lit_one\": {\n \"type\": \"string\",\n \"value\": \"'one quote'\"\n },\n \"lit_one_space\": {\n \"type\": \"string\",\n \"value\": \" 'one quote' \"\n },\n \"lit_two\": {\n \"type\": \"string\",\n \"value\": \"''two quotes''\"\n },\n \"lit_two_space\": {\n \"type\": \"string\",\n \"value\": \" ''two quotes'' \"\n },\n \"mismatch1\": {\n \"type\": \"string\",\n \"value\": \"aaa'''bbb\"\n },\n \"mismatch2\": {\n \"type\": \"string\",\n \"value\": \"aaa\\\"\\\"\\\"bbb\"\n },\n \"one\": {\n \"type\": \"string\",\n \"value\": \"\\\"one quote\\\"\"\n },\n \"one_space\": {\n \"type\": \"string\",\n \"value\": \" \\\"one quote\\\" \"\n },\n \"two\": {\n \"type\": \"string\",\n \"value\": \"\\\"\\\"two quotes\\\"\\\"\"\n },\n \"two_space\": {\n \"type\": \"string\",\n \"value\": \" \\\"\\\"two quotes\\\"\\\" \"\n }\n}\n" testgenValid(t, input, jsonRef) }