aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 358cbdb59..adacb379c 100644
--- a/tests/basic/keymap.c
+++ b/tests/basic/keymap.c
@@ -24,9 +24,20 @@
24const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 24const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
25 [0] = { 25 [0] = {
26 // 0 1 2 3 4 5 6 7 8 9 26 // 0 1 2 3 4 5 6 7 8 9
27 {KC_A, KC_B, KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, COMBO1, SFT_T(KC_P), KC_NO, KC_NO}, 27 {KC_A, KC_B, KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, COMBO1, SFT_T(KC_P), M(0), KC_NO},
28 {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, 28 {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO},
29 {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, 29 {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO},
30 {KC_C, KC_D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, 30 {KC_C, KC_D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO},
31 }, 31 },
32}; 32};
33
34const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
35 if (record->event.pressed) {
36 switch(id) {
37 case 0:
38 return MACRO(D(LSFT), T(H), U(LSFT), T(E), T(L), T(L), T(O), T(SPACE), W(100),
39 D(LSFT), T(W), U(LSFT), I(10), T(O), T(R), T(L), T(D), D(LSFT), T(1), U(LSFT), END);
40 }
41 }
42 return MACRO_NONE;
43};
diff --git a/tests/basic/test_macro.cpp b/tests/basic/test_macro.cpp
new file mode 100644
index 000000000..f1990bf6f
--- /dev/null
+++ b/tests/basic/test_macro.cpp
@@ -0,0 +1,97 @@
1/* Copyright 2017 Fred Sundvik
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "test_common.h"
18#include "time.h"
19
20using testing::InSequence;
21using testing::InvokeWithoutArgs;
22
23class Macro : public TestFixture {};
24
25#define AT_TIME(t) WillOnce(InvokeWithoutArgs([current_time]() {EXPECT_EQ(timer_elapsed32(current_time), t);}))
26
27TEST_F(Macro, PlayASimpleMacro) {
28 TestDriver driver;
29 InSequence s;
30 press_key(8, 0);
31 uint32_t current_time = timer_read32();
32 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
33 .AT_TIME(0);
34 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_H)))
35 .AT_TIME(0);
36 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
37 .AT_TIME(0);
38 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
39 .AT_TIME(0);
40 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E)))
41 .AT_TIME(0);
42 // The macro system could actually skip these empty keyboard reports
43 // it should be enough to just send a report with the next key down
44 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
45 .AT_TIME(0);
46 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
47 .AT_TIME(0);
48 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
49 .AT_TIME(0);
50 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
51 .AT_TIME(0);
52 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
53 .AT_TIME(0);
54 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_O)))
55 .AT_TIME(0);
56 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
57 .AT_TIME(0);
58 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_SPACE)))
59 .AT_TIME(0);
60 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
61 .AT_TIME(0);
62 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
63 .AT_TIME(100);
64 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_W)))
65 .AT_TIME(100);
66 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
67 .AT_TIME(100);
68 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
69 .AT_TIME(100);
70 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_O)))
71 // BUG: The timer should not really have advanced 10 ms here
72 .AT_TIME(110);
73 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
74 // BUG: The timer should not advance on both keydown and key-up
75 .AT_TIME(120);
76 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R)))
77 .AT_TIME(130);
78 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
79 .AT_TIME(140);
80 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L)))
81 .AT_TIME(150);
82 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
83 .AT_TIME(160);
84 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_D)))
85 .AT_TIME(170);
86 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
87 .AT_TIME(180);
88 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
89 .AT_TIME(190);
90 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_1)))
91 .AT_TIME(200);
92 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)))
93 .AT_TIME(210);
94 EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()))
95 .AT_TIME(220);
96 run_one_scan_loop();
97} \ No newline at end of file