v0.6.0 b250c5e

history_measure_test.go RawHistoryFolder

1package vt
2
3import (
4	"encoding/binary"
5	"testing"
6
7	"github.com/bnema/vev-vt/core"
8	"github.com/stretchr/testify/require"
9)
10
11func TestMeasureHistoryBlobMatchesValidatedResources(t *testing.T) {
12	payload, err := core.NewCellPayload("e\u0301", "https://example.org")
13	require.NoError(t, err)
14	for _, rows := range []int{0, 1, 8} {
15		h := NewHistory(HistoryConfig{MaxRows: 10, ChunkRows: 2})
16		for i := range rows {
17			style := core.DefaultStyle()
18			style.Foreground = i
19			require.NoError(t, h.Append([]core.Cell{{Rune: 'e', Style: style, Payload: payload}}, LineBound{End: 1}))
20		}
21		data, err := MarshalHistory(h.SealAndView())
22		require.NoError(t, err)
23		want, err := PreflightHistoryBlob(data)
24		require.NoError(t, err)
25		got, err := MeasureHistoryBlob(data)
26		require.NoError(t, err)
27		require.Equal(t, want, got)
28		require.Zero(t, testing.AllocsPerRun(20, func() {
29			if _, err := MeasureHistoryBlob(data); err != nil {
30				panic(err)
31			}
32		}))
33		for n := range len(data) {
34			_, err := MeasureHistoryBlob(data[:n])
35			require.Error(t, err)
36		}
37		_, err = MeasureHistoryBlob(append(append([]byte(nil), data...), 0))
38		require.Error(t, err)
39	}
40}
41
42func TestMeasureHistoryBlobDoesNotReplaceValidation(t *testing.T) {
43	h := NewHistory(HistoryConfig{MaxRows: 1})
44	require.NoError(t, h.Append([]core.Cell{{Rune: 'a', Style: core.DefaultStyle()}}, LineBound{End: 1}))
45	data, err := MarshalHistory(h.SealAndView())
46	require.NoError(t, err)
47	binary.BigEndian.PutUint64(data[historyHeaderBytes+historyChunkHeaderBytes:], 0)
48	_, err = MeasureHistoryBlob(data)
49	require.NoError(t, err, "resource sizing deliberately does not validate row identities")
50	_, err = PreflightHistoryBlob(data)
51	require.Error(t, err, "semantic validation must still reject the invalid identity")
52}
53
54func FuzzMeasureHistoryBlob(f *testing.F) {
55	empty, err := MarshalEmptyHistoryTail()
56	if err != nil {
57		f.Fatal(err)
58	}
59	f.Add(empty)
60	f.Fuzz(func(t *testing.T, data []byte) {
61		got, measured := MeasureHistoryBlob(data)
62		want, validated := PreflightHistoryBlob(data)
63		if validated == nil {
64			require.NoError(t, measured)
65			require.Equal(t, want, got)
66		}
67	})
68}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 13

↑↓ moveenter openesc close