aboutsummaryrefslogtreecommitdiffhomepage
path: root/app/tests/mod-morph
diff options
context:
space:
mode:
authorRobert U <[email protected]>2022-10-14 21:40:28 -0400
committerGitHub <[email protected]>2022-10-14 20:40:28 -0500
commitef2e6e9156806760d9e91c0d635cd809058c3ee7 (patch)
tree8a83ac99caf99a7d5bcee3698eae2be4d1e4a990 /app/tests/mod-morph
parent18b8b9b3a57226ef84064b1382d846c634dcfd2e (diff)
downloadzmk-ef2e6e9156806760d9e91c0d635cd809058c3ee7.tar.gz
zmk-ef2e6e9156806760d9e91c0d635cd809058c3ee7.zip
feat(behaviors): Add mod-morph `keep-mods`
* Update docs for mod-morph * Add unit tests for mod-morph * Add keep-mods to DT binding Co-authored-by: Martin Aumùˆller <[email protected]> Co-authored-by: Cem Aksoylar <[email protected]>
Diffstat (limited to 'app/tests/mod-morph')
-rw-r--r--app/tests/mod-morph/1-no-morph/events.patterns8
-rw-r--r--app/tests/mod-morph/1-no-morph/keycode_events.snapshot5
-rw-r--r--app/tests/mod-morph/1-no-morph/native_posix_64.keymap11
-rw-r--r--app/tests/mod-morph/2a-masked-morph/events.patterns8
-rw-r--r--app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot12
-rw-r--r--app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap13
-rw-r--r--app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns8
-rw-r--r--app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot12
-rw-r--r--app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap37
-rw-r--r--app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns8
-rw-r--r--app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot18
-rw-r--r--app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap15
-rw-r--r--app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns8
-rw-r--r--app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot12
-rw-r--r--app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap45
-rw-r--r--app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns8
-rw-r--r--app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot12
-rw-r--r--app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap47
-rw-r--r--app/tests/mod-morph/3-unmasked-morph/events.patterns8
-rw-r--r--app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot12
-rw-r--r--app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap37
-rw-r--r--app/tests/mod-morph/behavior_keymap.dtsi23
22 files changed, 367 insertions, 0 deletions
diff --git a/app/tests/mod-morph/1-no-morph/events.patterns b/app/tests/mod-morph/1-no-morph/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/1-no-morph/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/1-no-morph/keycode_events.snapshot b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot
new file mode 100644
index 0000000000..3a2d70febe
--- /dev/null
+++ b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot
@@ -0,0 +1,5 @@
+pressed: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x00
+released: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x00
+unmask mods: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap
new file mode 100644
index 0000000000..fb939de59c
--- /dev/null
+++ b/app/tests/mod-morph/1-no-morph/native_posix_64.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,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ >;
+};
diff --git a/app/tests/mod-morph/2a-masked-morph/events.patterns b/app/tests/mod-morph/2a-masked-morph/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/2a-masked-morph/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot
new file mode 100644
index 0000000000..dcf2aae638
--- /dev/null
+++ b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot
@@ -0,0 +1,12 @@
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x02
+reg implicit: Modifiers set to 0x02
+mask mods: Modifiers set to 0x00
+pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x00
+released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x00
+unmask mods: Modifiers set to 0x02
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap
new file mode 100644
index 0000000000..9ad50202c3
--- /dev/null
+++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.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)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+};
diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot
new file mode 100644
index 0000000000..ce85f25db6
--- /dev/null
+++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot
@@ -0,0 +1,12 @@
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x02
+reg implicit: Modifiers set to 0x02
+mask mods: Modifiers set to 0x00
+pressed: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
+reg implicit: Modifiers set to 0x02
+released: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x00
+unmask mods: Modifiers set to 0x02
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap
new file mode 100644
index 0000000000..74de8588d6
--- /dev/null
+++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap
@@ -0,0 +1,37 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+/ {
+ behaviors {
+ mod_morph: mod_morph {
+ compatible = "zmk,behavior-mod-morph";
+ label = "MOD_MORPH_TEST";
+ #binding-cells = <0>;
+ bindings = <&kp A>, <&kp LS(B)>; // implict mod overwrite
+ mods = <(MOD_LSFT|MOD_RSFT)>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LEFT_ALT &mod_morph
+ &kp LEFT_SHIFT &kp RIGHT_SHIFT
+ >;
+ };
+ };
+};
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+};
+
diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot
new file mode 100644
index 0000000000..561f88a929
--- /dev/null
+++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot
@@ -0,0 +1,18 @@
+pressed: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x04
+reg implicit: Modifiers set to 0x04
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x06
+reg implicit: Modifiers set to 0x06
+mask mods: Modifiers set to 0x04
+pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x04
+released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x04
+unmask mods: Modifiers set to 0x06
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x04
+unreg implicit: Modifiers set to 0x04
+released: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap
new file mode 100644
index 0000000000..d5406e195a
--- /dev/null
+++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap
@@ -0,0 +1,15 @@
+#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_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot
new file mode 100644
index 0000000000..dcf2aae638
--- /dev/null
+++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot
@@ -0,0 +1,12 @@
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x02
+reg implicit: Modifiers set to 0x02
+mask mods: Modifiers set to 0x00
+pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x00
+released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x00
+unmask mods: Modifiers set to 0x02
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap
new file mode 100644
index 0000000000..7071e8cd39
--- /dev/null
+++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap
@@ -0,0 +1,45 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+&kscan {
+ events = <
+ /* Shift + tap &mod_morph --> expect B (but get Shift + B) */
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
+
+/ {
+ behaviors {
+ mod_morph: mod_morph {
+ compatible = "zmk,behavior-mod-morph";
+ label = "MOD_MORPH_TEST";
+ #binding-cells = <0>;
+ bindings = <&kp A>, <&lt 1 B>;
+ mods = <(MOD_LSFT|MOD_RSFT)>;
+ };
+
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LEFT_SHIFT &mod_morph
+ &kp C &none
+ >;
+ };
+
+ second_layer {
+ bindings = <
+ &trans &trans
+ &kp D &trans
+ >;
+ };
+ };
+};
diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot
new file mode 100644
index 0000000000..ba70ee9817
--- /dev/null
+++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot
@@ -0,0 +1,12 @@
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x02
+reg implicit: Modifiers set to 0x02
+mask mods: Modifiers set to 0x00
+pressed: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x00
+released: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x00
+unmask mods: Modifiers set to 0x02
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap
new file mode 100644
index 0000000000..96c2f270fe
--- /dev/null
+++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap
@@ -0,0 +1,47 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+&kscan {
+ events = <
+ /* Shift + hold &mod_morph --> expect and get D (no shift) */
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(0,1,200)
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
+
+/ {
+ behaviors {
+ mod_morph: mod_morph {
+ compatible = "zmk,behavior-mod-morph";
+ label = "MOD_MORPH_TEST";
+ #binding-cells = <0>;
+ bindings = <&kp A>, <&lt 1 B>;
+ mods = <(MOD_LSFT|MOD_RSFT)>;
+ };
+
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LEFT_SHIFT &mod_morph
+ &kp C &none
+ >;
+ };
+
+ second_layer {
+ bindings = <
+ &trans &trans
+ &kp D &trans
+ >;
+ };
+ };
+};
diff --git a/app/tests/mod-morph/3-unmasked-morph/events.patterns b/app/tests/mod-morph/3-unmasked-morph/events.patterns
new file mode 100644
index 0000000000..f1a41fcf2c
--- /dev/null
+++ b/app/tests/mod-morph/3-unmasked-morph/events.patterns
@@ -0,0 +1,8 @@
+s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p
+s/.*hid_listener_keycode_released.*keycode/released: keycode/p
+s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p
+s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p
+s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p
+s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p
+s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p
diff --git a/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot
new file mode 100644
index 0000000000..424242d599
--- /dev/null
+++ b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot
@@ -0,0 +1,12 @@
+pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+reg explicit: Modifiers set to 0x02
+reg implicit: Modifiers set to 0x02
+mask mods: Modifiers set to 0x02
+pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+reg implicit: Modifiers set to 0x02
+released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+unreg implicit: Modifiers set to 0x02
+unmask mods: Modifiers set to 0x02
+released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00
+unreg explicit: Modifiers set to 0x00
+unreg implicit: Modifiers set to 0x00
diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap
new file mode 100644
index 0000000000..a82d3ea724
--- /dev/null
+++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap
@@ -0,0 +1,37 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+/ {
+ behaviors {
+ mod_morph: mod_morph {
+ compatible = "zmk,behavior-mod-morph";
+ label = "MOD_MORPH_TEST";
+ #binding-cells = <0>;
+ bindings = <&kp A>, <&kp B>;
+ mods = <(MOD_LSFT|MOD_RSFT)>;
+ keep-mods = <(MOD_LSFT|MOD_RSFT)>; // no masking
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LEFT_ALT &mod_morph
+ &kp LEFT_SHIFT &kp RIGHT_SHIFT
+ >;
+ };
+ };
+};
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+};
diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi
new file mode 100644
index 0000000000..09720d8d03
--- /dev/null
+++ b/app/tests/mod-morph/behavior_keymap.dtsi
@@ -0,0 +1,23 @@
+/ {
+ behaviors {
+ mod_morph: mod_morph {
+ compatible = "zmk,behavior-mod-morph";
+ label = "MOD_MORPH_TEST";
+ #binding-cells = <0>;
+ bindings = <&kp A>, <&kp B>;
+ mods = <(MOD_LSFT|MOD_RSFT)>;
+ };
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LEFT_ALT &mod_morph
+ &kp LEFT_SHIFT &kp RIGHT_SHIFT
+ >;
+ };
+ };
+};