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  }