mirror of
https://github.com/LizardByte/libvirtualhid.git
synced 2026-11-03 02:26:47 +09:00
137 lines
6.7 KiB
C++
137 lines
6.7 KiB
C++
/**
|
|
* @file tests/unit/test_macos_backend.cpp
|
|
* @brief Unit tests for macOS backend internals.
|
|
*/
|
|
|
|
// lib includes
|
|
#include <libvirtualhid/libvirtualhid.hpp>
|
|
|
|
// local includes
|
|
#include "fixtures/fixtures.hpp"
|
|
#include "fixtures/macos_backend_test_hooks.hpp"
|
|
|
|
// platform includes
|
|
#include <Carbon/Carbon.h>
|
|
|
|
/**
|
|
* @brief Test fixture for macOS backend internals.
|
|
*/
|
|
class MacosBackendTest: public MacOSTest {};
|
|
|
|
TEST_F(MacosBackendTest, TranslatesKeyboardKeys) {
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x08), kVK_Delete);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x09), kVK_Tab);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x0D), kVK_Return);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x1B), kVK_Escape);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x20), kVK_Space);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x21), kVK_PageUp);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x22), kVK_PageDown);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x25), kVK_LeftArrow);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x26), kVK_UpArrow);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x27), kVK_RightArrow);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x28), kVK_DownArrow);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x41), kVK_ANSI_A);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x5B), kVK_Command);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x5C), kVK_RightCommand);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0x6B), kVK_ANSI_KeypadPlus);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA0), kVK_Shift);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA1), kVK_RightShift);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA2), kVK_Control);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA3), kVK_RightControl);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA4), kVK_Option);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xA5), kVK_RightOption);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xBB), kVK_ANSI_Equal);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xBD), kVK_ANSI_Minus);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_key_code(0xDE), kVK_ANSI_Quote);
|
|
EXPECT_FALSE(lvh::detail::test::macos_backend_key_code(0x13).has_value());
|
|
EXPECT_FALSE(lvh::detail::test::macos_backend_key_code(0xFFFF).has_value());
|
|
}
|
|
|
|
TEST_F(MacosBackendTest, IdentifiesModifierKeys) {
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0x10));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0x11));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0x12));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0x5B));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0x5C));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA0));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA1));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA2));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA3));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA4));
|
|
EXPECT_TRUE(lvh::detail::test::macos_backend_is_modifier_key(0xA5));
|
|
EXPECT_FALSE(lvh::detail::test::macos_backend_is_modifier_key(0x41));
|
|
EXPECT_FALSE(lvh::detail::test::macos_backend_is_modifier_key(0x13));
|
|
}
|
|
|
|
TEST_F(MacosBackendTest, ConvertsScrollSettings) {
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_lines_per_detent(0.0), 1);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_lines_per_detent(0.3125), 5);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_lines_per_detent(1.0), 14);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_pixels(120, 10, 5), 50);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_pixels(-240, 10, 5), -100);
|
|
EXPECT_EQ(lvh::detail::test::macos_backend_scroll_pixels(120, 0, 0), 1);
|
|
}
|
|
|
|
TEST_F(MacosBackendTest, ConvertsAbsoluteMouseCoordinates) {
|
|
lvh::MouseEvent event {
|
|
.kind = lvh::MouseEventKind::absolute_motion,
|
|
.x = 40,
|
|
.y = 50,
|
|
.width = 200,
|
|
.height = 100,
|
|
};
|
|
|
|
auto location = lvh::detail::test::macos_backend_absolute_mouse_location(event, 10.0, 20.0, 400.0, 200.0);
|
|
EXPECT_DOUBLE_EQ(location.x, 90.0);
|
|
EXPECT_DOUBLE_EQ(location.y, 120.0);
|
|
|
|
event.x = 250;
|
|
event.y = -10;
|
|
location = lvh::detail::test::macos_backend_absolute_mouse_location(event, 10.0, 20.0, 400.0, 200.0);
|
|
EXPECT_DOUBLE_EQ(location.x, 410.0);
|
|
EXPECT_DOUBLE_EQ(location.y, 20.0);
|
|
|
|
event = {
|
|
.kind = lvh::MouseEventKind::absolute_motion,
|
|
.absolute_x = 0.25F,
|
|
.absolute_y = 0.75F,
|
|
.has_fractional_absolute_coordinates = true,
|
|
.width = 1,
|
|
.height = 1,
|
|
};
|
|
location = lvh::detail::test::macos_backend_absolute_mouse_location(event, 10.0, 20.0, 400.0, 200.0);
|
|
EXPECT_DOUBLE_EQ(location.x, 110.0);
|
|
EXPECT_DOUBLE_EQ(location.y, 170.0);
|
|
}
|
|
|
|
TEST_F(MacosBackendTest, ReportsCapabilitiesAndUnsupportedDevices) {
|
|
const auto result = lvh::detail::test::macos_backend_utilities();
|
|
|
|
EXPECT_EQ(result.capabilities.backend_name, "macos-coregraphics");
|
|
EXPECT_FALSE(result.capabilities.supports_virtual_hid);
|
|
EXPECT_FALSE(result.capabilities.supports_gamepad);
|
|
EXPECT_TRUE(result.capabilities.supports_keyboard);
|
|
EXPECT_TRUE(result.capabilities.supports_mouse);
|
|
EXPECT_FALSE(result.capabilities.supports_touchscreen);
|
|
EXPECT_FALSE(result.capabilities.supports_trackpad);
|
|
EXPECT_FALSE(result.capabilities.supports_pen_tablet);
|
|
EXPECT_FALSE(result.capabilities.supports_output_reports);
|
|
EXPECT_FALSE(result.capabilities.requires_installed_driver);
|
|
|
|
ASSERT_TRUE(result.keyboard_create_status.ok()) << result.keyboard_create_status.message();
|
|
EXPECT_EQ(result.keyboard_text_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
ASSERT_TRUE(result.keyboard_close_status.ok()) << result.keyboard_close_status.message();
|
|
EXPECT_EQ(result.keyboard_submit_after_close_status.code(), lvh::ErrorCode::device_closed);
|
|
EXPECT_EQ(result.keyboard_invalid_profile_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
|
|
ASSERT_TRUE(result.mouse_create_status.ok()) << result.mouse_create_status.message();
|
|
ASSERT_TRUE(result.mouse_close_status.ok()) << result.mouse_close_status.message();
|
|
EXPECT_EQ(result.mouse_submit_after_close_status.code(), lvh::ErrorCode::device_closed);
|
|
EXPECT_EQ(result.mouse_invalid_profile_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
|
|
EXPECT_EQ(result.gamepad_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
EXPECT_EQ(result.touchscreen_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
EXPECT_EQ(result.trackpad_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
EXPECT_EQ(result.pen_tablet_status.code(), lvh::ErrorCode::unsupported_profile);
|
|
}
|