+ }, viewChatHigh, viewChatLow, tree)
+ require.NoError(t, err)
+ require.Equal(t, "<chat>\n0+2|aaa aaa\n2+1|"+viewPending+"\n</chat>", view.Render())
+ require.Equal(t, 7+len(viewPending), view.Size())
+}
+
+func TestViewCoarsenTakesTheCoarserLines(t *testing.T) {
+ view, err := restoreView(ViewState{
+ Lines: [][2]int{{1, 0}, {0, 2}, {0, 3}, {0, 4}, {0, 5}},
+ }, 100, 100, ViewBuiltTree{})
+ require.NoError(t, err)
+
+ other, err := restoreView(ViewState{
+ Lines: [][2]int{{0, 0}, {0, 1}, {1, 1}, {0, 4}, {0, 5}},
+ }, 100, 100, ViewBuiltTree{})
+ 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)
+
+ view.low = 2
+ require.NoError(t, view.Coarsen(other, ViewBuiltTree{}))
+ 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{
+ {0, 0}: 1,
+ {0, 1}: 1,
+ {1, 0}: 1,
+ {0, 3}: 1,
+ },
+ }
+
+ view, err := restoreView(ViewState{
+ Lines: [][2]int{{1, 0}, {0, 2}, {0, 3}},
+ }, 100, 100, tree)