15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2011 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <math.h>
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <binder/Parcel.h>
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <gtest/gtest.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass BaseTest : public testing::Test {
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual void SetUp() { }
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual void TearDown() { }
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- PointerCoordsTest ---
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass PointerCoordsTest : public BaseTest {
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(PointerCoordsTest, ClearSetsBitsToZero) {
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords coords;
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    coords.clear();
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0ULL, coords.bits);
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(PointerCoordsTest, AxisValues) {
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float* valuePtr;
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords coords;
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    coords.clear();
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Check invariants when no axes are present.
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(0))
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(1))
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set first axis.
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, coords.setAxisValue(1, 5));
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.values[0]);
57b8290c2642ec7a0cb8a1703a7e1e8958a6a5f9f3Narayan Kamath    ASSERT_EQ(0x4000000000000000ULL, coords.bits);
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(0))
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.getAxisValue(1))
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set an axis with a higher id than all others.  (appending value at the end)
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, coords.setAxisValue(3, 2));
66b8290c2642ec7a0cb8a1703a7e1e8958a6a5f9f3Narayan Kamath    ASSERT_EQ(0x5000000000000000ULL, coords.bits);
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.values[0]);
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.values[1]);
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(0))
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.getAxisValue(1))
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(2))
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.getAxisValue(3))
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set an axis with an id lower than all others.  (prepending value at beginning)
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, coords.setAxisValue(0, 4));
81b8290c2642ec7a0cb8a1703a7e1e8958a6a5f9f3Narayan Kamath    ASSERT_EQ(0xd000000000000000ULL, coords.bits);
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.values[0]);
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.values[1]);
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.values[2]);
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.getAxisValue(0))
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.getAxisValue(1))
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0, coords.getAxisValue(2))
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return zero because axis is not present";
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.getAxisValue(3))
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set an axis with an id between the others.  (inserting value in the middle)
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, coords.setAxisValue(2, 1));
97b8290c2642ec7a0cb8a1703a7e1e8958a6a5f9f3Narayan Kamath    ASSERT_EQ(0xf000000000000000ULL, coords.bits);
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.values[0]);
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.values[1]);
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, coords.values[2]);
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.values[3]);
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.getAxisValue(0))
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(5, coords.getAxisValue(1))
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, coords.getAxisValue(2))
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.getAxisValue(3))
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set an existing axis value in place.
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, coords.setAxisValue(1, 6));
114b8290c2642ec7a0cb8a1703a7e1e8958a6a5f9f3Narayan Kamath    ASSERT_EQ(0xf000000000000000ULL, coords.bits);
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.values[0]);
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(6, coords.values[1]);
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, coords.values[2]);
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.values[3]);
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(4, coords.getAxisValue(0))
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(6, coords.getAxisValue(1))
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, coords.getAxisValue(2))
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, coords.getAxisValue(3))
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "getAxisValue should return value of axis";
1285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set maximum number of axes.
1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t axis = 4; axis < PointerCoords::MAX_AXES; axis++) {
1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ASSERT_EQ(OK, coords.setAxisValue(axis, axis));
1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(PointerCoords::MAX_AXES, __builtin_popcountll(coords.bits));
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Try to set one more axis beyond maximum number.
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Ensure bits are unchanged.
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(NO_MEMORY, coords.setAxisValue(PointerCoords::MAX_AXES, 100));
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(PointerCoords::MAX_AXES, __builtin_popcountll(coords.bits));
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(PointerCoordsTest, Parcel) {
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Parcel parcel;
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords inCoords;
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inCoords.clear();
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords outCoords;
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Round trip with empty coords.
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inCoords.writeToParcel(&parcel);
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel.setDataPosition(0);
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    outCoords.readFromParcel(&parcel);
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0ULL, outCoords.bits);
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Round trip with some values.
1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel.freeData();
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inCoords.setAxisValue(2, 5);
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inCoords.setAxisValue(5, 8);
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inCoords.writeToParcel(&parcel);
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel.setDataPosition(0);
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    outCoords.readFromParcel(&parcel);
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(outCoords.bits, inCoords.bits);
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(outCoords.values[0], inCoords.values[0]);
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(outCoords.values[1], inCoords.values[1]);
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- KeyEventTest ---
1715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyEventTest : public BaseTest {
1735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(KeyEventTest, Properties) {
1765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyEvent event;
1775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Initialize and get properties.
1795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t ARBITRARY_DOWN_TIME = 1;
1805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t ARBITRARY_EVENT_TIME = 2;
1815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.initialize(2, AINPUT_SOURCE_GAMEPAD, AKEY_EVENT_ACTION_DOWN,
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            AKEY_EVENT_FLAG_FROM_SYSTEM, AKEYCODE_BUTTON_X, 121,
1835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            AMETA_ALT_ON, 1, ARBITRARY_DOWN_TIME, ARBITRARY_EVENT_TIME);
1845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_EVENT_TYPE_KEY, event.getType());
1865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, event.getDeviceId());
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_SOURCE_GAMEPAD, event.getSource());
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, event.getAction());
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, event.getFlags());
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AKEYCODE_BUTTON_X, event.getKeyCode());
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(121, event.getScanCode());
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMETA_ALT_ON, event.getMetaState());
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, event.getRepeatCount());
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_DOWN_TIME, event.getDownTime());
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_EVENT_TIME, event.getEventTime());
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set source.
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.setSource(AINPUT_SOURCE_JOYSTICK);
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource());
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// --- MotionEventTest ---
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass MotionEventTest : public BaseTest {
2065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
2075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static const nsecs_t ARBITRARY_DOWN_TIME;
2085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static const nsecs_t ARBITRARY_EVENT_TIME;
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static const float X_OFFSET;
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static const float Y_OFFSET;
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void initializeEventWithHistory(MotionEvent* event);
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void assertEqualsEventWithHistory(const MotionEvent* event);
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst nsecs_t MotionEventTest::ARBITRARY_DOWN_TIME = 1;
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst nsecs_t MotionEventTest::ARBITRARY_EVENT_TIME = 2;
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst float MotionEventTest::X_OFFSET = 1.0f;
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownconst float MotionEventTest::Y_OFFSET = 1.1f;
2205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEventTest::initializeEventWithHistory(MotionEvent* event) {
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerProperties pointerProperties[2];
2235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[0].clear();
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[0].id = 1;
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[0].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER;
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[1].clear();
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[1].id = 2;
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerProperties[1].toolType = AMOTION_EVENT_TOOL_TYPE_STYLUS;
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords pointerCoords[2];
2315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].clear();
2325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 10);
2335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 11);
2345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 12);
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 13);
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 14);
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 15);
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 16);
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 17);
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 18);
2415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].clear();
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 20);
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 21);
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 22);
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 23);
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 24);
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 25);
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 26);
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 27);
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 28);
2515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event->initialize(2, AINPUT_SOURCE_TOUCHSCREEN, AMOTION_EVENT_ACTION_MOVE,
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED,
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            AMOTION_EVENT_EDGE_FLAG_TOP, AMETA_ALT_ON, AMOTION_EVENT_BUTTON_PRIMARY,
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            X_OFFSET, Y_OFFSET, 2.0f, 2.1f,
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            ARBITRARY_DOWN_TIME, ARBITRARY_EVENT_TIME,
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            2, pointerProperties, pointerCoords);
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 110);
2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 111);
2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 112);
2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 113);
2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 114);
2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 115);
2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 116);
2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 117);
2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 118);
2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 120);
2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 121);
2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 122);
2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 123);
2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 124);
2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 125);
2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 126);
2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 127);
2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 128);
2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event->addSample(ARBITRARY_EVENT_TIME + 1, pointerCoords);
2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 210);
2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 211);
2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 212);
2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 213);
2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 214);
2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 215);
2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 216);
2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 217);
2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 218);
2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 220);
2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 221);
2895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 222);
2905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 223);
2915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 224);
2925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 225);
2935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 226);
2945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 227);
2955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 228);
2965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event->addSample(ARBITRARY_EVENT_TIME + 2, pointerCoords);
2975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid MotionEventTest::assertEqualsEventWithHistory(const MotionEvent* event) {
3005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Check properties.
3015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType());
3025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, event->getDeviceId());
3035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, event->getSource());
3045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, event->getAction());
3055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED, event->getFlags());
3065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_EDGE_FLAG_TOP, event->getEdgeFlags());
3075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMETA_ALT_ON, event->getMetaState());
3085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, event->getButtonState());
3095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET, event->getXOffset());
3105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET, event->getYOffset());
3115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2.0f, event->getXPrecision());
3125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2.1f, event->getYPrecision());
3135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_DOWN_TIME, event->getDownTime());
3145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2U, event->getPointerCount());
3165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(1, event->getPointerId(0));
3175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, event->getToolType(0));
3185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2, event->getPointerId(1));
3195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, event->getToolType(1));
3205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(2U, event->getHistorySize());
3225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Check data.
3245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_EVENT_TIME, event->getHistoricalEventTime(0));
3255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_EVENT_TIME + 1, event->getHistoricalEventTime(1));
3265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(ARBITRARY_EVENT_TIME + 2, event->getEventTime());
3275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(11, event->getHistoricalRawPointerCoords(0, 0)->
3295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(21, event->getHistoricalRawPointerCoords(1, 0)->
3315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(111, event->getHistoricalRawPointerCoords(0, 1)->
3335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(121, event->getHistoricalRawPointerCoords(1, 1)->
3355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(211, event->getRawPointerCoords(0)->
3375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(221, event->getRawPointerCoords(1)->
3395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            getAxisValue(AMOTION_EVENT_AXIS_Y));
3405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(11, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 0, 0));
3425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(21, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 1, 0));
3435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(111, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 0, 1));
3445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(121, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 1, 1));
3455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(211, event->getRawAxisValue(AMOTION_EVENT_AXIS_Y, 0));
3465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(221, event->getRawAxisValue(AMOTION_EVENT_AXIS_Y, 1));
3475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(10, event->getHistoricalRawX(0, 0));
3495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(20, event->getHistoricalRawX(1, 0));
3505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(110, event->getHistoricalRawX(0, 1));
3515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(120, event->getHistoricalRawX(1, 1));
3525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(210, event->getRawX(0));
3535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(220, event->getRawX(1));
3545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(11, event->getHistoricalRawY(0, 0));
3565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(21, event->getHistoricalRawY(1, 0));
3575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(111, event->getHistoricalRawY(0, 1));
3585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(121, event->getHistoricalRawY(1, 1));
3595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(211, event->getRawY(0));
3605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(221, event->getRawY(1));
3615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 10, event->getHistoricalX(0, 0));
3635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 20, event->getHistoricalX(1, 0));
3645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 110, event->getHistoricalX(0, 1));
3655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 120, event->getHistoricalX(1, 1));
3665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 210, event->getX(0));
3675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 220, event->getX(1));
3685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 11, event->getHistoricalY(0, 0));
3705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 21, event->getHistoricalY(1, 0));
3715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 111, event->getHistoricalY(0, 1));
3725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 121, event->getHistoricalY(1, 1));
3735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 211, event->getY(0));
3745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET + 221, event->getY(1));
3755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(12, event->getHistoricalPressure(0, 0));
3775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(22, event->getHistoricalPressure(1, 0));
3785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(112, event->getHistoricalPressure(0, 1));
3795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(122, event->getHistoricalPressure(1, 1));
3805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(212, event->getPressure(0));
3815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(222, event->getPressure(1));
3825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(13, event->getHistoricalSize(0, 0));
3845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(23, event->getHistoricalSize(1, 0));
3855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(113, event->getHistoricalSize(0, 1));
3865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(123, event->getHistoricalSize(1, 1));
3875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(213, event->getSize(0));
3885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(223, event->getSize(1));
3895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(14, event->getHistoricalTouchMajor(0, 0));
3915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(24, event->getHistoricalTouchMajor(1, 0));
3925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(114, event->getHistoricalTouchMajor(0, 1));
3935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(124, event->getHistoricalTouchMajor(1, 1));
3945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(214, event->getTouchMajor(0));
3955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(224, event->getTouchMajor(1));
3965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(15, event->getHistoricalTouchMinor(0, 0));
3985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(25, event->getHistoricalTouchMinor(1, 0));
3995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(115, event->getHistoricalTouchMinor(0, 1));
4005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(125, event->getHistoricalTouchMinor(1, 1));
4015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(215, event->getTouchMinor(0));
4025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(225, event->getTouchMinor(1));
4035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(16, event->getHistoricalToolMajor(0, 0));
4055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(26, event->getHistoricalToolMajor(1, 0));
4065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(116, event->getHistoricalToolMajor(0, 1));
4075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(126, event->getHistoricalToolMajor(1, 1));
4085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(216, event->getToolMajor(0));
4095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(226, event->getToolMajor(1));
4105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(17, event->getHistoricalToolMinor(0, 0));
4125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(27, event->getHistoricalToolMinor(1, 0));
4135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(117, event->getHistoricalToolMinor(0, 1));
4145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(127, event->getHistoricalToolMinor(1, 1));
4155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(217, event->getToolMinor(0));
4165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(227, event->getToolMinor(1));
4175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(18, event->getHistoricalOrientation(0, 0));
4195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(28, event->getHistoricalOrientation(1, 0));
4205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(118, event->getHistoricalOrientation(0, 1));
4215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(128, event->getHistoricalOrientation(1, 1));
4225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(218, event->getOrientation(0));
4235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(228, event->getOrientation(1));
4245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, Properties) {
4275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
4285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Initialize, add samples and check properties.
4305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&event);
4315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event));
4325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set source.
4345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.setSource(AINPUT_SOURCE_JOYSTICK);
4355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource());
4365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set action.
4385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.setAction(AMOTION_EVENT_ACTION_CANCEL);
4395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_CANCEL, event.getAction());
4405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Set meta state.
4425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.setMetaState(AMETA_CTRL_ON);
4435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AMETA_CTRL_ON, event.getMetaState());
4445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, CopyFrom_KeepHistory) {
4475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
4485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&event);
4495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent copy;
4515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    copy.copyFrom(&event, true /*keepHistory*/);
4525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event));
4545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, CopyFrom_DoNotKeepHistory) {
4575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
4585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&event);
4595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent copy;
4615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    copy.copyFrom(&event, false /*keepHistory*/);
4625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(event.getPointerCount(), copy.getPointerCount());
4645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(0U, copy.getHistorySize());
4655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(event.getPointerId(0), copy.getPointerId(0));
4675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(event.getPointerId(1), copy.getPointerId(1));
4685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(event.getEventTime(), copy.getEventTime());
4705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(event.getX(0), copy.getX(0));
4725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, OffsetLocation) {
4755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
4765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&event);
4775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.offsetLocation(5.0f, -2.0f);
4795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET + 5.0f, event.getXOffset());
4815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET - 2.0f, event.getYOffset());
4825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
4835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, Scale) {
4855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
4865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&event);
4875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.scale(2.0f);
4895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(X_OFFSET * 2, event.getXOffset());
4915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(Y_OFFSET * 2, event.getYOffset());
4925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(210 * 2, event.getRawX(0));
4945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(211 * 2, event.getRawY(0));
4955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ((X_OFFSET + 210) * 2, event.getX(0));
4965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ((Y_OFFSET + 211) * 2, event.getY(0));
4975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(212, event.getPressure(0));
4985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(213, event.getSize(0));
4995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(214 * 2, event.getTouchMajor(0));
5005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(215 * 2, event.getTouchMinor(0));
5015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(216 * 2, event.getToolMajor(0));
5025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(217 * 2, event.getToolMinor(0));
5035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(218, event.getOrientation(0));
5045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, Parcel) {
5075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Parcel parcel;
5085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent inEvent;
5105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    initializeEventWithHistory(&inEvent);
5115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent outEvent;
5125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Round trip.
5145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inEvent.writeToParcel(&parcel);
5155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    parcel.setDataPosition(0);
5165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    outEvent.readFromParcel(&parcel);
5175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&outEvent));
5195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
521313eff7bb7e5eedbdbea805343451fd473241266Jeff Brownstatic void setRotationMatrix(float matrix[9], float angle) {
522313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    float sin = sinf(angle);
523313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    float cos = cosf(angle);
524313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[0] = cos;
525313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[1] = -sin;
526313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[2] = 0;
527313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[3] = sin;
528313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[4] = cos;
529313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[5] = 0;
530313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[6] = 0;
531313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[7] = 0;
532313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    matrix[8] = 1.0f;
533313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown}
534313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown
5355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(MotionEventTest, Transform) {
5365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Generate some points on a circle.
5375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Each point 'i' is a point on a circle of radius ROTATION centered at (3,2) at an angle
5385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // of ARC * i degrees clockwise relative to the Y axis.
5395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // The geometrical representation is irrelevant to the test, it's just easy to generate
5405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // and check rotation.  We set the orientation to the same angle.
5415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Coordinate system: down is increasing Y, right is increasing X.
5425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float PI_180 = float(M_PI / 180);
5435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float RADIUS = 10;
5445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float ARC = 36;
5455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float ROTATION = ARC * 2;
5465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t pointerCount = 11;
5485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerProperties pointerProperties[pointerCount];
5495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords pointerCoords[pointerCount];
5505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
5515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float angle = float(i * ARC * PI_180);
5525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].clear();
5535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].id = i;
5545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].clear();
5555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_X, sinf(angle) * RADIUS + 3);
5565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, -cosf(angle) * RADIUS + 2);
5575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, angle);
5585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent event;
5605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.initialize(0, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, 0, 0,
5615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            0, 0, 0, 0, 0, 0, pointerCount, pointerProperties, pointerCoords);
5625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float originalRawX = 0 + 3;
5635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    float originalRawY = -RADIUS + 2;
5645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Check original raw X and Y assumption.
5665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001);
5675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001);
5685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Now translate the motion event so the circle's origin is at (0,0).
5705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    event.offsetLocation(-3, -2);
5715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Offsetting the location should preserve the raw X and Y of the first point.
5735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001);
5745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001);
5755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Apply a rotation about the origin by ROTATION degrees clockwise.
577313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    float matrix[9];
578313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    setRotationMatrix(matrix, ROTATION * PI_180);
579313eff7bb7e5eedbdbea805343451fd473241266Jeff Brown    event.transform(matrix);
5805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Check the points.
5825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
5835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        float angle = float((i * ARC + ROTATION) * PI_180);
5845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ASSERT_NEAR(sinf(angle) * RADIUS, event.getX(i), 0.001);
5855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ASSERT_NEAR(-cosf(angle) * RADIUS, event.getY(i), 0.001);
5865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ASSERT_NEAR(tanf(angle), tanf(event.getOrientation(i)), 0.1);
5875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
5885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Applying the transformation should preserve the raw X and Y of the first point.
5905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001);
5915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001);
5925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
5935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
5945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
595