1
0
Fork 0

mcmp: make InheritedValue a function, not a method, and add Parent method to support it

gh-v1-backup
Brian Picciano 5 years ago
parent 6cd61c60f7
commit 752e266685
  1. 35
      mcmp/component.go
  2. 43
      mcmp/component_test.go

@ -69,20 +69,6 @@ func (c *Component) Value(key interface{}) interface{} {
return value
}
// InheritedValue returns the value which has been set for the given key. It first
// looks for the key on the receiver Component. If not found, it will look on
// its parent Component, and so on, until the key is found. If the key is not
// found on the root Component then false is returned.
func (c *Component) InheritedValue(key interface{}) (interface{}, bool) {
value, ok := c.value(key)
if ok {
return value, ok
} else if c.parent == nil {
return nil, false
}
return c.parent.InheritedValue(key)
}
// Values returns all key/value pairs which have been set via SetValue.
func (c *Component) Values() map[interface{}]interface{} {
c.l.RLock()
@ -137,6 +123,13 @@ func (c *Component) Children() []*Component {
return children
}
// Parent returns the Component from which this one was created via the Child
// method. This returns nil if this Component was not created via Child (and is
// therefore the root Component).
func (c *Component) Parent() *Component {
return c.parent
}
// Name returns the name this Component was created with (via the Child method),
// or false if this Component was not created via Child (and is therefore the
// root Component).
@ -216,3 +209,17 @@ func BreadthFirstVisit(c *Component, callback func(*Component) bool) {
queue = queue[1:]
}
}
// InheritedValue returns the value which has been set for the given key. It
// first looks for the key on the receiver Component. If not found, it will look
// on its parent Component, and so on, until the key is found. If the key is not
// found on any Components, up to the root Component, then false is returned.
func InheritedValue(c *Component, key interface{}) (interface{}, bool) {
if c.HasValue(key) {
return c.kv[key], true
} else if parent := c.Parent(); parent == nil {
return nil, false
} else {
return InheritedValue(parent, key)
}
}

@ -53,23 +53,6 @@ func TestComponent(t *T) {
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)
@ -103,3 +86,29 @@ func TestBreadFirstVisit(t *T) {
)
}
}
func TestInheritedValue(t *T) {
assertInheritedValue := func(c *Component, key, expectedValue interface{}) massert.Assertion {
val, ok := InheritedValue(c, key)
return massert.All(
massert.Equal(expectedValue, val),
massert.Equal(expectedValue != nil, ok),
)
}
c := new(Component)
c.SetValue("foo", 1)
child := c.Child("child")
child.SetValue("bar", 2)
// 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),
)
}

Loading…
Cancel
Save