blob: b41fbdbacc0d973064ad703717d4d6f10475d9d4 [file] [log] [blame]
// 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 <vector>
#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<TouchscreenDevice> GetDevices() OVERRIDE {
return devices_;
}
private:
std::vector<TouchscreenDevice> 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<TouchscreenDeviceManager>(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<const DisplayMode*>(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<const DisplayMode*>(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<const DisplayMode*>(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<DisplayConfigurator::DisplayState> GetDisplayStates() {
std::vector<DisplayConfigurator::DisplayState> 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<TouchscreenDelegateImpl> delegate_;
ScopedVector<DisplaySnapshot> displays_;
private:
DISALLOW_COPY_AND_ASSIGN(TouchscreenDelegateImplTest);
};
TEST_F(TouchscreenDelegateImplTest, NoTouchscreens) {
std::vector<DisplayConfigurator::DisplayState> 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<DisplayConfigurator::DisplayState> 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<DisplayConfigurator::DisplayState> 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<DisplayConfigurator::DisplayState> 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<DisplayConfigurator::DisplayState> 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