// 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") } }) } }