1package daemon
2
3import (
4 "strings"
5 "testing"
6
7 renderer "github.com/bnema/vev-vt"
8 "github.com/stretchr/testify/require"
9
10 "github.com/bnema/vev/internal/protocol"
11)
12
13// TestHeldCtrlShowsRecentSessionRanks pins that a reported Ctrl hold prefixes
14// the attachment's recent sessions with their Ctrl+N ranks, and its release
15// removes them.
16func TestHeldCtrlShowsRecentSessionRanks(t *testing.T) {
17 tests := []struct {
18 name string
19 ctrl bool
20 ranks bool
21 }{
22 {name: "held shows ranks", ctrl: true, ranks: true},
23 {name: "released hides ranks", ctrl: false, ranks: false},
24 }
25 for _, tt := range tests {
26 t.Run(tt.name, func(t *testing.T) {
27 d, sess, ac, _, releases := newManualTabSession(t, 1)
28 defer releases[0]()
29 ac.setRouteSnapshot(testRecentRouteSnapshot())
30 effect := beginRecentRoutePaletteEffect(t, d, sess, ac)
31 if !tt.ctrl {
32 ac.ctrlHeld.Store(true)
33 }
34
35 d.applyModifierStateForAttachment(effect, protocol.ModifierState{Ctrl: tt.ctrl})
36
37 require.Equal(t, tt.ctrl, ac.ctrlHeld.Load())
38 bars := d.barStateForAttachmentPaletteHintsFor(sess, ac, "", nil, protocol.RecentRouteSnapshot{})
39 require.Equal(t, tt.ranks, bars.showRanks)
40 row := renderTestStatusRow(bars)
41 require.Equal(t, tt.ranks, strings.Contains(row, "1:recent"), row)
42 require.Equal(t, tt.ranks, strings.Contains(row, "2:older"), row)
43 })
44 }
45}
46
47func renderTestStatusRow(state barState) string {
48 row := make([]renderer.Cell, 80)
49 drawStatusBarState(row, state, resolveStyles(nil))
50 return rowText(row)
51}
52
53// TestSuspensionReleasesHeldCtrl pins that a suspended attachment, which
54// drops modifier reports, never activates with ranks stuck on.
55func TestSuspensionReleasesHeldCtrl(t *testing.T) {
56 d, sess, ac, _ := newManualSessionWithPTYs(t, newQuietPTY())
57 d.attachCoordinator(sess, nil, ac, true)
58 token := sess.captureAttachmentCapability(ac, ac.transport())
59 ac.installTestAttachmentCapability(token)
60 ac.ctrlHeld.Store(true)
61
62 require.NoError(t, d.suspendAttachment(token, protocol.SuspendAttachment{RequestID: 1}))
63
64 require.False(t, ac.ctrlHeld.Load())
65}