1package theme
2
3import (
4 "bytes"
5 "testing"
6
7 renderer "github.com/bnema/vev-vt"
8 "github.com/stretchr/testify/require"
9)
10
11func TestScannerBatchBoundaryPreservesBytesAndReuse(t *testing.T) {
12 for _, test := range []struct {
13 name, input string
14 pending bool
15 }{
16 {"empty", "", false},
17 {"ordinary", "hello", false},
18 {"standalone escape", "\x1b", false},
19 {"split color", "x\x1b]10;#12", true},
20 {"split scheme", "\x1b[?997;", true},
21 } {
22 t.Run(test.name, func(t *testing.T) {
23 var scanner Scanner
24 var out bytes.Buffer
25 callbacks := 0
26 scan := func(data string) {
27 scanner.Scan([]byte(data), func(int, renderer.RGB) { callbacks++ }, func(int, renderer.RGB) { callbacks++ }, func(bool) { callbacks++ }, func(data []byte) { out.Write(data) })
28 }
29 require.False(t, (len(scanner.pending) != 0))
30 scan(test.input)
31 require.Equal(t, test.pending, (len(scanner.pending) != 0))
32 scanner.EndBatch(func(data []byte) { out.Write(data) })
33 require.False(t, (len(scanner.pending) != 0))
34 require.Equal(t, test.input, out.String(), "ending a batch flushes undecided bytes, not fabricated replies")
35 require.Zero(t, callbacks)
36 scanner.EndBatch(func(data []byte) { out.Write(data) })
37 require.Equal(t, test.input, out.String(), "a boundary cannot replay bytes")
38 scan("\x1b]10;#123456\a")
39 require.Equal(t, 1, callbacks, "the reusable scanner still handles normal terminal responses")
40 require.False(t, (len(scanner.pending) != 0))
41 })
42 }
43}