72 lines
2.7 KiB
Go
72 lines
2.7 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// Authors: Storm Dragon, Angus Kola
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package review
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"git.stormux.org/storm/cthulhu/internal/atspi"
|
|
)
|
|
|
|
func TestDocumentCaretReadsFieldsInsideNamedClickableContainer(t *testing.T) {
|
|
reader := caretTextReader{webID("/before"): "Before", webID("/letter"): "A", webID("/after"): "After"}
|
|
node := func(path, role, name string, count int, children ...string) atspi.TreeNode {
|
|
snapshot := atspi.NewSnapshot(path, name, role, "", "")
|
|
snapshot.BusName, snapshot.CharacterCount = webID(path).BusName, count
|
|
result := atspi.TreeNode{Snapshot: snapshot}
|
|
for _, child := range children {
|
|
result.Children = append(result.Children, webID(child))
|
|
}
|
|
return result
|
|
}
|
|
container := node("/row", "section", "Completed row", 2, "/dragger", "/cells")
|
|
container.Snapshot.SupportsClick, container.Snapshot.ExplicitName, container.Snapshot.Focusable = true, true, true
|
|
container.Snapshot.TextChildren = []atspi.TextChild{{Offset: 0, Child: webID("/dragger")}, {Offset: 1, Child: webID("/cells")}}
|
|
entry := node("/letter", "entry", "Letter", 1)
|
|
entry.Snapshot.Editable, entry.Snapshot.SensitiveKnown = true, true // Disabled fields can retain editable state.
|
|
tree, err := atspi.NewAccessibleTree(webID("/doc"), []atspi.TreeNode{
|
|
node("/doc", "document web", "", 0, "/before", "/row", "/after"),
|
|
node("/before", "static", "", 6), container,
|
|
node("/dragger", "button", "Reorder row", 0, "/icon"),
|
|
node("/icon", "image", "Reorder icon", 0),
|
|
node("/cells", "section", "", 0, "/letter", "/password"), entry,
|
|
node("/password", "password text", "Secret", 0, "/secret"),
|
|
node("/secret", "static", "Private fixture", 15),
|
|
node("/after", "static", "", 5),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cursor, err := NewDocumentCursor(tree)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx := context.Background()
|
|
if _, err := cursor.SyncFocus(ctx, webID("/before")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, step := range []struct {
|
|
command DocumentCaretCommand
|
|
path, text string
|
|
}{
|
|
{CaretNextLine, "/row", ""},
|
|
{CaretNextCharacter, "/dragger", ""},
|
|
{CaretNextCharacter, "/letter", "A"},
|
|
{CaretReadLine, "/letter", "A"},
|
|
{CaretNextLine, "/after", "After"},
|
|
{CaretPreviousLine, "/letter", "A"},
|
|
{CaretPreviousCharacter, "/dragger", ""},
|
|
{CaretPreviousLine, "/row", ""},
|
|
{CaretPreviousLine, "/before", "Before"},
|
|
} {
|
|
move, err := cursor.MoveCaret(ctx, reader, step.command)
|
|
if err != nil || !move.Moved || move.Position.Object.ID() != webID(step.path) || move.Text != step.text {
|
|
t.Fatalf("%s: object=%s text=%q moved=%t err=%v; want %s %q", step.command,
|
|
move.Position.Object.ID().Path, move.Text, move.Moved, err, step.path, step.text)
|
|
}
|
|
}
|
|
}
|