This repository has been archived on 2022-07-30. You can view files and clone it, but cannot push or open issues/pull-requests.
mdb/btreeindex_ex_test.go

138 lines
2.6 KiB
Go

package mdb
import (
"fmt"
"reflect"
)
func (bt *BTreeIndex[T]) Equals(rhs *BTreeIndex[T]) error {
if bt.Len() != rhs.Len() {
return fmt.Errorf("Expected %d items, but found %d.", bt.Len(), rhs.Len())
}
it1 := bt.Ascend()
defer it1.Close()
it2 := rhs.Ascend()
defer it2.Close()
for it1.Next() {
it2.Next()
v1 := it1.Value()
v2 := it2.Value()
if !reflect.DeepEqual(v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", v1, v2)
}
}
return nil
}
func (bt *BTreeIndex[T]) EqualsList(data []*T) error {
if bt.Len() != len(data) {
return fmt.Errorf("Expected %d items, but found %d.", bt.Len(), len(data))
}
if len(data) == 0 {
return nil
}
// Ascend fully.
it := bt.Ascend()
for _, v1 := range data {
it.Next()
v2 := it.Value()
if !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
}
if it.Next() {
return fmt.Errorf("Next returned true after full ascend.")
}
it.Close()
// Descend fully.
it = bt.Descend()
dataList := data
for len(dataList) > 0 {
v1 := dataList[len(dataList)-1]
dataList = dataList[:len(dataList)-1]
it.Next()
v2 := it.Value()
if !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
}
if it.Next() {
return fmt.Errorf("Next returned true after full descend.")
}
it.Close()
// AscendAfter
dataList = data
for len(dataList) > 1 {
dataList = dataList[1:]
it = bt.AscendAfter(*dataList[0])
for _, v1 := range dataList {
it.Next()
v2 := it.Value()
if !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
}
if it.Next() {
return fmt.Errorf("Next returned true after partial ascend.")
}
it.Close()
}
// DescendAfter
dataList = data
for len(dataList) > 1 {
dataList = dataList[:len(dataList)-1]
it = bt.DescendAfter(*dataList[len(dataList)-1])
for i := len(dataList) - 1; i >= 0; i-- {
v1 := dataList[i]
it.Next()
v2 := it.Value()
if !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
}
if it.Next() {
return fmt.Errorf("Next returned true after partial descend: %#v", it.Value())
}
it.Close()
}
// Using Get.
for _, v1 := range data {
v2, ok := bt.Get(*v1)
if !ok || !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
}
// Min.
v1 := data[0]
v2, ok := bt.Min()
if !ok || !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
// Max.
v1 = data[len(data)-1]
v2, ok = bt.Max()
if !ok || !reflect.DeepEqual(*v1, v2) {
return fmt.Errorf("Value mismatch: %v != %v", *v1, v2)
}
return nil
}