logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

test_action_layer.cpp (12809B)


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