summaryrefslogtreecommitdiff
path: root/app/tests/modifiers
diff options
context:
space:
mode:
Diffstat (limited to 'app/tests/modifiers')
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns4
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot17
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap27
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns4
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot9
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap25
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns4
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot18
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap27
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns4
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot18
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap28
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns4
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap27
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending9
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns4
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap27
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns4
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot13
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap27
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns4
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot13
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap27
25 files changed, 360 insertions, 0 deletions
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
new file mode 100644
index 0000000..6218e65
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
@@ -0,0 +1,17 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 2
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 1
+unreg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap
new file mode 100644
index 0000000..6150094
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LCTL &kp LCTL
+ &kp LSFT &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
new file mode 100644
index 0000000..4232428
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
@@ -0,0 +1,9 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap
new file mode 100644
index 0000000..3324584
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap
@@ -0,0 +1,25 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LCTL &kp LCTL
+ &kp LSFT &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
new file mode 100644
index 0000000..60d829a
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
@@ -0,0 +1,18 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+reg: Modifier 1 count 1
+reg: Modifiers set to 0x03
+mods: Modifiers set to 0x03
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x02
+mods: Modifiers set to 0x02
+released: usage_page 0x07 keycode 0xe1 mods 0x00
+unreg: Modifier 1 count: 0
+unreg: Modifier 1 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap
new file mode 100644
index 0000000..b6f9631
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LCTL &kp LCTL
+ &kp LSFT &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
new file mode 100644
index 0000000..b4755e5
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
@@ -0,0 +1,18 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+reg: Modifier 1 count 1
+reg: Modifiers set to 0x03
+mods: Modifiers set to 0x03
+released: usage_page 0x07 keycode 0xe1 mods 0x00
+unreg: Modifier 1 count: 0
+unreg: Modifier 1 released
+unreg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap
new file mode 100644
index 0000000..3fedad2
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap
@@ -0,0 +1,28 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&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)
+
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LCTL &kp LCTL
+ &kp LSFT &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
new file mode 100644
index 0000000..61dd271
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
@@ -0,0 +1,8 @@
+pressed: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x02
+pressed: usage_page 0x07 keycode 0x04 mods 0x01
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0x04 mods 0x01
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap
new file mode 100644
index 0000000..c603c00
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LC(A) &kp LS(B)
+ &kp LCTL &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending
new file mode 100644
index 0000000..3f49005
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending
@@ -0,0 +1,9 @@
+This test fails because the hid_listener_keycode_released function
+releases implicit modifiers always, even if they were not set by the
+key that's going up. Also see the comment in that function:
+
+ If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
+ prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
+ Solving this would require keeping track of which key's implicit modifiers are currently
+ active and only releasing modifiers at that time.
+
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
new file mode 100644
index 0000000..e8a231f
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
@@ -0,0 +1,8 @@
+pressed: usage_page 0x07 keycode 0x04 mods 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x02
+released: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x00
+released: usage_page 0x07 keycode 0x04 mods 0x01
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap
new file mode 100644
index 0000000..109d60e
--- /dev/null
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(0,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_RELEASE(0,0,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LC(A) &kp LS(B)
+ &none &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
new file mode 100644
index 0000000..40c5841
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
@@ -0,0 +1,13 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x03
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
+released: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap
new file mode 100644
index 0000000..d381e4b
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&kscan {
+ events = <
+ ZMK_MOCK_PRESS(1,0,10)
+ ZMK_MOCK_PRESS(0,1,10)
+ ZMK_MOCK_RELEASE(1,0,10)
+ ZMK_MOCK_RELEASE(0,1,10)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LC(A) &kp LS(B)
+ &kp LCTL &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns
@@ -0,0 +1,4 @@
+s/.*hid_listener_keycode_//p
+s/.*hid_register_mod/reg/p
+s/.*hid_unregister_mod/unreg/p
+s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
new file mode 100644
index 0000000..5df571b
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
@@ -0,0 +1,13 @@
+pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+mods: Modifiers set to 0x01
+pressed: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x03
+released: usage_page 0x07 keycode 0x05 mods 0x02
+mods: Modifiers set to 0x01
+released: usage_page 0x07 keycode 0xe0 mods 0x00
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap
new file mode 100644
index 0000000..b47b5f7
--- /dev/null
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap
@@ -0,0 +1,27 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+
+&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)
+ >;
+};
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp LC(A) &kp LS(B)
+ &kp LCTL &none
+ >;
+ };
+ };
+};