hcl/hclsyntax/scan_string_lit_test.go

203 lines
4.0 KiB
Go

package hclsyntax
import (
"reflect"
"testing"
"github.com/davecgh/go-spew/spew"
)
func TestScanStringLit(t *testing.T) {
tests := []struct {
Input string
WantQuoted []string
WantUnquoted []string
}{
{
``,
[]string{},
[]string{},
},
{
`hello`,
[]string{`hello`},
[]string{`hello`},
},
{
`hello world`,
[]string{`hello world`},
[]string{`hello world`},
},
{
`hello\nworld`,
[]string{`hello`, `\n`, `world`},
[]string{`hello\nworld`},
},
{
`hello\🥁world`,
[]string{`hello`, `\🥁`, `world`},
[]string{`hello\🥁world`},
},
{
`hello\uabcdworld`,
[]string{`hello`, `\uabcd`, `world`},
[]string{`hello\uabcdworld`},
},
{
`hello\uabcdabcdworld`,
[]string{`hello`, `\uabcd`, `abcdworld`},
[]string{`hello\uabcdabcdworld`},
},
{
`hello\uabcworld`,
[]string{`hello`, `\uabc`, `world`},
[]string{`hello\uabcworld`},
},
{
`hello\U01234567world`,
[]string{`hello`, `\U01234567`, `world`},
[]string{`hello\U01234567world`},
},
{
`hello\U012345670123world`,
[]string{`hello`, `\U01234567`, `0123world`},
[]string{`hello\U012345670123world`},
},
{
`hello\Uabcdworld`,
[]string{`hello`, `\Uabcd`, `world`},
[]string{`hello\Uabcdworld`},
},
{
`hello\Uabcworld`,
[]string{`hello`, `\Uabc`, `world`},
[]string{`hello\Uabcworld`},
},
{
`hello\uworld`,
[]string{`hello`, `\u`, `world`},
[]string{`hello\uworld`},
},
{
`hello\Uworld`,
[]string{`hello`, `\U`, `world`},
[]string{`hello\Uworld`},
},
{
`hello\u`,
[]string{`hello`, `\u`},
[]string{`hello\u`},
},
{
`hello\U`,
[]string{`hello`, `\U`},
[]string{`hello\U`},
},
{
`hello\`,
[]string{`hello`, `\`},
[]string{`hello\`},
},
{
`hello$${world}`,
[]string{`hello`, `$${`, `world}`},
[]string{`hello`, `$${`, `world}`},
},
{
`hello$$world`,
[]string{`hello`, `$$`, `world`},
[]string{`hello`, `$$`, `world`},
},
{
`hello$world`,
[]string{`hello`, `$`, `world`},
[]string{`hello`, `$`, `world`},
},
{
`hello$`,
[]string{`hello`, `$`},
[]string{`hello`, `$`},
},
{
`hello$${`,
[]string{`hello`, `$${`},
[]string{`hello`, `$${`},
},
{
`hello%%{world}`,
[]string{`hello`, `%%{`, `world}`},
[]string{`hello`, `%%{`, `world}`},
},
{
`hello%%world`,
[]string{`hello`, `%%`, `world`},
[]string{`hello`, `%%`, `world`},
},
{
`hello%world`,
[]string{`hello`, `%`, `world`},
[]string{`hello`, `%`, `world`},
},
{
`hello%`,
[]string{`hello`, `%`},
[]string{`hello`, `%`},
},
{
`hello%%{`,
[]string{`hello`, `%%{`},
[]string{`hello`, `%%{`},
},
{
`hello\${world}`,
[]string{`hello`, `\$`, `{world}`},
[]string{`hello\`, `$`, `{world}`},
},
{
`hello\%{world}`,
[]string{`hello`, `\%`, `{world}`},
[]string{`hello\`, `%`, `{world}`},
},
{
"hello\nworld",
[]string{`hello`, "\n", `world`},
[]string{`hello`, "\n", `world`},
},
{
"hello\rworld",
[]string{`hello`, "\r", `world`},
[]string{`hello`, "\r", `world`},
},
{
"hello\r\nworld",
[]string{`hello`, "\r\n", `world`},
[]string{`hello`, "\r\n", `world`},
},
}
for _, test := range tests {
t.Run(test.Input, func(t *testing.T) {
t.Run("quoted", func(t *testing.T) {
slices := scanStringLit([]byte(test.Input), true)
got := make([]string, len(slices))
for i, slice := range slices {
got[i] = string(slice)
}
if !reflect.DeepEqual(got, test.WantQuoted) {
t.Errorf("wrong result\ngot: %swant: %s", spew.Sdump(got), spew.Sdump(test.WantQuoted))
}
})
t.Run("unquoted", func(t *testing.T) {
slices := scanStringLit([]byte(test.Input), false)
got := make([]string, len(slices))
for i, slice := range slices {
got[i] = string(slice)
}
if !reflect.DeepEqual(got, test.WantUnquoted) {
t.Errorf("wrong result\ngot: %swant: %s", spew.Sdump(got), spew.Sdump(test.WantUnquoted))
}
})
})
}
}