11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/input/synthetic_web_input_event_builders.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/pepper/event_conversion.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/shared_impl/ppb_input_event_shared.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EventConversionTest : public ::testing::Test {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CompareWebTouchEvents(const blink::WebTouchEvent& expected,
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const blink::WebTouchEvent& actual) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(expected.type, actual.type);
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(expected.touchesLength, actual.touchesLength);
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < expected.touchesLength; ++i) {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size_t j = 0;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (; j < actual.touchesLength; ++j) {
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (actual.touches[j].id == expected.touches[i].id)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASSERT_NE(j, actual.touchesLength);
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].id, actual.touches[j].id);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].state, actual.touches[j].state);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].position.x, actual.touches[j].position.x);
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].position.y, actual.touches[j].position.y);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].radiusX, actual.touches[j].radiusX);
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].radiusY, actual.touches[j].radiusY);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].rotationAngle,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                actual.touches[j].rotationAngle);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(expected.touches[i].force, actual.touches[j].force);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EventConversionTest, TouchStart) {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SyntheticWebTouchEvent touch;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(1.f, 2.f);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<ppapi::InputEventData> pp_events;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateInputEventData(touch, &pp_events);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_events.size());
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ppapi::InputEventData& pp_event = pp_events[0];
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHSTART, pp_event.event_type);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.touches.size());
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.changed_touches.size());
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.target_touches.size());
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<blink::WebInputEvent> event_out(CreateWebInputEvent(pp_event));
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const blink::WebTouchEvent* touch_out =
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<const blink::WebTouchEvent*>(event_out.get());
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(touch_out);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.type, touch_out->type);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.touchesLength, touch_out->touchesLength);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompareWebTouchEvents(touch, *touch_out);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EventConversionTest, TouchMove) {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SyntheticWebTouchEvent touch;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(1.f, 2.f);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(3.f, 4.f);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.MovePoint(1, 5.f, 6.f);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<ppapi::InputEventData> pp_events;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateInputEventData(touch, &pp_events);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_events.size());
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ppapi::InputEventData& pp_event = pp_events[0];
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHMOVE, pp_event.event_type);
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, pp_event.touches.size());
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.changed_touches.size());
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, pp_event.target_touches.size());
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<blink::WebInputEvent> event_out(CreateWebInputEvent(pp_event));
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const blink::WebTouchEvent* touch_out =
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<const blink::WebTouchEvent*>(event_out.get());
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(touch_out);
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.type, touch_out->type);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.touchesLength, touch_out->touchesLength);
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompareWebTouchEvents(touch, *touch_out);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EventConversionTest, TouchEnd) {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SyntheticWebTouchEvent touch;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(1.f, 2.f);
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(3.f, 4.f);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ReleasePoint(0);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<ppapi::InputEventData> pp_events;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateInputEventData(touch, &pp_events);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_events.size());
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ppapi::InputEventData& pp_event = pp_events[0];
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHEND, pp_event.event_type);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.touches.size());
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_event.changed_touches.size());
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, pp_event.target_touches.size());
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<blink::WebInputEvent> event_out(CreateWebInputEvent(pp_event));
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const blink::WebTouchEvent* touch_out =
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<const blink::WebTouchEvent*>(event_out.get());
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(touch_out);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.type, touch_out->type);
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(touch.touchesLength, touch_out->touchesLength);
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompareWebTouchEvents(touch, *touch_out);
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EventConversionTest, TouchCancel) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SyntheticWebTouchEvent touch;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(1.f, 2.f);
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.PressPoint(3.f, 4.f);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.ResetPoints();
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.CancelPoint(1);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  touch.CancelPoint(0);
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<ppapi::InputEventData> pp_events;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CreateInputEventData(touch, &pp_events);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1U, pp_events.size());
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ppapi::InputEventData& pp_event = pp_events[0];
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHCANCEL, pp_event.event_type);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(0U, pp_event.touches.size());
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, pp_event.changed_touches.size());
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, pp_event.target_touches.size());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<blink::WebInputEvent> event_out(CreateWebInputEvent(pp_event));
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const blink::WebTouchEvent* touch_out =
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<const blink::WebTouchEvent*>(event_out.get());
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(touch_out);
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.type, touch_out->type);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(touch.touchesLength, touch_out->touchesLength);
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CompareWebTouchEvents(touch, *touch_out);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace content
146