Add unittests for CastTouchDeviceManager

Ensure the touch device events are scaled correctly.

Bug: b/72054342
Test: Compiled and ran unittests
Change-Id: I40b9d1dac5f49f7c4cf7f38bf047f8a75e908d49
Reviewed-on: https://chromium-review.googlesource.com/932962
Commit-Queue: Daniel Nicoara <[email protected]>
Reviewed-by: Michael Spang <[email protected]>
Reviewed-by: Sergey Volk <[email protected]>
Cr-Commit-Position: refs/heads/master@{#539521}
diff --git a/chromecast/browser/cast_touch_device_manager_unittest.cc b/chromecast/browser/cast_touch_device_manager_unittest.cc
new file mode 100644
index 0000000..e435a12
--- /dev/null
+++ b/chromecast/browser/cast_touch_device_manager_unittest.cc
@@ -0,0 +1,128 @@
+// Copyright 2018 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 "chromecast/browser/cast_touch_device_manager.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/devices/device_data_manager.h"
+#include "ui/events/devices/device_hotplug_event_observer.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace {
+
+constexpr int64_t kDisplayId = 1;
+constexpr int kTouchDeviceId = 100;
+
+}  // namespace
+
+class CastTouchDeviceManagerTest : public testing::Test {
+ public:
+  CastTouchDeviceManagerTest() {}
+
+  void SetUp() override {
+    ui::DeviceDataManager::CreateInstance();
+    touch_device_manager_ =
+        std::make_unique<chromecast::shell::CastTouchDeviceManager>();
+  }
+
+  void TearDown() override {
+    touch_device_manager_.reset();
+    ui::DeviceDataManager::DeleteInstance();
+  }
+
+  ui::DeviceHotplugEventObserver* GetHotplugObserver() {
+    return ui::DeviceDataManager::GetInstance();
+  }
+
+ protected:
+  std::unique_ptr<chromecast::shell::CastTouchDeviceManager>
+      touch_device_manager_;
+};
+
+TEST_F(CastTouchDeviceManagerTest, CheckOneToOneMapping) {
+  std::vector<ui::TouchscreenDevice> touchscreens;
+  const gfx::Size display_size = gfx::Size(1280, 720);
+  touch_device_manager_->OnDisplayConfigured(
+      kDisplayId, display::Display::ROTATE_0, gfx::Rect(display_size));
+  touchscreens.push_back(ui::TouchscreenDevice(kTouchDeviceId,
+                                               ui::INPUT_DEVICE_INTERNAL,
+                                               "Touchscreen", display_size, 1));
+  GetHotplugObserver()->OnTouchscreenDevicesUpdated(touchscreens);
+
+  // 1:1 mapping for touch coordinates to display coordinates.
+  {
+    float x = display_size.width(), y = display_size.height();
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(display_size.width(), x);
+    EXPECT_EQ(display_size.height(), y);
+  }
+
+  {
+    float x = display_size.width(), y = 0;
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(display_size.width(), x);
+    EXPECT_EQ(0, y);
+  }
+
+  {
+    float x = 0, y = display_size.height();
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(0, x);
+    EXPECT_EQ(display_size.height(), y);
+  }
+
+  {
+    float x = display_size.width() / 2, y = display_size.height() / 2;
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(1, &x, &y);
+    EXPECT_EQ(display_size.width() / 2, x);
+    EXPECT_EQ(display_size.height() / 2, y);
+  }
+}
+
+TEST_F(CastTouchDeviceManagerTest, CheckMappingWithLargerTouchscreen) {
+  std::vector<ui::TouchscreenDevice> touchscreens;
+  const gfx::Size display_size = gfx::Size(1280, 720);
+  touch_device_manager_->OnDisplayConfigured(
+      kDisplayId, display::Display::ROTATE_0, gfx::Rect(display_size));
+  touchscreens.push_back(ui::TouchscreenDevice(
+      kTouchDeviceId, ui::INPUT_DEVICE_INTERNAL, "Touchscreen",
+      gfx::ScaleToRoundedSize(display_size, 2, 2), 1));
+  GetHotplugObserver()->OnTouchscreenDevicesUpdated(touchscreens);
+
+  // Touch screen is twice the size, so transformed events will be half the
+  // reported value.
+  {
+    float x = display_size.width(), y = display_size.height();
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(display_size.width() / 2, x);
+    EXPECT_EQ(display_size.height() / 2, y);
+  }
+
+  {
+    float x = display_size.width(), y = 0;
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(display_size.width() / 2, x);
+    EXPECT_EQ(0, y);
+  }
+
+  {
+    float x = 0, y = display_size.height();
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(0, x);
+    EXPECT_EQ(display_size.height() / 2, y);
+  }
+
+  {
+    float x = display_size.width() / 2, y = display_size.height() / 2;
+    ui::DeviceDataManager::GetInstance()->ApplyTouchTransformer(kTouchDeviceId,
+                                                                &x, &y);
+    EXPECT_EQ(display_size.width() / 4, x);
+    EXPECT_EQ(display_size.height() / 4, y);
+  }
+}