166 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2024 Dasky (@daskygit)
 | |
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #include "gtest/gtest.h"
 | |
| #include "mouse_report_util.hpp"
 | |
| #include "test_common.hpp"
 | |
| #include "test_pointing_device_driver.h"
 | |
| #include "mousekey.h"
 | |
| 
 | |
| using testing::_;
 | |
| 
 | |
| class Pointing : public TestFixture {};
 | |
| class PointingButtonsViaMousekeysParametrized : public ::testing::WithParamInterface<std::pair<KeymapKey, uint8_t>>, public Pointing {};
 | |
| 
 | |
| TEST_F(Pointing, SendMouseIsNotCalledWithNoInput) {
 | |
|     TestDriver driver;
 | |
|     EXPECT_NO_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, Xnegative) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     pd_set_x(-10);
 | |
|     EXPECT_MOUSE_REPORT(driver, (-10, 0, 0, 0, 0));
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_movement();
 | |
|     // EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, Xpositive) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     pd_set_x(10);
 | |
|     EXPECT_MOUSE_REPORT(driver, (10, 0, 0, 0, 0));
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_movement();
 | |
|     // EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, Ynegative) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     pd_set_y(-20);
 | |
|     EXPECT_MOUSE_REPORT(driver, (0, -20, 0, 0, 0));
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_movement();
 | |
|     // EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, Ypositive) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     pd_set_y(20);
 | |
|     EXPECT_MOUSE_REPORT(driver, (0, 20, 0, 0, 0));
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_movement();
 | |
|     // EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, XandY) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     pd_set_x(-50);
 | |
|     pd_set_y(100);
 | |
|     EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0));
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_movement();
 | |
|     // EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, CorrectButtonIsReportedWhenPressed) {
 | |
|     TestDriver driver;
 | |
| 
 | |
|     EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
 | |
|     pd_press_button(POINTING_DEVICE_BUTTON1);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     pd_release_button(POINTING_DEVICE_BUTTON1);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_NO_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     pd_clear_all_buttons();
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_F(Pointing, CorrectButtonIsReportedWhenKeyPressed) {
 | |
|     TestDriver driver;
 | |
|     auto       key = KeymapKey(0, 0, 0, KC_MS_BTN1);
 | |
|     set_keymap({key});
 | |
| 
 | |
|     EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
 | |
|     key.press();
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     key.release();
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_NO_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| 
 | |
| TEST_P(PointingButtonsViaMousekeysParametrized, MouseKeysViaPointingDriver) {
 | |
|     TestDriver driver;
 | |
|     KeymapKey  mouse_key   = GetParam().first;
 | |
|     uint8_t    button_mask = GetParam().second;
 | |
| 
 | |
|     set_keymap({mouse_key});
 | |
| 
 | |
|     EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, button_mask));
 | |
|     mouse_key.press();
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_EMPTY_MOUSE_REPORT(driver);
 | |
|     mouse_key.release();
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     EXPECT_NO_MOUSE_REPORT(driver);
 | |
|     run_one_scan_loop();
 | |
| 
 | |
|     VERIFY_AND_CLEAR(driver);
 | |
| }
 | |
| // clang-format off
 | |
| INSTANTIATE_TEST_CASE_P(
 | |
|     ButtonsOneToEight,
 | |
|     PointingButtonsViaMousekeysParametrized,
 | |
|     ::testing::Values(
 | |
|         //                                Key               , Buttons Mask
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_1}, 1),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_2}, 2),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_3}, 4),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_4}, 8),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_5}, 16),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_6}, 32),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_7}, 64),
 | |
|         std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_8}, 128)
 | |
|         ));
 | |
| // clang-format on
 | 
