v0.5.0 5fd5066

buffers_test.go RawHistoryFolder

1package buffers
2
3import (
4	"errors"
5	"testing"
6)
7
8func committed(t *testing.T, p *Pool) *Buffer {
9	t.Helper()
10	b, e := p.Begin()
11	if e != nil {
12		t.Fatal(e)
13	}
14	acquire, e := p.Acquire(b)
15	if e != nil {
16		t.Fatal(e)
17	}
18	release, e := p.Commit(b)
19	if e != nil || release <= acquire {
20		t.Fatalf("points %d %d %v", acquire, release, e)
21	}
22	if e = p.Own(b); e != nil {
23		t.Fatal(e)
24	}
25	return b
26}
27func TestLatestReleasePoint(t *testing.T) {
28	p, e := New(1)
29	if e != nil {
30		t.Fatal(e)
31	}
32	b := committed(t, p)
33	old := b.ReleasePoint
34	if e = p.Release(b); e != nil {
35		t.Fatal(e)
36	}
37	if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
38		t.Fatalf("wl release authorized reuse: %v", e)
39	}
40	if e = p.Signal(b, old+1); !errors.Is(e, ErrTransition) {
41		t.Fatalf("future point: %v", e)
42	}
43	if e = p.Reuse(b, true); !errors.Is(e, ErrTransition) {
44		t.Fatalf("premature reuse: %v", e)
45	}
46	if e = p.Signal(b, old); e != nil {
47		t.Fatal(e)
48	}
49	if e = p.Reuse(b, false); !errors.Is(e, ErrTransition) {
50		t.Fatalf("missing GPU wait: %v", e)
51	}
52	if e = p.Reuse(b, true); e != nil {
53		t.Fatal(e)
54	}
55	b = committed(t, p)
56	if b.ReleasePoint <= old {
57		t.Fatal("release point not advanced")
58	}
59	if e = p.Signal(b, old); !errors.Is(e, ErrTransition) {
60		t.Fatalf("old point accepted: %v", e)
61	}
62	if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
63		t.Fatalf("old point allowed reuse: %v", e)
64	}
65	if e = p.Signal(b, b.ReleasePoint); e != nil {
66		t.Fatal(e)
67	}
68	// A late wl_buffer.release is diagnostic and cannot re-lock a signaled image.
69	if e = p.Release(b); e != nil {
70		t.Fatal(e)
71	}
72	if e = p.Reuse(b, true); e != nil {
73		t.Fatal(e)
74	}
75}
76func TestThreeBuffersOutOfOrderAndResize(t *testing.T) {
77	p, e := New(3)
78	if e != nil {
79		t.Fatal(e)
80	}
81	a, b, c := committed(t, p), committed(t, p), committed(t, p)
82	if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
83		t.Fatal(e)
84	}
85	if e = p.Signal(c, c.ReleasePoint); e != nil {
86		t.Fatal(e)
87	}
88	if e = p.Reuse(c, true); e != nil {
89		t.Fatal(e)
90	}
91	if got, e := p.Begin(); e != nil || got != c {
92		t.Fatalf("out-of-order point: %v %v", got, e)
93	}
94	if e = p.Resize(3); e != nil {
95		t.Fatal(e)
96	}
97	if e = p.Signal(b, b.ReleasePoint); e != nil {
98		t.Fatal(e)
99	}
100	if !p.Retirable(b) || p.Retirable(a) || p.Retirable(c) {
101		t.Fatal("retired generation ownership")
102	}
103	if e = p.Reuse(b, true); !errors.Is(e, ErrTransition) {
104		t.Fatalf("reused retired: %v", e)
105	}
106	for range 3 {
107		got, e := p.Begin()
108		if e != nil || got.Generation != 2 {
109			t.Fatalf("new generation: %v %v", got, e)
110		}
111	}
112	if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
113		t.Fatal(e)
114	}
115	if e = p.Remove(a); !errors.Is(e, ErrTransition) {
116		t.Fatal(e)
117	}
118	if e = p.Remove(b); e != nil {
119		t.Fatal(e)
120	}
121}
122func TestInvalidTransitions(t *testing.T) {
123	p, _ := New(1)
124	b := p.Buffers[0]
125	if _, e := p.Commit(b); !errors.Is(e, ErrTransition) {
126		t.Fatal(e)
127	}
128	if e := p.Signal(b, 0); !errors.Is(e, ErrTransition) {
129		t.Fatal(e)
130	}
131	if e := p.Release(&Buffer{}); !errors.Is(e, ErrTransition) {
132		t.Fatal(e)
133	}
134	b = committed(t, p)
135	if e := p.Signal(b, b.ReleasePoint); e != nil {
136		t.Fatal(e)
137	}
138	if e := p.Signal(b, b.ReleasePoint); !errors.Is(e, ErrTransition) {
139		t.Fatal(e)
140	}
141}

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 1

Tags 12

↑↓ moveenter openesc close