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  }