| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- package cache
- import (
- "math/rand"
- "testing"
- "time"
- )
- // 类型枚举
- const (
- TypeWeapon = "武器"
- TypeHelmet = "头盔"
- TypeArmor = "护甲"
- TypeBoots = "战靴"
- )
- // 品质枚举
- const (
- QualityExclusive = "专属"
- QualityLegendary = "传说"
- QualityEpic = "史诗"
- QualityRare = "稀有"
- )
- // 兵种枚举
- const (
- ArmyInfantry = "步兵"
- ArmyCavalry = "骑兵"
- ArmyArcher = "弓兵"
- )
- // 附加属性枚举
- const (
- Attr0 = 0
- Attr1 = 1
- Attr2 = 2
- Attr3 = 3
- )
- // 测试用结构体
- type TestItem struct {
- ID int64
- Name string
- Type string
- Quality string
- Army string
- Attr int
- Quantity int
- Price float64
- CreateTime int64
- }
- func TestPaging(t *testing.T) {
- // 创建Paging实例
- paging := NewPaging[TestItem]()
- // 初始化随机数生成器
- rand.Seed(time.Now().UnixNano())
- // 类型列表
- types := []string{TypeWeapon, TypeHelmet, TypeArmor, TypeBoots}
- // 品质列表
- qualities := []string{QualityExclusive, QualityLegendary, QualityEpic, QualityRare}
- // 兵种列表
- armies := []string{ArmyInfantry, ArmyCavalry, ArmyArcher}
- // 附加属性列表
- attrs := []int{Attr0, Attr1, Attr2, Attr3}
- // 生成100条测试数据
- testData := make([]TestItem, 0, 100)
- for i := 0; i < 100; i++ {
- item := TestItem{
- ID: int64(i + 1),
- Name: "装备" + string(rune(i+65)), // A-Z
- Type: types[rand.Intn(len(types))],
- Quality: qualities[rand.Intn(len(qualities))],
- Army: armies[rand.Intn(len(armies))],
- Attr: attrs[rand.Intn(len(attrs))],
- Quantity: rand.Intn(100) + 1,
- Price: rand.Float64() * 10000,
- CreateTime: time.Now().UnixNano() - int64(rand.Intn(1000000000000)), // 随机创建时间,范围在最近1000秒内
- }
- testData = append(testData, item)
- }
- paging.AddAll(testData)
- // 过滤条件
- filterFunc := func(item TestItem) bool {
- // 类型 = 头盔、护甲
- typeOk := item.Type == TypeHelmet || item.Type == TypeArmor
- // 品质 = 专属、传说、史诗
- qualityOk := item.Quality == QualityExclusive || item.Quality == QualityLegendary || item.Quality == QualityEpic
- // 兵种 = 所有
- armyOk := true
- // 附加属性 = 1、2
- attrOk := item.Attr == Attr1 || item.Attr == Attr2
- // 所有条件都必须满足(并且)
- return typeOk && qualityOk && armyOk && attrOk
- }
- // 排序条件:创建时间降序,价格升序
- comparatorFunc := func(a, b TestItem) int {
- // 1. 创建时间降序
- if a.CreateTime > b.CreateTime {
- return -1
- }
- if a.CreateTime < b.CreateTime {
- return 1
- }
- // 2. 价格升序
- if a.Price < b.Price {
- return -1
- }
- if a.Price > b.Price {
- return 1
- }
- return 0
- }
- // 执行查询
- pageSize := int32(10) // 每页10条
- total, pageData := paging.Query(1, pageSize, filterFunc, comparatorFunc)
- // 输出结果
- t.Logf("符合条件的总数: %d", total)
- t.Logf("第一页数据条数: %d", len(pageData))
- // 验证排序是否正确
- if len(pageData) > 1 {
- for i := 0; i < len(pageData)-1; i++ {
- // 检查创建时间降序
- if pageData[i].CreateTime < pageData[i+1].CreateTime {
- t.Errorf("第%d条的创建时间(%d)小于第%d条的创建时间(%d),不符合降序要求",
- i+1, pageData[i].CreateTime, i+2, pageData[i+1].CreateTime)
- }
- // 检查价格升序(当创建时间相同时)
- if pageData[i].CreateTime == pageData[i+1].CreateTime && pageData[i].Price > pageData[i+1].Price {
- t.Errorf("第%d条的价格(%.2f)大于第%d条的价格(%.2f),创建时间相同,不符合升序要求",
- i+1, pageData[i].Price, i+2, pageData[i+1].Price)
- }
- }
- }
- // 验证过滤条件是否正确
- for _, item := range pageData {
- // 类型应该是头盔或护甲
- if item.Type != TypeHelmet && item.Type != TypeArmor {
- t.Errorf("Item %d 类型为 %s,不符合过滤条件", item.ID, item.Type)
- }
- // 品质应该是专属、传说或史诗
- if item.Quality != QualityExclusive && item.Quality != QualityLegendary && item.Quality != QualityEpic {
- t.Errorf("Item %d 品质为 %s,不符合过滤条件", item.ID, item.Quality)
- }
- // 附加属性应该是1或2
- if item.Attr != Attr1 && item.Attr != Attr2 {
- t.Errorf("Item %d 附加属性为 %d,不符合过滤条件", item.ID, item.Attr)
- }
- }
- // 测试第二页
- total, pageData2 := paging.Query(2, pageSize, filterFunc, comparatorFunc)
- t.Logf("第二页数据条数: %d", len(pageData2))
- // 验证分页是否正确(第二页应该不包含第一页的最后一条数据)
- if len(pageData) > 0 && len(pageData2) > 0 {
- lastItemPage1 := pageData[len(pageData)-1]
- firstItemPage2 := pageData2[0]
- // 比较结果:如果lastItemPage1应该排在firstItemPage2前面,返回-1
- // 对于分页来说,这是正确的顺序
- if comparatorFunc(lastItemPage1, firstItemPage2) <= 0 {
- t.Logf("分页正确:第一页最后一条数据应该在第二页第一条数据之前或相等")
- } else {
- t.Errorf("分页错误:第一页最后一条数据应该在第二页第一条数据之前")
- }
- }
- }
|