You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

120 lines
3.3 KiB

package student_test
import (
"reflect"
"testing"
"github.com/01-edu/z01"
solutions "./solutions"
student "./student"
)
func BTreeMinStu(root *student.TreeNode) *student.TreeNode {
if root == nil || root.Left == nil {
return root
}
return BTreeMinStu(root.Left)
}
func errorMessage_isbin(t *testing.T, fn interface{}, root, a *solutions.TreeNode, b *student.TreeNode) {
t.Fatalf("%s(\n%s\n) == %s instead of %s\n",
z01.NameOfFunc(fn),
solutions.FormatTree(root),
b.Data,
a.Data,
)
}
func CompareNode_isbin(t *testing.T, fn interface{}, arg1, a *solutions.TreeNode, b *student.TreeNode) {
if a == nil || b == nil {
t.Fatalf("Expected %v instead of %v\n", a, b)
return
}
if a.Data != b.Data {
errorMessage_isbin(t, fn, arg1, a, b)
}
if a.Parent != nil && b.Parent != nil {
if a.Parent.Data != b.Parent.Data {
errorMessage_isbin(t, fn, arg1, a, b)
t.Fatalf("Expected parent value %v instead of %v\n", a.Parent.Data, b.Parent.Data)
}
} else if (a.Parent == nil && b.Parent != nil) || (a.Parent != nil && b.Parent == nil) {
t.Fatalf("Expected parent value %v instead of %v\n", a.Parent, b.Parent)
}
if a.Right != nil && b.Right != nil {
if a.Right.Data != b.Right.Data {
errorMessage_isbin(t, fn, arg1, a, b)
t.Fatalf("Expected right child value %v instead of %v\n", a.Right.Data, b.Right.Data)
}
} else if (a.Right == nil && b.Right != nil) || (a.Right != nil && b.Right == nil) {
t.Fatalf("Expected right child value %v instead of %v\n", a.Right, b.Right)
}
if a.Left != nil && b.Left != nil {
if a.Left.Data != b.Left.Data {
errorMessage_isbin(t, fn, arg1, a, b)
t.Fatalf("Expected left child value %v instead of %v\n", a.Left, b.Left)
}
} else if (a.Left == nil && b.Left != nil) || (a.Left != nil && b.Left == nil) {
t.Fatalf("Expected left child value %v instead of %v\n", a, b)
}
}
func CompareReturn_isbin(t *testing.T, fn1, fn2 interface{}, arg1 *solutions.TreeNode, arg2 interface{}) {
arar1 := []interface{}{arg1}
arar2 := []interface{}{arg2}
out1 := z01.Monitor(fn1, arar1)
out2 := z01.Monitor(fn2, arar2)
for i, v := range out1.Results {
switch str := v.(type) {
case *solutions.TreeNode:
CompareNode_isbin(t, fn1, arg1, str, out2.Results[i].(*student.TreeNode))
default:
if !reflect.DeepEqual(str, out2.Results[i]) {
t.Fatalf("%s(\n%s) == %s instead of %s\n",
z01.NameOfFunc(fn1),
solutions.FormatTree(arg1),
z01.Format(out2.Results...),
z01.Format(out1.Results...),
)
}
}
}
}
func TestBTreeIsBinary(t *testing.T) {
root := &solutions.TreeNode{Data: "04"}
rootS := &student.TreeNode{Data: "04"}
ins := []string{"01", "07", "05", "12", "02", "03", "10"}
for _, v := range ins {
root = solutions.BTreeInsertData(root, v)
rootS = student.BTreeInsertData(rootS, v)
}
CompareReturn_isbin(t, solutions.BTreeIsBinary, student.BTreeIsBinary, root, rootS)
rootNB := &solutions.TreeNode{Data: "04"}
rootNB_stu := &student.TreeNode{Data: "04"}
//Test a non-binarysearch tree
for _, v := range ins {
rootNB = solutions.BTreeInsertData(rootNB, v)
rootNB_stu = student.BTreeInsertData(rootNB_stu, v)
}
min := solutions.BTreeMin(rootNB)
minStu := BTreeMinStu(rootNB_stu)
min.Left = &solutions.TreeNode{Data: "123"}
minStu.Left = &student.TreeNode{Data: "123"}
CompareReturn_isbin(t, solutions.BTreeIsBinary, student.BTreeIsBinary, rootNB, rootNB_stu)
}