blob: 55be35521341339f57e348b63ffd00ba18e68432 [file] [log] [blame]
// Copyright 2012 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <deque>
#include <math.h>
#include <vector>
#include <utility>
#include <gtest/gtest.h>
#include "include/box_filter_interpreter.h"
#include "include/gestures.h"
#include "include/macros.h"
#include "include/unittest_util.h"
using std::deque;
using std::make_pair;
using std::pair;
using std::vector;
static const HardwareProperties hwprops = {
.right = 100, .bottom = 100,
.res_x = 1, .res_y = 1,
.orientation_minimum = -1,
.orientation_maximum = 2,
.max_finger_cnt = 5, .max_touch_cnt = 5,
.supports_t5r2 = 0, .support_semi_mt = 0, .is_button_pad = 1,
.has_wheel = 0, .wheel_is_hi_res = 0,
.is_haptic_pad = 0,
};
namespace gestures {
class BoxFilterInterpreterTest : public ::testing::Test {};
class BoxFilterInterpreterTestInterpreter : public Interpreter {
public:
BoxFilterInterpreterTestInterpreter()
: Interpreter(nullptr, nullptr, false),
handle_timer_called_(false) {}
virtual void SyncInterpret(HardwareState& hwstate, stime_t* timeout) {
EXPECT_EQ(1, hwstate.finger_cnt);
prev_ = hwstate.fingers[0];
}
virtual void HandleTimer(stime_t now, stime_t* timeout) {
handle_timer_called_ = true;
}
FingerState prev_;
bool handle_timer_called_;
};
struct InputAndExpectedOutput {
float in;
float out;
};
TEST(BoxFilterInterpreterTest, SimpleTest) {
BoxFilterInterpreterTestInterpreter* base_interpreter =
new BoxFilterInterpreterTestInterpreter;
BoxFilterInterpreter interpreter(nullptr, base_interpreter, nullptr);
interpreter.box_width_.val_ = 1.0;
interpreter.box_height_.val_ = 1.0;
TestInterpreterWrapper wrapper(&interpreter, &hwprops);
EXPECT_FALSE(base_interpreter->handle_timer_called_);
wrapper.HandleTimer(0.0, nullptr);
EXPECT_TRUE(base_interpreter->handle_timer_called_);
FingerState fs = { 0, 0, 0, 0, 1, 0, 3.0, 0.0, 1, 0 };
HardwareState hs = make_hwstate(0.0, 0, 1, 1, &fs);
InputAndExpectedOutput data[] = {
{ 3.0, 3.0 },
{ 4.0, 3.5 },
{ 3.0, 3.5 },
{ 4.0, 3.5 },
{ 5.0, 4.5 },
{ 6.0, 5.5 },
{ 5.0, 5.5 },
{ 4.0, 4.5 },
};
stime_t now = 0.0;
const stime_t kTimeDelta = 0.01;
for (size_t i = 0; i < arraysize(data); i++) {
now += kTimeDelta;
hs.timestamp = now;
fs.position_y = data[i].in;
wrapper.SyncInterpret(hs, nullptr);
EXPECT_FLOAT_EQ(data[i].out, fs.position_y) << "i=" << i;
}
}
TEST(BoxFilterInterpreterTest, ZeroSizeBoxTest) {
BoxFilterInterpreterTestInterpreter* base_interpreter =
new BoxFilterInterpreterTestInterpreter;
BoxFilterInterpreter interpreter(nullptr, base_interpreter, nullptr);
interpreter.box_width_.val_ = 0.0;
interpreter.box_height_.val_ = 0.0;
TestInterpreterWrapper wrapper(&interpreter, &hwprops);
EXPECT_FALSE(base_interpreter->handle_timer_called_);
wrapper.HandleTimer(0.0, nullptr);
EXPECT_TRUE(base_interpreter->handle_timer_called_);
FingerState fs = { 0, 0, 0, 0, 1, 0, 3.0, 0.0, 1, 0 };
HardwareState hs = make_hwstate(0.0, 0, 1, 1, &fs);
InputAndExpectedOutput data[] = {
{ 3.0, 3.0 },
{ 4.0, 4.0 },
{ 3.0, 3.0 },
{ 4.0, 4.0 },
{ 5.0, 5.0 },
{ 6.0, 6.0 },
{ 5.0, 5.0 },
{ 4.0, 4.0 },
};
stime_t now = 0.0;
const stime_t kTimeDelta = 0.01;
for (size_t i = 0; i < arraysize(data); i++) {
now += kTimeDelta;
hs.timestamp = now;
fs.position_y = data[i].in;
wrapper.SyncInterpret(hs, nullptr);
EXPECT_FLOAT_EQ(data[i].out, fs.position_y) << "i=" << i;
}
}
} // namespace gestures