mediocre-go-lib/mcmp/component_test.go

106 lines
2.5 KiB
Go
Raw Normal View History

package mcmp
import (
. "testing"
"github.com/mediocregopher/mediocre-go-lib/mtest/massert"
)
func TestComponent(t *T) {
assertValue := func(c *Component, key, expectedValue interface{}) massert.Assertion {
val := c.Value(key)
ok := c.HasValue(key)
return massert.All(
massert.Equal(expectedValue, val),
massert.Equal(expectedValue != nil, ok),
)
}
assertName := func(c *Component, expectedName string) massert.Assertion {
name, ok := c.Name()
return massert.All(
massert.Equal(expectedName, name),
massert.Equal(expectedName != "", ok),
)
}
// test that a Component is initialized correctly
c := new(Component)
massert.Require(t,
assertName(c, ""),
massert.Length(c.Path(), 0),
massert.Length(c.Children(), 0),
assertValue(c, "foo", nil),
assertValue(c, "bar", nil),
)
// test that setting values work, and that values aren't inherited
c.SetValue("foo", 1)
child := c.Child("child")
massert.Require(t,
assertName(child, "child"),
massert.Equal([]string{"child"}, child.Path()),
massert.Length(child.Children(), 0),
massert.Equal([]*Component{child}, c.Children()),
assertValue(c, "foo", 1),
assertValue(child, "foo", nil),
)
// test that a child setting a value does not affect the parent
child.SetValue("bar", 2)
massert.Require(t,
assertValue(c, "bar", nil),
assertValue(child, "bar", 2),
)
assertInheritedValue := func(c *Component, key, expectedValue interface{}) massert.Assertion {
val, ok := c.InheritedValue(key)
return massert.All(
massert.Equal(expectedValue, val),
massert.Equal(expectedValue != nil, ok),
)
}
// test that InheritedValue does what it's supposed to
massert.Require(t,
assertInheritedValue(c, "foo", 1),
assertInheritedValue(child, "foo", 1),
assertInheritedValue(c, "bar", nil),
assertInheritedValue(child, "bar", 2),
assertInheritedValue(c, "xxx", nil),
assertInheritedValue(child, "xxx", nil),
)
}
func TestBreadFirstVisit(t *T) {
cmp := new(Component)
cmp1 := cmp.Child("1")
cmp1a := cmp1.Child("a")
cmp1b := cmp1.Child("b")
cmp2 := cmp.Child("2")
{
got := make([]*Component, 0, 5)
BreadthFirstVisit(cmp, func(cmp *Component) bool {
got = append(got, cmp)
return true
})
massert.Require(t,
massert.Equal([]*Component{cmp, cmp1, cmp2, cmp1a, cmp1b}, got),
)
}
{
got := make([]*Component, 0, 3)
BreadthFirstVisit(cmp, func(cmp *Component) bool {
if len(cmp.Path()) > 1 {
return false
}
got = append(got, cmp)
return true
})
massert.Require(t,
massert.Equal([]*Component{cmp, cmp1, cmp2}, got),
)
}
}