history_final_acceptance_test.go RawHistoryFolder
1package vt
2
3import (
4 "testing"
5
6 renderer "github.com/bnema/vev-vt/core"
7 "github.com/stretchr/testify/require"
8)
9
10func TestHistoryAcceptanceKeepsBookmarksAcrossLiveScrollEvictionAndRestore(t *testing.T) {
11 history := NewHistory(HistoryConfig{MaxRows: 3, MaxBytes: 1 << 20, ChunkRows: 2})
12 for _, text := range []string{"live-1", "live-2", "live-3"} {
13 require.NoError(t, history.Append(historyAcceptanceRow(text), LineBound{End: len(text)}))
14 }
15
16 beforeScroll := history.View()
17 bookmark := beforeScroll.RowID(1)
18 immutable := beforeScroll.Row(1)
19 immutable[0].Rune = 'X'
20 require.Equal(t, 'l', beforeScroll.Row(1)[0].Rune, "immutable history view exposed mutable cells")
21
22 require.NoError(t, history.Append(historyAcceptanceRow("live-4"), LineBound{End: 6}))
23 afterScroll := history.View()
24 require.Equal(t, 3, afterScroll.Len())
25 require.Equal(t, 0, afterScroll.FindRowID(bookmark), "bookmark row was not retained after one live scroll")
26 require.Equal(t, "live-2", historyAcceptanceText(afterScroll.Row(0)))
27 require.Equal(t, "live-1", historyAcceptanceText(beforeScroll.Row(0)), "retained view changed after eviction")
28
29 sealed, tail, err := MarshalSealedHistory(history.SealAndView())
30 require.NoError(t, err)
31 restored, err := HistoryFromBlobs(HistoryConfig{MaxRows: 3, MaxBytes: 1 << 20, ChunkRows: 2}, sealed, tail)
32 require.NoError(t, err)
33 restoredView := restored.View()
34 require.Equal(t, afterScroll.Len(), restoredView.Len())
35 require.Equal(t, bookmark, restoredView.RowID(0), "bookmark row identity changed during restore")
36 require.Equal(t, "live-2", historyAcceptanceText(restoredView.Row(0)))
37
38 next := restoredView.NextRowID()
39 require.NoError(t, restored.Append(historyAcceptanceRow("live-5"), LineBound{End: 6}))
40 require.Greater(t, restored.View().NextRowID(), next)
41}
42
43func historyAcceptanceRow(text string) []renderer.Cell {
44 row := make([]renderer.Cell, len(text))
45 for i, r := range text {
46 row[i] = renderer.Cell{Rune: r}
47 }
48 return row
49}
50
51func historyAcceptanceText(row []renderer.Cell) string {
52 text := make([]rune, len(row))
53 for i, cell := range row {
54 text[i] = cell.Rune
55 }
56 return string(text)
57}