xorm/internal/statements/statement_test.go
Lunny Xiao f51d28304a
All checks were successful
continuous-integration/drone/push Build is passing
Move some codes to statement sub package (#1574)
revert change for delete

refactor new engine

fix tests

Move some codes to statement sub package

Reviewed-on: #1574
2020-03-06 06:43:49 +00:00

197 lines
4.5 KiB
Go

// Copyright 2017 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package statements
import (
"reflect"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"xorm.io/xorm/caches"
"xorm.io/xorm/dialects"
"xorm.io/xorm/names"
"xorm.io/xorm/schemas"
"xorm.io/xorm/tags"
_ "github.com/mattn/go-sqlite3"
)
var (
dialect dialects.Dialect
tagParser *tags.Parser
)
func TestMain(m *testing.M) {
var err error
dialect, err = dialects.OpenDialect("sqlite3", "./test.db")
if err != nil {
panic("unknow dialect")
}
tagParser = tags.NewParser("xorm", dialect, names.SnakeMapper{}, names.SnakeMapper{}, caches.NewManager())
if tagParser == nil {
panic("tags parser is nil")
}
m.Run()
}
var colStrTests = []struct {
omitColumn string
onlyToDBColumnNdx int
expected string
}{
{"", -1, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
{"Code2", -1, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
{"", 1, "`ID`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
{"Code3", 1, "`ID`, `Caption`, `Code1`, `Code2`, `ParentID`, `Latitude`, `Longitude`"},
{"Longitude", 1, "`ID`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`"},
{"", 8, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`"},
}
func TestColumnsStringGeneration(t *testing.T) {
for ndx, testCase := range colStrTests {
statement, err := createTestStatement()
assert.NoError(t, err)
if testCase.omitColumn != "" {
statement.Omit(testCase.omitColumn)
}
columns := statement.RefTable.Columns()
if testCase.onlyToDBColumnNdx >= 0 {
columns[testCase.onlyToDBColumnNdx].MapType = schemas.ONLYTODB
}
actual := statement.genColumnStr()
if actual != testCase.expected {
t.Errorf("[test #%d] Unexpected columns string:\nwant:\t%s\nhave:\t%s", ndx, testCase.expected, actual)
}
if testCase.onlyToDBColumnNdx >= 0 {
columns[testCase.onlyToDBColumnNdx].MapType = schemas.TWOSIDES
}
}
}
func BenchmarkGetFlagForColumnWithICKey_ContainsKey(b *testing.B) {
b.StopTimer()
mapCols := make(map[string]bool)
cols := []*schemas.Column{
{Name: `ID`},
{Name: `IsDeleted`},
{Name: `Caption`},
{Name: `Code1`},
{Name: `Code2`},
{Name: `Code3`},
{Name: `ParentID`},
{Name: `Latitude`},
{Name: `Longitude`},
}
for _, col := range cols {
mapCols[strings.ToLower(col.Name)] = true
}
b.StartTimer()
for i := 0; i < b.N; i++ {
for _, col := range cols {
if _, ok := getFlagForColumn(mapCols, col); !ok {
b.Fatal("Unexpected result")
}
}
}
}
func BenchmarkGetFlagForColumnWithICKey_EmptyMap(b *testing.B) {
b.StopTimer()
mapCols := make(map[string]bool)
cols := []*schemas.Column{
{Name: `ID`},
{Name: `IsDeleted`},
{Name: `Caption`},
{Name: `Code1`},
{Name: `Code2`},
{Name: `Code3`},
{Name: `ParentID`},
{Name: `Latitude`},
{Name: `Longitude`},
}
b.StartTimer()
for i := 0; i < b.N; i++ {
for _, col := range cols {
if _, ok := getFlagForColumn(mapCols, col); ok {
b.Fatal("Unexpected result")
}
}
}
}
type TestType struct {
ID int64 `xorm:"ID PK"`
IsDeleted bool `xorm:"IsDeleted"`
Caption string `xorm:"Caption"`
Code1 string `xorm:"Code1"`
Code2 string `xorm:"Code2"`
Code3 string `xorm:"Code3"`
ParentID int64 `xorm:"ParentID"`
Latitude float64 `xorm:"Latitude"`
Longitude float64 `xorm:"Longitude"`
}
func (TestType) TableName() string {
return "TestTable"
}
func createTestStatement() (*Statement, error) {
statement := NewStatement(dialect, tagParser, time.Local)
if err := statement.SetRefValue(reflect.ValueOf(TestType{})); err != nil {
return nil, err
}
return statement, nil
}
func BenchmarkColumnsStringGeneration(b *testing.B) {
b.StopTimer()
statement, err := createTestStatement()
if err != nil {
panic(err)
}
testCase := colStrTests[0]
if testCase.omitColumn != "" {
statement.Omit(testCase.omitColumn) // !nemec784! Column must be skipped
}
if testCase.onlyToDBColumnNdx >= 0 {
columns := statement.RefTable.Columns()
columns[testCase.onlyToDBColumnNdx].MapType = schemas.ONLYTODB // !nemec784! Column must be skipped
}
b.StartTimer()
for i := 0; i < b.N; i++ {
actual := statement.genColumnStr()
if actual != testCase.expected {
b.Errorf("Unexpected columns string:\nwant:\t%s\nhave:\t%s", testCase.expected, actual)
}
}
}