xormplus 9 years ago
parent
commit
8949ea9218
1 changed files with 139 additions and 0 deletions
  1. 139 0
      statement_test.go

+ 139 - 0
statement_test.go

@@ -0,0 +1,139 @@
+package xorm
+
+import (
+	"reflect"
+	"sync"
+	"testing"
+	"time"
+
+	"github.com/xormplus/core"
+)
+
+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`"},
+}
+
+// !nemec784! Only for Statement object creation
+const driverName = "mysql"
+const dataSourceName = "Server=TestServer;Database=TestDB;Uid=testUser;Pwd=testPassword;"
+
+func init() {
+	core.RegisterDriver(driverName, &mysqlDriver{})
+}
+
+func TestColumnsStringGeneration(t *testing.T) {
+
+	var statement *Statement
+
+	for ndx, testCase := range colStrTests {
+
+		statement = createTestStatement()
+
+		if testCase.omitColumn != "" {
+			statement.Omit(testCase.omitColumn) // !nemec784! Column must be skipped
+		}
+
+		if testCase.onlyToDBColumnNdx >= 0 {
+			columns := statement.RefTable.Columns()
+			columns[testCase.onlyToDBColumnNdx].MapType = core.ONLYTODB // !nemec784! Column must be skipped
+		}
+
+		actual := statement.genColumnStr()
+
+		if actual != testCase.expected {
+			t.Errorf("[test #%d] Unexpected columns string:\nwant:\t%s\nhave:\t%s", ndx, testCase.expected, actual)
+		}
+	}
+}
+
+func BenchmarkColumnsStringGeneration(b *testing.B) {
+
+	b.StopTimer()
+
+	statement := createTestStatement()
+
+	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 = core.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)
+		}
+	}
+}
+
+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 {
+
+	engine := createTestEngine()
+
+	statement := &Statement{}
+	statement.Init()
+	statement.Engine = engine
+	statement.setRefValue(reflect.ValueOf(TestType{}))
+
+	return statement
+}
+
+func createTestEngine() *Engine {
+	driver := core.QueryDriver(driverName)
+	uri, err := driver.Parse(driverName, dataSourceName)
+
+	if err != nil {
+		panic(err)
+	}
+
+	dialect := &mysql{}
+	err = dialect.Init(nil, uri, driverName, dataSourceName)
+
+	if err != nil {
+		panic(err)
+	}
+
+	engine := &Engine{
+		dialect:       dialect,
+		Tables:        make(map[reflect.Type]*core.Table),
+		mutex:         &sync.RWMutex{},
+		TagIdentifier: "xorm",
+		TZLocation:    time.Local,
+	}
+	engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
+
+	return engine
+}