blob: ced6c1ac9df977d11766523acf227ab899f7a032 [file] [log] [blame]
// Copyright 2014 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.
#include <android/input.h>
#include "base/android/jni_android.h"
#include "base/float_util.h"
#include "content/browser/renderer_host/input/motion_event_android.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event_constants.h"
using ui::MotionEvent;
namespace content {
namespace {
const float kPixToDip = 0.5f;
int kAndroidActionDown = AMOTION_EVENT_ACTION_DOWN;
int kAndroidAltKeyDown = AMETA_ALT_ON;
// Corresponds to TOOL_TYPE_FINGER, see
// developer.android.com/reference/android/view/MotionEvent.html
// #TOOL_TYPE_FINGER.
int kAndroidToolTypeFinger = 1;
// Corresponds to BUTTON_PRIMARY, see
// developer.android.com/reference/android/view/MotionEvent.html#BUTTON_PRIMARY.
int kAndroidButtonPrimary = 1;
} // namespace
TEST(MotionEventAndroidTest, Constructor) {
int event_time_ms = 5;
base::TimeTicks event_time =
base::TimeTicks() + base::TimeDelta::FromMilliseconds(event_time_ms);
float x0 = 13.7f;
float y0 = -7.13f;
float x1 = -13.7f;
float y1 = 7.13f;
float raw_offset = 10.1f;
float touch_major0 = 5.3f;
float touch_major1 = 3.5f;
float touch_minor0 = 1.2f;
float touch_minor1 = 2.1f;
float orientation0 = 0.1f;
float orientation1 = -0.1f;
int p0 = 1;
int p1 = 2;
int pointer_count = 2;
int history_size = 0;
int action_index = -1;
base::android::ScopedJavaLocalRef<jobject> base_event_obj =
MotionEventAndroid::Obtain(
event_time, event_time, MotionEvent::ACTION_DOWN, x0, y0);
ASSERT_TRUE(base_event_obj.obj());
MotionEventAndroid event(kPixToDip,
base::android::AttachCurrentThread(),
base_event_obj.obj(),
event_time_ms,
kAndroidActionDown,
pointer_count,
history_size,
action_index,
x0,
y0,
x1,
y1,
p0,
p1,
touch_major0,
touch_major1,
touch_minor0,
touch_minor1,
orientation0,
orientation1,
x0 + raw_offset,
y0 - raw_offset,
kAndroidToolTypeFinger,
kAndroidToolTypeFinger,
kAndroidButtonPrimary,
kAndroidAltKeyDown);
EXPECT_EQ(MotionEvent::ACTION_DOWN, event.GetAction());
EXPECT_EQ(event_time, event.GetEventTime());
EXPECT_EQ(x0 * kPixToDip, event.GetX(0));
EXPECT_EQ(y0 * kPixToDip, event.GetY(0));
EXPECT_EQ(x1 * kPixToDip, event.GetX(1));
EXPECT_EQ(y1 * kPixToDip, event.GetY(1));
EXPECT_FLOAT_EQ((x0 + raw_offset) * kPixToDip, event.GetRawX(0));
EXPECT_FLOAT_EQ((y0 - raw_offset) * kPixToDip, event.GetRawY(0));
EXPECT_FLOAT_EQ((x1 + raw_offset) * kPixToDip, event.GetRawX(1));
EXPECT_FLOAT_EQ((y1 - raw_offset) * kPixToDip, event.GetRawY(1));
EXPECT_EQ(touch_major0 * kPixToDip, event.GetTouchMajor(0));
EXPECT_EQ(touch_major1 * kPixToDip, event.GetTouchMajor(1));
EXPECT_EQ(touch_minor0 * kPixToDip, event.GetTouchMinor(0));
EXPECT_EQ(touch_minor1 * kPixToDip, event.GetTouchMinor(1));
EXPECT_EQ(orientation0, event.GetOrientation(0));
EXPECT_EQ(orientation1, event.GetOrientation(1));
EXPECT_EQ(p0, event.GetPointerId(0));
EXPECT_EQ(p1, event.GetPointerId(1));
EXPECT_EQ(MotionEvent::TOOL_TYPE_FINGER, event.GetToolType(0));
EXPECT_EQ(MotionEvent::TOOL_TYPE_FINGER, event.GetToolType(1));
EXPECT_EQ(MotionEvent::BUTTON_PRIMARY, event.GetButtonState());
EXPECT_EQ(ui::EF_ALT_DOWN, event.GetFlags());
EXPECT_EQ(static_cast<size_t>(pointer_count), event.GetPointerCount());
EXPECT_EQ(static_cast<size_t>(history_size), event.GetHistorySize());
EXPECT_EQ(action_index, event.GetActionIndex());
}
TEST(MotionEventAndroidTest, Clone) {
int event_time_ms = 5;
base::TimeTicks event_time =
base::TimeTicks() + base::TimeDelta::FromMilliseconds(event_time_ms);
float x = 13.7f;
float y = -7.13f;
float touch_major = 5.3f;
float touch_minor = 3.5f;
float orientation = 0.2f;
int pointer_count = 1;
int pointer_id = 1;
base::android::ScopedJavaLocalRef<jobject> event_obj =
MotionEventAndroid::Obtain(
event_time, event_time, MotionEvent::ACTION_DOWN, x, y);
ASSERT_TRUE(event_obj.obj());
MotionEventAndroid event(kPixToDip,
base::android::AttachCurrentThread(),
event_obj.obj(),
event_time_ms,
kAndroidActionDown,
pointer_count,
0,
0,
x,
y,
0,
0,
pointer_id,
0,
touch_major,
0.f,
touch_minor,
0.f,
orientation,
0.f,
x,
y,
0,
0,
0,
0);
scoped_ptr<MotionEvent> clone = event.Clone();
EXPECT_EQ(event, *clone);
}
TEST(MotionEventAndroidTest, Cancel) {
int event_time_ms = 5;
base::TimeTicks event_time =
base::TimeTicks() + base::TimeDelta::FromMilliseconds(event_time_ms);
int pointer_count = 1;
float x = 13.7f;
float y = -7.13f;
base::android::ScopedJavaLocalRef<jobject> event_obj =
MotionEventAndroid::Obtain(
event_time, event_time, MotionEvent::ACTION_DOWN, x, y);
ASSERT_TRUE(event_obj.obj());
MotionEventAndroid event(kPixToDip,
base::android::AttachCurrentThread(),
event_obj.obj(),
event_time_ms,
kAndroidActionDown,
pointer_count,
0,
0,
x,
y,
0,
0,
0,
0,
0.f,
0.f,
0.f,
0.f,
0.f,
0.f,
x,
y,
0,
0,
0,
0);
scoped_ptr<MotionEvent> cancel_event = event.Cancel();
EXPECT_EQ(MotionEvent::ACTION_CANCEL, cancel_event->GetAction());
EXPECT_EQ(event_time, cancel_event->GetEventTime());
EXPECT_EQ(x * kPixToDip, cancel_event->GetX(0));
EXPECT_EQ(y * kPixToDip, cancel_event->GetY(0));
EXPECT_EQ(static_cast<size_t>(pointer_count),
cancel_event->GetPointerCount());
EXPECT_EQ(0U, cancel_event->GetHistorySize());
}
TEST(MotionEventAndroidTest, InvalidOrientationsSanitized) {
base::TimeTicks event_time;
int pointer_count = 2;
float orientation0 = 1e10f;
float orientation1 = std::numeric_limits<float>::quiet_NaN();
base::android::ScopedJavaLocalRef<jobject> base_event_obj =
MotionEventAndroid::Obtain(
event_time, event_time, MotionEvent::ACTION_DOWN, 0, 0);
ASSERT_TRUE(base_event_obj.obj());
MotionEventAndroid event(kPixToDip,
base::android::AttachCurrentThread(),
base_event_obj.obj(),
0,
kAndroidActionDown,
pointer_count,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
orientation0,
orientation1,
0,
0,
0,
0,
0,
0);
EXPECT_EQ(0.f, event.GetOrientation(0));
EXPECT_EQ(0.f, event.GetOrientation(1));
}
} // namespace content