55 lines
2.5 KiB
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")
|
|
}
|
|
})
|
|
}
|
|
}
|