// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_PROTOCOL_TEST_EVENT_MATCHERS_H_ #define REMOTING_PROTOCOL_TEST_EVENT_MATCHERS_H_ #include #include "remoting/proto/event.pb.h" #include "testing/gmock/include/gmock/gmock.h" // This file contains matchers for protocol events. namespace remoting { namespace protocol { namespace test { MATCHER_P2(EqualsKeyEvent, usb_keycode, pressed, "") { return arg.usb_keycode() == static_cast(usb_keycode) && arg.pressed() == pressed; } MATCHER_P2(EqualsKeyEventWithCapsLock, usb_keycode, pressed, "") { return arg.usb_keycode() == static_cast(usb_keycode) && arg.pressed() == pressed && arg.lock_states() == KeyEvent::LOCK_STATES_CAPSLOCK; } MATCHER_P2(EqualsKeyEventWithNumLock, usb_keycode, pressed, "") { return arg.usb_keycode() == static_cast(usb_keycode) && arg.pressed() == pressed && arg.lock_states() == KeyEvent::LOCK_STATES_NUMLOCK; } MATCHER_P2(EqualsKeyEventWithoutLockStates, usb_keycode, pressed, "") { return arg.usb_keycode() == static_cast(usb_keycode) && arg.pressed() == pressed && !arg.has_lock_states(); } MATCHER_P(EqualsTextEvent, text, "") { return arg.text() == text; } MATCHER_P2(EqualsMouseMoveEvent, x, y, "") { return arg.x() == x && arg.y() == y; } MATCHER_P2(EqualsMouseButtonEvent, button, button_down, "") { return arg.button() == button && arg.button_down() == button_down; } MATCHER_P4(EqualsMouseEvent, x, y, button, down, "") { return arg.x() == x && arg.y() == y && arg.button() == button && arg.button_down() == down; } MATCHER_P2(EqualsClipboardEvent, mime_type, data, "") { return arg.mime_type() == mime_type && arg.data() == data; } MATCHER_P(EqualsTouchEvent, expected_event, "") { if (arg.event_type() != expected_event.event_type()) return false; if (arg.touch_points().size() != expected_event.touch_points().size()) return false; for (int i = 0; i < expected_event.touch_points().size(); ++i) { const TouchEventPoint& expected_point = expected_event.touch_points(i); const TouchEventPoint& actual_point = arg.touch_points(i); const bool equal = expected_point.id() == actual_point.id() && expected_point.x() == actual_point.x() && expected_point.y() == actual_point.y() && expected_point.radius_x() == actual_point.radius_x() && expected_point.radius_y() == actual_point.radius_y() && expected_point.angle() == actual_point.angle() && expected_point.pressure() == actual_point.pressure(); if (!equal) return false; } return true; } // If the rounding error for the coordinates checked in TouchPoint* matcher are // within 1 pixel diff, it is acceptable. const float kTestTouchErrorEpsilon = 1.0f; MATCHER_P(EqualsTouchPointCoordinates, expected_event, "") { if (arg.touch_points().size() != expected_event.touch_points().size()) return false; for (int i = 0; i < expected_event.touch_points().size(); ++i) { const TouchEventPoint& arg_point = arg.touch_points(i); const TouchEventPoint& expected_point = expected_event.touch_points(i); if (std::abs(expected_point.x() - arg_point.x()) >= kTestTouchErrorEpsilon) return false; if (std::abs(expected_point.y() - arg_point.y()) >= kTestTouchErrorEpsilon) return false; } return true; } MATCHER_P(EqualsTouchPointRadii, expected_event, "") { if (arg.touch_points().size() != expected_event.touch_points().size()) return false; for (int i = 0; i < expected_event.touch_points().size(); ++i) { const TouchEventPoint& arg_point = arg.touch_points(i); const TouchEventPoint& expected_point = expected_event.touch_points(i); if (std::abs(expected_point.radius_x() - arg_point.radius_x()) >= kTestTouchErrorEpsilon) { return false; } if (std::abs(expected_point.radius_y() - arg_point.radius_y()) >= kTestTouchErrorEpsilon) { return false; } } return true; } MATCHER_P2(EqualsTouchEventTypeAndId, type, id, "") { if (arg.event_type() != type) return false; if (arg.touch_points().size() != 1) return false; return arg.touch_points(0).id() == id; } } // namespace test } // namespace protocol } // namespace remoting #endif // REMOTING_PROTOCOL_TEST_EVENT_MATCHERS_H_