1package html
2
3import (
4 "testing"
5
6 "github.com/bnema/vev-vt/core"
7 "github.com/stretchr/testify/require"
8)
9
10func TestRendererRejectsMalformedOrOverLimitFramesWithoutPendingState(t *testing.T) {
11 renderer, err := New(Options{Limits: Limits{MaxCells: 2}})
12 require.NoError(t, err)
13
14 tooLarge := core.NewFrame(3, 1)
15 _, err = renderer.Prepare(tooLarge, nil, false, Cursor{})
16 require.ErrorIs(t, err, ErrLimitExceeded)
17
18 orphan := core.NewFrame(2, 1)
19 orphan.Set(0, 0, core.Cell{Continuation: true, Style: core.DefaultStyle()})
20 _, err = renderer.Prepare(orphan, nil, false, Cursor{})
21 require.ErrorContains(t, err, "orphan wide continuation")
22
23 combining := core.NewFrame(1, 1)
24 combining.Set(0, 0, core.Cell{Rune: '\u0301', Style: core.DefaultStyle()})
25 _, err = renderer.Prepare(combining, nil, false, Cursor{})
26 require.ErrorContains(t, err, "unsupported zero-width rune")
27
28 wide := core.NewFrame(2, 1)
29 wide.Set(0, 0, core.Cell{Rune: '界', Style: core.DefaultStyle()})
30 wide.Set(1, 0, core.Cell{Rune: 'X', Continuation: true, Style: core.DefaultStyle()})
31 _, err = renderer.Prepare(wide, nil, false, Cursor{})
32 require.ErrorContains(t, err, "wide continuation contains a rune")
33
34 alternate := core.DefaultStyle()
35 alternate.Bold = true
36 wide.Set(1, 0, core.Cell{Continuation: true, Style: alternate})
37 _, err = renderer.Prepare(wide, nil, false, Cursor{})
38 require.ErrorContains(t, err, "style differs from its head")
39
40 valid := core.NewFrame(2, 1)
41 prepared, err := renderer.Prepare(valid, nil, false, Cursor{})
42 require.NoError(t, err)
43 require.NoError(t, prepared.Abort())
44}
45
46func TestNewRejectsNegativeLimits(t *testing.T) {
47 _, err := New(Options{Limits: Limits{MaxCells: -1}})
48 require.ErrorIs(t, err, ErrInvalidLimits)
49 require.ErrorContains(t, err, "must not be negative")
50}
51
52func TestRendererEnforcesEncodedByteAndStyleLimits(t *testing.T) {
53 frame := core.NewFrame(2, 1)
54 alternate := core.DefaultStyle()
55 alternate.Bold = true
56 frame.Set(1, 0, core.Cell{Rune: 'X', Style: alternate})
57
58 styleLimited, err := New(Options{Limits: Limits{MaxStyles: 1}})
59 require.NoError(t, err)
60 _, err = styleLimited.Prepare(frame, nil, false, Cursor{})
61 require.ErrorIs(t, err, ErrLimitExceeded)
62
63 byteLimited, err := New(Options{Limits: Limits{MaxGeneratedBytes: 1}})
64 require.NoError(t, err)
65 _, err = byteLimited.Prepare(core.NewFrame(1, 1), nil, false, Cursor{})
66 require.ErrorIs(t, err, ErrLimitExceeded)
67 require.ErrorContains(t, err, "generated update is")
68 _, err = byteLimited.Prepare(core.NewFrame(1, 1), nil, false, Cursor{})
69 require.ErrorIs(t, err, ErrLimitExceeded)
70}