99 lines
3.4 KiB
Go
99 lines
3.4 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package input
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.stormux.org/storm/fenrir/internal/command"
|
|
)
|
|
|
|
func TestRegionChordsInBothLayoutsConsumeRepeatsAndEitherReleaseOrder(t *testing.T) {
|
|
for _, layout := range []string{"desktop", "laptop"} {
|
|
bindings, _, err := Load_bindings([]string{"../../config/keyboard/" + layout + ".toml"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, binding := range bindings.Bindings {
|
|
if binding.Command != command.SetWindow && binding.Command != command.SetLiveRegion && binding.Command != command.ListReadingRegions && binding.Command != command.ClearLiveRegions && binding.Command != command.ClearReadingRegions &&
|
|
!strings.HasPrefix(string(binding.Command), "read_live_region_") && !strings.HasPrefix(string(binding.Command), "clear_live_region_") {
|
|
continue
|
|
}
|
|
for _, modifierFirst := range []bool{false, true} {
|
|
for _, numLock := range []bool{false, true} {
|
|
router, err := New_router(bindings)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
modifiers := []uint16{KeyInsert}
|
|
for _, name := range binding.Keys[1 : len(binding.Keys)-1] {
|
|
if name == "CTRL" {
|
|
modifiers = append(modifiers, KeyCtrl)
|
|
} else if name == "SHIFT" {
|
|
modifiers = append(modifiers, KeyShift)
|
|
}
|
|
}
|
|
for _, key := range modifiers {
|
|
router.Key(0, key, 1, numLock, false)
|
|
}
|
|
key := keyCodes[binding.Keys[len(binding.Keys)-1]]
|
|
if got := router.Key(0, key, 1, numLock, false); got.Command != binding.Command || got.Forward {
|
|
t.Fatal(layout, binding.Name, got)
|
|
}
|
|
if got := router.Key(0, key, 2, numLock, false); got.Command != "" || got.Forward {
|
|
t.Fatal("repeat escaped", layout, binding.Name, got)
|
|
}
|
|
if modifierFirst {
|
|
for _, modifier := range modifiers {
|
|
router.Key(0, modifier, 0, numLock, false)
|
|
}
|
|
}
|
|
if got := router.Key(0, key, 0, numLock, false); got.Forward || got.Command != "" {
|
|
t.Fatal("release escaped", layout, binding.Name, got)
|
|
}
|
|
if !modifierFirst {
|
|
for _, modifier := range modifiers {
|
|
router.Key(0, modifier, 0, numLock, false)
|
|
}
|
|
}
|
|
if got := router.Key(0, 48, 1, numLock, false); !got.Forward {
|
|
t.Fatal("plain typing trapped after chord", layout, got)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestWindowDoublePressSurvivesX11AggregateControlSamples(t *testing.T) {
|
|
for _, modifier := range []uint16{KeyCtrl, KeyRightCtrl} {
|
|
bindings, _, err := Load_bindings([]string{"../../config/keyboard/laptop.toml"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
router, err := New_router(bindings)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
now := time.Unix(1000, 0)
|
|
router.now = func() time.Time { return now }
|
|
for _, want := range []command.ID{command.SetWindow, command.ClearWindow} {
|
|
router.Observe_modifier(1, KeyCtrl, 0, false)
|
|
router.Key(0, KeyInsert, 1, false, false)
|
|
router.Key(0, modifier, 1, false, false)
|
|
router.Observe_modifier(1, KeyCtrl, 1, false)
|
|
if got := router.Key(0, 9, 1, false, false); got.Command != want || got.Forward {
|
|
t.Fatal("control modifier shadow broke double press", modifier, got, want)
|
|
}
|
|
router.Key(0, 9, 0, false, false)
|
|
router.Key(0, modifier, 0, false, false)
|
|
router.Observe_modifier(1, KeyCtrl, 0, false)
|
|
router.Key(0, KeyInsert, 0, false, false)
|
|
now = now.Add(100 * time.Millisecond)
|
|
}
|
|
}
|
|
}
|