github.com/scottcagno/storage@v1.8.0/pkg/_junk/_lsmtree/container/bptree/bptree_test.go (about) 1 package bptree 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 TestNewBPTree(t *testing.T) { 16 var tree *BPTree 17 tree = NewBPTree() 18 util.AssertNotNil(t, tree) 19 tree.Close() 20 } 21 22 // signature: Has(key string) (bool, int64) 23 func TestBPTree_Has(t *testing.T) { 24 tree := NewBPTree() 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 TestBPTree_HasInt(t *testing.T) { 41 tree := NewBPTree() 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 TestBPTree_Put(t *testing.T) { 58 tree := NewBPTree() 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 TestBPTree_PutInt(t *testing.T) { 72 tree := NewBPTree() 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 TestBPTree_Get(t *testing.T) { 86 tree := NewBPTree() 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 _, v := tree.Get(makeKey(i)) 93 if v == nil { 94 t.Errorf("getting: %v", v) 95 } 96 util.AssertEqual(t, makeVal(i), v) 97 } 98 tree.Close() 99 } 100 101 // signature: GetInt(key int64) (int64, bool) 102 func TestBPTree_GetInt(t *testing.T) { 103 tree := NewBPTree() 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 _, v := tree.GetInt(int64(i)) 110 if v == -1 { 111 t.Errorf("getting: %v", v) 112 } 113 util.AssertEqual(t, int64(i), v) 114 } 115 tree.Close() 116 } 117 118 // signature: Del(key string) ([]byte, bool) 119 func TestBPTree_Del(t *testing.T) { 120 tree := NewBPTree() 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 _, v := tree.Del(makeKey(i)) 127 if v == nil { 128 t.Errorf("delete: %v", v) 129 } 130 } 131 util.AssertLen(t, 0, tree.Len()) 132 tree.Close() 133 } 134 135 // signature: DelInt(key int64) (int64, bool) 136 func TestBPTree_DelInt(t *testing.T) { 137 tree := NewBPTree() 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 _, v := tree.DelInt(int64(i)) 144 if v == -1 { 145 t.Errorf("delete: %v", v) 146 } 147 } 148 util.AssertLen(t, 0, tree.Len()) 149 tree.Close() 150 } 151 152 // signature: Len() int 153 func TestBPTree_Len(t *testing.T) { 154 tree := NewBPTree() 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 TestBPTree_Size(t *testing.T) { 164 tree := NewBPTree() 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 TestBPTree_Min(t *testing.T) { 178 tree := NewBPTree() 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, v := tree.Min() 184 if v == nil { 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 TestBPTree_Max(t *testing.T) { 193 tree := NewBPTree() 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, v := tree.Max() 199 if v == nil { 200 t.Errorf("min: %v", tree) 201 } 202 util.AssertEqual(t, makeKey(n*thousand-1), k) 203 tree.Close() 204 } 205 206 func TestBPTree_Range(t *testing.T) { 207 tree := NewBPTree() 208 for i := 0; i < n*thousand; i++ { 209 tree.Put(makeKey(i), makeVal(i)) 210 } 211 util.AssertLen(t, n*thousand, tree.Len()) 212 213 printInfo := false 214 215 // do scan front 216 tree.Range(func(key string, value []byte) bool { 217 if key == "" { 218 t.Errorf("scan front, issue with key: %v", key) 219 return false 220 } 221 if printInfo { 222 log.Printf("key: %s\n", key) 223 } 224 return true 225 }) 226 227 tree.Close() 228 } 229 230 func TestBPTree_Close(t *testing.T) { 231 var tree *BPTree 232 tree = NewBPTree() 233 tree.Close() 234 } 235 236 func makeKey(i int) string { 237 return fmt.Sprintf("key-%.6d", i) 238 } 239 240 func makeVal(i int) []byte { 241 return []byte(fmt.Sprintf("{\"id\":%.6d,\"key\":\"key-%.6d\",\"value\":\"val-%.6d\"}", i, i, i)) 242 }