// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package input import ( "git.stormux.org/storm/fenrir/internal/command" "testing" ) func TestAttributeBindingsNumLockRepeatsAndRelease(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 _, numLock := range []bool{false, true} { for _, modifierFirst := range []bool{false, true} { router, err := New_router(bindings) if err != nil { t.Fatal(err) } code := uint16(74) if layout == "laptop" { code = 30 router.Key(0, KeyInsert, 1, numLock, false) router.Key(0, KeyShift, 1, numLock, false) } for range 2 { got := router.Key(0, code, 1, numLock, false) forwarded := layout == "desktop" && numLock if got.Forward != forwarded || (!forwarded && got.Command != command.AttributeCursor) || (forwarded && got.Command != "") { t.Fatal(layout, numLock, got) } got = router.Key(0, code, 2, numLock, false) if got.Command != "" || got.Forward != forwarded { t.Fatal("held report", got) } router.Key(0, code, 0, numLock, false) } router.Key(0, code, 1, numLock, false) if modifierFirst && layout == "laptop" { router.Key(0, KeyInsert, 0, numLock, false) } router.Key(0, code, 0, numLock, false) if !modifierFirst && layout == "laptop" { router.Key(0, KeyInsert, 0, numLock, false) } if layout == "laptop" { router.Key(0, KeyShift, 0, numLock, false) } if router.Held(0) { t.Fatal("stuck attributes chord", layout) } if got := router.Key(0, 48, 1, numLock, false); !got.Forward || got.Command != "" { t.Fatal("typing after attributes", got) } } } } } func TestAttributeToggleChordBothLayoutsNumLockAndReleases(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 _, numLock := range []bool{false, true} { for _, modifierFirst := range []bool{false, true} { router, err := New_router(bindings) if err != nil { t.Fatal(err) } router.Key(0, KeyInsert, 1, numLock, false) got := router.Key(0, 74, 1, numLock, false) if got.Command != command.ToggleAttributes || got.Forward || !got.Interrupt { t.Fatal(layout, numLock, got) } if got := router.Key(0, 74, 2, numLock, false); got.Command != "" || got.Forward { t.Fatal("repeat toggle", got) } releases := []uint16{74, KeyInsert} if modifierFirst { releases = []uint16{KeyInsert, 74} } for _, code := range releases { if got := router.Key(0, code, 0, numLock, false); got.Command != "" || got.Forward { t.Fatal("release", got) } } if router.Held(0) { t.Fatal("stuck toggle") } if got := router.Key(0, 48, 1, numLock, false); !got.Forward || got.Command != "" { t.Fatal("typing", got) } } } } }