201 lines
3.7 KiB
Go
201 lines
3.7 KiB
Go
// Copyright 2015, Hu Keping. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package rbtree
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestInsertAndDelete(t *testing.T) {
|
|
rbt := New()
|
|
|
|
m := 0
|
|
n := 1000
|
|
for m < n {
|
|
rbt.Insert(Int(m))
|
|
m++
|
|
}
|
|
if rbt.Len() != uint(n) {
|
|
t.Errorf("tree.Len() = %d, expect %d", rbt.Len(), n)
|
|
}
|
|
|
|
for m > 0 {
|
|
rbt.Delete(Int(m))
|
|
m--
|
|
}
|
|
if rbt.Len() != 1 {
|
|
t.Errorf("tree.Len() = %d, expect %d", rbt.Len(), 1)
|
|
}
|
|
}
|
|
|
|
type testStruct struct {
|
|
id int
|
|
text string
|
|
}
|
|
|
|
func (ts *testStruct) Less(than Item) bool {
|
|
return ts.id < than.(*testStruct).id
|
|
}
|
|
|
|
func TestInsertOrGet(t *testing.T) {
|
|
rbt := New()
|
|
|
|
items := []*testStruct{
|
|
{1, "this"},
|
|
{2, "is"},
|
|
{3, "a"},
|
|
{4, "test"},
|
|
}
|
|
|
|
for i := range items {
|
|
rbt.Insert(items[i])
|
|
}
|
|
|
|
newItem := &testStruct{items[0].id, "not"}
|
|
newItem = rbt.InsertOrGet(newItem).(*testStruct)
|
|
|
|
if newItem.text != items[0].text {
|
|
t.Errorf("tree.InsertOrGet = {id: %d, text: %s}, expect {id %d, text %s}", newItem.id, newItem.text, items[0].id, items[0].text)
|
|
}
|
|
|
|
newItem = &testStruct{5, "new"}
|
|
newItem = rbt.InsertOrGet(newItem).(*testStruct)
|
|
|
|
if newItem.text != "new" {
|
|
t.Errorf("tree.InsertOrGet = {id: %d, text: %s}, expect {id %d, text %s}", newItem.id, newItem.text, 5, "new")
|
|
}
|
|
}
|
|
|
|
func TestInsertString(t *testing.T) {
|
|
rbt := New()
|
|
|
|
rbt.Insert(String("go"))
|
|
rbt.Insert(String("lang"))
|
|
|
|
if rbt.Len() != 2 {
|
|
t.Errorf("tree.Len() = %d, expect %d", rbt.Len(), 2)
|
|
}
|
|
}
|
|
|
|
// Test for duplicate
|
|
func TestInsertDup(t *testing.T) {
|
|
rbt := New()
|
|
|
|
rbt.Insert(String("go"))
|
|
rbt.Insert(String("go"))
|
|
rbt.Insert(String("go"))
|
|
|
|
if rbt.Len() != 1 {
|
|
t.Errorf("tree.Len() = %d, expect %d", rbt.Len(), 1)
|
|
}
|
|
}
|
|
|
|
func TestDescend(t *testing.T) {
|
|
rbt := New()
|
|
|
|
m := 0
|
|
n := 10
|
|
for m < n {
|
|
rbt.Insert(Int(m))
|
|
m++
|
|
}
|
|
|
|
var ret []Item
|
|
|
|
rbt.Descend(Int(1), func(i Item) bool {
|
|
ret = append(ret, i)
|
|
return true
|
|
})
|
|
expected := []Item{Int(1), Int(0)}
|
|
if !reflect.DeepEqual(ret, expected) {
|
|
t.Errorf("expected %v but got %v", expected, ret)
|
|
}
|
|
|
|
ret = nil
|
|
rbt.Descend(Int(10), func(i Item) bool {
|
|
ret = append(ret, i)
|
|
return true
|
|
})
|
|
expected = []Item{Int(9), Int(8), Int(7), Int(6), Int(5), Int(4), Int(3), Int(2), Int(1), Int(0)}
|
|
if !reflect.DeepEqual(ret, expected) {
|
|
t.Errorf("expected %v but got %v", expected, ret)
|
|
}
|
|
}
|
|
|
|
func TestGet(t *testing.T) {
|
|
rbt := New()
|
|
|
|
rbt.Insert(Int(1))
|
|
rbt.Insert(Int(2))
|
|
rbt.Insert(Int(3))
|
|
|
|
no := rbt.Get(Int(100))
|
|
ok := rbt.Get(Int(1))
|
|
|
|
if no != nil {
|
|
t.Errorf("100 is expect not exists")
|
|
}
|
|
|
|
if ok == nil {
|
|
t.Errorf("1 is expect exists")
|
|
}
|
|
}
|
|
|
|
func TestAscend(t *testing.T) {
|
|
rbt := New()
|
|
|
|
rbt.Insert(String("a"))
|
|
rbt.Insert(String("b"))
|
|
rbt.Insert(String("c"))
|
|
rbt.Insert(String("d"))
|
|
|
|
rbt.Delete(rbt.Min())
|
|
|
|
var ret []Item
|
|
rbt.Ascend(rbt.Min(), func(i Item) bool {
|
|
ret = append(ret, i)
|
|
return true
|
|
})
|
|
|
|
expected := []Item{String("b"), String("c"), String("d")}
|
|
if !reflect.DeepEqual(ret, expected) {
|
|
t.Errorf("expected %v but got %v", expected, ret)
|
|
}
|
|
}
|
|
|
|
func TestMax(t *testing.T) {
|
|
rbt := New()
|
|
|
|
rbt.Insert(String("z"))
|
|
rbt.Insert(String("h"))
|
|
rbt.Insert(String("a"))
|
|
|
|
expected := String("z")
|
|
if rbt.Max() != expected {
|
|
t.Errorf("expected Max of tree as %v but got %v", expected, rbt.Max())
|
|
}
|
|
}
|
|
|
|
func TestAscendRange(t *testing.T) {
|
|
rbt := New()
|
|
|
|
strings := []String{"a", "b", "c", "aa", "ab", "ac", "abc", "acb", "bac"}
|
|
for _, v := range strings {
|
|
rbt.Insert(v)
|
|
}
|
|
|
|
var ret []Item
|
|
rbt.AscendRange(String("ab"), String("b"), func(i Item) bool {
|
|
ret = append(ret, i)
|
|
return true
|
|
})
|
|
expected := []Item{String("ab"), String("abc"), String("ac"), String("acb")}
|
|
|
|
if !reflect.DeepEqual(ret, expected) {
|
|
t.Errorf("expected %v but got %v", expected, ret)
|
|
}
|
|
}
|