From a62f4496599d4a1880adc5f272f97f81be0586cb Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Sat, 1 Jul 2017 02:43:32 +0300
Subject: [PATCH] Add test for a combo key

---
 tests/basic/keymap.c     | 13 ++++++++-----
 tests/basic/keypress.cpp | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/tests/basic/keymap.c b/tests/basic/keymap.c
index a3e1aaf669..e3a60ccc45 100644
--- a/tests/basic/keymap.c
+++ b/tests/basic/keymap.c
@@ -18,12 +18,15 @@
 
 // Don't rearrange keys as existing tests might rely on the order
 // Col2, Row 0 has to be KC_NO, because tests rely on it
+
+#define COMBO1 RSFT(LCTL(KC_O))
+
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 	[0] = {
-		// 0    1      2      3        4        5        6      7      8      9
-	    {KC_A,  KC_B,  KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, KC_NO, KC_NO, KC_NO, KC_NO},
-	    {KC_NO, KC_NO, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO, KC_NO, KC_NO},
-	    {KC_NO, KC_NO, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO, KC_NO, KC_NO},
-	    {KC_C,  KC_D,  KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO, KC_NO, KC_NO},
+		// 0    1      2      3        4        5        6       7      8      9
+	    {KC_A,  KC_B,  KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, COMBO1, KC_NO, KC_NO, KC_NO},
+	    {KC_NO, KC_NO, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO,  KC_NO, KC_NO, KC_NO},
+	    {KC_NO, KC_NO, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO,  KC_NO, KC_NO, KC_NO},
+	    {KC_C,  KC_D,  KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO,  KC_NO, KC_NO, KC_NO},
 	},
 };
diff --git a/tests/basic/keypress.cpp b/tests/basic/keypress.cpp
index 4424e86965..2bb029d884 100644
--- a/tests/basic/keypress.cpp
+++ b/tests/basic/keypress.cpp
@@ -85,4 +85,40 @@ TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {
     release_key(3, 0);
     EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
     keyboard_task();
+}
+
+TEST_F(KeyPress, PressLeftShiftAndControl) {
+    TestDriver driver;
+    press_key(3, 0);
+    press_key(5, 0);
+    // Unfortunately modifiers are also processed in the wrong order
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
+    keyboard_task();
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_LCTRL)));
+    keyboard_task();
+}
+
+TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) {
+    TestDriver driver;
+    press_key(3, 0);
+    press_key(4, 0);
+    // Unfortunately modifiers are also processed in the wrong order
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
+    keyboard_task();
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_RSFT)));
+    keyboard_task();
+}
+
+TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) {
+    TestDriver driver;
+    press_key(6, 0);
+    // BUG: The press is split into two reports
+    // BUG: It reports RSFT instead of LSFT
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL)));
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL, KC_O)));
+    keyboard_task();
+    release_key(6, 0);
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL)));
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+    keyboard_task();
 }
\ No newline at end of file