You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

413 lines
14 KiB

  1. /* Copyright 2017 Colin T.A. Gray
  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. #include "gtest/gtest.h"
  17. #include "keyboard_report_util.hpp"
  18. #include "test_common.hpp"
  19. using testing::_;
  20. using testing::InSequence;
  21. class ActionLayer : public TestFixture {};
  22. TEST_F(ActionLayer, LayerStateDBG) {
  23. TestDriver driver;
  24. layer_state_set(0);
  25. testing::Mock::VerifyAndClearExpectations(&driver);
  26. }
  27. TEST_F(ActionLayer, LayerStateSet) {
  28. TestDriver driver;
  29. layer_state_set(0);
  30. EXPECT_EQ(layer_state, 0);
  31. layer_state_set(0b001100);
  32. EXPECT_EQ(layer_state, 0b001100);
  33. testing::Mock::VerifyAndClearExpectations(&driver);
  34. }
  35. TEST_F(ActionLayer, LayerStateIs) {
  36. TestDriver driver;
  37. layer_state_set(0);
  38. EXPECT_EQ(layer_state_is(0), true);
  39. EXPECT_EQ(layer_state_is(1), false);
  40. layer_state_set(1);
  41. EXPECT_EQ(layer_state_is(0), true);
  42. EXPECT_EQ(layer_state_is(1), false);
  43. layer_state_set(2);
  44. EXPECT_EQ(layer_state_is(0), false);
  45. EXPECT_EQ(layer_state_is(1), true);
  46. EXPECT_EQ(layer_state_is(2), false);
  47. testing::Mock::VerifyAndClearExpectations(&driver);
  48. }
  49. TEST_F(ActionLayer, LayerStateCmp) {
  50. TestDriver driver;
  51. uint32_t prev_layer;
  52. prev_layer = 0;
  53. EXPECT_EQ(layer_state_cmp(prev_layer, 0), true);
  54. EXPECT_EQ(layer_state_cmp(prev_layer, 1), false);
  55. prev_layer = 1;
  56. EXPECT_EQ(layer_state_cmp(prev_layer, 0), true);
  57. EXPECT_EQ(layer_state_cmp(prev_layer, 1), false);
  58. prev_layer = 2;
  59. EXPECT_EQ(layer_state_cmp(prev_layer, 0), false);
  60. EXPECT_EQ(layer_state_cmp(prev_layer, 1), true);
  61. EXPECT_EQ(layer_state_cmp(prev_layer, 2), false);
  62. testing::Mock::VerifyAndClearExpectations(&driver);
  63. }
  64. TEST_F(ActionLayer, LayerClear) {
  65. TestDriver driver;
  66. layer_clear();
  67. EXPECT_EQ(layer_state, 0);
  68. testing::Mock::VerifyAndClearExpectations(&driver);
  69. }
  70. TEST_F(ActionLayer, LayerMove) {
  71. TestDriver driver;
  72. layer_move(0);
  73. EXPECT_EQ(layer_state, 1);
  74. layer_move(3);
  75. EXPECT_EQ(layer_state, 0b1000);
  76. testing::Mock::VerifyAndClearExpectations(&driver);
  77. }
  78. TEST_F(ActionLayer, LayerOn) {
  79. TestDriver driver;
  80. layer_clear();
  81. layer_on(1);
  82. layer_on(3);
  83. layer_on(3);
  84. EXPECT_EQ(layer_state, 0b1010);
  85. testing::Mock::VerifyAndClearExpectations(&driver);
  86. }
  87. TEST_F(ActionLayer, LayerOff) {
  88. TestDriver driver;
  89. layer_clear();
  90. layer_on(1);
  91. layer_on(3);
  92. layer_off(3);
  93. layer_off(2);
  94. EXPECT_EQ(layer_state, 0b0010);
  95. testing::Mock::VerifyAndClearExpectations(&driver);
  96. }
  97. TEST_F(ActionLayer, MomentaryLayerDoesNothing) {
  98. TestDriver driver;
  99. KeymapKey layer_key = KeymapKey{0, 0, 0, MO(1)};
  100. set_keymap({layer_key});
  101. /* Press and release MO, nothing should happen. */
  102. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  103. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  104. layer_key.press();
  105. run_one_scan_loop();
  106. testing::Mock::VerifyAndClearExpectations(&driver);
  107. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  108. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  109. layer_key.release();
  110. run_one_scan_loop();
  111. testing::Mock::VerifyAndClearExpectations(&driver);
  112. }
  113. TEST_F(ActionLayer, MomentaryLayerWithKeypress) {
  114. TestDriver driver;
  115. KeymapKey layer_key = KeymapKey{0, 0, 0, MO(1)};
  116. /* These keys must have the same position in the matrix, only the layer is different. */
  117. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  118. set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
  119. /* Press MO. */
  120. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  121. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  122. layer_key.press();
  123. run_one_scan_loop();
  124. EXPECT_TRUE(layer_state_is(1));
  125. testing::Mock::VerifyAndClearExpectations(&driver);
  126. /* Press key on layer 1 */
  127. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B))).Times(1);
  128. regular_key.press();
  129. run_one_scan_loop();
  130. EXPECT_TRUE(layer_state_is(1));
  131. testing::Mock::VerifyAndClearExpectations(&driver);
  132. /* Release key on layer 1 */
  133. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  134. regular_key.release();
  135. run_one_scan_loop();
  136. EXPECT_TRUE(layer_state_is(1));
  137. testing::Mock::VerifyAndClearExpectations(&driver);
  138. /* Release MO */
  139. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  140. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  141. layer_key.release();
  142. run_one_scan_loop();
  143. EXPECT_TRUE(layer_state_is(0));
  144. testing::Mock::VerifyAndClearExpectations(&driver);
  145. }
  146. TEST_F(ActionLayer, ToggleLayerDoesNothing) {
  147. GTEST_SKIP() << "TODO: Toggle layer does not activate the expected layer on key press but on release.";
  148. TestDriver driver;
  149. KeymapKey layer_key = KeymapKey{0, 0, 0, TG(1)};
  150. set_keymap({layer_key});
  151. /* Press TG. Layer state should not change as it's applied on release. */
  152. EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
  153. layer_key.press();
  154. run_one_scan_loop();
  155. EXPECT_TRUE(layer_state_is(1));
  156. testing::Mock::VerifyAndClearExpectations(&driver);
  157. /* Release TG. */
  158. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  159. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  160. layer_key.release();
  161. run_one_scan_loop();
  162. EXPECT_TRUE(layer_state_is(1));
  163. testing::Mock::VerifyAndClearExpectations(&driver);
  164. }
  165. TEST_F(ActionLayer, ToggleLayerUpAndDown) {
  166. GTEST_SKIP() << "TODO: Toggle layer does not activate the expected layer on key press but on release.";
  167. TestDriver driver;
  168. KeymapKey toggle_layer_1_on_layer_0 = KeymapKey{0, 0, 0, TG(1)};
  169. KeymapKey toggle_layer_0_on_layer_1 = KeymapKey{1, 1, 0, TG(0)};
  170. set_keymap({toggle_layer_1_on_layer_0, toggle_layer_0_on_layer_1});
  171. /* Toggle Layer 1. */
  172. EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
  173. toggle_layer_1_on_layer_0.press();
  174. run_one_scan_loop();
  175. EXPECT_TRUE(layer_state_is(1));
  176. testing::Mock::VerifyAndClearExpectations(&driver);
  177. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  178. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  179. toggle_layer_1_on_layer_0.release();
  180. run_one_scan_loop();
  181. EXPECT_TRUE(layer_state_is(1));
  182. testing::Mock::VerifyAndClearExpectations(&driver);
  183. /* Toggle Layer 0. */
  184. EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
  185. toggle_layer_0_on_layer_1.press();
  186. run_one_scan_loop();
  187. EXPECT_TRUE(layer_state_is(0));
  188. testing::Mock::VerifyAndClearExpectations(&driver);
  189. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  190. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  191. toggle_layer_0_on_layer_1.release();
  192. run_one_scan_loop();
  193. EXPECT_TRUE(layer_state_is(0));
  194. testing::Mock::VerifyAndClearExpectations(&driver);
  195. }
  196. TEST_F(ActionLayer, LayerTapToggleDoesNothing) {
  197. GTEST_SKIP() << "TODO: Tap toggle layer does not activate the expected layer on key press.";
  198. TestDriver driver;
  199. KeymapKey layer_key = KeymapKey{0, 0, 0, TT(1)};
  200. set_keymap({layer_key});
  201. /* Press and release TT. */
  202. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  203. layer_key.press();
  204. run_one_scan_loop();
  205. EXPECT_TRUE(layer_state_is(1));
  206. testing::Mock::VerifyAndClearExpectations(&driver);
  207. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  208. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2);
  209. layer_key.release();
  210. run_one_scan_loop();
  211. EXPECT_TRUE(layer_state_is(0));
  212. testing::Mock::VerifyAndClearExpectations(&driver);
  213. }
  214. TEST_F(ActionLayer, LayerTapToggleWithKeypress) {
  215. GTEST_SKIP() << "TODO: Tap toggle layer does not activate the expected layer on key press.";
  216. TestDriver driver;
  217. KeymapKey layer_key = KeymapKey{0, 0, 0, TT(1)};
  218. /* These keys must have the same position in the matrix, only the layer is different. */
  219. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  220. set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
  221. /* Press TT. */
  222. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  223. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  224. layer_key.press();
  225. run_one_scan_loop();
  226. EXPECT_TRUE(layer_state_is(1));
  227. testing::Mock::VerifyAndClearExpectations(&driver);
  228. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B))).Times(1);
  229. regular_key.press();
  230. run_one_scan_loop();
  231. EXPECT_TRUE(layer_state_is(1));
  232. testing::Mock::VerifyAndClearExpectations(&driver);
  233. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  234. regular_key.release();
  235. run_one_scan_loop();
  236. EXPECT_TRUE(layer_state_is(1));
  237. testing::Mock::VerifyAndClearExpectations(&driver);
  238. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  239. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  240. layer_key.release();
  241. run_one_scan_loop();
  242. EXPECT_TRUE(layer_state_is(0));
  243. testing::Mock::VerifyAndClearExpectations(&driver);
  244. }
  245. TEST_F(ActionLayer, LayerTapToggleWithToggleWithKeypress) {
  246. GTEST_SKIP() << "TODO: Tap toggle layer does not activate the expected layer on key press.";
  247. TestDriver driver;
  248. KeymapKey layer_key = KeymapKey{0, 0, 0, TT(1)};
  249. /* These keys must have the same position in the matrix, only the layer is different. */
  250. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  251. set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
  252. /* Tap TT five times . */
  253. /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
  254. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(9);
  255. layer_key.press();
  256. run_one_scan_loop();
  257. EXPECT_TRUE(layer_state_is(1));
  258. layer_key.release();
  259. run_one_scan_loop();
  260. EXPECT_TRUE(layer_state_is(0));
  261. layer_key.press();
  262. run_one_scan_loop();
  263. EXPECT_TRUE(layer_state_is(1));
  264. layer_key.release();
  265. run_one_scan_loop();
  266. EXPECT_TRUE(layer_state_is(0));
  267. layer_key.press();
  268. run_one_scan_loop();
  269. EXPECT_TRUE(layer_state_is(1));
  270. layer_key.release();
  271. run_one_scan_loop();
  272. EXPECT_TRUE(layer_state_is(0));
  273. layer_key.press();
  274. run_one_scan_loop();
  275. EXPECT_TRUE(layer_state_is(1));
  276. layer_key.release();
  277. run_one_scan_loop();
  278. EXPECT_TRUE(layer_state_is(0));
  279. layer_key.press();
  280. run_one_scan_loop();
  281. EXPECT_TRUE(layer_state_is(1));
  282. layer_key.release();
  283. run_one_scan_loop();
  284. EXPECT_TRUE(layer_state_is(1));
  285. testing::Mock::VerifyAndClearExpectations(&driver);
  286. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B))).Times(1);
  287. regular_key.press();
  288. run_one_scan_loop();
  289. EXPECT_TRUE(layer_state_is(1));
  290. testing::Mock::VerifyAndClearExpectations(&driver);
  291. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  292. regular_key.release();
  293. run_one_scan_loop();
  294. EXPECT_TRUE(layer_state_is(1));
  295. testing::Mock::VerifyAndClearExpectations(&driver);
  296. }
  297. TEST_F(ActionLayer, LayerTapReleasedBeforeKeypressReleaseWithModifiers) {
  298. GTEST_SKIP() << "TODO: Modifiers are erroneously discarded on layer changes, although a key that introduced the modifier is still held.";
  299. TestDriver driver;
  300. InSequence s;
  301. KeymapKey layer_0_key_0 = KeymapKey{0, 0, 0, LT(1, KC_T)};
  302. KeymapKey layer_1_key_1 = KeymapKey{1, 1, 0, RALT(KC_9)};
  303. set_keymap({layer_0_key_0, layer_1_key_1});
  304. /* Press layer tap and wait for tapping term to switch to layer 1 */
  305. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  306. layer_0_key_0.press();
  307. idle_for(TAPPING_TERM);
  308. EXPECT_TRUE(layer_state_is(0));
  309. testing::Mock::VerifyAndClearExpectations(&driver);
  310. /* Press key with layer 1 mapping, result basically expected
  311. * altough more reports are send then necessary. */
  312. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RALT))).Times(1);
  313. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RALT, KC_9))).Times(1);
  314. layer_1_key_1.press();
  315. run_one_scan_loop();
  316. EXPECT_TRUE(layer_state_is(1));
  317. testing::Mock::VerifyAndClearExpectations(&driver);
  318. /* Release layer tap key, no report is send because key is still held. */
  319. EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
  320. layer_0_key_0.release();
  321. run_one_scan_loop();
  322. EXPECT_TRUE(layer_state_is(0));
  323. testing::Mock::VerifyAndClearExpectations(&driver);
  324. /* Unregister keycode and modifier. */
  325. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RALT))).Times(1);
  326. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
  327. layer_1_key_1.release();
  328. run_one_scan_loop();
  329. EXPECT_TRUE(layer_state_is(0));
  330. testing::Mock::VerifyAndClearExpectations(&driver);
  331. }