Add Mumble message review shortcuts

This commit is contained in:
ak47 committed 2026-11-07 19:59:23 -05:00
1 parent d5f8a392cf
commit 64440fbb78
18 files changed
+484 -30

No files matched your search

+73 -3
View File
@@ -7,6 +7,7 @@ package app
import (
"context"
"errors"
"fmt"
"log/slog"
"os"
"testing"
@@ -26,7 +27,71 @@ func pidginMessageEvent(text string) atspi.Event {
return event
}
func TestMumbleMessagingReviewBoundsOwnershipAndRetirement(t *testing.T) {
queue, braille := &learnSpeechRecorder{}, &flashRecorder{}
controller := newMessagingController(context.Background(), queue, nil, nil, func(_ context.Context, text string) error {
if text != "Mumble message 3" {
return fmt.Errorf("copied wrong message: %q", text)
}
return nil
})
controller.braille = braille
defer controller.stop()
current := atspi.Snapshot{ApplicationProcess: "mumble", BusName: ":1.42"}
for i := 0; i < 15; i++ {
event := pidginMessageEvent(fmt.Sprintf("Mumble message %d", i))
event.Source.ApplicationProcess = "mumble"
if i%2 == 0 {
event.Source.Role = "label"
}
if !controller.handle(event) {
t.Fatal("Mumble log insertion was not handled")
}
}
for i := 0; i < 12; i++ {
controller.review(input.MessageCommand(i, false), current)
want := fmt.Sprintf("Mumble message %d", 14-i)
if queue.texts[len(queue.texts)-1] != want || braille.messages[len(braille.messages)-1] != want {
t.Fatalf("review slot %d did not present %q", i, want)
}
}
controller.review(input.MessageCommand(11, true), current)
select {
case result := <-controller.results:
if result.err != nil {
t.Fatal(result.err)
}
controller.copied(result)
case <-time.After(time.Second):
t.Fatal("Mumble F12 copy did not complete")
}
if queue.texts[len(queue.texts)-1] != "Copied Mumble message 3 to clipboard." {
t.Fatal("Mumble F12 copy was not confirmed")
}
count := len(queue.texts)
for _, focus := range []atspi.Snapshot{
{ApplicationProcess: "mumble", BusName: ":1.43"},
{ApplicationProcess: "chromium", BusName: ":1.42"},
{ApplicationProcess: "pidgin", BusName: ":1.42"},
} {
controller.review(input.MessageCommand(11, false), focus)
}
retired := atspi.NewEvent(atspi.DefunctStateEvent, atspi.Snapshot{BusName: ":1.42", Path: "/transcript", Defunct: true})
retired.Detail1 = 1
controller.handle(retired)
controller.review(input.MessageCommand(0, false), current)
if len(queue.texts) != count || len(braille.messages) != count {
t.Fatal("unowned or retired history was presented")
}
}
func TestMessagingBackgroundPresentationKeepsFocusAndUsesCommands(t *testing.T) {
for _, process := range []string{"pidgin", "mumble"} {
t.Run(process, func(t *testing.T) { testMessagingBackgroundPresentationKeepsFocusAndUsesCommands(t, process) })
}
}
func testMessagingBackgroundPresentationKeepsFocusAndUsesCommands(t *testing.T, process string) {
ctx, cancel := context.WithCancel(context.Background())
adapter := &fakeAdapter{events: make(chan atspi.Event)}
queue := &fakeSpeechQueue{spoken: make(chan string, 16)}
@@ -37,13 +102,18 @@ func TestMessagingBackgroundPresentationKeepsFocusAndUsesCommands(t *testing.T)
}()
defer func() { cancel(); <-done }()
focus := ownerEvent(atspi.FocusedStateEvent, ":1.42", "/window", "/entry")
focus.Source.ApplicationProcess, focus.Source.Role, focus.Source.Name = "pidgin", "entry", "Message input"
focus.Source.ApplicationProcess, focus.Source.Role, focus.Source.Name = process, "entry", "Message input"
focus.Source.Editable, focus.Source.Focused, focus.Detail1 = true, true, 1
adapter.events <- focus
expectActivationSpeech(t, queue.spoken, "Message input, entry")
adapter.events <- pidginMessageEvent("First message")
messageEvent := func(text string) atspi.Event {
event := pidginMessageEvent(text)
event.Source.ApplicationProcess = process
return event
}
adapter.events <- messageEvent("First message")
expectActivationSpeech(t, queue.spoken, "First message")
adapter.events <- pidginMessageEvent("Second message")
adapter.events <- messageEvent("Second message")
expectActivationSpeech(t, queue.spoken, "Second message")
requests <- input.MessageCommand(0, false)
expectActivationSpeech(t, queue.spoken, "Second message")