package atspi import ( "context" "strings" "testing" "time" ) func TestEmbeddedTextBudgetReportsIncompleteExpansion(t *testing.T) { for _, test := range []struct { name, raw, want string depth int budget embeddedTextBudget incomplete bool }{ {"nodes", "Before \ufffc after", "Before after", 0, embeddedTextBudget{nodes: 0, characters: 100, deadline: time.Now().Add(time.Hour)}, true}, {"deadline", "Before \ufffc after", "Before after", 0, embeddedTextBudget{nodes: 32, characters: 100, deadline: time.Time{}}, true}, {"depth", "Before \ufffc after", "Before after", 8, embeddedTextBudget{nodes: 32, characters: 100, deadline: time.Now().Add(time.Hour)}, true}, {"characters", "猫text", "猫", 0, embeddedTextBudget{nodes: 32, characters: 1}, true}, {"complete plain text", "猫text", "猫text", 0, embeddedTextBudget{nodes: 32, characters: 5}, false}, } { t.Run(test.name, func(t *testing.T) { // These budgets stop before any native child query. No provider // reference is needed to exercise the actual expansion limits. got := expandNativeEmbeddedText(nil, test.raw, 0, test.depth, &test.budget) if got != test.want || test.budget.incomplete != test.incomplete || strings.ContainsRune(got, '\ufffc') { t.Fatalf("text=%q incomplete=%t", got, test.budget.incomplete) } }) } } func TestEmbeddedDocumentTextSkipsProtectedAndEditableObjects(t *testing.T) { for _, snapshot := range []Snapshot{{Role: "password text"}, {Role: "terminal"}, {Role: "entry", Editable: true}} { line := expandNativeDocumentText(context.Background(), nil, snapshot, DocumentCaretText{Text: "\ufffc", Start: 0, End: 1, CharacterCount: 1}) if line.Text != "\ufffc" || line.RawText != "\ufffc" || line.Expanded { t.Fatalf("unexpected expansion for %s: %+v", snapshot.Role, line) } } }