Files
libvirtualhid/tests/unit/test_macos_backend.cpp

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);
}