Files

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)
}
}
}