9 "github.com/stretchr/testify/require"
12 func TestFreeLeafHoldsAShortMessageWordForWord(t *testing.T) {
16 Text: strings.Repeat("a", nodeBytes-len("user: ")),
19 node, free := freeLeaf(message)
21 require.Equal(t, Node{
24 Text: "user: " + message.Text,
29 _, free = freeLeaf(message)
30 require.False(t, free)
33 func TestFreeMergeJoinsShortSiblings(t *testing.T) {
34 left := testNode(1, 2, "left")
35 right := testNode(1, 3, "right")
37 node, free := freeMerge(left, right)
39 require.Equal(t, testNode(2, 1, "left\nright"), node)
41 right = testNode(1, 3, strings.Repeat("r", nodeBytes-len("left")))
42 _, free = freeMerge(left, right)
43 require.False(t, free)
46 func TestTreeBuildsEachNodeOnce(t *testing.T) {
47 tree, err := openTree(t.Context(), t.TempDir(), 2, newTestClock().Now)
48 require.NoError(t, err)
51 require.NoError(t, tree.Close())
54 require.NoError(t, tree.Add(testNode(0, 0, "user: a")))
55 require.ErrorContains(t, tree.Add(testNode(0, 0, "user: b")), "already built")
56 require.ErrorContains(t, tree.Add(testNode(1, 0, "a b")), "child that is not built")
58 require.NoError(t, tree.Add(testNode(0, 1, "unii: b")))
59 require.NoError(t, tree.Add(testNode(1, 0, "a b")))
61 node, built := tree.Node(0, 0)
62 require.True(t, built)
63 require.Equal(t, "user: a", node.Text)
66 func TestTreeReopenLoadsTheSameNodes(t *testing.T) {
68 clock := newTestClock()
69 tree, err := openTree(t.Context(), root, 2, clock.Now)
70 require.NoError(t, err)
73 testNode(0, 1, "unii: b"),
74 testNode(0, 0, "user: a"),
75 testNode(1, 0, "user: a\nunii: b"),
77 for _, node := range nodes {
78 require.NoError(t, tree.Add(node))
81 require.NoError(t, tree.Close())
83 data, err := os.ReadFile(filepath.Join(root, "tree", "2026-01-01.jsonl"))
84 require.NoError(t, err)
85 require.Equal(t, `{"l":0,"i":1,"text":"unii: b","size":7}`+"\n", strings.SplitAfter(string(data), "\n")[0])
87 tree, err = openTree(t.Context(), root, 2, clock.Now)
88 require.NoError(t, err)
91 require.NoError(t, tree.Close())
94 require.Len(t, tree.nodes, len(nodes))
95 for _, node := range nodes {
96 loaded, built := tree.Node(node.Level, node.Index)
97 require.True(t, built)
98 require.Equal(t, node, loaded)
101 _, err = openTree(t.Context(), root, 1, clock.Now)
102 require.ErrorContains(t, err, "covers messages after the log")
105 func testNode(level, index int, text string) Node {