From 8ccb362ef6e091dc9f00947ac1e0467b6a1ee7e5 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 27 Jul 2023 23:57:28 +0200 Subject: [PATCH] fix double press key combination, tests Now we can fly again! --- .../binding/actions/KeyActionFilterTest.kt | 97 +++++++++++++++++++ .../binding/actions/KeyActionFilter.kt | 2 +- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilterTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilterTest.kt index 8418c882b..c0534b202 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilterTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilterTest.kt @@ -26,20 +26,27 @@ import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingFil import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.KeyBindingState import de.bixilon.minosoft.test.IT.OBJENESIS import de.bixilon.minosoft.util.KUtil.set +import it.unimi.dsi.fastutil.objects.Object2LongMap +import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap import org.testng.Assert.assertFalse import org.testng.Assert.assertTrue import org.testng.annotations.Test +val times = InputManager::class.java.getDeclaredField("times").apply { isAccessible = true } val keysPressed = InputManager::class.java.getDeclaredField("pressed").apply { isAccessible = true } val bindingsPressed = BindingsManager::class.java.getDeclaredField("pressed").apply { isAccessible = true } val name = minosoft("dummy") +val InputManager.times: Object2LongMap get() = de.bixilon.minosoft.gui.rendering.input.key.manager.binding.actions.times.get(this).unsafeCast() + + fun input(): InputManager { val manager = OBJENESIS.newInstance(InputManager::class.java) val bindings = OBJENESIS.newInstance(BindingsManager::class.java) bindingsPressed[bindings] = mutableSetOf() manager::bindings.forceSet(bindings) + times[manager] = Object2LongOpenHashMap() keysPressed[manager] = KeyCodes.set() @@ -353,3 +360,93 @@ class Sticky { assertTrue(state.satisfied) } } + + +@Test(groups = ["input"]) +class DoublePress { + + fun `press single`() { + val state = KeyBindingFilterState(false) + KeyActionFilter.DoublePress.check( + state, setOf(KeyCodes.KEY_0), input(), name, + KeyBindingState(KeyBinding(mapOf(KeyActions.DOUBLE_PRESS to setOf(KeyCodes.KEY_0)))), + KeyCodes.KEY_0, + pressed = true, + 0L, + ) + + assertFalse(state.satisfied) + } + + fun `double press`() { + val state = KeyBindingFilterState(false) + val input = input() + input.times.put(KeyCodes.KEY_0, 1000L) + + KeyActionFilter.DoublePress.check( + state, setOf(KeyCodes.KEY_0), input, name, + KeyBindingState(KeyBinding(mapOf(KeyActions.DOUBLE_PRESS to setOf(KeyCodes.KEY_0)))), + KeyCodes.KEY_0, + pressed = true, + 1100L, + ) + + assertTrue(state.satisfied) + assertTrue(state.result) + assertTrue(state.store) + } + + fun `double press second time`() { + val state = KeyBindingFilterState(false) + val input = input() + + val pressed = bindingsPressed[input.bindings].unsafeCast>() + pressed += name + + input.times.put(KeyCodes.KEY_0, 1000L) + + KeyActionFilter.DoublePress.check( + state, setOf(KeyCodes.KEY_0), input, name, + KeyBindingState(KeyBinding(mapOf(KeyActions.DOUBLE_PRESS to setOf(KeyCodes.KEY_0)))), + KeyCodes.KEY_0, + pressed = true, + 1100L, + ) + + assertTrue(state.satisfied) + assertFalse(state.result) + assertTrue(state.store) + } + + fun `too long ago press`() { + val state = KeyBindingFilterState(false) + val input = input() + input.times.put(KeyCodes.KEY_0, 1000L) + + KeyActionFilter.DoublePress.check( + state, setOf(KeyCodes.KEY_0), input, name, + KeyBindingState(KeyBinding(mapOf(KeyActions.DOUBLE_PRESS to setOf(KeyCodes.KEY_0)))), + KeyCodes.KEY_0, + pressed = true, + 10000L, + ) + + assertFalse(state.satisfied) + } + + fun `delay between`() { + val state = KeyBindingFilterState(false) + val input = input() + input.times.put(KeyCodes.KEY_0, 10L) + + KeyActionFilter.DoublePress.check( + state, setOf(KeyCodes.KEY_0), input, name, + KeyBindingState(KeyBinding(mapOf(KeyActions.DOUBLE_PRESS to setOf(KeyCodes.KEY_0)))), + KeyCodes.KEY_0, + pressed = true, + 100L, + ) + + assertFalse(state.satisfied) + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilter.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilter.kt index 6ef3b53bd..487801073 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilter.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/manager/binding/actions/KeyActionFilter.kt @@ -118,7 +118,7 @@ interface KeyActionFilter { filter.satisfied = false return } - filter.result = input.bindings.isDown(name) + filter.result = !input.bindings.isDown(name) } }