package merkletrie
import . "gopkg.in/check.v1"
type FrameSuite struct{}
var _ = Suite(&FrameSuite{})
func (s *FrameSuite) TestNewFrameFromLeaf(c *C) {
n := newNode(
[]byte("hash"),
"key",
[]*node{},
)
frame := newFrame("foo", n)
expectedString := `base="foo/key", stack=[]`
c.Assert(frame.String(), Equals, expectedString)
obtainedTopNode, obtainedTopOK := frame.top()
c.Assert(obtainedTopNode, IsNil)
c.Assert(obtainedTopOK, Equals, false)
obtainedPopNode, obtainedPopOK := frame.top()
c.Assert(obtainedPopNode, IsNil)
c.Assert(obtainedPopOK, Equals, false)
}
func (s *FrameSuite) TestNewFrameFromParent(c *C) {
leaf0 := newNode([]byte("leaf0 hash"), "leaf0 key", []*node{})
leaf1 := newNode([]byte("leaf1 hash"), "leaf1 key", []*node{})
leaf2 := newNode([]byte("leaf2 hash"), "leaf2 key", []*node{})
leaf3 := newNode([]byte("leaf3 hash"), "leaf3 key", []*node{})
parent := newNode(
[]byte("parent hash"),
"parent key",
[]*node{leaf3, leaf0, leaf2, leaf1}, // not alphabetically sorted
)
frame := newFrame("foo", parent)
expectedString := `base="foo/parent key", stack=["leaf3 key", "leaf2 key", "leaf1 key", "leaf0 key"]`
c.Assert(frame.String(), Equals, expectedString)
checkTopAndPop(c, frame, leaf0, true)
checkTopAndPop(c, frame, leaf1, true)
checkTopAndPop(c, frame, leaf2, true)
checkTopAndPop(c, frame, leaf3, true)
checkTopAndPop(c, frame, nil, false)
}
func checkTopAndPop(c *C, f *frame, expectedNode *node, expectedOK bool) {
n, ok := f.top()
if expectedNode == nil {
c.Assert(n, IsNil)
} else {
c.Assert(n, DeepEquals, expectedNode)
}
c.Assert(ok, Equals, expectedOK)
n, ok = f.pop()
if expectedNode == nil {
c.Assert(n, IsNil)
} else {
c.Assert(n, DeepEquals, expectedNode)
}
c.Assert(ok, Equals, expectedOK)
}