// Copyright 2014 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 #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/chromeos/display_configurator.h" #include "ui/display/chromeos/test/test_display_snapshot.h" #include "ui/display/chromeos/touchscreen_delegate_impl.h" #include "ui/display/types/chromeos/touchscreen_device_manager.h" namespace ui { namespace { class MockTouchscreenDeviceManager : public TouchscreenDeviceManager { public: MockTouchscreenDeviceManager() {} virtual ~MockTouchscreenDeviceManager() {} void AddDevice(const TouchscreenDevice& device) { devices_.push_back(device); } // TouchscreenDeviceManager overrides: virtual std::vector GetDevices() OVERRIDE { return devices_; } private: std::vector devices_; DISALLOW_COPY_AND_ASSIGN(MockTouchscreenDeviceManager); }; } // namespace class TouchscreenDelegateImplTest : public testing::Test { public: TouchscreenDelegateImplTest() {} virtual ~TouchscreenDelegateImplTest() {} virtual void SetUp() OVERRIDE { device_manager_ = new MockTouchscreenDeviceManager(); delegate_.reset(new TouchscreenDelegateImpl( scoped_ptr(device_manager_))); // Internal display. Must not be matched to a touch screen unless the size // matches. TestDisplaySnapshot* snapshot = new TestDisplaySnapshot(); DisplayMode* mode = new DisplayMode(gfx::Size(1920, 1080), false, 60.0); snapshot->set_type(DISPLAY_CONNECTION_TYPE_INTERNAL); snapshot->set_modes(std::vector(1, mode)); snapshot->set_native_mode(mode); displays_.push_back(snapshot); snapshot = new TestDisplaySnapshot(); mode = new DisplayMode(gfx::Size(800, 600), false, 60.0); snapshot->set_modes(std::vector(1, mode)); snapshot->set_native_mode(mode); displays_.push_back(snapshot); // Display without native mode. Must not be matched to any touch screen. displays_.push_back(new TestDisplaySnapshot()); snapshot = new TestDisplaySnapshot(); mode = new DisplayMode(gfx::Size(1024, 768), false, 60.0); snapshot->set_modes(std::vector(1, mode)); snapshot->set_native_mode(mode); displays_.push_back(snapshot); } virtual void TearDown() OVERRIDE { // The snapshots do not own the modes, so we need to delete them. for (size_t i = 0; i < displays_.size(); ++i) { if (displays_[i]->native_mode()) delete displays_[i]->native_mode(); } displays_.clear(); } std::vector GetDisplayStates() { std::vector states(displays_.size()); for (size_t i = 0; i < displays_.size(); ++i) states[i].display = displays_[i]; return states; } protected: MockTouchscreenDeviceManager* device_manager_; // Not owned. scoped_ptr delegate_; ScopedVector displays_; private: DISALLOW_COPY_AND_ASSIGN(TouchscreenDelegateImplTest); }; TEST_F(TouchscreenDelegateImplTest, NoTouchscreens) { std::vector display_states = GetDisplayStates(); delegate_->AssociateTouchscreens(&display_states); for (size_t i = 0; i < display_states.size(); ++i) EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[i].touch_device_id); } TEST_F(TouchscreenDelegateImplTest, OneToOneMapping) { device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(800, 600))); device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768))); std::vector display_states = GetDisplayStates(); delegate_->AssociateTouchscreens(&display_states); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id); EXPECT_EQ(1, display_states[1].touch_device_id); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id); EXPECT_EQ(2, display_states[3].touch_device_id); } TEST_F(TouchscreenDelegateImplTest, MapToCorrectDisplaySize) { device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768))); std::vector display_states = GetDisplayStates(); delegate_->AssociateTouchscreens(&display_states); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[1].touch_device_id); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id); EXPECT_EQ(2, display_states[3].touch_device_id); } TEST_F(TouchscreenDelegateImplTest, MapWhenSizeDiffersByOne) { device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(801, 600))); device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1023, 768))); std::vector display_states = GetDisplayStates(); delegate_->AssociateTouchscreens(&display_states); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id); EXPECT_EQ(1, display_states[1].touch_device_id); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id); EXPECT_EQ(2, display_states[3].touch_device_id); } TEST_F(TouchscreenDelegateImplTest, MapWhenSizesDoNotMatch) { device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(1022, 768))); device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(802, 600))); std::vector display_states = GetDisplayStates(); delegate_->AssociateTouchscreens(&display_states); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id); EXPECT_EQ(1, display_states[1].touch_device_id); EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id); EXPECT_EQ(2, display_states[3].touch_device_id); } } // namespace ui