74 lines
2.7 KiB
Go
74 lines
2.7 KiB
Go
package lexer_test
|
||
|
||
import (
|
||
"fmt"
|
||
"testing"
|
||
)
|
||
|
||
func TestUnterminatedBasicString(t *testing.T) {
|
||
runStatesT(t, statesT{
|
||
"missing closing quote", `a="value`, "[a]=",
|
||
"Unexpected end of file (expected basic string token)"})
|
||
}
|
||
|
||
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)`, 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 same line", `a=""b=""`, "[a]=STR()[b]=STR()", ""},
|
||
{"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)", ""},
|
||
})
|
||
}
|