Files
cthulhu/internal/atspi/text_component_test.go

55 lines
2.5 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package atspi
import (
"context"
"strings"
"testing"
"unicode/utf8"
)
func TestReviewComponentRecoveryRequiresVerifiedContent(t *testing.T) {
clip := Rectangle{Width: 200, Height: 20}
for _, tc := range []struct {
name, role, native, label string
editable, clipped, want, known bool
}{
{name: "named toolbar control", role: "button", native: "Back", label: "Back", want: true},
{name: "named separator", role: "separator", native: "Separator", label: "Separator", want: true},
{name: "named label", role: "static", native: "Café 猫", label: "Café 猫", want: true},
{name: "child-only container", role: "panel", native: "\ufffc\ufffc", want: true, known: true},
{name: "child-only tab", role: "page tab", native: "\ufffc", label: "Tab metadata", want: true, known: true},
{name: "mixed container", role: "panel", native: "Text\ufffc", label: "Text"},
{name: "mismatched name", role: "button", native: "Visible", label: "Other"},
{name: "editable field", role: "entry", native: "Visible", label: "Visible", editable: true},
{name: "readonly field", role: "entry", native: "Visible", label: "Visible"},
{name: "password", role: "password text", native: "Secret", label: "Secret"},
{name: "terminal", role: "terminal", native: "Text", label: "Text"},
{name: "clipped label", role: "static", native: "Hidden suffix", label: "Hidden suffix", clipped: true},
{name: "oversized label", role: "button", native: strings.Repeat("x", maxReviewLineCharacters+1), label: strings.Repeat("x", maxReviewLineCharacters+1)},
} {
t.Run(tc.name, func(t *testing.T) {
source := &pointReviewText{fakeReviewText: fakeReviewText{characters: utf8.RuneCountInString(tc.native)}, textByOffset: map[int]string{}}
for i, r := range []rune(tc.native) {
source.textByOffset[i] = string(r)
}
geometry := Geometry{Bounds: clip, BoundsKnown: true}
if tc.clipped {
geometry.Bounds.Width++
}
got, ok := recover_review_component(context.Background(), source, Snapshot{Role: tc.role, Name: tc.label, Editable: tc.editable}, geometry, clip)
if ok != tc.want || got.Known != tc.known || len(got.Ranges) != 0 || got.CaretKnown {
t.Fatalf("recovery = %+v, %v", got, ok)
}
ctx, cancel := context.WithCancel(context.Background())
cancel()
if _, ok := recover_review_component(ctx, source, Snapshot{Role: tc.role, Name: tc.label}, geometry, clip); ok {
t.Fatal("recovered canceled request")
}
})
}
}