github.com/zhongdalu/gf@v1.0.0/g/container/gring/gring_unit_test.go (about) 1 package gring_test 2 3 import ( 4 "container/ring" 5 "github.com/zhongdalu/gf/g" 6 "github.com/zhongdalu/gf/g/container/gring" 7 "github.com/zhongdalu/gf/g/test/gtest" 8 "testing" 9 ) 10 11 type Student struct { 12 position int 13 name string 14 upgrade bool 15 } 16 17 func TestRing_Val(t *testing.T) { 18 gtest.Case(t, func() { 19 //定义cap 为3的ring类型数据 20 r := gring.New(3, true) 21 //分别给3个元素初始化赋值 22 r.Put(&Student{1, "jimmy", true}) 23 r.Put(&Student{2, "tom", true}) 24 r.Put(&Student{3, "alon", false}) 25 26 //元素取值并判断和预设值是否相等 27 gtest.Assert(r.Val().(*Student).name, "jimmy") 28 //从当前位置往后移两个元素 29 r.Move(2) 30 gtest.Assert(r.Val().(*Student).name, "alon") 31 //更新元素值 32 //测试 value == nil 33 r.Set(nil) 34 gtest.Assert(r.Val(), nil) 35 //测试value != nil 36 r.Set(&Student{3, "jack", true}) 37 }) 38 } 39 func TestRing_CapLen(t *testing.T) { 40 gtest.Case(t, func() { 41 r := gring.New(10) 42 r.Put("goframe") 43 //cap长度 10 44 gtest.Assert(r.Cap(), 10) 45 //已有数据项 1 46 gtest.Assert(r.Len(), 1) 47 }) 48 } 49 50 func TestRing_Position(t *testing.T) { 51 gtest.Case(t, func() { 52 r := gring.New(2) 53 r.Put(1) 54 r.Put(2) 55 //往后移动1个元素 56 r.Next() 57 gtest.Assert(r.Val(), 2) 58 //往前移动1个元素 59 r.Prev() 60 gtest.Assert(r.Val(), 1) 61 62 }) 63 } 64 65 func TestRing_Link(t *testing.T) { 66 gtest.Case(t, func() { 67 r := gring.New(3) 68 r.Put(1) 69 r.Put(2) 70 r.Put(3) 71 s := gring.New(2) 72 s.Put("a") 73 s.Put("b") 74 75 rs := r.Link(s) 76 gtest.Assert(rs.Move(2).Val(), "b") 77 78 }) 79 } 80 81 func TestRing_Unlink(t *testing.T) { 82 gtest.Case(t, func() { 83 r := gring.New(5) 84 for i := 0; i < 5; i++ { 85 r.Put(i + 1) 86 } 87 // 1 2 3 4 88 // 删除当前位置往后的2个数据,返回被删除的数据 89 // 重新计算s len 90 s := r.Unlink(2) // 2 3 91 gtest.Assert(s.Val(), 2) 92 gtest.Assert(s.Len(), 1) 93 }) 94 } 95 96 func TestRing_Slice(t *testing.T) { 97 gtest.Case(t, func() { 98 ringLen := 5 99 r := gring.New(ringLen) 100 for i := 0; i < ringLen; i++ { 101 r.Put(i + 1) 102 } 103 r.Move(2) // 3 104 array := r.SliceNext() // [3 4 5 1 2] 105 gtest.Assert(array[0], 3) 106 gtest.Assert(len(array), 5) 107 108 //判断array是否等于[3 4 5 1 2] 109 ra := []int{3, 4, 5, 1, 2} 110 gtest.Assert(ra, array) 111 112 //第3个元素设为nil 113 r.Set(nil) 114 array2 := r.SliceNext() //[4 5 1 2] 115 //返回当前位置往后不为空的元素数组,长度为4 116 gtest.Assert(array2, g.Slice{4, 5, 1, 2}) 117 118 array3 := r.SlicePrev() //[2 1 5 4] 119 gtest.Assert(array3, g.Slice{2, 1, 5, 4}) 120 121 s := gring.New(ringLen) 122 for i := 0; i < ringLen; i++ { 123 s.Put(i + 1) 124 } 125 array4 := s.SlicePrev() // [] 126 gtest.Assert(array4, g.Slice{1, 5, 4, 3, 2}) 127 128 }) 129 } 130 131 func TestRing_RLockIterator(t *testing.T) { 132 gtest.Case(t, func() { 133 ringLen := 5 134 r := gring.New(ringLen) 135 136 //ring不存在有值元素 137 r.RLockIteratorNext(func(v interface{}) bool { 138 gtest.Assert(v, nil) 139 return false 140 }) 141 r.RLockIteratorNext(func(v interface{}) bool { 142 gtest.Assert(v, nil) 143 return true 144 }) 145 146 r.RLockIteratorPrev(func(v interface{}) bool { 147 gtest.Assert(v, nil) 148 return true 149 }) 150 151 for i := 0; i < ringLen; i++ { 152 r.Put(i + 1) 153 } 154 155 //回调函数返回true,RLockIteratorNext遍历5次,期望值分别是1、2、3、4、5 156 i := 0 157 r.RLockIteratorNext(func(v interface{}) bool { 158 gtest.Assert(v, i+1) 159 i++ 160 return true 161 }) 162 163 //RLockIteratorPrev遍历1次返回 false,退出遍历 164 r.RLockIteratorPrev(func(v interface{}) bool { 165 gtest.Assert(v, 1) 166 return false 167 }) 168 169 }) 170 } 171 172 func TestRing_LockIterator(t *testing.T) { 173 gtest.Case(t, func() { 174 ringLen := 5 175 r := gring.New(ringLen) 176 177 //不存在有值元素 178 r.LockIteratorNext(func(item *ring.Ring) bool { 179 gtest.Assert(item.Value, nil) 180 return false 181 }) 182 r.LockIteratorNext(func(item *ring.Ring) bool { 183 gtest.Assert(item.Value, nil) 184 return false 185 }) 186 r.LockIteratorNext(func(item *ring.Ring) bool { 187 gtest.Assert(item.Value, nil) 188 return true 189 }) 190 191 r.LockIteratorPrev(func(item *ring.Ring) bool { 192 gtest.Assert(item.Value, nil) 193 return false 194 }) 195 r.LockIteratorPrev(func(item *ring.Ring) bool { 196 gtest.Assert(item.Value, nil) 197 return true 198 }) 199 200 //ring初始化元素值 201 for i := 0; i < ringLen; i++ { 202 r.Put(i + 1) 203 } 204 205 //往后遍历组成数据 [1,2,3,4,5] 206 array1 := g.Slice{1, 2, 3, 4, 5} 207 ii := 0 208 r.LockIteratorNext(func(item *ring.Ring) bool { 209 //校验每一次遍历取值是否是期望值 210 gtest.Assert(item.Value, array1[ii]) 211 ii++ 212 return true 213 }) 214 215 //往后取3个元素组成数组 216 //获得 [1,5,4] 217 i := 0 218 a := g.Slice{1, 5, 4} 219 r.LockIteratorPrev(func(item *ring.Ring) bool { 220 if i > 2 { 221 return false 222 } 223 gtest.Assert(item.Value, a[i]) 224 i++ 225 return true 226 }) 227 228 }) 229 }