logo

qmk_firmware

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

test_layer_lock.cpp (8529B)


  1. // Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "keycodes.h"
  4. #include "test_common.hpp"
  5. using testing::_;
  6. class LayerLock : public TestFixture {};
  7. TEST_F(LayerLock, LayerLockState) {
  8. TestDriver driver;
  9. KeymapKey key_a = KeymapKey(0, 0, 0, KC_A);
  10. KeymapKey key_b = KeymapKey(1, 0, 0, KC_B);
  11. KeymapKey key_c = KeymapKey(2, 0, 0, KC_C);
  12. KeymapKey key_d = KeymapKey(3, 0, 0, KC_C);
  13. set_keymap({key_a, key_b, key_c, key_d});
  14. EXPECT_FALSE(is_layer_locked(1));
  15. EXPECT_FALSE(is_layer_locked(2));
  16. EXPECT_FALSE(is_layer_locked(3));
  17. layer_lock_invert(1); // Layer 1: unlocked -> locked
  18. layer_lock_on(2); // Layer 2: unlocked -> locked
  19. layer_lock_off(3); // Layer 3: stays unlocked
  20. // Layers 1 and 2 are now on.
  21. EXPECT_TRUE(layer_state_is(1));
  22. EXPECT_TRUE(layer_state_is(2));
  23. // Layers 1 and 2 are now locked.
  24. EXPECT_TRUE(is_layer_locked(1));
  25. EXPECT_TRUE(is_layer_locked(2));
  26. EXPECT_FALSE(is_layer_locked(3));
  27. layer_lock_invert(1); // Layer 1: locked -> unlocked
  28. layer_lock_on(2); // Layer 2: stays locked
  29. layer_lock_on(3); // Layer 3: unlocked -> locked
  30. EXPECT_FALSE(layer_state_is(1));
  31. EXPECT_TRUE(layer_state_is(2));
  32. EXPECT_TRUE(layer_state_is(3));
  33. EXPECT_FALSE(is_layer_locked(1));
  34. EXPECT_TRUE(is_layer_locked(2));
  35. EXPECT_TRUE(is_layer_locked(3));
  36. layer_lock_invert(1); // Layer 1: unlocked -> locked
  37. layer_lock_off(2); // Layer 2: locked -> unlocked
  38. EXPECT_TRUE(layer_state_is(1));
  39. EXPECT_FALSE(layer_state_is(2));
  40. EXPECT_TRUE(layer_state_is(3));
  41. EXPECT_TRUE(is_layer_locked(1));
  42. EXPECT_FALSE(is_layer_locked(2));
  43. EXPECT_TRUE(is_layer_locked(3));
  44. layer_lock_all_off(); // Layers 1 and 3: locked -> unlocked
  45. EXPECT_FALSE(layer_state_is(1));
  46. EXPECT_FALSE(layer_state_is(2));
  47. EXPECT_FALSE(layer_state_is(3));
  48. EXPECT_FALSE(is_layer_locked(1));
  49. EXPECT_FALSE(is_layer_locked(2));
  50. EXPECT_FALSE(is_layer_locked(3));
  51. }
  52. TEST_F(LayerLock, LayerLockMomentaryTest) {
  53. TestDriver driver;
  54. KeymapKey key_layer = KeymapKey(0, 0, 0, MO(1));
  55. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  56. KeymapKey key_trns = KeymapKey(1, 0, 0, KC_TRNS);
  57. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  58. set_keymap({key_layer, key_a, key_trns, key_ll});
  59. EXPECT_NO_REPORT(driver);
  60. key_layer.press();
  61. run_one_scan_loop();
  62. EXPECT_TRUE(layer_state_is(1));
  63. EXPECT_FALSE(is_layer_locked(1));
  64. VERIFY_AND_CLEAR(driver);
  65. EXPECT_NO_REPORT(driver);
  66. tap_key(key_ll);
  67. EXPECT_TRUE(layer_state_is(1));
  68. EXPECT_TRUE(is_layer_locked(1));
  69. VERIFY_AND_CLEAR(driver);
  70. EXPECT_NO_REPORT(driver);
  71. key_layer.release();
  72. run_one_scan_loop();
  73. EXPECT_TRUE(layer_state_is(1));
  74. EXPECT_TRUE(is_layer_locked(1));
  75. VERIFY_AND_CLEAR(driver);
  76. // Pressing Layer Lock again unlocks the lock.
  77. EXPECT_NO_REPORT(driver);
  78. key_ll.press();
  79. run_one_scan_loop();
  80. EXPECT_FALSE(layer_state_is(1));
  81. EXPECT_FALSE(is_layer_locked(1));
  82. VERIFY_AND_CLEAR(driver);
  83. }
  84. TEST_F(LayerLock, LayerLockLayerTapTest) {
  85. TestDriver driver;
  86. KeymapKey key_layer = KeymapKey(0, 0, 0, LT(1, KC_B));
  87. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  88. KeymapKey key_trns = KeymapKey(1, 0, 0, KC_TRNS);
  89. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  90. set_keymap({key_layer, key_a, key_trns, key_ll});
  91. EXPECT_NO_REPORT(driver);
  92. key_layer.press();
  93. idle_for(TAPPING_TERM);
  94. run_one_scan_loop();
  95. EXPECT_TRUE(layer_state_is(1));
  96. VERIFY_AND_CLEAR(driver);
  97. EXPECT_NO_REPORT(driver);
  98. tap_key(key_ll);
  99. EXPECT_TRUE(layer_state_is(1));
  100. EXPECT_TRUE(is_layer_locked(1));
  101. VERIFY_AND_CLEAR(driver);
  102. // Pressing Layer Lock again unlocks the lock.
  103. EXPECT_NO_REPORT(driver);
  104. key_ll.press();
  105. run_one_scan_loop();
  106. EXPECT_FALSE(layer_state_is(1));
  107. EXPECT_FALSE(is_layer_locked(1));
  108. VERIFY_AND_CLEAR(driver);
  109. }
  110. TEST_F(LayerLock, LayerLockOneshotTapTest) {
  111. TestDriver driver;
  112. KeymapKey key_layer = KeymapKey(0, 0, 0, OSL(1));
  113. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  114. KeymapKey key_trns = KeymapKey(1, 0, 0, KC_TRNS);
  115. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  116. set_keymap({key_layer, key_a, key_trns, key_ll});
  117. EXPECT_NO_REPORT(driver);
  118. tap_key(key_layer);
  119. run_one_scan_loop();
  120. EXPECT_TRUE(layer_state_is(1));
  121. VERIFY_AND_CLEAR(driver);
  122. EXPECT_NO_REPORT(driver);
  123. tap_key(key_ll);
  124. run_one_scan_loop();
  125. EXPECT_TRUE(layer_state_is(1));
  126. EXPECT_TRUE(is_layer_locked(1));
  127. VERIFY_AND_CLEAR(driver);
  128. // Pressing Layer Lock again unlocks the lock.
  129. EXPECT_NO_REPORT(driver);
  130. key_ll.press();
  131. run_one_scan_loop();
  132. EXPECT_FALSE(layer_state_is(1));
  133. EXPECT_FALSE(is_layer_locked(1));
  134. VERIFY_AND_CLEAR(driver);
  135. }
  136. TEST_F(LayerLock, LayerLockOneshotHoldTest) {
  137. TestDriver driver;
  138. KeymapKey key_layer = KeymapKey(0, 0, 0, OSL(1));
  139. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  140. KeymapKey key_trns = KeymapKey(1, 0, 0, KC_TRNS);
  141. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  142. set_keymap({key_layer, key_a, key_trns, key_ll});
  143. EXPECT_NO_REPORT(driver);
  144. key_layer.press();
  145. idle_for(TAPPING_TERM);
  146. run_one_scan_loop();
  147. EXPECT_TRUE(layer_state_is(1));
  148. VERIFY_AND_CLEAR(driver);
  149. EXPECT_NO_REPORT(driver);
  150. tap_key(key_ll);
  151. run_one_scan_loop();
  152. EXPECT_TRUE(layer_state_is(1));
  153. VERIFY_AND_CLEAR(driver);
  154. EXPECT_NO_REPORT(driver);
  155. key_layer.release();
  156. run_one_scan_loop();
  157. EXPECT_TRUE(layer_state_is(1));
  158. EXPECT_TRUE(is_layer_locked(1));
  159. VERIFY_AND_CLEAR(driver);
  160. // Pressing Layer Lock again unlocks the lock.
  161. EXPECT_NO_REPORT(driver);
  162. key_ll.press();
  163. run_one_scan_loop();
  164. EXPECT_FALSE(layer_state_is(1));
  165. EXPECT_FALSE(is_layer_locked(1));
  166. VERIFY_AND_CLEAR(driver);
  167. }
  168. TEST_F(LayerLock, LayerLockTimeoutTest) {
  169. TestDriver driver;
  170. KeymapKey key_layer = KeymapKey(0, 0, 0, MO(1));
  171. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  172. KeymapKey key_trns = KeymapKey(1, 0, 0, KC_TRNS);
  173. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  174. set_keymap({key_layer, key_a, key_trns, key_ll});
  175. EXPECT_NO_REPORT(driver);
  176. key_layer.press();
  177. run_one_scan_loop();
  178. EXPECT_TRUE(layer_state_is(1));
  179. VERIFY_AND_CLEAR(driver);
  180. EXPECT_NO_REPORT(driver);
  181. tap_key(key_ll);
  182. EXPECT_TRUE(layer_state_is(1));
  183. VERIFY_AND_CLEAR(driver);
  184. EXPECT_NO_REPORT(driver);
  185. key_layer.release();
  186. run_one_scan_loop();
  187. EXPECT_TRUE(layer_state_is(1));
  188. EXPECT_TRUE(is_layer_locked(1));
  189. VERIFY_AND_CLEAR(driver);
  190. EXPECT_NO_REPORT(driver);
  191. idle_for(LAYER_LOCK_IDLE_TIMEOUT);
  192. run_one_scan_loop();
  193. EXPECT_FALSE(layer_state_is(1));
  194. EXPECT_FALSE(is_layer_locked(1));
  195. VERIFY_AND_CLEAR(driver);
  196. }
  197. TEST_F(LayerLock, ToKeyOverridesLayerLock) {
  198. TestDriver driver;
  199. KeymapKey key_layer = KeymapKey(0, 0, 0, MO(1));
  200. KeymapKey key_to0 = KeymapKey(1, 0, 0, TO(0));
  201. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  202. set_keymap({key_layer, key_to0, key_ll});
  203. EXPECT_NO_REPORT(driver);
  204. layer_lock_on(1);
  205. run_one_scan_loop();
  206. EXPECT_TRUE(layer_state_is(1));
  207. EXPECT_TRUE(is_layer_locked(1));
  208. VERIFY_AND_CLEAR(driver);
  209. EXPECT_NO_REPORT(driver);
  210. tap_key(key_to0); // TO(0) overrides Layer Lock and unlocks layer 1.
  211. EXPECT_FALSE(layer_state_is(1));
  212. EXPECT_FALSE(is_layer_locked(1));
  213. VERIFY_AND_CLEAR(driver);
  214. }
  215. TEST_F(LayerLock, LayerClearOverridesLayerLock) {
  216. TestDriver driver;
  217. KeymapKey key_layer = KeymapKey(0, 0, 0, MO(1));
  218. KeymapKey key_a = KeymapKey(0, 1, 0, KC_A);
  219. KeymapKey key_ll = KeymapKey(1, 1, 0, QK_LAYER_LOCK);
  220. set_keymap({key_layer, key_a, key_ll});
  221. EXPECT_NO_REPORT(driver);
  222. layer_lock_on(1);
  223. run_one_scan_loop();
  224. EXPECT_TRUE(layer_state_is(1));
  225. EXPECT_TRUE(is_layer_locked(1));
  226. VERIFY_AND_CLEAR(driver);
  227. EXPECT_REPORT(driver, (KC_A));
  228. layer_clear(); // layer_clear() overrides Layer Lock and unlocks layer 1.
  229. key_a.press();
  230. run_one_scan_loop();
  231. EXPECT_FALSE(layer_state_is(1));
  232. EXPECT_FALSE(is_layer_locked(1));
  233. VERIFY_AND_CLEAR(driver);
  234. }