package printer
import (
"fmt"
"testing"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"gotest.tools/v3/assert"
)
func TestEscapeString(t *testing.T) {
t.Parallel()
data := []struct {
s string
quoteChar QuoteChar
expected string
}{
{s: "", quoteChar: QuoteCharDoubleQuote, expected: ``},
{s: "abc", quoteChar: QuoteCharDoubleQuote, expected: `abc`},
{s: "ab\"c", quoteChar: QuoteCharDoubleQuote, expected: `ab\"c`},
{s: "ab\tc", quoteChar: QuoteCharDoubleQuote, expected: `ab\tc`},
{s: "ab\nc", quoteChar: QuoteCharDoubleQuote, expected: `ab\nc`},
{s: "ab'c", quoteChar: QuoteCharDoubleQuote, expected: `ab'c`},
{s: "ab'c", quoteChar: QuoteCharSingleQuote, expected: `ab\'c`},
{s: "ab\"c", quoteChar: QuoteCharSingleQuote, expected: `ab"c`},
{s: "ab`c", quoteChar: QuoteCharBacktick, expected: "ab\\`c"},
{s: "\u001f", quoteChar: QuoteCharBacktick, expected: "\\u001F"},
}
for i, rec := range data {
t.Run(fmt.Sprintf("[%d] escapeString(%q, %v)", i, rec.s, rec.quoteChar), func(t *testing.T) {
t.Parallel()
actual := EscapeString(rec.s, rec.quoteChar)
assert.Equal(t, actual, rec.expected)
})
}
}
func TestEscapeNonAsciiString(t *testing.T) {
t.Parallel()
data := []struct {
s string
quoteChar QuoteChar
expected string
}{
{s: "", quoteChar: QuoteCharDoubleQuote, expected: ``},
{s: "abc", quoteChar: QuoteCharDoubleQuote, expected: `abc`},
{s: "ab\"c", quoteChar: QuoteCharDoubleQuote, expected: `ab\"c`},
{s: "ab\tc", quoteChar: QuoteCharDoubleQuote, expected: `ab\tc`},
{s: "ab\nc", quoteChar: QuoteCharDoubleQuote, expected: `ab\nc`},
{s: "ab'c", quoteChar: QuoteCharDoubleQuote, expected: `ab'c`},
{s: "ab'c", quoteChar: QuoteCharSingleQuote, expected: `ab\'c`},
{s: "ab\"c", quoteChar: QuoteCharSingleQuote, expected: `ab"c`},
{s: "ab`c", quoteChar: QuoteCharBacktick, expected: "ab\\`c"},
{s: "ab\u008fc", quoteChar: QuoteCharDoubleQuote, expected: `ab\u008Fc`},
{s: "𝟘𝟙", quoteChar: QuoteCharDoubleQuote, expected: `\uD835\uDFD8\uD835\uDFD9`},
}
for i, rec := range data {
t.Run(fmt.Sprintf("[%d] escapeNonAsciiString(%q, %v)", i, rec.s, rec.quoteChar), func(t *testing.T) {
t.Parallel()
actual := escapeNonAsciiString(rec.s, rec.quoteChar)
assert.Equal(t, actual, rec.expected)
})
}
}
func TestEscapeJsxAttributeString(t *testing.T) {
t.Parallel()
data := []struct {
s string
quoteChar QuoteChar
expected string
}{
{s: "", quoteChar: QuoteCharDoubleQuote, expected: ""},
{s: "abc", quoteChar: QuoteCharDoubleQuote, expected: "abc"},
{s: "ab\"c", quoteChar: QuoteCharDoubleQuote, expected: "ab"c"},
{s: "ab\tc", quoteChar: QuoteCharDoubleQuote, expected: "ab c"},
{s: "ab\nc", quoteChar: QuoteCharDoubleQuote, expected: "ab
c"},
{s: "ab'c", quoteChar: QuoteCharDoubleQuote, expected: "ab'c"},
{s: "ab'c", quoteChar: QuoteCharSingleQuote, expected: "ab'c"},
{s: "ab\"c", quoteChar: QuoteCharSingleQuote, expected: "ab\"c"},
{s: "ab\u008fc", quoteChar: QuoteCharDoubleQuote, expected: "ab\u008Fc"},
{s: "𝟘𝟙", quoteChar: QuoteCharDoubleQuote, expected: "𝟘𝟙"},
}
for i, rec := range data {
t.Run(fmt.Sprintf("[%d] escapeJsxAttributeString(%q, %v)", i, rec.s, rec.quoteChar), func(t *testing.T) {
t.Parallel()
actual := escapeJsxAttributeString(rec.s, rec.quoteChar)
assert.Equal(t, actual, rec.expected)
})
}
}
func TestIsRecognizedTripleSlashComment(t *testing.T) {
t.Parallel()
data := []struct {
s string
commentRange ast.CommentRange
expected bool
}{
{s: "", commentRange: ast.CommentRange{Kind: ast.KindMultiLineCommentTrivia}, expected: false},
{s: "", commentRange: ast.CommentRange{Kind: ast.KindSingleLineCommentTrivia}, expected: false},
{s: "/a", expected: false},
{s: "//", expected: false},
{s: "//a", expected: false},
{s: "///", expected: false},
{s: "///a", expected: false},
{s: "///", expected: true},
{s: "///", expected: true},
{s: "///", expected: true},
{s: "///", expected: true},
{s: "///", expected: true},
{s: "///", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: true},
{s: "/// ", expected: false},
{s: "/// ", expected: false},
{s: "/// ", expected: false},
}
for i, rec := range data {
t.Run(fmt.Sprintf("[%d] isRecognizedTripleSlashComment()", i), func(t *testing.T) {
t.Parallel()
commentRange := rec.commentRange
if commentRange.Kind == ast.KindUnknown {
commentRange.Kind = ast.KindSingleLineCommentTrivia
commentRange.TextRange = core.NewTextRange(0, len(rec.s))
}
actual := IsRecognizedTripleSlashComment(rec.s, commentRange)
assert.Equal(t, actual, rec.expected)
})
}
}