package neferclient import ( "os" "testing" "github.com/stretchr/testify/require" "golang.org/x/sys/unix" "github.com/bnema/purego-xkbcommon/raw" ) // Evdev codes used below (US QWERTY positions). const ( keyQ = 16 keyE = 18 keyBackspace = 14 keyEnter = 28 keyU = 22 keyLeftShift = 42 keyCircum = 41 // de: dead_circumflex ) // testKeyboard is a keyboard on a real xkb keymap compiled from rules. func testKeyboard(t testing.TB, locale, layout string) *keyboard { t.Helper() k, err := newKeyboard(locale) require.NoError(t, err) t.Cleanup(k.close) km, err := k.ctx.NewKeymapRules("evdev", "pc105", layout, "", "") require.NoError(t, err) require.NoError(t, k.replace(km)) k.setFocus(true) return k } func pressKey(t testing.TB, k *keyboard, code uint32) (KeyEvent, bool) { t.Helper() var ev KeyEvent ok, err := k.press(code, &ev) require.NoError(t, err) return ev, ok } func releaseKey(k *keyboard, code uint32) (KeyEvent, bool) { var ev KeyEvent ok := k.release(code, &ev) return ev, ok } func TestKeyboardLayoutsAndModifiers(t *testing.T) { for _, tc := range []struct { layout string code uint32 want string }{{"us", keyQ, "q"}, {"fr", keyQ, "a"}, {"de", 21, "z"}} { k := testKeyboard(t, "en_US.UTF-8", tc.layout) ev, ok := pressKey(t, k, tc.code) require.True(t, ok) require.Equal(t, tc.want, string(ev.Text), tc.layout) require.True(t, ev.Pressed) require.NotZero(t, ev.Keysym) require.Equal(t, tc.code, ev.Keycode) rel, ok := releaseKey(k, tc.code) require.True(t, ok) require.False(t, rel.Pressed) require.Nil(t, rel.Text) require.Equal(t, ev.Keysym, rel.Keysym) } k := testKeyboard(t, "en_US.UTF-8", "us") idx, err := k.keymap.ModIndex("Shift") require.NoError(t, err) require.NoError(t, k.setMask(1<