summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Sundvik <fsundvik@gmail.com>2017-07-02 01:06:59 +0300
committerJack Humbert <jack.humb@gmail.com>2017-07-08 21:59:51 -0400
commite5780a6dc66bb21969594f1b446916e36cf69253 (patch)
treebe170b59b369f3a6c9f099df137f977908b01db7
parent4087d6da0d60f51735f6ec2c34e5fdabcf9c4447 (diff)
downloadqmk_firmware-e5780a6dc66bb21969594f1b446916e36cf69253.tar.gz
qmk_firmware-e5780a6dc66bb21969594f1b446916e36cf69253.zip
Add tests for macros
-rw-r--r--tests/basic/keymap.c13
-rw-r--r--tests/basic/test_macro.cpp97
2 files changed, 109 insertions, 1 deletions
diff --git a/tests/basic/keymap.c b/tests/basic/keymap.c
index 358cbdb599..adacb379ce 100644
--- a/tests/basic/keymap.c
+++ b/tests/basic/keymap.c
@@ -24,9 +24,20 @@
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, COMBO1, SFT_T(KC_P), KC_NO, KC_NO},
+ {KC_A, KC_B, KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, COMBO1, SFT_T(KC_P), M(0), 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},
},
};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+ if (record->event.pressed) {
+ switch(id) {
+ case 0:
+ return MACRO(D(LSFT), T(H), U(LSFT), T(E), T(L), T(L), T(O), T(SPACE), W(100),
+ D(LSFT), T(W), U(LSFT), I(10), T(O), T(R), T(L), T(D), D(LSFT), T(1), U(LSFT), END);
+ }
+ }
+ return MACRO_NONE;
+};
diff --git a/tests/basic/test_macro.cpp b/tests/basic/test_macro.cpp
new file mode 100644
index 0000000000..f1990bf6ff
--- /dev/null
+++ b/tests/basic/test_macro.cpp
@@ -0,0 +1,97 @@
+/* Copyright 2017 Fred Sundvik
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "test_common.h"
+#include "time.h"
+
+using testing::InSequence;
+using testing::InvokeWithoutArgs;
+
+class Macro : public TestFixture {};
+
+#define AT_TIME(t) WillOnce(InvokeWithoutArgs([current_time]() {EXPECT_EQ(timer_elapsed32(current_time), t);}))
+
+TEST_F(Macro, PlayASimpleMacro) {
+ TestDriver driver;
+ InSequence s;
+ press_key(8, 0);
+ uint32_t current_time = timer_read32();
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_H)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E)))
+ .AT_TIME(0);
+ // The macro system could actually skip these empty keyboard reports
+ // it should be enough to just send a report with the next key down
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_O)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_SPACE)))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(0);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(100);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_W)))
+ .AT_TIME(100);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(100);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(100);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_O)))
+ // BUG: The timer should not really have advanced 10 ms here
+ .AT_TIME(110);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ // BUG: The timer should not advance on both keydown and key-up
+ .AT_TIME(120);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R)))
+ .AT_TIME(130);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(140);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
+ .AT_TIME(150);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(160);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_D)))
+ .AT_TIME(170);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(180);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(190);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_1)))
+ .AT_TIME(200);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
+ .AT_TIME(210);
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
+ .AT_TIME(220);
+ run_one_scan_loop();
+} \ No newline at end of file