X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/e5343bd4c3ec69192e92f4be339b855eef36b6ec..56129a5fcbcbe51a7ac7d6b009d4551ed9f71109:/view_test.go?ds=inline diff --git a/view_test.go b/view_test.go index 0162f28..201483e 100644 --- a/view_test.go +++ b/view_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestViewMergesInTheOrderOfTaelinsPush(t *testing.T) { +func TestViewMergesInTheOrderOfTheRollbackPush(t *testing.T) { tree := builtTree{} view := newView(0, 0) var states *pushEntry @@ -17,7 +17,8 @@ func TestViewMergesInTheOrderOfTaelinsPush(t *testing.T) { starts := states.starts() view.high = len(starts) view.low = len(starts) - view.Append(tree) + _, err := view.Append(tree) + require.NoError(t, err) lines := make([]int, len(view.lines)) for n, line := range view.lines { @@ -33,8 +34,9 @@ func TestViewMergesInOneBatchFromHighToLow(t *testing.T) { view := newView(10, 5) sizes := make([]int, 0, 20) for range 20 { - view.Append(tree) - sizes = append(sizes, view.Size(tree)) + _, err := view.Append(tree) + require.NoError(t, err) + sizes = append(sizes, view.Size()) } require.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8}, sizes) @@ -54,21 +56,24 @@ func TestViewMergesOnlyBuiltParents(t *testing.T) { view := newView(3, 2) for range 4 { - view.Append(tree) + _, err := view.Append(tree) + require.NoError(t, err) } require.Equal(t, []nodeKey{{0, 0}, {0, 1}, {0, 2}, {0, 3}}, view.lines) require.True(t, view.merging) tree.sizes[nodeKey{1, 0}] = 1 - view.Append(tree) + _, err := view.Append(tree) + require.NoError(t, err) require.Equal(t, []nodeKey{{1, 0}, {0, 2}, {0, 3}, {0, 4}}, view.lines) require.True(t, view.merging) tree.sizes[nodeKey{1, 1}] = 1 tree.sizes[nodeKey{1, 2}] = 1 tree.sizes[nodeKey{2, 0}] = 1 - view.Append(tree) + _, err = view.Append(tree) + require.NoError(t, err) require.Equal(t, []nodeKey{{2, 0}, {1, 2}}, view.lines) require.False(t, view.merging) } @@ -86,8 +91,8 @@ func TestViewRendersPendingLinesWithoutTheirMessage(t *testing.T) { Lines: [][2]int{{1, 0}, {0, 2}}, }, chatHigh, chatLow, tree) require.NoError(t, err) - require.Equal(t, "\n0+2|aaa aaa\n2+1|"+pending+"\n", view.Render(tree)) - require.Equal(t, 7+len(pending), view.Size(tree)) + require.Equal(t, "\n0+2|aaa aaa\n2+1|"+pending+"\n", view.Render()) + require.Equal(t, 7+len(pending), view.Size()) } func TestViewCoarsenTakesTheCoarserLines(t *testing.T) { @@ -101,11 +106,11 @@ func TestViewCoarsenTakesTheCoarserLines(t *testing.T) { }, 100, 100, builtTree{}) require.NoError(t, err) - view.Coarsen(other, builtTree{}) + require.NoError(t, view.Coarsen(other, builtTree{})) require.Equal(t, []nodeKey{{1, 0}, {1, 1}, {0, 4}, {0, 5}}, view.lines) view.low = 2 - view.Coarsen(other, builtTree{}) + require.NoError(t, view.Coarsen(other, builtTree{})) require.Equal(t, []nodeKey{{2, 0}, {1, 2}}, view.lines) require.False(t, view.merging) } @@ -124,9 +129,9 @@ func TestViewContextStopsAtTheFirstPendingLine(t *testing.T) { Lines: [][2]int{{1, 0}, {0, 2}, {0, 3}}, }, 100, 100, tree) require.NoError(t, err) - require.Equal(t, "\n", view.Context(tree, 0)) - require.Equal(t, "\n0+2|a\n", view.Context(tree, 2)) - require.Equal(t, "\n0+2|a\n", view.Context(tree, 3)) + require.Equal(t, "\n", view.Context(0)) + require.Equal(t, "\n0+2|a\n", view.Context(2)) + require.Equal(t, "\n0+2|a\n", view.Context(3)) } func TestRestoreViewRejectsAGap(t *testing.T) { @@ -136,8 +141,8 @@ func TestRestoreViewRejectsAGap(t *testing.T) { require.ErrorContains(t, err, "does not start at message 1") } -// pushEntry is one entry of Taelin's rollback state list, newest first. Under -// push alone, life stays 0, so the entry leaves it out. +// pushEntry is one entry of the rollback state list of the reference design, +// newest first. Under push alone, life stays 0, so the entry leaves it out. type pushEntry struct { keep bool state int @@ -181,8 +186,12 @@ func (e *pushEntry) starts() []int { // builtTree is a tree with each node built, with 1 byte of text. type builtTree struct{} -func (builtTree) Node(level, index int) (Node, bool) { - return testNode(level, index, "a"), true +func (builtTree) Built(level, index int) (bool, error) { + return true, nil +} + +func (builtTree) Node(level, index int) (Node, bool, error) { + return testNode(level, index, "a"), true, nil } // partTree is a tree with the built nodes of its sizes. @@ -190,10 +199,15 @@ type partTree struct { sizes map[nodeKey]int } -func (p partTree) Node(level, index int) (Node, bool) { +func (p partTree) Built(level, index int) (bool, error) { + _, built := p.sizes[nodeKey{level, index}] + return built, nil +} + +func (p partTree) Node(level, index int) (Node, bool, error) { size, built := p.sizes[nodeKey{level, index}] if !built { - return Node{}, false + return Node{}, false, nil } text := strings.Repeat("a", size) @@ -201,5 +215,5 @@ func (p partTree) Node(level, index int) (Node, bool) { text = "aaa\naaa" } - return testNode(level, index, text), true + return testNode(level, index, text), true, nil }