Răsfoiți Sursa

Add simple modifier test

Fred Sundvik 8 ani în urmă
părinte
comite
cae7a9c3ec

+ 5 - 4
tests/basic/keymap.c

@@ -20,9 +20,10 @@
 // Col2, Row 0 has to be KC_NO, because tests rely on it
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 	[0] = {
-	    {KC_A,  KC_B,  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_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, 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},
 	},
 };

+ 17 - 0
tests/basic/keypress.cpp

@@ -68,4 +68,21 @@ TEST_F(KeyPress, ANonMappedKeyDoesNothing) {
     EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
     keyboard_task();
     keyboard_task();
+}
+
+TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {
+    TestDriver driver;
+    press_key(3, 0);
+    press_key(0, 0);
+    // Unfortunately modifiers are also processed in the wrong order
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));
+    keyboard_task();
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A, KC_LSFT)));
+    keyboard_task();
+    release_key(0, 0);
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
+    keyboard_task();
+    release_key(3, 0);
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+    keyboard_task();
 }

+ 10 - 4
tests/test_common/keyboard_report_util.cpp

@@ -47,19 +47,25 @@ bool operator==(const report_keyboard_t& lhs, const report_keyboard_t& rhs) {
 
 std::ostream& operator<<(std::ostream& stream, const report_keyboard_t& value) {
     stream << "Keyboard report:" << std::endl;
-    stream << "Mods: " << value.mods << std::endl;
+    stream << "Mods: " << (uint32_t)value.mods << std::endl;
+    stream << "Keys: ";
     // TODO: This should probably print friendly names for the keys
     for (uint32_t k: get_keys(value)) {
-        stream << k << std::endl;
+        stream << k << " ";
     }
+    stream << std::endl;
     return stream;
 }
 
 KeyboardReportMatcher::KeyboardReportMatcher(const std::vector<uint8_t>& keys) {
-    // TODO: Support modifiers
     memset(m_report.raw, 0, sizeof(m_report.raw));
     for (auto k: keys) {
-        add_key_to_report(&m_report, k);
+        if (IS_MOD(k)) {
+            m_report.mods |= MOD_BIT(k);
+        }
+        else {
+            add_key_to_report(&m_report, k);
+        }
     }
 }