qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

test_pointing.cpp (4665B)


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