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 }