88 lines
2.8 KiB
Plaintext
88 lines
2.8 KiB
Plaintext
package lexer_test
|
|
|
|
import "testing"
|
|
import "github.com/mmakaay/toml/lexer"
|
|
|
|
func TestGeneratingStringDoesNotResetBuffer(t *testing.T) {
|
|
var b lexer.StringBuffer
|
|
s1, _ := b.WriteString(`hi\nthere`).AsInterpretedString()
|
|
s2 := b.AsLiteralString()
|
|
if s1 != "hi\nthere" {
|
|
t.Fatalf("Did not get expected string\"X\" for try 1, but %q", s1)
|
|
}
|
|
if s2 != "hi\\nthere" {
|
|
t.Fatalf("Did not get expected string\"X\" for try 2, but %q", s2)
|
|
}
|
|
}
|
|
|
|
func TestResetResetsBuffer(t *testing.T) {
|
|
var b lexer.StringBuffer
|
|
s := b.WriteRune('X').Reset().AsLiteralString()
|
|
if s != "" {
|
|
t.Fatalf("Did not get expected empty string, but %q", s)
|
|
}
|
|
}
|
|
|
|
func TestAsLiteralString(t *testing.T) {
|
|
b := lexer.StringBuffer{}
|
|
for _, c := range []stringbufT{
|
|
{"empty string", ``, ``, OK},
|
|
{"simple string", `Simple string!`, `Simple string!`, OK},
|
|
{"single quote", `'`, `'`, OK},
|
|
{"double quote", `"`, `"`, OK},
|
|
{"escaped single quote", `\'`, `\'`, OK},
|
|
{"escaped double quote", `\"`, `\"`, OK},
|
|
{"escape anything", `\x\t\f\n\r\'\"\\`, `\x\t\f\n\r\'\"\\`, OK},
|
|
{"UTF8 escapes", `\uceb2\U00e0b8bf`, `\uceb2\U00e0b8bf`, OK},
|
|
{"actual newline", "on\nmultiple\nlines", "on\nmultiple\nlines", OK},
|
|
} {
|
|
s := b.Reset().WriteString(c.in).AsLiteralString()
|
|
if s != c.out {
|
|
t.Fatalf("[%s] %q -> %q failed: actual result = %q", c.name, c.in, c.out, s)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAsInterpretedString(t *testing.T) {
|
|
b := lexer.StringBuffer{}
|
|
for _, c := range []stringbufT{
|
|
{"empty string", "", "", OK},
|
|
{"one character", "Simple string!", "Simple string!", OK},
|
|
{"escaped single quote", `\'`, "", FAIL},
|
|
{"escaped double quote", `\"`, `"`, OK},
|
|
{"bare single quote", `'`, "'", OK},
|
|
{"string in single quotes", `'Hello'`, `'Hello'`, OK},
|
|
{"string in escaped double quotes", `\"Hello\"`, `"Hello"`, OK},
|
|
{"escape something", `\t\f\n\r\"\\`, "\t\f\n\r\"\\", OK},
|
|
{"short UTF8 escapes", `\u2318Wh\u00e9\u00e9!`, `⌘Whéé!`, OK},
|
|
{"long UTF8 escapes", `\U0001014D \u2318 Wh\u00e9\u00e9!`, `𐅍 ⌘ Whéé!`, OK},
|
|
{"UTF8 characters", "Ѝюج wut Ж ?", "Ѝюج wut Ж ?", OK},
|
|
{"example from spec",
|
|
`I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF.`,
|
|
"I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF.", OK},
|
|
} {
|
|
s, err := b.Reset().WriteString(c.in).AsInterpretedString()
|
|
if c.isSuccessCase && err != nil {
|
|
t.Fatalf("[%s] unexpected error for input %q: %s", c.name, c.in, err)
|
|
}
|
|
if !c.isSuccessCase && err == nil {
|
|
t.Fatalf("[%s] expected a failure, but no failure occurred", c.name)
|
|
}
|
|
if s != c.out && c.isSuccessCase {
|
|
t.Fatalf("[%s] %q -> %q failed: actual result = %q", c.name, c.in, c.out, s)
|
|
}
|
|
}
|
|
}
|
|
|
|
type stringbufT struct {
|
|
name string
|
|
in string
|
|
out string
|
|
isSuccessCase bool
|
|
}
|
|
|
|
const (
|
|
OK bool = true
|
|
FAIL bool = false
|
|
)
|