statement_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package xorm
  2. import (
  3. "reflect"
  4. "sync"
  5. "testing"
  6. "time"
  7. "github.com/xormplus/core"
  8. )
  9. var colStrTests = []struct {
  10. omitColumn string
  11. onlyToDBColumnNdx int
  12. expected string
  13. }{
  14. {"", -1, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
  15. {"Code2", -1, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
  16. {"", 1, "`ID`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`, `Longitude`"},
  17. {"Code3", 1, "`ID`, `Caption`, `Code1`, `Code2`, `ParentID`, `Latitude`, `Longitude`"},
  18. {"Longitude", 1, "`ID`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`"},
  19. {"", 8, "`ID`, `IsDeleted`, `Caption`, `Code1`, `Code2`, `Code3`, `ParentID`, `Latitude`"},
  20. }
  21. // !nemec784! Only for Statement object creation
  22. const driverName = "mysql"
  23. const dataSourceName = "Server=TestServer;Database=TestDB;Uid=testUser;Pwd=testPassword;"
  24. func init() {
  25. core.RegisterDriver(driverName, &mysqlDriver{})
  26. }
  27. func TestColumnsStringGeneration(t *testing.T) {
  28. var statement *Statement
  29. for ndx, testCase := range colStrTests {
  30. statement = createTestStatement()
  31. if testCase.omitColumn != "" {
  32. statement.Omit(testCase.omitColumn) // !nemec784! Column must be skipped
  33. }
  34. if testCase.onlyToDBColumnNdx >= 0 {
  35. columns := statement.RefTable.Columns()
  36. columns[testCase.onlyToDBColumnNdx].MapType = core.ONLYTODB // !nemec784! Column must be skipped
  37. }
  38. actual := statement.genColumnStr()
  39. if actual != testCase.expected {
  40. t.Errorf("[test #%d] Unexpected columns string:\nwant:\t%s\nhave:\t%s", ndx, testCase.expected, actual)
  41. }
  42. }
  43. }
  44. func BenchmarkColumnsStringGeneration(b *testing.B) {
  45. b.StopTimer()
  46. statement := createTestStatement()
  47. testCase := colStrTests[0]
  48. if testCase.omitColumn != "" {
  49. statement.Omit(testCase.omitColumn) // !nemec784! Column must be skipped
  50. }
  51. if testCase.onlyToDBColumnNdx >= 0 {
  52. columns := statement.RefTable.Columns()
  53. columns[testCase.onlyToDBColumnNdx].MapType = core.ONLYTODB // !nemec784! Column must be skipped
  54. }
  55. b.StartTimer()
  56. for i := 0; i < b.N; i++ {
  57. actual := statement.genColumnStr()
  58. if actual != testCase.expected {
  59. b.Errorf("Unexpected columns string:\nwant:\t%s\nhave:\t%s", testCase.expected, actual)
  60. }
  61. }
  62. }
  63. type TestType struct {
  64. ID int64 `xorm:"ID PK"`
  65. IsDeleted bool `xorm:"IsDeleted"`
  66. Caption string `xorm:"Caption"`
  67. Code1 string `xorm:"Code1"`
  68. Code2 string `xorm:"Code2"`
  69. Code3 string `xorm:"Code3"`
  70. ParentID int64 `xorm:"ParentID"`
  71. Latitude float64 `xorm:"Latitude"`
  72. Longitude float64 `xorm:"Longitude"`
  73. }
  74. func (TestType) TableName() string {
  75. return "TestTable"
  76. }
  77. func createTestStatement() *Statement {
  78. engine := createTestEngine()
  79. statement := &Statement{}
  80. statement.Init()
  81. statement.Engine = engine
  82. statement.setRefValue(reflect.ValueOf(TestType{}))
  83. return statement
  84. }
  85. func createTestEngine() *Engine {
  86. driver := core.QueryDriver(driverName)
  87. uri, err := driver.Parse(driverName, dataSourceName)
  88. if err != nil {
  89. panic(err)
  90. }
  91. dialect := &mysql{}
  92. err = dialect.Init(nil, uri, driverName, dataSourceName)
  93. if err != nil {
  94. panic(err)
  95. }
  96. engine := &Engine{
  97. dialect: dialect,
  98. Tables: make(map[reflect.Type]*core.Table),
  99. mutex: &sync.RWMutex{},
  100. TagIdentifier: "xorm",
  101. TZLocation: time.Local,
  102. }
  103. engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
  104. return engine
  105. }