test_pointing.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright 2024 Dasky (@daskygit)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "gtest/gtest.h"
  4. #include "mouse_report_util.hpp"
  5. #include "test_common.hpp"
  6. #include "test_pointing_device_driver.h"
  7. #include "mousekey.h"
  8. using testing::_;
  9. class Pointing : public TestFixture {};
  10. class PointingButtonsViaMousekeysParametrized : public ::testing::WithParamInterface<std::pair<KeymapKey, uint8_t>>, public Pointing {};
  11. TEST_F(Pointing, NoMovementOnInitFailure) {
  12. TestDriver driver;
  13. pointing_device_set_status(POINTING_DEVICE_STATUS_INIT_FAILED);
  14. pd_set_x(-50);
  15. pd_set_y(100);
  16. EXPECT_NO_MOUSE_REPORT(driver);
  17. run_one_scan_loop();
  18. pointing_device_set_status(POINTING_DEVICE_STATUS_SUCCESS);
  19. EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0));
  20. run_one_scan_loop();
  21. pd_clear_movement();
  22. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  23. run_one_scan_loop();
  24. VERIFY_AND_CLEAR(driver);
  25. }
  26. TEST_F(Pointing, SendMouseIsNotCalledWithNoInput) {
  27. TestDriver driver;
  28. EXPECT_NO_MOUSE_REPORT(driver);
  29. run_one_scan_loop();
  30. }
  31. TEST_F(Pointing, Xnegative) {
  32. TestDriver driver;
  33. pd_set_x(-10);
  34. EXPECT_MOUSE_REPORT(driver, (-10, 0, 0, 0, 0));
  35. run_one_scan_loop();
  36. pd_clear_movement();
  37. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  38. run_one_scan_loop();
  39. VERIFY_AND_CLEAR(driver);
  40. }
  41. TEST_F(Pointing, Xpositive) {
  42. TestDriver driver;
  43. pd_set_x(10);
  44. EXPECT_MOUSE_REPORT(driver, (10, 0, 0, 0, 0));
  45. run_one_scan_loop();
  46. pd_clear_movement();
  47. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  48. run_one_scan_loop();
  49. VERIFY_AND_CLEAR(driver);
  50. }
  51. TEST_F(Pointing, Ynegative) {
  52. TestDriver driver;
  53. pd_set_y(-20);
  54. EXPECT_MOUSE_REPORT(driver, (0, -20, 0, 0, 0));
  55. run_one_scan_loop();
  56. pd_clear_movement();
  57. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  58. run_one_scan_loop();
  59. VERIFY_AND_CLEAR(driver);
  60. }
  61. TEST_F(Pointing, Ypositive) {
  62. TestDriver driver;
  63. pd_set_y(20);
  64. EXPECT_MOUSE_REPORT(driver, (0, 20, 0, 0, 0));
  65. run_one_scan_loop();
  66. pd_clear_movement();
  67. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  68. run_one_scan_loop();
  69. VERIFY_AND_CLEAR(driver);
  70. }
  71. TEST_F(Pointing, XandY) {
  72. TestDriver driver;
  73. pd_set_x(-50);
  74. pd_set_y(100);
  75. EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0));
  76. run_one_scan_loop();
  77. pd_clear_movement();
  78. // EXPECT_EMPTY_MOUSE_REPORT(driver);
  79. run_one_scan_loop();
  80. VERIFY_AND_CLEAR(driver);
  81. }
  82. TEST_F(Pointing, CorrectButtonIsReportedWhenPressed) {
  83. TestDriver driver;
  84. EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
  85. pd_press_button(POINTING_DEVICE_BUTTON1);
  86. run_one_scan_loop();
  87. EXPECT_EMPTY_MOUSE_REPORT(driver);
  88. pd_release_button(POINTING_DEVICE_BUTTON1);
  89. run_one_scan_loop();
  90. EXPECT_NO_MOUSE_REPORT(driver);
  91. run_one_scan_loop();
  92. pd_clear_all_buttons();
  93. run_one_scan_loop();
  94. VERIFY_AND_CLEAR(driver);
  95. }
  96. TEST_F(Pointing, CorrectButtonIsReportedWhenKeyPressed) {
  97. TestDriver driver;
  98. auto key = KeymapKey(0, 0, 0, QK_MOUSE_BUTTON_1);
  99. set_keymap({key});
  100. EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
  101. key.press();
  102. run_one_scan_loop();
  103. EXPECT_EMPTY_MOUSE_REPORT(driver);
  104. key.release();
  105. run_one_scan_loop();
  106. EXPECT_NO_MOUSE_REPORT(driver);
  107. run_one_scan_loop();
  108. VERIFY_AND_CLEAR(driver);
  109. }
  110. TEST_P(PointingButtonsViaMousekeysParametrized, MouseKeysViaPointingDriver) {
  111. TestDriver driver;
  112. KeymapKey mouse_key = GetParam().first;
  113. uint8_t button_mask = GetParam().second;
  114. set_keymap({mouse_key});
  115. EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, button_mask));
  116. mouse_key.press();
  117. run_one_scan_loop();
  118. EXPECT_EMPTY_MOUSE_REPORT(driver);
  119. mouse_key.release();
  120. run_one_scan_loop();
  121. EXPECT_NO_MOUSE_REPORT(driver);
  122. run_one_scan_loop();
  123. VERIFY_AND_CLEAR(driver);
  124. }
  125. // clang-format off
  126. INSTANTIATE_TEST_CASE_P(
  127. ButtonsOneToEight,
  128. PointingButtonsViaMousekeysParametrized,
  129. ::testing::Values(
  130. // Key , Buttons Mask
  131. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_1}, 1),
  132. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_2}, 2),
  133. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_3}, 4),
  134. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_4}, 8),
  135. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_5}, 16),
  136. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_6}, 32),
  137. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_7}, 64),
  138. std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_8}, 128)
  139. ));
  140. // clang-format on