]> git.giacomolli.uk - onechat/blobdiff - view_test.go
Send stored images to WhatsApp chats
[onechat] / view_test.go
index 7184f8c7b2c89cab9d6139567916dfc071fccfea..46f76dade8f9fa6102909d3616f8b090bf61d43e 100644 (file)
@@ -10,8 +10,11 @@ import (
 
 func TestViewMergesInTheOrderOfTheRollbackPush(t *testing.T) {
        tree := ViewBuiltTree{}
+
        view := newView(0, 0)
+
        var states *ViewPushEntry
+
        for tick := range 20001 {
                states = viewPush(tick, states)
                starts := states.starts()
@@ -31,11 +34,13 @@ func TestViewMergesInTheOrderOfTheRollbackPush(t *testing.T) {
 
 func TestViewMergesInOneBatchFromHighToLow(t *testing.T) {
        tree := ViewBuiltTree{}
+
        view := newView(10, 5)
        sizes := make([]int, 0, 20)
        for range 20 {
                _, err := view.Append(tree)
                require.NoError(t, err)
+
                sizes = append(sizes, view.Size())
        }
 
@@ -44,7 +49,7 @@ func TestViewMergesInOneBatchFromHighToLow(t *testing.T) {
 
 func TestViewMergesOnlyBuiltParents(t *testing.T) {
        tree := ViewPartTree{
-               sizes: map[nodeKey]int{
+               sizes: map[NodeKey]int{
                        {0, 0}: 1,
                        {0, 1}: 1,
                        {0, 2}: 1,
@@ -60,27 +65,27 @@ func TestViewMergesOnlyBuiltParents(t *testing.T) {
                require.NoError(t, err)
        }
 
-       require.Equal(t, []nodeKey{{0, 0}, {0, 1}, {0, 2}, {0, 3}}, view.lines)
+       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
+       tree.sizes[NodeKey{1, 0}] = 1
        _, err := view.Append(tree)
        require.NoError(t, err)
-       require.Equal(t, []nodeKey{{1, 0}, {0, 2}, {0, 3}, {0, 4}}, view.lines)
+       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
+       tree.sizes[NodeKey{1, 1}] = 1
+       tree.sizes[NodeKey{1, 2}] = 1
+       tree.sizes[NodeKey{2, 0}] = 1
        _, err = view.Append(tree)
        require.NoError(t, err)
-       require.Equal(t, []nodeKey{{2, 0}, {1, 2}}, view.lines)
+       require.Equal(t, []NodeKey{{2, 0}, {1, 2}}, view.lines)
        require.False(t, view.merging)
 }
 
 func TestViewRendersPendingLinesWithoutTheirMessage(t *testing.T) {
        tree := ViewPartTree{
-               sizes: map[nodeKey]int{
+               sizes: map[NodeKey]int{
                        {0, 0}: 3,
                        {0, 1}: 3,
                        {1, 0}: 7,
@@ -107,17 +112,17 @@ func TestViewCoarsenTakesTheCoarserLines(t *testing.T) {
        require.NoError(t, err)
 
        require.NoError(t, view.Coarsen(other, ViewBuiltTree{}))
-       require.Equal(t, []nodeKey{{1, 0}, {1, 1}, {0, 4}, {0, 5}}, view.lines)
+       require.Equal(t, []NodeKey{{1, 0}, {1, 1}, {0, 4}, {0, 5}}, view.lines)
 
        view.low = 2
        require.NoError(t, view.Coarsen(other, ViewBuiltTree{}))
-       require.Equal(t, []nodeKey{{2, 0}, {1, 2}}, view.lines)
+       require.Equal(t, []NodeKey{{2, 0}, {1, 2}}, view.lines)
        require.False(t, view.merging)
 }
 
 func TestViewContextStopsAtTheFirstPendingLine(t *testing.T) {
        tree := ViewPartTree{
-               sizes: map[nodeKey]int{
+               sizes: map[NodeKey]int{
                        {0, 0}: 1,
                        {0, 1}: 1,
                        {1, 0}: 1,
@@ -144,12 +149,12 @@ func TestRestoreViewRejectsAGap(t *testing.T) {
 // ViewBuiltTree is a tree with each node built, with 1 byte of text.
 type ViewBuiltTree struct{}
 
-func (ViewBuiltTree) Built(level, index int) (bool, error) {
+func (v ViewBuiltTree) Built(_, _ int) (bool, error) {
        return true, nil
 }
 
 func (ViewBuiltTree) Node(level, index int) (Node, bool, error) {
-       return testNode(level, index, "a"), true, nil
+       return treeTestNode(level, index, "a"), true, nil
 }
 
 // ViewPushEntry is one entry of the rollback state list of the reference
@@ -164,6 +169,7 @@ type ViewPushEntry struct {
 // starts returns the states of the list, oldest first.
 func (e *ViewPushEntry) starts() []int {
        var starts []int
+
        for entry := e; entry != nil; entry = entry.older {
                starts = append(starts, entry.state)
        }
@@ -175,16 +181,16 @@ func (e *ViewPushEntry) starts() []int {
 
 // ViewPartTree is a tree with the built nodes of its sizes.
 type ViewPartTree struct {
-       sizes map[nodeKey]int
+       sizes map[NodeKey]int
 }
 
 func (p ViewPartTree) Built(level, index int) (bool, error) {
-       _, built := p.sizes[nodeKey{level, index}]
+       _, built := p.sizes[NodeKey{level, index}]
        return built, nil
 }
 
 func (p ViewPartTree) Node(level, index int) (Node, bool, error) {
-       size, built := p.sizes[nodeKey{level, index}]
+       size, built := p.sizes[NodeKey{level, index}]
        if !built {
                return Node{}, false, nil
        }
@@ -194,10 +200,14 @@ func (p ViewPartTree) Node(level, index int) (Node, bool, error) {
                text = "aaa\naaa"
        }
 
-       return testNode(level, index, text), true, nil
+       return treeTestNode(level, index, text), true, nil
 }
 
-// viewPush is the push of rollback_state_list.js.
+// viewPush adds state to the newest end of states and returns the new list. An
+// empty list gets one entry. When the newest entry is not kept, it becomes kept
+// with its own state, and state is dropped. When it is kept, state becomes a
+// new newest entry, and the state of the old newest entry goes to the older
+// entries by the same push.
 func viewPush(state int, states *ViewPushEntry) *ViewPushEntry {
        if states == nil {
                return &ViewPushEntry{