paging_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package cache
  2. import (
  3. "math/rand"
  4. "testing"
  5. "time"
  6. )
  7. // 类型枚举
  8. const (
  9. TypeWeapon = "武器"
  10. TypeHelmet = "头盔"
  11. TypeArmor = "护甲"
  12. TypeBoots = "战靴"
  13. )
  14. // 品质枚举
  15. const (
  16. QualityExclusive = "专属"
  17. QualityLegendary = "传说"
  18. QualityEpic = "史诗"
  19. QualityRare = "稀有"
  20. )
  21. // 兵种枚举
  22. const (
  23. ArmyInfantry = "步兵"
  24. ArmyCavalry = "骑兵"
  25. ArmyArcher = "弓兵"
  26. )
  27. // 附加属性枚举
  28. const (
  29. Attr0 = 0
  30. Attr1 = 1
  31. Attr2 = 2
  32. Attr3 = 3
  33. )
  34. // 测试用结构体
  35. type TestItem struct {
  36. ID int64
  37. Name string
  38. Type string
  39. Quality string
  40. Army string
  41. Attr int
  42. Quantity int
  43. Price float64
  44. CreateTime int64
  45. }
  46. func TestPaging(t *testing.T) {
  47. // 创建Paging实例
  48. paging := NewPaging[TestItem]()
  49. // 初始化随机数生成器
  50. rand.Seed(time.Now().UnixNano())
  51. // 类型列表
  52. types := []string{TypeWeapon, TypeHelmet, TypeArmor, TypeBoots}
  53. // 品质列表
  54. qualities := []string{QualityExclusive, QualityLegendary, QualityEpic, QualityRare}
  55. // 兵种列表
  56. armies := []string{ArmyInfantry, ArmyCavalry, ArmyArcher}
  57. // 附加属性列表
  58. attrs := []int{Attr0, Attr1, Attr2, Attr3}
  59. // 生成100条测试数据
  60. testData := make([]TestItem, 0, 100)
  61. for i := 0; i < 100; i++ {
  62. item := TestItem{
  63. ID: int64(i + 1),
  64. Name: "装备" + string(rune(i+65)), // A-Z
  65. Type: types[rand.Intn(len(types))],
  66. Quality: qualities[rand.Intn(len(qualities))],
  67. Army: armies[rand.Intn(len(armies))],
  68. Attr: attrs[rand.Intn(len(attrs))],
  69. Quantity: rand.Intn(100) + 1,
  70. Price: rand.Float64() * 10000,
  71. CreateTime: time.Now().UnixNano() - int64(rand.Intn(1000000000000)), // 随机创建时间,范围在最近1000秒内
  72. }
  73. testData = append(testData, item)
  74. }
  75. paging.AddAll(testData)
  76. // 过滤条件
  77. filterFunc := func(item TestItem) bool {
  78. // 类型 = 头盔、护甲
  79. typeOk := item.Type == TypeHelmet || item.Type == TypeArmor
  80. // 品质 = 专属、传说、史诗
  81. qualityOk := item.Quality == QualityExclusive || item.Quality == QualityLegendary || item.Quality == QualityEpic
  82. // 兵种 = 所有
  83. armyOk := true
  84. // 附加属性 = 1、2
  85. attrOk := item.Attr == Attr1 || item.Attr == Attr2
  86. // 所有条件都必须满足(并且)
  87. return typeOk && qualityOk && armyOk && attrOk
  88. }
  89. // 排序条件:创建时间降序,价格升序
  90. comparatorFunc := func(a, b TestItem) int {
  91. // 1. 创建时间降序
  92. if a.CreateTime > b.CreateTime {
  93. return -1
  94. }
  95. if a.CreateTime < b.CreateTime {
  96. return 1
  97. }
  98. // 2. 价格升序
  99. if a.Price < b.Price {
  100. return -1
  101. }
  102. if a.Price > b.Price {
  103. return 1
  104. }
  105. return 0
  106. }
  107. // 执行查询
  108. pageSize := int32(10) // 每页10条
  109. total, pageData := paging.Query(1, pageSize, filterFunc, comparatorFunc)
  110. // 输出结果
  111. t.Logf("符合条件的总数: %d", total)
  112. t.Logf("第一页数据条数: %d", len(pageData))
  113. // 验证排序是否正确
  114. if len(pageData) > 1 {
  115. for i := 0; i < len(pageData)-1; i++ {
  116. // 检查创建时间降序
  117. if pageData[i].CreateTime < pageData[i+1].CreateTime {
  118. t.Errorf("第%d条的创建时间(%d)小于第%d条的创建时间(%d),不符合降序要求",
  119. i+1, pageData[i].CreateTime, i+2, pageData[i+1].CreateTime)
  120. }
  121. // 检查价格升序(当创建时间相同时)
  122. if pageData[i].CreateTime == pageData[i+1].CreateTime && pageData[i].Price > pageData[i+1].Price {
  123. t.Errorf("第%d条的价格(%.2f)大于第%d条的价格(%.2f),创建时间相同,不符合升序要求",
  124. i+1, pageData[i].Price, i+2, pageData[i+1].Price)
  125. }
  126. }
  127. }
  128. // 验证过滤条件是否正确
  129. for _, item := range pageData {
  130. // 类型应该是头盔或护甲
  131. if item.Type != TypeHelmet && item.Type != TypeArmor {
  132. t.Errorf("Item %d 类型为 %s,不符合过滤条件", item.ID, item.Type)
  133. }
  134. // 品质应该是专属、传说或史诗
  135. if item.Quality != QualityExclusive && item.Quality != QualityLegendary && item.Quality != QualityEpic {
  136. t.Errorf("Item %d 品质为 %s,不符合过滤条件", item.ID, item.Quality)
  137. }
  138. // 附加属性应该是1或2
  139. if item.Attr != Attr1 && item.Attr != Attr2 {
  140. t.Errorf("Item %d 附加属性为 %d,不符合过滤条件", item.ID, item.Attr)
  141. }
  142. }
  143. // 测试第二页
  144. total, pageData2 := paging.Query(2, pageSize, filterFunc, comparatorFunc)
  145. t.Logf("第二页数据条数: %d", len(pageData2))
  146. // 验证分页是否正确(第二页应该不包含第一页的最后一条数据)
  147. if len(pageData) > 0 && len(pageData2) > 0 {
  148. lastItemPage1 := pageData[len(pageData)-1]
  149. firstItemPage2 := pageData2[0]
  150. // 比较结果:如果lastItemPage1应该排在firstItemPage2前面,返回-1
  151. // 对于分页来说,这是正确的顺序
  152. if comparatorFunc(lastItemPage1, firstItemPage2) <= 0 {
  153. t.Logf("分页正确:第一页最后一条数据应该在第二页第一条数据之前或相等")
  154. } else {
  155. t.Errorf("分页错误:第一页最后一条数据应该在第二页第一条数据之前")
  156. }
  157. }
  158. }