From d848dda183d7ba6ae4ba7d8735b7c997d20fc094 Mon Sep 17 00:00:00 2001 From: Jacek Olszak Date: Sun, 5 Oct 2025 12:49:34 +0200 Subject: [PATCH 1/2] test: add pimouse unit tests --- pimouse/pimouse_test.go | 55 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 pimouse/pimouse_test.go diff --git a/pimouse/pimouse_test.go b/pimouse/pimouse_test.go new file mode 100644 index 0000000..40dfad0 --- /dev/null +++ b/pimouse/pimouse_test.go @@ -0,0 +1,55 @@ +// Copyright 2025 Jacek Olszak +// This code is licensed under MIT license (see LICENSE for details) + +package pimouse_test + +import ( + "testing" + + "github.com/elgopher/pi" + "github.com/elgopher/pi/pimouse" + "github.com/stretchr/testify/assert" +) + +func TestDuration(t *testing.T) { + t.Run("should return 0 by default", func(t *testing.T) { + assert.Equal(t, 0, pimouse.Duration(pimouse.Left)) + }) + + pimouse.ButtonTarget().Publish(pimouse.EventButton{ + Button: pimouse.Left, + Type: pimouse.EventButtonDown, + }) + + t.Run("should return 1 when button was down in the current frame", func(t *testing.T) { + assert.Equal(t, 1, pimouse.Duration(pimouse.Left)) + }) + + pi.Frame++ + + t.Run("should return 2 when button has been down since the previous frame", func(t *testing.T) { + assert.Equal(t, 2, pimouse.Duration(pimouse.Left)) + }) + + pimouse.ButtonTarget().Publish(pimouse.EventButton{ + Button: pimouse.Left, + Type: pimouse.EventButtonUp, + }) + + t.Run("should return 0 when button is up", func(t *testing.T) { + assert.Equal(t, 0, pimouse.Duration(pimouse.Left)) + }) +} + +func TestPosition(t *testing.T) { + expected := pi.Position{X: 1, Y: 2} + event := pimouse.EventMove{ + Position: expected, + Previous: pi.Position{X: 3, Y: 5}, + } + // when + pimouse.MoveTarget().Publish(event) + // then + assert.Equal(t, expected, pimouse.Position) + assert.Equal(t, pi.Position{X: -2, Y: -3}, pimouse.MovementDelta) +} From d747473e2fcfe939fb29faee1bc7d9fe5e7eec15 Mon Sep 17 00:00:00 2001 From: Jacek Olszak Date: Sun, 5 Oct 2025 13:22:51 +0200 Subject: [PATCH 2/2] test: add pikey unit tests --- pikey/pikey_test.go | 37 ++++++++++++++++++ pikey/shortcut_test.go | 85 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 pikey/pikey_test.go create mode 100644 pikey/shortcut_test.go diff --git a/pikey/pikey_test.go b/pikey/pikey_test.go new file mode 100644 index 0000000..c013b23 --- /dev/null +++ b/pikey/pikey_test.go @@ -0,0 +1,37 @@ +// Copyright 2025 Jacek Olszak +// This code is licensed under MIT license (see LICENSE for details) + +package pikey_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/elgopher/pi" + "github.com/elgopher/pi/pikey" +) + +func TestDuration(t *testing.T) { + t.Run("should return 0 by default", func(t *testing.T) { + assert.Equal(t, 0, pikey.Duration(pikey.A)) + }) + + pikey.Target().Publish(aDownEvent) + + t.Run("should return 1 when key was down in the current frame", func(t *testing.T) { + assert.Equal(t, 1, pikey.Duration(pikey.A)) + }) + + pi.Frame++ + + t.Run("should return 2 when key has been down since the previous frame", func(t *testing.T) { + assert.Equal(t, 2, pikey.Duration(pikey.A)) + }) + + pikey.Target().Publish(aUpEvent) + + t.Run("should return 0 when key is up", func(t *testing.T) { + assert.Equal(t, 0, pikey.Duration(pikey.A)) + }) +} diff --git a/pikey/shortcut_test.go b/pikey/shortcut_test.go new file mode 100644 index 0000000..41acc2b --- /dev/null +++ b/pikey/shortcut_test.go @@ -0,0 +1,85 @@ +// Copyright 2025 Jacek Olszak +// This code is licensed under MIT license (see LICENSE for details) + +package pikey_test + +import ( + "testing" + + "github.com/elgopher/pi/pikey" + "github.com/elgopher/pi/piloop" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + aDownEvent = pikey.Event{Type: pikey.EventDown, Key: pikey.A} + aUpEvent = pikey.Event{Type: pikey.EventUp, Key: pikey.A} + ctrlDownEvent = pikey.Event{Type: pikey.EventDown, Key: pikey.Ctrl} +) + +func TestRegisterShortcut(t *testing.T) { + t.Run("single key", func(t *testing.T) { + executionTimes := 0 + shortcut := pikey.RegisterShortcut(func() { + executionTimes++ + }, pikey.A) + require.NotNil(t, shortcut) + + pikey.Target().Publish(aDownEvent) + piloop.Target().Publish(piloop.EventLateUpdate) + + t.Run("should execute callback when key is pressed", func(t *testing.T) { + assert.Equal(t, 1, executionTimes) + }) + + executionTimes = 0 + + piloop.Target().Publish(piloop.EventLateUpdate) + + t.Run("should not execute callback again on next frame when key is still pressed", func(t *testing.T) { + assert.Equal(t, 0, executionTimes) + }) + + shortcut.Unregister() + + pikey.Target().Publish(aDownEvent) + piloop.Target().Publish(piloop.EventLateUpdate) + + t.Run("should not execute callback after shortcut is unregistered", func(t *testing.T) { + assert.Equal(t, 0, executionTimes) + }) + }) + + t.Run("multiple keys", func(t *testing.T) { + executionTimes := 0 + shortcut := pikey.RegisterShortcut(func() { + executionTimes++ + }, pikey.A, pikey.Ctrl) + require.NotNil(t, shortcut) + // when + pikey.Target().Publish(aDownEvent) + pikey.Target().Publish(ctrlDownEvent) + piloop.Target().Publish(piloop.EventLateUpdate) + // then + assert.Equal(t, 1, executionTimes) + }) + + t.Run("should not run callback when all keys are not pressed simultaneously, but was down before", func(t *testing.T) { + executionTimes := 0 + shortcut := pikey.RegisterShortcut(func() { + executionTimes++ + }, pikey.A, pikey.Ctrl) + require.NotNil(t, shortcut) + + pikey.Target().Publish(aDownEvent) + piloop.Target().Publish(piloop.EventLateUpdate) + require.Equal(t, 0, executionTimes) + // when + pikey.Target().Publish(ctrlDownEvent) + pikey.Target().Publish(aUpEvent) // "A" no longer down + piloop.Target().Publish(piloop.EventLateUpdate) + // then + assert.Equal(t, 0, executionTimes) + }) +}