package parser_test import ( "testing" "github.com/mmakaay/toml/parser" ) func TestGeneratingStringDoesNotResetBuffer(t *testing.T) { var b parser.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 parser.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 := parser.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 := parser.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 )