Restore reading backspace if typing with autoread disabled.

This commit is contained in:
Storm Dragon committed 2026-10-28 01:14:09 -04:00
1 parent eaf450587c
commit 57799cd2eb
6 files changed
+295 -6

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
package app
import (
"context"
"reflect"
"testing"
"time"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/config"
"git.stormux.org/storm/fenrir/internal/input"
"git.stormux.org/storm/fenrir/internal/screen"
)
func TestDeletionThroughSharedRouterWithAutoreadOff(t *testing.T) {
for _, key := range []uint16{input.KeyBackspace, input.KeyDelete} {
for _, mode := range []string{"enabled", "muted", "temporary silence", "speech disabled"} {
t.Run(mode+"/"+map[uint16]string{input.KeyBackspace: "backspace", input.KeyDelete: "delete"}[key], func(t *testing.T) {
router, err := input.New_router([]input.Binding{{Name: "Quit", Keys: []string{"FENRIR", "Q"}, Command: command.Quit}})
if err != nil {
t.Fatal(err)
}
beforeX := 11
if key == input.KeyDelete {
beforeX = 10
}
source := &fakeSource{snapshot: screen.Snapshot{Terminal: 1, Active: true, Rows: 2, Cols: 20, X: beforeX, Cells: []rune("type 2% abc " + "Download 20% ")}, events: make(chan error, 1)}
keys := &fakeKeys{events: make(chan error, 1)}
voice, sounds := &fakeVoice{}, &fakeSounds{}
voice.muted = mode == "speech disabled"
reads, polls := 0, 0
source.afterRead = func() {
reads++
if reads == 2 {
keys.events <- nil
}
}
keys.poll = func(_ bool, handle func(input.Decision)) error {
polls++
if polls == 1 {
handle(input.Decision{Command: command.AutoRead, Interrupt: true})
if mode == "muted" {
handle(input.Decision{Command: command.Mute, Interrupt: true})
}
handle(router.Key(0, key, 1, false, false))
if mode == "temporary silence" {
handle(input.Decision{Command: command.TempDisableSpeech, Interrupt: true})
}
voice.messages = nil
source.snapshot.Cells = []rune("type 2% ab " + "Download 30% ")
source.snapshot.X = 10
source.events <- nil
} else {
handle(input.Decision{Command: command.Quit})
}
return nil
}
settings := config.Defaults()
settings.Keyboard.CharacterEcho = false
settings.Keyboard.WordEcho = false
settings.Reading.CursorEcho = false
settings.Presentation.Progress.Enabled = true
settings.Presentation.Speech.Enabled = mode != "speech disabled"
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
if err := run(ctx, source, keys, voice, nil, RunOptions{Settings: settings, Sounds: sounds}); err != nil || reads != 2 {
t.Fatal(err, reads)
}
var want []string
if mode == "enabled" {
want = []string{"c"}
}
if !reflect.DeepEqual(voice.messages, want) {
t.Fatal("deletion speech or concurrent output", voice.messages, want)
}
wantProgress := []float64{30}
if mode == "temporary silence" {
wantProgress = nil
}
if !reflect.DeepEqual(sounds.progress, wantProgress) {
t.Fatal("concurrent background progress lost or deletion beeped", sounds.progress)
}
})
}
}
}