Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Unified Diff: ui/events/ozone/evdev/touch_noise/touch_noise_remover_unittest.cc

Issue 991533002: Port Chromium OS touch noise filtering to Chromium (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/events/ozone/evdev/touch_noise/touch_noise_remover_unittest.cc
diff --git a/ui/events/ozone/evdev/touch_noise/touch_noise_remover_unittest.cc b/ui/events/ozone/evdev/touch_noise/touch_noise_remover_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..75a6ff35679e1f69e3c3d7fbdd73e5d8f7d15273
--- /dev/null
+++ b/ui/events/ozone/evdev/touch_noise/touch_noise_remover_unittest.cc
@@ -0,0 +1,144 @@
+// Copyright 2015 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 "ui/events/ozone/evdev/touch_noise/touch_noise_remover.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/stringprintf.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
+
+namespace ui {
+
+namespace {
+
+bool TouchEventParamsEquals(const TouchEventParams& p1,
+ const TouchEventParams& p2) {
+ return p1.device_id == p2.device_id && p1.touch_id == p2.touch_id &&
+ p1.tracking_id == p2.tracking_id && p1.type == p2.type &&
+ p1.location == p2.location && p1.radii == p2.radii &&
+ p1.pressure == p2.pressure && p1.timestamp == p2.timestamp;
+}
+
+} // namespace
+
+class TouchNoiseRemoverTest : public testing::Test {
+ public:
+ struct TouchEntry {
+ int time_ms;
+ int touch_id;
+ ui::EventType type;
+ gfx::PointF location;
+ bool should_be_canceled;
+ };
+
+ TouchNoiseRemoverTest() {}
+ ~TouchNoiseRemoverTest() override {}
+
+ bool FilterAndCheck(const TouchEntry entries[], size_t count) {
+ std::vector<TouchEventParams> params;
+ std::vector<TouchEventParams> expected_params;
+ for (size_t i = 0; i < count; ++i) {
+ const TouchEntry& entry = entries[i];
+ int entry_time_ms = entry.time_ms;
+ params.push_back(
+ TouchEventParams(0, entry.touch_id, entry.touch_id, entry.type,
+ entry.location, gfx::Vector2dF(), 0.0f,
+ base::TimeDelta::FromMilliseconds(entry_time_ms)));
+ if (!entry.should_be_canceled)
+ expected_params.push_back(params.back());
+
+ if (i == count - 1 || entry_time_ms != entries[i + 1].time_ms) {
+ touch_noise_remover_->RemoveNoise(
+ &params, base::TimeDelta::FromMilliseconds(entry_time_ms));
+ if (params.size() != expected_params.size() ||
+ !std::equal(params.begin(), params.end(), expected_params.begin(),
+ TouchEventParamsEquals)) {
+ LOG(ERROR) << base::StringPrintf("Incorrect filtering at %dms",
+ entry_time_ms);
+ return false;
+ }
+
+ params.clear();
+ expected_params.clear();
+ }
+ }
+
+ return true;
+ }
+
+ private:
+ // testing::Test:
+ void SetUp() override {
+ touch_noise_remover_.reset(new TouchNoiseRemover);
+ }
+
+ scoped_ptr<TouchNoiseRemover> touch_noise_remover_;
+
+ DISALLOW_COPY_AND_ASSIGN(TouchNoiseRemoverTest);
+};
+
+// Test that taps which are far apart in quick succession are considered noise.
+TEST_F(TouchNoiseRemoverTest, FarApartTaps) {
+ const TouchEntry kTestData[] = {
+ {10, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), false},
+ {20, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 11), false},
+ {30, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 12), false},
+ {30, 2, ui::ET_TOUCH_PRESSED, gfx::PointF(2500, 1000), true},
+ {40, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 13), true},
+ {40, 2, ui::ET_TOUCH_MOVED, gfx::PointF(2500, 1001), true},
+ {50, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 14), true},
+ {50, 2, ui::ET_TOUCH_RELEASED, gfx::PointF(2500, 1002), true},
+ {60, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 15), true}};
+ EXPECT_TRUE(FilterAndCheck(kTestData, arraysize(kTestData)));
+}
+
+// Test that taps which are far apart but do not occur in quick succession are
+// not considered noise.
+TEST_F(TouchNoiseRemoverTest, FarApartTapsSlow) {
+ const TouchEntry kTestData[] = {
+ {1000, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), false},
+ {1500, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 11), false},
+ {2000, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 12), false},
+ {2500, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 13), false},
+ {2500, 2, ui::ET_TOUCH_PRESSED, gfx::PointF(2500, 1000), false},
+ {3000, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 14), false},
+ {3000, 2, ui::ET_TOUCH_RELEASED, gfx::PointF(2500, 1001), false},
+ {3500, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 15), false}};
+ EXPECT_TRUE(FilterAndCheck(kTestData, arraysize(kTestData)));
+}
+
+// Test that touches which are horizontally aligned are considered noise.
+TEST_F(TouchNoiseRemoverTest, HorizontallyAligned) {
+ const TouchEntry kTestData[] = {
+ {10, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), false},
+ {20, 1, ui::ET_TOUCH_MOVED, gfx::PointF(10, 10), false},
+ {20, 2, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 25), true},
+ {30, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 10), false},
+ {30, 2, ui::ET_TOUCH_MOVED, gfx::PointF(10, 25), true},
+ {40, 2, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 25), true}};
+ EXPECT_TRUE(FilterAndCheck(kTestData, arraysize(kTestData)));
+}
+
+// Test that touches in the same position are considered noise.
+TEST_F(TouchNoiseRemoverTest, SamePosition) {
+ const TouchEntry kTestData[] = {
+ {1000, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), false},
+ {1500, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 10), false},
+ {2000, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), false},
+ {2500, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 10), false},
+ {3000, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(50, 50), false},
+ {3500, 1, ui::ET_TOUCH_MOVED, gfx::PointF(50, 51), false},
+ {3500, 2, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), true},
+ {4000, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(50, 52), false},
+ {4000, 2, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 10), true},
+ {4500, 1, ui::ET_TOUCH_PRESSED, gfx::PointF(10, 10), true},
+ {5000, 1, ui::ET_TOUCH_RELEASED, gfx::PointF(10, 10), true}};
+ EXPECT_TRUE(FilterAndCheck(kTestData, arraysize(kTestData)));
+}
flackr 2015/03/10 05:23:40 Thanks for adding unit tests! The cancel behavior
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698