138 lines
2.6 KiB
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
|
|
}
|