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