d2/d2format/escape_test.go
Alexander Wang 524c089a74 oss
Co-authored-by: Anmol Sethi <hi@nhooyr.io>
2022-11-03 06:54:49 -07:00

294 lines
5.1 KiB
Go

package d2format_test
import (
"testing"
"oss.terrastruct.com/diff"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2format"
)
func TestEscapeSingleQuoted(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
str string
exp string
}{
{
name: "simple",
str: `Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.`,
exp: `'Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.'`,
},
{
name: "single_quotes",
str: `'rawr'`,
exp: `'''rawr'''`,
},
{
name: "newlines",
str: `
`,
exp: `'\n\n\n'`,
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
diff.AssertStringEq(t, tc.exp, d2format.Format(&d2ast.SingleQuotedString{
Value: tc.str,
}))
})
}
}
func TestEscapeDoubleQuoted(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
str string
exp string
inKey bool
}{
{
name: "simple",
str: `Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.`,
exp: `"Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips."`,
},
{
name: "specials_1",
str: `"\x`,
exp: `"\"\\x"`,
},
{
name: "specials_2",
str: `$$3es`,
exp: `"\$\$3es"`,
},
{
name: "newlines",
str: `
`,
exp: `"\n\n\n"`,
},
{
name: "specials_key",
str: `$$3es`,
exp: `"$$3es"`,
inKey: true,
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
var n d2ast.Node
if tc.inKey {
n = &d2ast.KeyPath{
Path: []*d2ast.StringBox{
d2ast.MakeValueBox(d2ast.FlatDoubleQuotedString(tc.str)).StringBox(),
},
}
} else {
n = d2ast.FlatDoubleQuotedString(tc.str)
}
diff.AssertStringEq(t, tc.exp, d2format.Format(n))
})
}
}
func TestEscapeUnquoted(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
str string
exp string
inKey bool
}{
{
name: "simple",
str: `Change your thoughts and you change your world.`,
exp: `Change your thoughts and you change your world.`,
},
{
name: "specials_1",
str: `meow;{};meow`,
exp: `meow\;\{\}\;meow`,
},
{
name: "specials_2",
str: `'meow-#'`,
exp: `\'meow-\#'`,
},
{
name: "specials_3",
str: `#meow|`,
exp: `\#meow|`,
},
{
name: "specials_key_1",
str: `<---->`,
exp: `\<\-\-\--\>`,
inKey: true,
},
{
name: "specials_key_2",
str: `:::::`,
exp: `\:\:\:\:\:`,
inKey: true,
},
{
name: "specials_key_3",
str: `&&OKAY!! Turn on the sound ONLY for TRYNEL CARPETING, FULLY-EQUIPPED`,
exp: `\&&OKAY!! Turn on the sound ONLY for TRYNEL CARPETING, FULLY-EQUIPPED`,
inKey: true,
},
{
name: "specials_key_4",
str: `*-->`,
exp: `\*\--\>`,
inKey: true,
},
{
name: "specials_key_4_notkey",
str: `*-->`,
exp: `*-->`,
},
{
name: "null",
str: `null`,
exp: `\null`,
},
{
name: "empty",
str: ``,
exp: `""`,
},
{
name: "newlines",
str: `
`,
exp: `\n\n\n`,
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
var n d2ast.Node
if tc.inKey {
n = &d2ast.KeyPath{
Path: []*d2ast.StringBox{
d2ast.MakeValueBox(d2ast.FlatUnquotedString(tc.str)).StringBox(),
},
}
} else {
n = d2ast.FlatUnquotedString(tc.str)
}
diff.AssertStringEq(t, tc.exp, d2format.Format(n))
})
}
}
func TestEscapeBlockString(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
tag string
quote string
value string
exp string
}{
{
name: "oneline",
value: `Change your thoughts and you change your world.`,
exp: `| Change your thoughts and you change your world. |`,
},
{
name: "multiline",
value: `Change your thoughts and you change your world.
`,
exp: `|
Change your thoughts and you change your world.
|`,
},
{
name: "empty",
value: ``,
exp: `| |`,
},
{
name: "quote_1",
value: `|%%% %%%|`,
quote: "%%%",
exp: `|%%%% |%%% %%%| %%%%|`,
},
{
name: "quote_2",
value: `|%%% %%%%|`,
quote: "%%%",
exp: `|%%%%% |%%% %%%%| %%%%%|`,
},
{
name: "quote_3",
value: `||`,
quote: "",
exp: `||| || |||`,
},
{
name: "tag",
value: `This must be morning. I never could get the hang of mornings.`,
tag: "html",
exp: `|html This must be morning. I never could get the hang of mornings. |`,
},
{
name: "bad_tag",
value: `This must be morning. I never could get the hang of mornings.`,
tag: "ok ok",
exp: `|ok ok This must be morning. I never could get the hang of mornings. |`,
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
n := &d2ast.BlockString{
Quote: tc.quote,
Tag: tc.tag,
Value: tc.value,
}
diff.AssertStringEq(t, tc.exp, d2format.Format(n))
})
}
}
// TODO: chaos test each