40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// Authors: Storm Dragon, Angus Kola
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package input
|
|
|
|
import "testing"
|
|
|
|
func TestRepeatTrackerRecognizesNativeSequences(t *testing.T) {
|
|
var tracker RepeatTracker
|
|
steps := []struct {
|
|
code uint8
|
|
pressed bool
|
|
timestamp uint32
|
|
repeat bool
|
|
}{
|
|
{38, true, 100, false},
|
|
{38, true, 110, true}, // Detectable autorepeat.
|
|
{39, true, 111, false}, // Another key is still a fresh press.
|
|
{38, false, 120, false},
|
|
{38, true, 120, true}, // Classic X11 release/press pair.
|
|
{38, false, 130, false},
|
|
{38, true, 140, false}, // Real release and new press.
|
|
{39, false, ^uint32(0), false},
|
|
{39, true, 1, false}, // Timestamp wrap is not a repeat.
|
|
{38, false, 0, false},
|
|
{38, true, 0, false}, // Unknown timestamps cannot prove a release/press pair.
|
|
{38, true, 0, true},
|
|
}
|
|
for index, step := range steps {
|
|
if got := tracker.Observe(Event{Keycode: step.code, Pressed: step.pressed, Timestamp: step.timestamp}); got != step.repeat {
|
|
t.Fatalf("step %d: repeat = %t, want %t", index, got, step.repeat)
|
|
}
|
|
}
|
|
tracker.Reset()
|
|
if tracker.Observe(Event{Keycode: 38, Pressed: true, Timestamp: 150}) {
|
|
t.Fatal("secure reset retained held keys")
|
|
}
|
|
}
|