tester.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package tester
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/gohxs/hqi"
  6. )
  7. // Something to test implementation can be used in test packages for drivers
  8. type Model struct {
  9. Name string
  10. Value int
  11. }
  12. var (
  13. Data = []Model{
  14. {"aaa", 1},
  15. {"aaa", 2},
  16. {"bbb", 3},
  17. {"bbb", 4},
  18. {"ccc", 5},
  19. {"ccc", 6},
  20. }
  21. )
  22. func PrepareHQI(t Testing, dc func() hqi.Driver) hqi.Query {
  23. q := hqi.NewQuery(dc())
  24. //e := &ErrChecker{t}
  25. var err error
  26. err = q.Schema(Model{})
  27. if err != nil {
  28. panic(err)
  29. }
  30. err = q.Insert(Data)
  31. if err != nil {
  32. panic(err)
  33. }
  34. err = q.Insert(Data)
  35. if err != nil {
  36. panic(err)
  37. }
  38. // Needs drop delete All
  39. //e.MCheckEQ("Creating schema", q.Schema(Model{}), nil)
  40. // Double data
  41. // e.MCheckEQ(fmt.Sprint("Inserting data ", Data), q.Insert(Data), nil)
  42. // e.MCheckEQ(fmt.Sprint("Inserting data AGAIN", Data), q.Insert(Data), nil)
  43. return q
  44. }
  45. //Tester testing implementation on drivers
  46. func Test(t *testing.T, dc func() hqi.Driver) {
  47. {
  48. q := hqi.NewQuery(dc())
  49. e := &ErrChecker{t}
  50. // Needs drop delete All
  51. e.MCheckEQ("Creating schema", q.Schema(Model{}), nil)
  52. // Double data
  53. e.MCheckEQ(fmt.Sprint("Inserting data ", Data), q.Insert(Data), nil)
  54. e.MCheckEQ(fmt.Sprint("Inserting data AGAIN", Data), q.Insert(Data), nil)
  55. }
  56. // Initialize data
  57. t.Run("Match", func(t *testing.T) {
  58. q := PrepareHQI(t, dc)
  59. var res []Model
  60. e := &ErrChecker{t}
  61. q.Find(`{"Name":"aaa"}`).List(&res)
  62. e.CheckEQ(fmt.Sprint(res), "[{aaa 1} {aaa 2} {aaa 1} {aaa 2}]")
  63. })
  64. t.Run("Skip&Max", func(t *testing.T) {
  65. q := PrepareHQI(t, dc)
  66. var res []Model
  67. e := &ErrChecker{t}
  68. q.Find().Skip(4).Max(2).List(&res)
  69. e.CheckEQ(fmt.Sprint(res), "[{ccc 5} {ccc 6}]")
  70. })
  71. t.Run("Sort(name)&Max", func(t *testing.T) {
  72. q := PrepareHQI(t, dc)
  73. var res []Model
  74. e := &ErrChecker{t}
  75. q.Find().Sort("-Name", "Value").Max(2).List(&res)
  76. e.CheckEQ(fmt.Sprint(res), "[{ccc 5} {ccc 5}]")
  77. })
  78. t.Run("Sort(-Name,-Value)&Max", func(t *testing.T) {
  79. q := PrepareHQI(t, dc)
  80. var res []Model
  81. e := &ErrChecker{t}
  82. q.Find().Sort("-Name", "-Value").Max(2).List(&res)
  83. e.CheckEQ(fmt.Sprint(res), "[{ccc 6} {ccc 6}]")
  84. })
  85. t.Run("Remove", func(t *testing.T) {
  86. q := PrepareHQI(t, dc)
  87. var res []Model
  88. e := &ErrChecker{t}
  89. var err error
  90. err = q.Find(hqi.M{"Name": "ccc", "Value": 6}).Delete()
  91. e.CheckEQ(err, nil)
  92. q.Find(hqi.M{"Name": "ccc"}).List(&res)
  93. e.CheckEQ(fmt.Sprint(res), "[{ccc 5} {ccc 5}]")
  94. })
  95. t.Run("RemoveOR", func(t *testing.T) {
  96. q := PrepareHQI(t, dc)
  97. var res []Model
  98. e := &ErrChecker{t}
  99. var err error
  100. // Remove all bbb 6 or all aaa
  101. err = q.Find(hqi.M{"Name": "bbb", "Value": 4}, hqi.M{"Name": "aaa"}, hqi.M{"Name": "ccc", "Value": 6}).Delete()
  102. e.CheckEQ(err, nil)
  103. q.Find().Sort("Name", "Value").List(&res)
  104. e.CheckEQ(fmt.Sprint(res), "[{bbb 3} {bbb 3} {ccc 5} {ccc 5}]")
  105. })
  106. }
  107. // Benchmark
  108. func Benchmark(b *testing.B, getDriver func() hqi.Driver) {
  109. q := PrepareHQI(b, getDriver)
  110. b.Run("Match", func(b *testing.B) {
  111. for i := 0; i < b.N; i++ {
  112. var res []Model
  113. q.Find(hqi.M{"Name": "aaa"}).
  114. List(&res)
  115. }
  116. })
  117. b.Run("Insert&Delete", func(b *testing.B) {
  118. for i := 0; i < b.N; i++ {
  119. q.Insert(Model{Name: "zzz", Value: 99})
  120. q.Find(hqi.M{"Name": "zzz"}).Delete()
  121. }
  122. })
  123. }