github.com/scottcagno/storage@v1.8.0/pkg/_junk/_index/rbtree/rbtree_test.go (about) 1 package rbtree 2 3 import ( 4 "fmt" 5 "github.com/scottcagno/storage/pkg/util" 6 "log" 7 "testing" 8 ) 9 10 const ( 11 thousand = 1000 12 n = 1 13 ) 14 15 func TestNewRBTree(t *testing.T) { 16 var tree *RBTree 17 tree = NewRBTree() 18 util.AssertNotNil(t, tree) 19 tree.Close() 20 } 21 22 // signature: Has(key string) (bool, int64) 23 func TestRbTree_Has(t *testing.T) { 24 tree := NewRBTree() 25 util.AssertLen(t, 0, tree.Len()) 26 for i := 0; i < n*thousand; i++ { 27 tree.Put(makeKey(i), makeVal(i)) 28 } 29 for i := 0; i < n*thousand; i++ { 30 ok := tree.Has(makeKey(i)) 31 if !ok { // existing=updated 32 t.Errorf("has: %v", ok) 33 } 34 } 35 util.AssertLen(t, n*thousand, tree.Len()) 36 tree.Close() 37 } 38 39 // signature: HasInt(key int64) (bool, int64) 40 func TestRbTree_HasInt(t *testing.T) { 41 tree := NewRBTree() 42 util.AssertLen(t, 0, tree.Len()) 43 for i := 0; i < n*thousand; i++ { 44 tree.PutInt(int64(i), int64(i)) 45 } 46 for i := 0; i < n*thousand; i++ { 47 ok := tree.HasInt(int64(i)) 48 if !ok { // existing=updated 49 t.Errorf("has: %v", ok) 50 } 51 } 52 util.AssertLen(t, n*thousand, tree.Len()) 53 tree.Close() 54 } 55 56 // signature: Put(key string, val []byte) ([]byte, bool) 57 func TestRbTree_Put(t *testing.T) { 58 tree := NewRBTree() 59 util.AssertLen(t, 0, tree.Len()) 60 for i := 0; i < n*thousand; i++ { 61 _, existing := tree.Put(makeKey(i), makeVal(i)) 62 if existing { // existing=updated 63 t.Errorf("putting: %v", existing) 64 } 65 } 66 util.AssertLen(t, n*thousand, tree.Len()) 67 tree.Close() 68 } 69 70 // signature: PutInt(key int64, val int64) (int64, bool) 71 func TestRbTree_PutInt(t *testing.T) { 72 tree := NewRBTree() 73 util.AssertLen(t, 0, tree.Len()) 74 for i := 0; i < n*thousand; i++ { 75 _, existing := tree.PutInt(int64(i), int64(i)) 76 if existing { // existing=updated 77 t.Errorf("putting: %v", existing) 78 } 79 } 80 util.AssertLen(t, n*thousand, tree.Len()) 81 tree.Close() 82 } 83 84 // signature: Get(key string) ([]byte, bool) 85 func TestRbTree_Get(t *testing.T) { 86 tree := NewRBTree() 87 for i := 0; i < n*thousand; i++ { 88 tree.Put(makeKey(i), makeVal(i)) 89 } 90 util.AssertLen(t, n*thousand, tree.Len()) 91 for i := 0; i < n*thousand; i++ { 92 val, ok := tree.Get(makeKey(i)) 93 if !ok { 94 t.Errorf("getting: %v", ok) 95 } 96 util.AssertEqual(t, makeVal(i), val) 97 } 98 tree.Close() 99 } 100 101 // signature: GetInt(key int64) (int64, bool) 102 func TestRbTree_GetInt(t *testing.T) { 103 tree := NewRBTree() 104 for i := 0; i < n*thousand; i++ { 105 tree.PutInt(int64(i), int64(i)) 106 } 107 util.AssertLen(t, n*thousand, tree.Len()) 108 for i := 0; i < n*thousand; i++ { 109 val, ok := tree.GetInt(int64(i)) 110 if !ok { 111 t.Errorf("getting: %v", ok) 112 } 113 util.AssertEqual(t, int64(i), val) 114 } 115 tree.Close() 116 } 117 118 // signature: Del(key string) ([]byte, bool) 119 func TestRbTree_Del(t *testing.T) { 120 tree := NewRBTree() 121 for i := 0; i < n*thousand; i++ { 122 tree.Put(makeKey(i), makeVal(i)) 123 } 124 util.AssertLen(t, n*thousand, tree.Len()) 125 for i := 0; i < n*thousand; i++ { 126 _, ok := tree.Del(makeKey(i)) 127 if !ok { 128 t.Errorf("delete: %v", ok) 129 } 130 } 131 util.AssertLen(t, 0, tree.Len()) 132 tree.Close() 133 } 134 135 // signature: DelInt(key int64) (int64, bool) 136 func TestRbTree_DelInt(t *testing.T) { 137 tree := NewRBTree() 138 for i := 0; i < n*thousand; i++ { 139 tree.PutInt(int64(i), int64(i)) 140 } 141 util.AssertLen(t, n*thousand, tree.Len()) 142 for i := 0; i < n*thousand; i++ { 143 _, ok := tree.DelInt(int64(i)) 144 if !ok { 145 t.Errorf("delete: %v", ok) 146 } 147 } 148 util.AssertLen(t, 0, tree.Len()) 149 tree.Close() 150 } 151 152 // signature: Len() int 153 func TestRbTree_Len(t *testing.T) { 154 tree := NewRBTree() 155 for i := 0; i < n*thousand; i++ { 156 tree.Put(makeKey(i), makeVal(i)) 157 } 158 util.AssertLen(t, n*thousand, tree.Len()) 159 tree.Close() 160 } 161 162 // signature: Size() int64 163 func TestRbTree_Size(t *testing.T) { 164 tree := NewRBTree() 165 var numBytes int64 166 for i := 0; i < n*thousand; i++ { 167 key, val := makeKey(i), makeVal(i) 168 numBytes += int64(len(key) + len(val)) 169 tree.Put(key, val) 170 } 171 util.AssertLen(t, numBytes, tree.Size()) 172 log.Printf("size=%d\n", numBytes) 173 tree.Close() 174 } 175 176 // signature: Min() (string, []byte, bool) 177 func TestRbTree_Min(t *testing.T) { 178 tree := NewRBTree() 179 for i := 0; i < n*thousand; i++ { 180 tree.Put(makeKey(i), makeVal(i)) 181 } 182 util.AssertLen(t, n*thousand, tree.Len()) 183 k, _, ok := tree.Min() 184 if !ok { 185 t.Errorf("min: %v", tree) 186 } 187 util.AssertEqual(t, makeKey(0), k) 188 tree.Close() 189 } 190 191 // signature: Max() (string, []byte, bool) 192 func TestRbTree_Max(t *testing.T) { 193 tree := NewRBTree() 194 for i := 0; i < n*thousand; i++ { 195 tree.Put(makeKey(i), makeVal(i)) 196 } 197 util.AssertLen(t, n*thousand, tree.Len()) 198 k, _, ok := tree.Max() 199 if !ok { 200 t.Errorf("min: %v", tree) 201 } 202 util.AssertEqual(t, makeKey(n*thousand-1), k) 203 tree.Close() 204 } 205 206 // signature: ScanFront(iter Iterator) 207 func TestRbTree_ScanFront(t *testing.T) { 208 tree := NewRBTree() 209 for i := 0; i < n*thousand; i++ { 210 tree.Put(makeKey(i), makeVal(i)) 211 } 212 util.AssertLen(t, n*thousand, tree.Len()) 213 214 printInfo := true 215 216 // do scan front 217 tree.ScanFront(func(key string, value []byte) bool { 218 if key == "" { 219 t.Errorf("scan front, issue with key: %v", key) 220 return false 221 } 222 if printInfo { 223 log.Printf("key: %s\n", key) 224 } 225 return true 226 }) 227 228 tree.Close() 229 } 230 231 // signature: ScanBack(iter Iterator) 232 func TestRbTree_ScanBack(t *testing.T) { 233 tree := NewRBTree() 234 for i := 0; i < n*thousand; i++ { 235 tree.Put(makeKey(i), makeVal(i)) 236 } 237 util.AssertLen(t, n*thousand, tree.Len()) 238 239 printInfo := true 240 241 tree.ScanBack(func(key string, value []byte) bool { 242 if key == "" { 243 t.Errorf("scan back, issue with key: %v", key) 244 return false 245 } 246 if printInfo { 247 log.Printf("key: %s\n", key) 248 } 249 return true 250 }) 251 252 tree.Close() 253 } 254 255 // signature: ScanRange(start Entry, end Entry, iter Iterator) 256 func TestRbTree_ScanRange(t *testing.T) { 257 tree := NewRBTree() 258 for i := 0; i < n*thousand; i++ { 259 tree.Put(makeKey(i), makeVal(i)) 260 } 261 util.AssertLen(t, n*thousand, tree.Len()) 262 263 printInfo := true 264 265 start, stop := makeKey(300), makeKey(700) 266 tree.ScanRange(start, stop, func(key string, value []byte) bool { 267 if key == "" && key < start && key > stop { 268 t.Errorf("scan range, issue with key: %v", key) 269 return false 270 } 271 if printInfo { 272 log.Printf("key: %s\n", key) 273 } 274 return true 275 }) 276 277 tree.Close() 278 } 279 280 // signature: ToList() (*list.List, error) 281 func TestRbTree_ToList(t *testing.T) { 282 tree := NewRBTree() 283 for i := 0; i < n*thousand; i++ { 284 tree.Put(makeKey(i), makeVal(i)) 285 } 286 util.AssertLen(t, n*thousand, tree.Len()) 287 288 l, err := tree.ToList() 289 if err != nil { 290 t.Errorf("tolist: %v", err) 291 } 292 util.AssertLen(t, n*thousand, l.Len()) 293 l = nil 294 tree.Close() 295 } 296 297 // signature: FromList(li *list.List) error 298 func TestRbTree_FromList(t *testing.T) { 299 tree := NewRBTree() 300 for i := 0; i < n*thousand; i++ { 301 tree.Put(makeKey(i), makeVal(i)) 302 } 303 util.AssertLen(t, n*thousand, tree.Len()) 304 treeList, err := tree.ToList() 305 if err != nil { 306 t.Errorf("to list: %v", err) 307 } 308 util.AssertLen(t, n*thousand, treeList.Len()) 309 tree.Close() 310 311 tree = NewRBTree() 312 util.AssertLen(t, 0, tree.Len()) 313 314 err = tree.FromList(treeList) 315 if err != nil { 316 t.Errorf("from list: %v", err) 317 } 318 treeList = nil 319 util.AssertLen(t, n*thousand, tree.Len()) 320 321 tree.Close() 322 } 323 324 // signature: Close() 325 func TestRbTree_Close(t *testing.T) { 326 var tree *RBTree 327 tree = NewRBTree() 328 tree.Close() 329 } 330 331 func makeKey(i int) string { 332 return fmt.Sprintf("key-%.6d", i) 333 } 334 335 func makeVal(i int) []byte { 336 return []byte(fmt.Sprintf("{\"id\":%.6d,\"key\":\"key-%.6d\",\"value\":\"val-%.6d\"}", i, i, i)) 337 }