blob: dd2e40c02506e37a9edb4a1b66c7b18d61405baf [file] [log] [blame] [edit]
/**
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <ostream>
#include <input/Input.h>
namespace android {
/**
* This file contains a copy of Matchers from .../inputflinger/tests/TestEventMatchers.h. Ideally,
* implementations must not be duplicated.
* TODO(b/365606513): Find a way to share TestEventMatchers.h between inputflinger and libinput.
*/
class WithDeviceIdMatcher {
public:
using is_gtest_matcher = void;
explicit WithDeviceIdMatcher(DeviceId deviceId) : mDeviceId(deviceId) {}
bool MatchAndExplain(const InputEvent& event, std::ostream*) const {
return mDeviceId == event.getDeviceId();
}
void DescribeTo(std::ostream* os) const { *os << "with device id " << mDeviceId; }
void DescribeNegationTo(std::ostream* os) const { *os << "wrong device id"; }
private:
const DeviceId mDeviceId;
};
inline WithDeviceIdMatcher WithDeviceId(int32_t deviceId) {
return WithDeviceIdMatcher(deviceId);
}
class WithMotionActionMatcher {
public:
using is_gtest_matcher = void;
explicit WithMotionActionMatcher(int32_t action) : mAction(action) {}
bool MatchAndExplain(const MotionEvent& event, std::ostream*) const {
bool matches = mAction == event.getAction();
if (event.getAction() == AMOTION_EVENT_ACTION_CANCEL) {
matches &= (event.getFlags() & AMOTION_EVENT_FLAG_CANCELED) != 0;
}
return matches;
}
void DescribeTo(std::ostream* os) const {
*os << "with motion action " << MotionEvent::actionToString(mAction);
if (mAction == AMOTION_EVENT_ACTION_CANCEL) {
*os << " and FLAG_CANCELED";
}
}
void DescribeNegationTo(std::ostream* os) const { *os << "wrong action"; }
private:
const int32_t mAction;
};
inline WithMotionActionMatcher WithMotionAction(int32_t action) {
return WithMotionActionMatcher(action);
}
class MotionEventIsResampledMatcher {
public:
using is_gtest_matcher = void;
bool MatchAndExplain(const MotionEvent& motionEvent, std::ostream*) const {
const size_t numSamples = motionEvent.getHistorySize() + 1;
const size_t numPointers = motionEvent.getPointerCount();
if (numPointers <= 0 || numSamples <= 0) {
return false;
}
for (size_t i = 0; i < numPointers; ++i) {
const PointerCoords& pointerCoords =
motionEvent.getSamplePointerCoords()[numSamples * numPointers + i];
if (!pointerCoords.isResampled) {
return false;
}
}
return true;
}
void DescribeTo(std::ostream* os) const { *os << "MotionEvent is resampled."; }
void DescribeNegationTo(std::ostream* os) const { *os << "MotionEvent is not resampled."; }
};
inline MotionEventIsResampledMatcher MotionEventIsResampled() {
return MotionEventIsResampledMatcher();
}
} // namespace android