package parser_test import ( "fmt" "testing" ) func TestUnterminatedBasicString(t *testing.T) { runStatesT(t, statesT{ "missing closing quote", `a="value`, "[a]=", "unexpected end of file (expected string contents)"}) } func TestBasicStringWithUnescapedControlCharacters(t *testing.T) { runStatesTs(t, []statesT{ {"null char", "a=\"\u0000\"", "[a]=", `invalid character in basic string: "\x00" (must be escaped)`}, {"newline", "a=\"b\nc\nd\"", "[a]=", `invalid character in basic string: "\n" (must be escaped)`}, {"delete", "a=\"\u007F\"", "[a]=", `invalid character in basic string: "\u007f" (must be escaped)`}, }) // No need to write all test cases for disallowed characters by hand. for i := 0x00; i <= 0x1F; i++ { name := fmt.Sprintf("control character %x", rune(i)) runStatesT( t, statesT{name, fmt.Sprintf(`_="%c"`, rune(i)), "[_]=", fmt.Sprintf(`invalid character in basic string: %q (must be escaped)`, string(rune(i)))}) } } func TestEmptyBasicString(t *testing.T) { runStatesTs(t, []statesT{ {"empty", `a=""`, "[a]=STR()", ""}, {"with comment", `a="" #cool`, "[a]=STR()#(cool)", ""}, {"with whitespaces", ` a = "" `, "[a]=STR()", ""}, {"dotted", ` a.b = "" `, "[a].[b]=STR()", ""}, {"multiple on same line", `a=""b=""`, "[a]=STR()[b]=STR()", ""}, {"multiple on multiple lines", "a=\"\" \n b = \"\" ", "[a]=STR()[b]=STR()", ""}, }) } func TestBasicString(t *testing.T) { runStatesTs(t, []statesT{ {"ascii value", `_ = "Nothing fancy!"`, "[_]=STR(Nothing fancy!)", ""}, {"UTF8 value", `_ = "A cool ƃuıɹʇs" # what!?`, "[_]=STR(A cool ƃuıɹʇs)#(what!?)", ""}, }) } func TestBasicStringWithInvalidEscapeSequence(t *testing.T) { err := "invalid escape sequence" runStatesTs(t, []statesT{ {"invalid escape sequence", `a="\x"`, "[a]=", err}, {"too short \\u UTF8", `a="\u123"`, "[a]=", err}, {"invalid hex in \\u UTF8", `a="\u000P"`, "[a]=", err}, {"too short \\U UTF8", `a="\U1234567"`, "[a]=", err}, {"invalid hex in \\U UTF8", `a="\U0000000P"`, "[a]=", err}, }) } func TestBasicStringEscapes(t *testing.T) { runStatesTs(t, []statesT{ {"bell escape", `_="\b"`, "[_]=STR(\b)", ""}, {"tab escape", `_="\t"`, "[_]=STR(\t)", ""}, {"newline escape", `_="\n"`, "[_]=STR(\n)", ""}, {"form feed escape", `_="\f"`, "[_]=STR(\f)", ""}, {"carriage return escape", `_="\r"`, "[_]=STR(\r)", ""}, {"double quote escape", `_="\""`, `[_]=STR(")`, ""}, {"backslash escape", `_="\\"`, `[_]=STR(\)`, ""}, {"mix of escapes", `_="\b\t\nhuh\f\r\""`, "[_]=STR(\b\t\nhuh\f\r\")", ""}, {"UTF8 escape short", `_="\u2318"`, "[_]=STR(⌘)", ""}, {"UTF8 escape long", `_="\U0001014D"`, "[_]=STR(𐅍)", ""}, {"UTF8 vertical tab", `_="\u000B"`, "[_]=STR(\v)", ""}, }) }