package merkletrie
// this files contains fixtures for testing the Iter.
//
// - iter... functions returns iterators for newly created trees
// for example:
//
// + iterLeaf returns an iterator for simple tree with just the root.
//
// + iter2Horizontal returns an iterator for a tree with 2 nodes, both
// childs of the root.
//
// - runs... contains sets of tests, indexed by a string that helps
// to understand each test: "nsn" means next, then step, then next
// again. The test also contains the expected keys of the nodes you
// will get when calling the operations over the correspoding trees:
// Example: runs2HorizontalSorted with iter2HorizontalSorted and so on.
func iterLeaf() *Iter {
root := newNode(hash, "root", empty)
return NewIter(root)
}
var runs0 = map[string][]test{
"nn": {{next, ""}, {next, ""}},
"ns": {{next, ""}, {step, ""}},
"sn": {{step, ""}, {next, ""}},
"ss": {{step, ""}, {step, ""}},
}
// root
// |
// a
func iter1() *Iter {
a := newNode(hash, "a", empty)
root := newNode(hash, "root", []*node{a})
return NewIter(root)
}
var runs1 = map[string][]test{
"nn": {{next, "a"}, {next, ""}},
"ns": {{next, "a"}, {step, ""}},
"sn": {{step, "a"}, {next, ""}},
"ss": {{step, "a"}, {step, ""}},
}
// root
// / \
// a b
func iter2HorizontalSorted() *Iter {
a := newNode(hash, "a", empty)
b := newNode(hash, "b", empty)
root := newNode(hash, "root", []*node{a, b})
return NewIter(root)
}
// root
// / \
// b a
func iter2HorizontalReverse() *Iter {
a := newNode(hash, "a", empty)
b := newNode(hash, "b", empty)
root := newNode(hash, "root", []*node{b, a})
return NewIter(root)
}
var runs2Horizontal = map[string][]test{
"nnn": {{next, "a"}, {next, "b"}, {next, ""}},
"nns": {{next, "a"}, {next, "b"}, {step, ""}},
"nsn": {{next, "a"}, {step, "b"}, {next, ""}},
"nss": {{next, "a"}, {step, "b"}, {step, ""}},
"snn": {{step, "a"}, {next, "b"}, {next, ""}},
"sns": {{step, "a"}, {next, "b"}, {step, ""}},
"ssn": {{step, "a"}, {step, "b"}, {next, ""}},
"sss": {{step, "a"}, {step, "b"}, {step, ""}},
}
// root
// |
// a
// |
// b
func iter2VerticalSorted() *Iter {
b := newNode(hash, "b", empty)
a := newNode(hash, "a", []*node{b})
root := newNode(hash, "root", []*node{a})
return NewIter(root)
}
var runs2VerticalSorted = map[string][]test{
"nnn": {{next, "a"}, {next, ""}, {next, ""}},
"nns": {{next, "a"}, {next, ""}, {step, ""}},
"nsn": {{next, "a"}, {step, "b"}, {next, ""}},
"nss": {{next, "a"}, {step, "b"}, {step, ""}},
"snn": {{step, "a"}, {next, ""}, {next, ""}},
"sns": {{step, "a"}, {next, ""}, {step, ""}},
"ssn": {{step, "a"}, {step, "b"}, {next, ""}},
"sss": {{step, "a"}, {step, "b"}, {step, ""}},
}
// root
// |
// b
// |
// a
func iter2VerticalReverse() *Iter {
a := newNode(hash, "a", empty)
b := newNode(hash, "b", []*node{a})
root := newNode(hash, "root", []*node{b})
return NewIter(root)
}
var runs2VerticalReverse = map[string][]test{
"nnn": {{next, "b"}, {next, ""}, {next, ""}},
"nns": {{next, "b"}, {next, ""}, {step, ""}},
"nsn": {{next, "b"}, {step, "a"}, {next, ""}},
"nss": {{next, "b"}, {step, "a"}, {step, ""}},
"snn": {{step, "b"}, {next, ""}, {next, ""}},
"sns": {{step, "b"}, {next, ""}, {step, ""}},
"ssn": {{step, "b"}, {step, "a"}, {next, ""}},
"sss": {{step, "b"}, {step, "a"}, {step, ""}},
}
// root
// /|\
// c a b
func iter3Horizontal() *Iter {
a := newNode(hash, "a", empty)
b := newNode(hash, "b", empty)
c := newNode(hash, "c", empty)
root := newNode(hash, "root", []*node{c, a, b})
return NewIter(root)
}
var runs3Horizontal = map[string][]test{
"nnnn": {{next, "a"}, {next, "b"}, {next, "c"}, {next, ""}},
"nnns": {{next, "a"}, {next, "b"}, {next, "c"}, {step, ""}},
"nnsn": {{next, "a"}, {next, "b"}, {step, "c"}, {next, ""}},
"nnss": {{next, "a"}, {next, "b"}, {step, "c"}, {step, ""}},
"nsnn": {{next, "a"}, {step, "b"}, {next, "c"}, {next, ""}},
"nsns": {{next, "a"}, {step, "b"}, {next, "c"}, {step, ""}},
"nssn": {{next, "a"}, {step, "b"}, {step, "c"}, {next, ""}},
"nsss": {{next, "a"}, {step, "b"}, {step, "c"}, {step, ""}},
"snnn": {{step, "a"}, {next, "b"}, {next, "c"}, {next, ""}},
"snns": {{step, "a"}, {next, "b"}, {next, "c"}, {step, ""}},
"snsn": {{step, "a"}, {next, "b"}, {step, "c"}, {next, ""}},
"snss": {{step, "a"}, {next, "b"}, {step, "c"}, {step, ""}},
"ssnn": {{step, "a"}, {step, "b"}, {next, "c"}, {next, ""}},
"ssns": {{step, "a"}, {step, "b"}, {next, "c"}, {step, ""}},
"sssn": {{step, "a"}, {step, "b"}, {step, "c"}, {next, ""}},
"ssss": {{step, "a"}, {step, "b"}, {step, "c"}, {step, ""}},
}
// root
// |
// b
// |
// c
// |
// a
func iter3Vertical() *Iter {
a := newNode(hash, "a", empty)
c := newNode(hash, "c", []*node{a})
b := newNode(hash, "b", []*node{c})
root := newNode(hash, "root", []*node{b})
return NewIter(root)
}
var runs3Vertical = map[string][]test{
"nnnn": {{next, "b"}, {next, ""}, {next, ""}, {next, ""}},
"nnns": {{next, "b"}, {next, ""}, {next, ""}, {step, ""}},
"nnsn": {{next, "b"}, {next, ""}, {step, ""}, {next, ""}},
"nnss": {{next, "b"}, {next, ""}, {step, ""}, {step, ""}},
"nsnn": {{next, "b"}, {step, "c"}, {next, ""}, {next, ""}},
"nsns": {{next, "b"}, {step, "c"}, {next, ""}, {step, ""}},
"nssn": {{next, "b"}, {step, "c"}, {step, "a"}, {next, ""}},
"nsss": {{next, "b"}, {step, "c"}, {step, "a"}, {step, ""}},
"snnn": {{step, "b"}, {next, ""}, {next, ""}, {next, ""}},
"snns": {{step, "b"}, {next, ""}, {next, ""}, {step, ""}},
"snsn": {{step, "b"}, {next, ""}, {step, ""}, {next, ""}},
"snss": {{step, "b"}, {next, ""}, {step, ""}, {step, ""}},
"ssnn": {{step, "b"}, {step, "c"}, {next, ""}, {next, ""}},
"ssns": {{step, "b"}, {step, "c"}, {next, ""}, {step, ""}},
"sssn": {{step, "b"}, {step, "c"}, {step, "a"}, {next, ""}},
"ssss": {{step, "b"}, {step, "c"}, {step, "a"}, {step, ""}},
}
// root
// / \
// c a
// |
// b
func iter3Mix1() *Iter {
a := newNode(hash, "a", empty)
b := newNode(hash, "b", empty)
c := newNode(hash, "c", []*node{b})
root := newNode(hash, "root", []*node{c, a})
return NewIter(root)
}
var runs3Mix1 = map[string][]test{
"nnnn": {{next, "a"}, {next, "c"}, {next, ""}, {next, ""}},
"nnns": {{next, "a"}, {next, "c"}, {next, ""}, {step, ""}},
"nnsn": {{next, "a"}, {next, "c"}, {step, "b"}, {next, ""}},
"nnss": {{next, "a"}, {next, "c"}, {step, "b"}, {step, ""}},
"nsnn": {{next, "a"}, {step, "c"}, {next, ""}, {next, ""}},
"nsns": {{next, "a"}, {step, "c"}, {next, ""}, {step, ""}},
"nssn": {{next, "a"}, {step, "c"}, {step, "b"}, {next, ""}},
"nsss": {{next, "a"}, {step, "c"}, {step, "b"}, {step, ""}},
"snnn": {{step, "a"}, {next, "c"}, {next, ""}, {next, ""}},
"snns": {{step, "a"}, {next, "c"}, {next, ""}, {step, ""}},
"snsn": {{step, "a"}, {next, "c"}, {step, "b"}, {next, ""}},
"snss": {{step, "a"}, {next, "c"}, {step, "b"}, {step, ""}},
"ssnn": {{step, "a"}, {step, "c"}, {next, ""}, {next, ""}},
"ssns": {{step, "a"}, {step, "c"}, {next, ""}, {step, ""}},
"sssn": {{step, "a"}, {step, "c"}, {step, "b"}, {next, ""}},
"ssss": {{step, "a"}, {step, "c"}, {step, "b"}, {step, ""}},
}
// root
// / \
// b a
// |
// c
func iter3Mix2() *Iter {
b := newNode(hash, "b", empty)
c := newNode(hash, "c", empty)
a := newNode(hash, "a", []*node{c})
root := newNode(hash, "root", []*node{b, a})
return NewIter(root)
}
var runs3Mix2 = map[string][]test{
"nnnn": {{next, "a"}, {next, "b"}, {next, ""}, {next, ""}},
"nnns": {{next, "a"}, {next, "b"}, {next, ""}, {step, ""}},
"nnsn": {{next, "a"}, {next, "b"}, {step, ""}, {next, ""}},
"nnss": {{next, "a"}, {next, "b"}, {step, ""}, {step, ""}},
"nsnn": {{next, "a"}, {step, "c"}, {next, "b"}, {next, ""}},
"nsns": {{next, "a"}, {step, "c"}, {next, "b"}, {step, ""}},
"nssn": {{next, "a"}, {step, "c"}, {step, "b"}, {next, ""}},
"nsss": {{next, "a"}, {step, "c"}, {step, "b"}, {step, ""}},
"snnn": {{step, "a"}, {next, "b"}, {next, ""}, {next, ""}},
"snns": {{step, "a"}, {next, "b"}, {next, ""}, {step, ""}},
"snsn": {{step, "a"}, {next, "b"}, {step, ""}, {next, ""}},
"snss": {{step, "a"}, {next, "b"}, {step, ""}, {step, ""}},
"ssnn": {{step, "a"}, {step, "c"}, {next, "b"}, {next, ""}},
"ssns": {{step, "a"}, {step, "c"}, {next, "b"}, {step, ""}},
"sssn": {{step, "a"}, {step, "c"}, {step, "b"}, {next, ""}},
"ssss": {{step, "a"}, {step, "c"}, {step, "b"}, {step, ""}},
}
// root
// / | \
// / | ----
// f d h --------
// /\ / \ |
// e a j b g
// | / \ |
// l n k icm
// |
// o
// |
// p
func iterCrazy() *Iter {
l := newNode(hash, "l", empty)
e := newNode(hash, "e", []*node{l})
p := newNode(hash, "p", empty)
o := newNode(hash, "o", []*node{p})
n := newNode(hash, "n", []*node{o})
k := newNode(hash, "k", empty)
a := newNode(hash, "a", []*node{n, k})
f := newNode(hash, "f", []*node{e, a})
d := newNode(hash, "d", empty)
i := newNode(hash, "i", empty)
c := newNode(hash, "c", empty)
m := newNode(hash, "m", empty)
j := newNode(hash, "j", []*node{i, c, m})
b := newNode(hash, "b", empty)
g := newNode(hash, "g", empty)
h := newNode(hash, "h", []*node{j, b, g})
root := newNode(hash, "root", []*node{f, d, h})
return NewIter(root)
}
var (
n = next
s = step
)
var runsCrazy = map[string][]test{
"nn nn n": {{n, "d"}, {n, "f"}, {n, "h"}, {n, ""}, {n, ""}},
"nn nn s": {{n, "d"}, {n, "f"}, {n, "h"}, {n, ""}, {s, ""}},
"nn ns n": {{n, "d"}, {n, "f"}, {n, "h"}, {s, "b"}, {n, "g"}},
"nn ns s": {{n, "d"}, {n, "f"}, {n, "h"}, {s, "b"}, {s, "g"}},
"nn sn n": {{n, "d"}, {n, "f"}, {s, "a"}, {n, "e"}, {n, "h"}},
"nn sn s": {{n, "d"}, {n, "f"}, {s, "a"}, {n, "e"}, {s, "l"}},
"nn ss n": {{n, "d"}, {n, "f"}, {s, "a"}, {s, "k"}, {n, "n"}},
"nn ss s": {{n, "d"}, {n, "f"}, {s, "a"}, {s, "k"}, {s, "n"}},
"ns nn n": {{n, "d"}, {s, "f"}, {n, "h"}, {n, ""}, {n, ""}},
"ns nn s": {{n, "d"}, {s, "f"}, {n, "h"}, {n, ""}, {s, ""}},
"ns ns n": {{n, "d"}, {s, "f"}, {n, "h"}, {s, "b"}, {n, "g"}},
"ns ns s": {{n, "d"}, {s, "f"}, {n, "h"}, {s, "b"}, {s, "g"}},
"ns sn n": {{n, "d"}, {s, "f"}, {s, "a"}, {n, "e"}, {n, "h"}},
"ns ss ns ss": {
{n, "d"}, {s, "f"},
{s, "a"}, {s, "k"},
{n, "n"}, {s, "o"},
{s, "p"}, {s, "e"},
},
"ns ss ns sn": {
{n, "d"}, {s, "f"},
{s, "a"}, {s, "k"},
{n, "n"}, {s, "o"},
{s, "p"}, {n, "e"},
},
"nn ns ns ss nn": {
{n, "d"}, {n, "f"},
{n, "h"}, {s, "b"},
{n, "g"}, {s, "j"},
{s, "c"}, {s, "i"},
{n, "m"}, {n, ""},
},
}