mydb/internal/sqladapter/exql/utilities_test.go
2023-09-18 15:15:42 +08:00

212 lines
4.8 KiB
Go

package exql
import (
"bytes"
"regexp"
"strings"
"testing"
"unicode"
"github.com/stretchr/testify/assert"
)
const (
blankSymbol = ' '
stringWithCommas = "Hello,,World!,Enjoy"
stringWithSpaces = " Hello World! Enjoy"
stringWithASKeyword = "table.Name AS myTableAlias"
)
var (
bytesWithLeadingBlanks = []byte(" Hello world! ")
stringWithLeadingBlanks = string(bytesWithLeadingBlanks)
)
var (
reInvisible = regexp.MustCompile(`[\t\n\r]`)
reSpace = regexp.MustCompile(`\s+`)
)
func mustTrim(a string, err error) string {
if err != nil {
panic(err.Error())
}
a = reInvisible.ReplaceAllString(strings.TrimSpace(a), " ")
a = reSpace.ReplaceAllString(strings.TrimSpace(a), " ")
return a
}
func TestUtilIsBlankSymbol(t *testing.T) {
assert.True(t, isBlankSymbol(' '))
assert.True(t, isBlankSymbol('\n'))
assert.True(t, isBlankSymbol('\t'))
assert.True(t, isBlankSymbol('\r'))
assert.False(t, isBlankSymbol('x'))
}
func TestUtilTrimBytes(t *testing.T) {
var trimmed []byte
trimmed = trimBytes([]byte(" \t\nHello World! \n"))
assert.Equal(t, "Hello World!", string(trimmed))
trimmed = trimBytes([]byte("Nope"))
assert.Equal(t, "Nope", string(trimmed))
trimmed = trimBytes([]byte(""))
assert.Equal(t, "", string(trimmed))
trimmed = trimBytes([]byte(" "))
assert.Equal(t, "", string(trimmed))
trimmed = trimBytes(nil)
assert.Equal(t, "", string(trimmed))
}
func TestUtilSeparateByComma(t *testing.T) {
chunks := separateByComma("Hello,,World!,Enjoy")
assert.Equal(t, 4, len(chunks))
assert.Equal(t, "Hello", chunks[0])
assert.Equal(t, "", chunks[1])
assert.Equal(t, "World!", chunks[2])
assert.Equal(t, "Enjoy", chunks[3])
}
func TestUtilSeparateBySpace(t *testing.T) {
chunks := separateBySpace(" Hello World! Enjoy")
assert.Equal(t, 3, len(chunks))
assert.Equal(t, "Hello", chunks[0])
assert.Equal(t, "World!", chunks[1])
assert.Equal(t, "Enjoy", chunks[2])
}
func TestUtilSeparateByAS(t *testing.T) {
var chunks []string
var tests = []string{
`table.Name AS myTableAlias`,
`table.Name AS myTableAlias`,
"table.Name\tAS\r\nmyTableAlias",
}
for _, test := range tests {
chunks = separateByAS(test)
assert.Len(t, chunks, 2)
assert.Equal(t, "table.Name", chunks[0])
assert.Equal(t, "myTableAlias", chunks[1])
}
// Single character.
chunks = separateByAS("a")
assert.Len(t, chunks, 1)
assert.Equal(t, "a", chunks[0])
// Empty name
chunks = separateByAS("")
assert.Len(t, chunks, 1)
assert.Equal(t, "", chunks[0])
// Single name
chunks = separateByAS(" A Single Table ")
assert.Len(t, chunks, 1)
assert.Equal(t, "A Single Table", chunks[0])
// Minimal expression.
chunks = separateByAS("a AS b")
assert.Len(t, chunks, 2)
assert.Equal(t, "a", chunks[0])
assert.Equal(t, "b", chunks[1])
// Minimal expression with spaces.
chunks = separateByAS(" a AS b ")
assert.Len(t, chunks, 2)
assert.Equal(t, "a", chunks[0])
assert.Equal(t, "b", chunks[1])
// Minimal expression + 1 with spaces.
chunks = separateByAS(" a AS bb ")
assert.Len(t, chunks, 2)
assert.Equal(t, "a", chunks[0])
assert.Equal(t, "bb", chunks[1])
}
func BenchmarkUtilIsBlankSymbol(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = isBlankSymbol(blankSymbol)
}
}
func BenchmarkUtilStdlibIsBlankSymbol(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = unicode.IsSpace(blankSymbol)
}
}
func BenchmarkUtilTrimBytes(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = trimBytes(bytesWithLeadingBlanks)
}
}
func BenchmarkUtilStdlibBytesTrimSpace(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = bytes.TrimSpace(bytesWithLeadingBlanks)
}
}
func BenchmarkUtilTrimString(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = trimString(stringWithLeadingBlanks)
}
}
func BenchmarkUtilStdlibStringsTrimSpace(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = strings.TrimSpace(stringWithLeadingBlanks)
}
}
func BenchmarkUtilSeparateByComma(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = separateByComma(stringWithCommas)
}
}
func BenchmarkUtilRegExpSeparateByComma(b *testing.B) {
sep := regexp.MustCompile(`\s*?,\s*?`)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = sep.Split(stringWithCommas, -1)
}
}
func BenchmarkUtilSeparateBySpace(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = separateBySpace(stringWithSpaces)
}
}
func BenchmarkUtilRegExpSeparateBySpace(b *testing.B) {
sep := regexp.MustCompile(`\s+`)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = sep.Split(stringWithSpaces, -1)
}
}
func BenchmarkUtilSeparateByAS(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = separateByAS(stringWithASKeyword)
}
}
func BenchmarkUtilRegExpSeparateByAS(b *testing.B) {
sep := regexp.MustCompile(`(?i:\s+AS\s+)`)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = sep.Split(stringWithASKeyword, -1)
}
}