Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / content / common / input / input_param_traits_unittest.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/common/input/input_param_traits.h"
6
7 #include "content/common/input/input_event.h"
8 #include "content/common/input/synthetic_gesture_params.h"
9 #include "content/common/input/synthetic_pinch_gesture_params.h"
10 #include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
11 #include "content/common/input_messages.h"
12 #include "ipc/ipc_message.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "third_party/WebKit/public/web/WebInputEvent.h"
15
16 namespace content {
17 namespace {
18
19 typedef ScopedVector<InputEvent> InputEvents;
20
21 class InputParamTraitsTest : public testing::Test {
22  protected:
23   static void Compare(const InputEvent* a, const InputEvent* b) {
24     EXPECT_EQ(!!a->web_event, !!b->web_event);
25     if (a->web_event && b->web_event) {
26       const size_t a_size = a->web_event->size;
27       ASSERT_EQ(a_size, b->web_event->size);
28       EXPECT_EQ(0, memcmp(a->web_event.get(), b->web_event.get(), a_size));
29     }
30     EXPECT_EQ(a->latency_info.latency_components.size(),
31               b->latency_info.latency_components.size());
32     EXPECT_EQ(a->is_keyboard_shortcut, b->is_keyboard_shortcut);
33   }
34
35   static void Compare(const InputEvents* a, const InputEvents* b) {
36     for (size_t i = 0; i < a->size(); ++i)
37       Compare((*a)[i], (*b)[i]);
38   }
39
40   static void Compare(const SyntheticSmoothScrollGestureParams* a,
41                       const SyntheticSmoothScrollGestureParams* b) {
42     EXPECT_EQ(a->gesture_source_type, b->gesture_source_type);
43     EXPECT_EQ(a->anchor, b->anchor);
44     EXPECT_EQ(a->distances.size(), b->distances.size());
45     for (size_t i = 0; i < a->distances.size(); i++)
46         EXPECT_EQ(a->distances[i], b->distances[i]);
47     EXPECT_EQ(a->prevent_fling, b->prevent_fling);
48     EXPECT_EQ(a->speed_in_pixels_s, b->speed_in_pixels_s);
49   }
50
51   static void Compare(const SyntheticPinchGestureParams* a,
52                       const SyntheticPinchGestureParams* b) {
53     EXPECT_EQ(a->gesture_source_type, b->gesture_source_type);
54     EXPECT_EQ(a->scale_factor, b->scale_factor);
55     EXPECT_EQ(a->anchor, b->anchor);
56     EXPECT_EQ(a->relative_pointer_speed_in_pixels_s,
57               b->relative_pointer_speed_in_pixels_s);
58   }
59
60   static void Compare(const SyntheticTapGestureParams* a,
61                       const SyntheticTapGestureParams* b) {
62     EXPECT_EQ(a->gesture_source_type, b->gesture_source_type);
63     EXPECT_EQ(a->position, b->position);
64     EXPECT_EQ(a->duration_ms, b->duration_ms);
65   }
66
67   static void Compare(const SyntheticGesturePacket* a,
68                       const SyntheticGesturePacket* b) {
69     ASSERT_EQ(!!a, !!b);
70     if (!a) return;
71     ASSERT_EQ(!!a->gesture_params(), !!b->gesture_params());
72     if (!a->gesture_params()) return;
73     ASSERT_EQ(a->gesture_params()->GetGestureType(),
74               b->gesture_params()->GetGestureType());
75     switch (a->gesture_params()->GetGestureType()) {
76       case SyntheticGestureParams::SMOOTH_SCROLL_GESTURE:
77         Compare(SyntheticSmoothScrollGestureParams::Cast(a->gesture_params()),
78                 SyntheticSmoothScrollGestureParams::Cast(b->gesture_params()));
79         break;
80       case SyntheticGestureParams::PINCH_GESTURE:
81         Compare(SyntheticPinchGestureParams::Cast(a->gesture_params()),
82                 SyntheticPinchGestureParams::Cast(b->gesture_params()));
83         break;
84       case SyntheticGestureParams::TAP_GESTURE:
85         Compare(SyntheticTapGestureParams::Cast(a->gesture_params()),
86                 SyntheticTapGestureParams::Cast(b->gesture_params()));
87         break;
88     }
89   }
90
91   static void Verify(const InputEvents& events_in) {
92     IPC::Message msg;
93     IPC::ParamTraits<InputEvents>::Write(&msg, events_in);
94
95     InputEvents events_out;
96     PickleIterator iter(msg);
97     EXPECT_TRUE(IPC::ParamTraits<InputEvents>::Read(&msg, &iter, &events_out));
98
99     Compare(&events_in, &events_out);
100
101     // Perform a sanity check that logging doesn't explode.
102     std::string events_in_string;
103     IPC::ParamTraits<InputEvents>::Log(events_in, &events_in_string);
104     std::string events_out_string;
105     IPC::ParamTraits<InputEvents>::Log(events_out, &events_out_string);
106     ASSERT_FALSE(events_in_string.empty());
107     EXPECT_EQ(events_in_string, events_out_string);
108   }
109
110   static void Verify(const SyntheticGesturePacket& packet_in) {
111     IPC::Message msg;
112     IPC::ParamTraits<SyntheticGesturePacket>::Write(&msg, packet_in);
113
114     SyntheticGesturePacket packet_out;
115     PickleIterator iter(msg);
116     EXPECT_TRUE(IPC::ParamTraits<SyntheticGesturePacket>::Read(&msg, &iter,
117                                                                &packet_out));
118
119     Compare(&packet_in, &packet_out);
120
121     // Perform a sanity check that logging doesn't explode.
122     std::string packet_in_string;
123     IPC::ParamTraits<SyntheticGesturePacket>::Log(packet_in, &packet_in_string);
124     std::string packet_out_string;
125     IPC::ParamTraits<SyntheticGesturePacket>::Log(packet_out,
126                                                   &packet_out_string);
127     ASSERT_FALSE(packet_in_string.empty());
128     EXPECT_EQ(packet_in_string, packet_out_string);
129   }
130 };
131
132 TEST_F(InputParamTraitsTest, UninitializedEvents) {
133   InputEvent event;
134
135   IPC::Message msg;
136   IPC::WriteParam(&msg, event);
137
138   InputEvent event_out;
139   PickleIterator iter(msg);
140   EXPECT_FALSE(IPC::ReadParam(&msg, &iter, &event_out));
141 }
142
143 TEST_F(InputParamTraitsTest, InitializedEvents) {
144   InputEvents events;
145
146   ui::LatencyInfo latency;
147
148   blink::WebKeyboardEvent key_event;
149   key_event.type = blink::WebInputEvent::RawKeyDown;
150   key_event.nativeKeyCode = 5;
151   events.push_back(new InputEvent(key_event, latency, false));
152
153   blink::WebMouseWheelEvent wheel_event;
154   wheel_event.type = blink::WebInputEvent::MouseWheel;
155   wheel_event.deltaX = 10;
156   latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 1, 1);
157   events.push_back(new InputEvent(wheel_event, latency, false));
158
159   blink::WebMouseEvent mouse_event;
160   mouse_event.type = blink::WebInputEvent::MouseDown;
161   mouse_event.x = 10;
162   latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 2, 2);
163   events.push_back(new InputEvent(mouse_event, latency, false));
164
165   blink::WebGestureEvent gesture_event;
166   gesture_event.type = blink::WebInputEvent::GestureScrollBegin;
167   gesture_event.x = -1;
168   events.push_back(new InputEvent(gesture_event, latency, false));
169
170   blink::WebTouchEvent touch_event;
171   touch_event.type = blink::WebInputEvent::TouchStart;
172   touch_event.touchesLength = 1;
173   touch_event.touches[0].radiusX = 1;
174   events.push_back(new InputEvent(touch_event, latency, false));
175
176   Verify(events);
177 }
178
179 TEST_F(InputParamTraitsTest, InvalidSyntheticGestureParams) {
180   IPC::Message msg;
181   // Write invalid value for SyntheticGestureParams::GestureType.
182   WriteParam(&msg, -3);
183
184   SyntheticGesturePacket packet_out;
185   PickleIterator iter(msg);
186   ASSERT_FALSE(
187       IPC::ParamTraits<SyntheticGesturePacket>::Read(&msg, &iter, &packet_out));
188 }
189
190 TEST_F(InputParamTraitsTest, SyntheticSmoothScrollGestureParams) {
191   scoped_ptr<SyntheticSmoothScrollGestureParams> gesture_params(
192       new SyntheticSmoothScrollGestureParams);
193   gesture_params->gesture_source_type = SyntheticGestureParams::TOUCH_INPUT;
194   gesture_params->anchor.SetPoint(234, 345);
195   gesture_params->distances.push_back(gfx::Vector2d(123, -789));
196   gesture_params->distances.push_back(gfx::Vector2d(-78, 43));
197   gesture_params->prevent_fling = false;
198   gesture_params->speed_in_pixels_s = 456;
199   ASSERT_EQ(SyntheticGestureParams::SMOOTH_SCROLL_GESTURE,
200             gesture_params->GetGestureType());
201   SyntheticGesturePacket packet_in;
202   packet_in.set_gesture_params(gesture_params.PassAs<SyntheticGestureParams>());
203
204   Verify(packet_in);
205 }
206
207 TEST_F(InputParamTraitsTest, SyntheticPinchGestureParams) {
208   scoped_ptr<SyntheticPinchGestureParams> gesture_params(
209       new SyntheticPinchGestureParams);
210   gesture_params->gesture_source_type = SyntheticGestureParams::TOUCH_INPUT;
211   gesture_params->scale_factor = 2.3f;
212   gesture_params->anchor.SetPoint(234, 345);
213   gesture_params->relative_pointer_speed_in_pixels_s = 456;
214   ASSERT_EQ(SyntheticGestureParams::PINCH_GESTURE,
215             gesture_params->GetGestureType());
216   SyntheticGesturePacket packet_in;
217   packet_in.set_gesture_params(gesture_params.PassAs<SyntheticGestureParams>());
218
219   Verify(packet_in);
220 }
221
222 TEST_F(InputParamTraitsTest, SyntheticTapGestureParams) {
223   scoped_ptr<SyntheticTapGestureParams> gesture_params(
224       new SyntheticTapGestureParams);
225   gesture_params->gesture_source_type = SyntheticGestureParams::TOUCH_INPUT;
226   gesture_params->position.SetPoint(798, 233);
227   gesture_params->duration_ms = 13;
228   ASSERT_EQ(SyntheticGestureParams::TAP_GESTURE,
229             gesture_params->GetGestureType());
230   SyntheticGesturePacket packet_in;
231   packet_in.set_gesture_params(gesture_params.PassAs<SyntheticGestureParams>());
232
233   Verify(packet_in);
234 }
235
236 }  // namespace
237 }  // namespace content