package html
import (
"testing"
"github.com/bnema/vev-vt/core"
"github.com/stretchr/testify/require"
)
func TestRendererRejectsMalformedOrOverLimitFramesWithoutPendingState(t *testing.T) {
renderer, err := New(Options{Limits: Limits{MaxCells: 2}})
require.NoError(t, err)
tooLarge := core.NewFrame(3, 1)
_, err = renderer.Prepare(tooLarge, nil, false, Cursor{})
require.ErrorIs(t, err, ErrLimitExceeded)
orphan := core.NewFrame(2, 1)
orphan.Set(0, 0, core.Cell{Continuation: true, Style: core.DefaultStyle()})
_, err = renderer.Prepare(orphan, nil, false, Cursor{})
require.ErrorContains(t, err, "orphan wide continuation")
combining := core.NewFrame(1, 1)
combining.Set(0, 0, core.Cell{Rune: '\u0301', Style: core.DefaultStyle()})
_, err = renderer.Prepare(combining, nil, false, Cursor{})
require.ErrorContains(t, err, "unsupported zero-width rune")
wide := core.NewFrame(2, 1)
wide.Set(0, 0, core.Cell{Rune: '界', Style: core.DefaultStyle()})
wide.Set(1, 0, core.Cell{Rune: 'X', Continuation: true, Style: core.DefaultStyle()})
_, err = renderer.Prepare(wide, nil, false, Cursor{})
require.ErrorContains(t, err, "wide continuation contains a rune")
alternate := core.DefaultStyle()
alternate.Bold = true
wide.Set(1, 0, core.Cell{Continuation: true, Style: alternate})
_, err = renderer.Prepare(wide, nil, false, Cursor{})
require.ErrorContains(t, err, "style differs from its head")
valid := core.NewFrame(2, 1)
prepared, err := renderer.Prepare(valid, nil, false, Cursor{})
require.NoError(t, err)
require.NoError(t, prepared.Abort())
}
func TestNewRejectsNegativeLimits(t *testing.T) {
_, err := New(Options{Limits: Limits{MaxCells: -1}})
require.ErrorIs(t, err, ErrInvalidLimits)
require.ErrorContains(t, err, "must not be negative")
}
func TestRendererEnforcesEncodedByteAndStyleLimits(t *testing.T) {
frame := core.NewFrame(2, 1)
alternate := core.DefaultStyle()
alternate.Bold = true
frame.Set(1, 0, core.Cell{Rune: 'X', Style: alternate})
styleLimited, err := New(Options{Limits: Limits{MaxStyles: 1}})
require.NoError(t, err)
_, err = styleLimited.Prepare(frame, nil, false, Cursor{})
require.ErrorIs(t, err, ErrLimitExceeded)
byteLimited, err := New(Options{Limits: Limits{MaxGeneratedBytes: 1}})
require.NoError(t, err)
_, err = byteLimited.Prepare(core.NewFrame(1, 1), nil, false, Cursor{})
require.ErrorIs(t, err, ErrLimitExceeded)
require.ErrorContains(t, err, "generated update is")
_, err = byteLimited.Prepare(core.NewFrame(1, 1), nil, false, Cursor{})
require.ErrorIs(t, err, ErrLimitExceeded)
}