// Copyright (c) 2012 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 PPAPI_TESTS_TEST_INPUT_EVENT_H_
#define PPAPI_TESTS_TEST_INPUT_EVENT_H_

#include <string>
#include <vector>

#include "ppapi/c/ppb_input_event.h"
#include "ppapi/c/private/ppb_testing_private.h"
#include "ppapi/cpp/input_event.h"
#include "ppapi/cpp/point.h"
#include "ppapi/cpp/private/input_event_private.h"
#include "ppapi/cpp/rect.h"
#include "ppapi/tests/test_case.h"
#include "ppapi/tests/test_utils.h"

class TestInputEvent : public TestCase {
 public:
  explicit TestInputEvent(TestingInstance* instance);
  ~TestInputEvent();

  virtual bool HandleInputEvent(const pp::InputEvent& input_event);
  virtual void HandleMessage(const pp::Var& message_data);
  virtual void DidChangeView(const pp::View& view);

  // TestCase implementation.
  virtual bool Init();
  virtual void RunTests(const std::string& test_filter);

 private:
  pp::InputEvent CreateMouseEvent(PP_InputEvent_Type type,
                                  PP_InputEvent_MouseButton buttons);
  pp::InputEvent CreateWheelEvent();
  pp::InputEvent CreateKeyEvent(PP_InputEvent_Type type,
                                uint32_t key_code, const std::string& code);
  pp::InputEvent CreateCharEvent(const std::string& text);
  pp::InputEvent CreateTouchEvent(PP_InputEvent_Type type,
                                  const pp::FloatPoint& location);

  void PostMessageBarrier();
  bool SimulateInputEvent(const pp::InputEvent& input_event);
  bool AreEquivalentEvents(PP_Resource first, PP_Resource second);

  std::string TestEvents();
  std::string TestEventsLatencyTracking();
  std::string TestAcceptTouchEvent_1();
  std::string TestAcceptTouchEvent_2();
  std::string TestAcceptTouchEvent_3();
  std::string TestAcceptTouchEvent_4();

  const PPB_InputEvent* input_event_interface_;
  const PPB_InputEvent_Private* input_event_private_interface_;
  const PPB_MouseInputEvent* mouse_input_event_interface_;
  const PPB_WheelInputEvent* wheel_input_event_interface_;
  const PPB_KeyboardInputEvent* keyboard_input_event_interface_;
  const PPB_TouchInputEvent* touch_input_event_interface_;

  NestedEvent nested_event_;

  pp::Rect view_rect_;
  pp::InputEvent expected_input_event_;
  bool received_expected_event_;
  bool received_finish_message_;
  bool enable_latency_tracking_;
  bool last_latency_tracking_successful_;
};

#endif  // PPAPI_TESTS_TEST_INPUT_EVENT_H_
