github.com/hdt3213/godis@v1.2.9/datastruct/list/quicklist_test.go (about) 1 package list 2 3 import ( 4 "github.com/hdt3213/godis/lib/utils" 5 "strconv" 6 "testing" 7 ) 8 9 func TestQuickList_Add(t *testing.T) { 10 list := NewQuickList() 11 for i := 0; i < pageSize*10; i++ { 12 list.Add(i) 13 } 14 for i := 0; i < pageSize*10; i++ { 15 v := list.Get(i).(int) 16 if v != i { 17 t.Errorf("wrong value at: %d", i) 18 } 19 } 20 list.ForEach(func(i int, v interface{}) bool { 21 if v != i { 22 t.Errorf("wrong value at: %d", i) 23 } 24 return true 25 }) 26 } 27 28 func BenchmarkQuickList_Add(b *testing.B) { 29 list := NewQuickList() 30 for i := 0; i < pageSize*10; i++ { 31 list.Add(i) 32 } 33 } 34 35 func BenchmarkQuickList_Range(b *testing.B) { 36 list := NewQuickList() 37 for i := 0; i < pageSize*10; i++ { 38 list.Add(i) 39 } 40 list.ForEach(func(i int, v interface{}) bool { 41 return true 42 }) 43 } 44 45 func TestQuickList_Set(t *testing.T) { 46 list := NewQuickList() 47 for i := 0; i < pageSize*10; i++ { 48 list.Add(i) 49 } 50 for i := 0; i < pageSize*10; i++ { 51 list.Set(i, 2*i) 52 } 53 for i := 0; i < pageSize*10; i++ { 54 v := list.Get(i).(int) 55 if v != 2*i { 56 t.Errorf("wrong value at: %d", i) 57 } 58 } 59 } 60 61 func TestQuickList_Insert(t *testing.T) { 62 list := NewQuickList() 63 for i := 0; i < pageSize*10; i++ { 64 list.Insert(0, i) 65 } 66 for i := 0; i < pageSize*10; i++ { 67 v := list.Get(i).(int) 68 if v != pageSize*10-i-1 { 69 t.Errorf("wrong value at: %d", i) 70 } 71 } 72 73 // insert into second half page 74 list = NewQuickList() 75 for i := 0; i < pageSize; i++ { 76 list.Add(0) 77 } 78 for i := 0; i < pageSize; i++ { 79 list.Insert(pageSize-1, i+1) 80 } 81 for i := pageSize - 1; i < list.size; i++ { 82 v := list.Get(i).(int) 83 if v != 2*pageSize-1-i { 84 t.Errorf("wrong value at: %d", i) 85 } 86 } 87 } 88 89 func TestQuickList_RemoveLast(t *testing.T) { 90 list := NewQuickList() 91 size := pageSize * 10 92 for i := 0; i < size; i++ { 93 list.Add(i) 94 } 95 for i := 0; i < size; i++ { 96 v := list.RemoveLast() 97 if v != size-i-1 { 98 t.Errorf("wrong value at: %d", i) 99 } 100 if list.Len() != size-i-1 { 101 t.Errorf("wrong len: %d", list.Len()) 102 } 103 } 104 105 } 106 107 func TestQuickListRemoveVal(t *testing.T) { 108 list := NewQuickList() 109 size := pageSize * 10 110 for i := 0; i < size; i++ { 111 list.Add(i) 112 list.Add(i) 113 } 114 for index := 0; index < list.Len(); index++ { 115 list.RemoveAllByVal(func(a interface{}) bool { 116 return utils.Equals(a, index) 117 }) 118 list.ForEach(func(i int, v interface{}) bool { 119 intVal, _ := v.(int) 120 if intVal == index { 121 t.Error("remove test fail: found " + strconv.Itoa(index) + " at index: " + strconv.Itoa(i)) 122 } 123 return true 124 }) 125 } 126 127 list = NewQuickList() 128 for i := 0; i < size; i++ { 129 list.Add(i) 130 list.Add(i) 131 } 132 for i := 0; i < size; i++ { 133 list.RemoveByVal(func(a interface{}) bool { 134 return utils.Equals(a, i) 135 }, 1) 136 } 137 list.ForEach(func(i int, v interface{}) bool { 138 intVal, _ := v.(int) 139 if intVal != i { 140 t.Error("test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal)) 141 } 142 return true 143 }) 144 for i := 0; i < size; i++ { 145 list.RemoveByVal(func(a interface{}) bool { 146 return utils.Equals(a, i) 147 }, 1) 148 } 149 if list.Len() != 0 { 150 t.Error("test fail: expected 0, actual: " + strconv.Itoa(list.Len())) 151 } 152 153 list = NewQuickList() 154 for i := 0; i < size; i++ { 155 list.Add(i) 156 list.Add(i) 157 } 158 for i := 0; i < size; i++ { 159 list.ReverseRemoveByVal(func(a interface{}) bool { 160 return utils.Equals(a, i) 161 }, 1) 162 } 163 list.ForEach(func(i int, v interface{}) bool { 164 intVal, _ := v.(int) 165 if intVal != i { 166 t.Error("test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal)) 167 } 168 return true 169 }) 170 for i := 0; i < size; i++ { 171 list.ReverseRemoveByVal(func(a interface{}) bool { 172 return utils.Equals(a, i) 173 }, 1) 174 } 175 if list.Len() != 0 { 176 t.Error("test fail: expected 0, actual: " + strconv.Itoa(list.Len())) 177 } 178 } 179 180 func TestQuickList_Contains(t *testing.T) { 181 list := NewQuickList() 182 list.Add(1) 183 list.Add(2) 184 list.Add(3) 185 if !list.Contains(func(a interface{}) bool { 186 return a == 1 187 }) { 188 t.Error("expect true actual false") 189 } 190 if list.Contains(func(a interface{}) bool { 191 return a == -1 192 }) { 193 t.Error("expect false actual true") 194 } 195 } 196 197 func TestQuickList_Range(t *testing.T) { 198 list := NewQuickList() 199 size := 10 200 for i := 0; i < size; i++ { 201 list.Add(i) 202 } 203 for start := 0; start < size; start++ { 204 for stop := start; stop < size; stop++ { 205 slice := list.Range(start, stop) 206 if len(slice) != stop-start { 207 t.Error("expected " + strconv.Itoa(stop-start) + ", get: " + strconv.Itoa(len(slice)) + 208 ", range: [" + strconv.Itoa(start) + "," + strconv.Itoa(stop) + "]") 209 } 210 sliceIndex := 0 211 for i := start; i < stop; i++ { 212 val := slice[sliceIndex] 213 intVal, _ := val.(int) 214 if intVal != i { 215 t.Error("expected " + strconv.Itoa(i) + ", get: " + strconv.Itoa(intVal) + 216 ", range: [" + strconv.Itoa(start) + "," + strconv.Itoa(stop) + "]") 217 } 218 sliceIndex++ 219 } 220 } 221 } 222 } 223 224 func TestQuickList_Remove(t *testing.T) { 225 list := NewQuickList() 226 size := pageSize * 10 227 for i := 0; i < size; i++ { 228 list.Add(i) 229 } 230 for i := size - 1; i >= 0; i-- { 231 list.Remove(i) 232 if i != list.Len() { 233 t.Error("remove test fail: expected size " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(list.Len())) 234 } 235 list.ForEach(func(i int, v interface{}) bool { 236 intVal, _ := v.(int) 237 if intVal != i { 238 t.Error("remove test fail: expected " + strconv.Itoa(i) + ", actual: " + strconv.Itoa(intVal)) 239 } 240 return true 241 }) 242 } 243 } 244 245 func TestQuickList_Prev(t *testing.T) { 246 list := NewQuickList() 247 size := pageSize * 10 248 for i := 0; i < size; i++ { 249 list.Add(i) 250 } 251 iter := list.find(size - 1) 252 i := size - 1 253 for !iter.atBegin() { 254 v := iter.get() 255 if v != i { 256 t.Errorf("wrong value at %d", i) 257 } 258 iter.prev() 259 i-- 260 } 261 }