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