summaryrefslogtreecommitdiff
path: root/app/tests
diff options
context:
space:
mode:
authorOkke Formsma <okke@formsma.nl>2020-09-01 14:37:37 +0200
committerOkke Formsma <okke@formsma.nl>2020-09-01 19:41:08 +0200
commitc33931c72c179d19028b2d70ec043cbc3d786137 (patch)
treed3d54fec1fe23b5a8d22491d3d1573abfa5e5ea2 /app/tests
parent4202db5a01e04e2e403941f40aea47a11f668853 (diff)
Initial implementation of hold-tap
Diffstat (limited to 'app/tests')
-rw-r--r--app/tests/hold-tap/balanced/1/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/1/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/balanced/1/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/balanced/2/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/2/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/balanced/2/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/balanced/3a/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/3a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/3a/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/balanced/3b/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/3b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/3b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/3c/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/3c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/3c/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/balanced/3d/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/3d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/3d/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/balanced/4a-nested/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/4a-nested/keycode_events.snapshot10
-rw-r--r--app/tests/hold-tap/balanced/4a-nested/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/4a/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/4a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/4a/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/4b/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/4b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/4b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/4c/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/4c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/4c/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/4d/events.patterns4
-rw-r--r--app/tests/hold-tap/balanced/4d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/balanced/4d/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/balanced/behavior_keymap.dtsi27
-rw-r--r--app/tests/hold-tap/hold-preferred/1/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/1/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/hold-preferred/1/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/hold-preferred/2/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/2/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/hold-preferred/2/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/hold-preferred/3a/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/3a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/3a/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/hold-preferred/3b/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/3b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/3b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/3c/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/3c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/3c/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/hold-preferred/3d/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/3d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/3d/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/hold-preferred/4a-nested/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/4a-nested/keycode_events.snapshot10
-rw-r--r--app/tests/hold-tap/hold-preferred/4a-nested/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/4a/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/4a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/4a/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/4b/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/4b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/4b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/4c/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/4c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/4c/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/4d/events.patterns4
-rw-r--r--app/tests/hold-tap/hold-preferred/4d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/hold-preferred/4d/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi29
-rw-r--r--app/tests/hold-tap/tap-preferred/1/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/1/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/tap-preferred/1/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/tap-preferred/2/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/2/keycode_events.snapshot5
-rw-r--r--app/tests/hold-tap/tap-preferred/2/native_posix.keymap11
-rw-r--r--app/tests/hold-tap/tap-preferred/3a/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/3a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/3a/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/tap-preferred/3b/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/3b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/3b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/3c/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/3c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/3c/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/tap-preferred/3d/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/3d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/3d/native_posix.keymap13
-rw-r--r--app/tests/hold-tap/tap-preferred/4a-nested/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/4a-nested/keycode_events.snapshot10
-rw-r--r--app/tests/hold-tap/tap-preferred/4a-nested/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/4a/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/4a/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/4a/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/4b/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/4b/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/4b/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/4c/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/4c/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/4c/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/4d/events.patterns4
-rw-r--r--app/tests/hold-tap/tap-preferred/4d/keycode_events.snapshot7
-rw-r--r--app/tests/hold-tap/tap-preferred/4d/native_posix.keymap14
-rw-r--r--app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi27
-rw-r--r--app/tests/hold-tap/zmk-modtap-proposal.odgbin0 -> 23148 bytes
-rw-r--r--app/tests/hold-tap/zmk-modtap-proposal.pdfbin0 -> 25493 bytes
-rw-r--r--app/tests/tap-hold/balanced/behavior_keymap.dtsi27
-rw-r--r--app/tests/tap-hold/hold-preferred/behavior_keymap.dtsi29
-rw-r--r--app/tests/tap-hold/tap-preferred/behavior_keymap.dtsi27
107 files changed, 961 insertions, 0 deletions
diff --git a/app/tests/hold-tap/balanced/1/events.patterns b/app/tests/hold-tap/balanced/1/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/1/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/1/keycode_events.snapshot b/app/tests/hold-tap/balanced/1/keycode_events.snapshot
new file mode 100644
index 0000000..5f6a266
--- /dev/null
+++ b/app/tests/hold-tap/balanced/1/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (balanced event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/1/native_posix.keymap b/app/tests/hold-tap/balanced/1/native_posix.keymap
new file mode 100644
index 0000000..10336ef
--- /dev/null
+++ b/app/tests/hold-tap/balanced/1/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/2/events.patterns b/app/tests/hold-tap/balanced/2/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/2/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/2/keycode_events.snapshot b/app/tests/hold-tap/balanced/2/keycode_events.snapshot
new file mode 100644
index 0000000..ddda1ae
--- /dev/null
+++ b/app/tests/hold-tap/balanced/2/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/2/native_posix.keymap b/app/tests/hold-tap/balanced/2/native_posix.keymap
new file mode 100644
index 0000000..aa93b86
--- /dev/null
+++ b/app/tests/hold-tap/balanced/2/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,500)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3a/events.patterns b/app/tests/hold-tap/balanced/3a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3a/keycode_events.snapshot b/app/tests/hold-tap/balanced/3a/keycode_events.snapshot
new file mode 100644
index 0000000..a435103
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (balanced event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3a/native_posix.keymap b/app/tests/hold-tap/balanced/3a/native_posix.keymap
new file mode 100644
index 0000000..6f08689
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3a/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3b/events.patterns b/app/tests/hold-tap/balanced/3b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3b/keycode_events.snapshot b/app/tests/hold-tap/balanced/3b/keycode_events.snapshot
new file mode 100644
index 0000000..c0da94f
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3b/native_posix.keymap b/app/tests/hold-tap/balanced/3b/native_posix.keymap
new file mode 100644
index 0000000..392d328
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,300)
+ /*timer*/
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3c/events.patterns b/app/tests/hold-tap/balanced/3c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3c/keycode_events.snapshot b/app/tests/hold-tap/balanced/3c/keycode_events.snapshot
new file mode 100644
index 0000000..ce6e7b7
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided tap (balanced event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3c/native_posix.keymap b/app/tests/hold-tap/balanced/3c/native_posix.keymap
new file mode 100644
index 0000000..77306cd
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3c/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /*d*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3d/events.patterns b/app/tests/hold-tap/balanced/3d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/3d/keycode_events.snapshot b/app/tests/hold-tap/balanced/3d/keycode_events.snapshot
new file mode 100644
index 0000000..1ec384a
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided hold (balanced event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3d/native_posix.keymap b/app/tests/hold-tap/balanced/3d/native_posix.keymap
new file mode 100644
index 0000000..1441331
--- /dev/null
+++ b/app/tests/hold-tap/balanced/3d/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /* d */
+ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,400)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4a-nested/events.patterns b/app/tests/hold-tap/balanced/4a-nested/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a-nested/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4a-nested/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a-nested/keycode_events.snapshot
new file mode 100644
index 0000000..8a1980b
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a-nested/keycode_events.snapshot
@@ -0,0 +1,10 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+ht_binding_pressed: 1 new undecided hold_tap
+ht_decide: 1 decided tap (balanced event 0)
+kp_pressed: usage_page 0x07 keycode 0x0d
+kp_released: usage_page 0x07 keycode 0x0d
+ht_binding_released: 1 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4a-nested/native_posix.keymap b/app/tests/hold-tap/balanced/4a-nested/native_posix.keymap
new file mode 100644
index 0000000..c10c6d6
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a-nested/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(0,1,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4a/events.patterns b/app/tests/hold-tap/balanced/4a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4a/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a/keycode_events.snapshot
new file mode 100644
index 0000000..b89b21d
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4a/native_posix.keymap b/app/tests/hold-tap/balanced/4a/native_posix.keymap
new file mode 100644
index 0000000..ce163f5
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4a/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4b/events.patterns b/app/tests/hold-tap/balanced/4b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4b/keycode_events.snapshot b/app/tests/hold-tap/balanced/4b/keycode_events.snapshot
new file mode 100644
index 0000000..798e2ee
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 2)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4b/native_posix.keymap b/app/tests/hold-tap/balanced/4b/native_posix.keymap
new file mode 100644
index 0000000..7abda41
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4c/events.patterns b/app/tests/hold-tap/balanced/4c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4c/keycode_events.snapshot b/app/tests/hold-tap/balanced/4c/keycode_events.snapshot
new file mode 100644
index 0000000..798e2ee
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (balanced event 2)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4c/native_posix.keymap b/app/tests/hold-tap/balanced/4c/native_posix.keymap
new file mode 100644
index 0000000..ce030af
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4c/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ /* timer */
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4d/events.patterns b/app/tests/hold-tap/balanced/4d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/4d/keycode_events.snapshot b/app/tests/hold-tap/balanced/4d/keycode_events.snapshot
new file mode 100644
index 0000000..5c9f4e3
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (balanced event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0x07
diff --git a/app/tests/hold-tap/balanced/4d/native_posix.keymap b/app/tests/hold-tap/balanced/4d/native_posix.keymap
new file mode 100644
index 0000000..5467660
--- /dev/null
+++ b/app/tests/hold-tap/balanced/4d/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(0,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/balanced/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/behavior_keymap.dtsi
new file mode 100644
index 0000000..df56fb5
--- /dev/null
+++ b/app/tests/hold-tap/balanced/behavior_keymap.dtsi
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ behaviors {
+ ht_bal: behavior_hold_tap_balanced {
+ compatible = "zmk,behavior-hold-tap";
+ label = "HOLD_TAP_BALANCED";
+ #binding-cells = <2>;
+ flavor = "balanced";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &ht_bal LSFT F &ht_bal LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};
diff --git a/app/tests/hold-tap/hold-preferred/1/events.patterns b/app/tests/hold-tap/hold-preferred/1/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/1/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/1/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/1/keycode_events.snapshot
new file mode 100644
index 0000000..cf787d8
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/1/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (hold-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/1/native_posix.keymap b/app/tests/hold-tap/hold-preferred/1/native_posix.keymap
new file mode 100644
index 0000000..10336ef
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/1/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/2/events.patterns b/app/tests/hold-tap/hold-preferred/2/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/2/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/2/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/2/keycode_events.snapshot
new file mode 100644
index 0000000..03329d5
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/2/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/2/native_posix.keymap b/app/tests/hold-tap/hold-preferred/2/native_posix.keymap
new file mode 100644
index 0000000..aa93b86
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/2/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,500)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3a/events.patterns b/app/tests/hold-tap/hold-preferred/3a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3a/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3a/keycode_events.snapshot
new file mode 100644
index 0000000..adf4fe2
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (hold-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3a/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3a/native_posix.keymap
new file mode 100644
index 0000000..6f08689
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3a/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3b/events.patterns b/app/tests/hold-tap/hold-preferred/3b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3b/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3b/keycode_events.snapshot
new file mode 100644
index 0000000..69b64a9
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3b/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3b/native_posix.keymap
new file mode 100644
index 0000000..392d328
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,300)
+ /*timer*/
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3c/events.patterns b/app/tests/hold-tap/hold-preferred/3c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3c/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3c/keycode_events.snapshot
new file mode 100644
index 0000000..b06a1d7
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided tap (hold-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3c/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3c/native_posix.keymap
new file mode 100644
index 0000000..77306cd
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3c/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /*d*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3d/events.patterns b/app/tests/hold-tap/hold-preferred/3d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/3d/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3d/keycode_events.snapshot
new file mode 100644
index 0000000..bf31955
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided hold (hold-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3d/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3d/native_posix.keymap
new file mode 100644
index 0000000..1441331
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/3d/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /* d */
+ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,400)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4a-nested/events.patterns b/app/tests/hold-tap/hold-preferred/4a-nested/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a-nested/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4a-nested/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a-nested/keycode_events.snapshot
new file mode 100644
index 0000000..3ed7de0
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a-nested/keycode_events.snapshot
@@ -0,0 +1,10 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 1)
+kp_pressed: usage_page 0x07 keycode 0xe1
+ht_binding_pressed: 1 new undecided hold_tap
+ht_decide: 1 decided tap (hold-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x0d
+kp_released: usage_page 0x07 keycode 0x0d
+ht_binding_released: 1 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4a-nested/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4a-nested/native_posix.keymap
new file mode 100644
index 0000000..c10c6d6
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a-nested/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(0,1,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4a/events.patterns b/app/tests/hold-tap/hold-preferred/4a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4a/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a/keycode_events.snapshot
new file mode 100644
index 0000000..e0b57fd
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 1)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4a/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4a/native_posix.keymap
new file mode 100644
index 0000000..ce163f5
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4a/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4b/events.patterns b/app/tests/hold-tap/hold-preferred/4b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4b/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4b/keycode_events.snapshot
new file mode 100644
index 0000000..e0b57fd
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 1)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4b/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4b/native_posix.keymap
new file mode 100644
index 0000000..7abda41
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4c/events.patterns b/app/tests/hold-tap/hold-preferred/4c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4c/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4c/keycode_events.snapshot
new file mode 100644
index 0000000..e0b57fd
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 1)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4c/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4c/native_posix.keymap
new file mode 100644
index 0000000..ce030af
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4c/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ /* timer */
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4d/events.patterns b/app/tests/hold-tap/hold-preferred/4d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/4d/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4d/keycode_events.snapshot
new file mode 100644
index 0000000..cac579d
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (hold-preferred event 1)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0x07
diff --git a/app/tests/hold-tap/hold-preferred/4d/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4d/native_posix.keymap
new file mode 100644
index 0000000..5467660
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/4d/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(0,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi
new file mode 100644
index 0000000..375ffd9
--- /dev/null
+++ b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi
@@ -0,0 +1,29 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+
+/ {
+ behaviors {
+ ht_hold: behavior_hold_hold_tap {
+ compatible = "zmk,behavior-hold-tap";
+ label = "hold_hold_tap";
+ #binding-cells = <2>;
+ flavor = "hold-preferred";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &ht_hold LSFT F &ht_hold LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};
diff --git a/app/tests/hold-tap/tap-preferred/1/events.patterns b/app/tests/hold-tap/tap-preferred/1/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/1/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/1/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/1/keycode_events.snapshot
new file mode 100644
index 0000000..2a250fb
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/1/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/1/native_posix.keymap b/app/tests/hold-tap/tap-preferred/1/native_posix.keymap
new file mode 100644
index 0000000..10336ef
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/1/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/2/events.patterns b/app/tests/hold-tap/tap-preferred/2/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/2/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/2/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/2/keycode_events.snapshot
new file mode 100644
index 0000000..4f1ee63
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/2/keycode_events.snapshot
@@ -0,0 +1,5 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/2/native_posix.keymap b/app/tests/hold-tap/tap-preferred/2/native_posix.keymap
new file mode 100644
index 0000000..aa93b86
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/2/native_posix.keymap
@@ -0,0 +1,11 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,500)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3a/events.patterns b/app/tests/hold-tap/tap-preferred/3a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3a/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3a/keycode_events.snapshot
new file mode 100644
index 0000000..87d1406
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3a/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3a/native_posix.keymap
new file mode 100644
index 0000000..6f08689
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3a/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3b/events.patterns b/app/tests/hold-tap/tap-preferred/3b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3b/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3b/keycode_events.snapshot
new file mode 100644
index 0000000..7455d2a
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0xe4
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe4
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3b/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3b/native_posix.keymap
new file mode 100644
index 0000000..392d328
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/
+ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,1,300)
+ /*timer*/
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3c/events.patterns b/app/tests/hold-tap/tap-preferred/3c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3c/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3c/keycode_events.snapshot
new file mode 100644
index 0000000..3d7eaf1
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3c/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3c/native_posix.keymap
new file mode 100644
index 0000000..77306cd
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3c/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /*d*/
+ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3d/events.patterns b/app/tests/hold-tap/tap-preferred/3d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/3d/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3d/keycode_events.snapshot
new file mode 100644
index 0000000..059d99c
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+kp_pressed: usage_page 0x07 keycode 0x07
+ht_binding_pressed: 0 new undecided hold_tap
+kp_released: usage_page 0x07 keycode 0x07
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3d/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3d/native_posix.keymap
new file mode 100644
index 0000000..1441331
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/3d/native_posix.keymap
@@ -0,0 +1,13 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10) /* d */
+ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */
+ ZMK_MOCK_RELEASE(1,0,400)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4a-nested/events.patterns b/app/tests/hold-tap/tap-preferred/4a-nested/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a-nested/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4a-nested/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a-nested/keycode_events.snapshot
new file mode 100644
index 0000000..a8cf490
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a-nested/keycode_events.snapshot
@@ -0,0 +1,10 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+ht_binding_pressed: 1 new undecided hold_tap
+ht_decide: 1 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x0d
+kp_released: usage_page 0x07 keycode 0x0d
+ht_binding_released: 1 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4a-nested/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4a-nested/native_posix.keymap
new file mode 100644
index 0000000..c10c6d6
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a-nested/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(0,1,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4a/events.patterns b/app/tests/hold-tap/tap-preferred/4a/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4a/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a/keycode_events.snapshot
new file mode 100644
index 0000000..92a3569
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4a/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4a/native_posix.keymap
new file mode 100644
index 0000000..ce163f5
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4a/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,200)
+ ZMK_MOCK_PRESS(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4b/events.patterns b/app/tests/hold-tap/tap-preferred/4b/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4b/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4b/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4b/keycode_events.snapshot
new file mode 100644
index 0000000..92a3569
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4b/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided hold (tap-preferred event 3)
+kp_pressed: usage_page 0x07 keycode 0xe1
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0xe1
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4b/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4b/native_posix.keymap
new file mode 100644
index 0000000..7abda41
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4b/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(1,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4c/events.patterns b/app/tests/hold-tap/tap-preferred/4c/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4c/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4c/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4c/keycode_events.snapshot
new file mode 100644
index 0000000..bc8aa8e
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4c/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4c/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4c/native_posix.keymap
new file mode 100644
index 0000000..ce030af
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4c/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ /* timer */
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4d/events.patterns b/app/tests/hold-tap/tap-preferred/4d/events.patterns
new file mode 100644
index 0000000..fdf2b15
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4d/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p
+s/.*on_hold_tap_binding/ht_binding/p
+s/.*decide_hold_tap/ht_decide/p \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/4d/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4d/keycode_events.snapshot
new file mode 100644
index 0000000..b106f13
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4d/keycode_events.snapshot
@@ -0,0 +1,7 @@
+ht_binding_pressed: 0 new undecided hold_tap
+ht_decide: 0 decided tap (tap-preferred event 0)
+kp_pressed: usage_page 0x07 keycode 0x09
+kp_pressed: usage_page 0x07 keycode 0x07
+kp_released: usage_page 0x07 keycode 0x09
+ht_binding_released: 0 cleaning up hold-tap
+kp_released: usage_page 0x07 keycode 0x07
diff --git a/app/tests/hold-tap/tap-preferred/4d/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4d/native_posix.keymap
new file mode 100644
index 0000000..5467660
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/4d/native_posix.keymap
@@ -0,0 +1,14 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,100)
+ ZMK_MOCK_PRESS(1,0,100)
+ ZMK_MOCK_RELEASE(0,0,200)
+ /* timer fires */
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+}; \ No newline at end of file
diff --git a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi
new file mode 100644
index 0000000..e514fa6
--- /dev/null
+++ b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ behaviors {
+ tp: behavior_tap_preferred {
+ compatible = "zmk,behavior-hold-tap";
+ label = "MOD_TAP";
+ #binding-cells = <2>;
+ flavor = "tap-preferred";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &tp LSFT F &tp LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};
diff --git a/app/tests/hold-tap/zmk-modtap-proposal.odg b/app/tests/hold-tap/zmk-modtap-proposal.odg
new file mode 100644
index 0000000..82f8436
--- /dev/null
+++ b/app/tests/hold-tap/zmk-modtap-proposal.odg
Binary files differ
diff --git a/app/tests/hold-tap/zmk-modtap-proposal.pdf b/app/tests/hold-tap/zmk-modtap-proposal.pdf
new file mode 100644
index 0000000..33048ca
--- /dev/null
+++ b/app/tests/hold-tap/zmk-modtap-proposal.pdf
Binary files differ
diff --git a/app/tests/tap-hold/balanced/behavior_keymap.dtsi b/app/tests/tap-hold/balanced/behavior_keymap.dtsi
new file mode 100644
index 0000000..df56fb5
--- /dev/null
+++ b/app/tests/tap-hold/balanced/behavior_keymap.dtsi
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ behaviors {
+ ht_bal: behavior_hold_tap_balanced {
+ compatible = "zmk,behavior-hold-tap";
+ label = "HOLD_TAP_BALANCED";
+ #binding-cells = <2>;
+ flavor = "balanced";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &ht_bal LSFT F &ht_bal LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};
diff --git a/app/tests/tap-hold/hold-preferred/behavior_keymap.dtsi b/app/tests/tap-hold/hold-preferred/behavior_keymap.dtsi
new file mode 100644
index 0000000..375ffd9
--- /dev/null
+++ b/app/tests/tap-hold/hold-preferred/behavior_keymap.dtsi
@@ -0,0 +1,29 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+
+/ {
+ behaviors {
+ ht_hold: behavior_hold_hold_tap {
+ compatible = "zmk,behavior-hold-tap";
+ label = "hold_hold_tap";
+ #binding-cells = <2>;
+ flavor = "hold-preferred";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &ht_hold LSFT F &ht_hold LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};
diff --git a/app/tests/tap-hold/tap-preferred/behavior_keymap.dtsi b/app/tests/tap-hold/tap-preferred/behavior_keymap.dtsi
new file mode 100644
index 0000000..e514fa6
--- /dev/null
+++ b/app/tests/tap-hold/tap-preferred/behavior_keymap.dtsi
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ behaviors {
+ tp: behavior_tap_preferred {
+ compatible = "zmk,behavior-hold-tap";
+ label = "MOD_TAP";
+ #binding-cells = <2>;
+ flavor = "tap-preferred";
+ tapping_term_ms = <300>;
+ bindings = <&kp>, <&kp>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &tp LSFT F &tp LCTL J
+ &kp D &kp RCTL>;
+ };
+ };
+};