aboutsummaryrefslogtreecommitdiffstats
path: root/plumbing/difftree/internal/merkletrie/frame_test.go
blob: 0ef036a839e73f97f92028d848ec35036c9ddc76 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)
}