Home | History | Annotate | Download | only in chromeos
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/memory/scoped_vector.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 #include "ui/display/chromeos/display_configurator.h"
     11 #include "ui/display/chromeos/test/test_display_snapshot.h"
     12 #include "ui/display/chromeos/touchscreen_delegate_impl.h"
     13 #include "ui/display/types/chromeos/touchscreen_device_manager.h"
     14 
     15 namespace ui {
     16 
     17 namespace {
     18 
     19 class MockTouchscreenDeviceManager : public TouchscreenDeviceManager {
     20  public:
     21   MockTouchscreenDeviceManager() {}
     22   virtual ~MockTouchscreenDeviceManager() {}
     23 
     24   void AddDevice(const TouchscreenDevice& device) {
     25     devices_.push_back(device);
     26   }
     27 
     28   // TouchscreenDeviceManager overrides:
     29   virtual std::vector<TouchscreenDevice> GetDevices() OVERRIDE {
     30     return devices_;
     31   }
     32 
     33  private:
     34   std::vector<TouchscreenDevice> devices_;
     35 
     36   DISALLOW_COPY_AND_ASSIGN(MockTouchscreenDeviceManager);
     37 };
     38 
     39 }  // namespace
     40 
     41 class TouchscreenDelegateImplTest : public testing::Test {
     42  public:
     43   TouchscreenDelegateImplTest() {}
     44   virtual ~TouchscreenDelegateImplTest() {}
     45 
     46   virtual void SetUp() OVERRIDE {
     47     device_manager_ = new MockTouchscreenDeviceManager();
     48     delegate_.reset(new TouchscreenDelegateImpl(
     49         scoped_ptr<TouchscreenDeviceManager>(device_manager_)));
     50 
     51     // Internal display will always match to internal touchscreen. If internal
     52     // touchscreen can't be detected, it is then associated to a touch screen
     53     // with matching size.
     54     TestDisplaySnapshot* snapshot = new TestDisplaySnapshot();
     55     DisplayMode* mode = new DisplayMode(gfx::Size(1920, 1080), false, 60.0);
     56     snapshot->set_type(DISPLAY_CONNECTION_TYPE_INTERNAL);
     57     snapshot->set_modes(std::vector<const DisplayMode*>(1, mode));
     58     snapshot->set_native_mode(mode);
     59     displays_.push_back(snapshot);
     60 
     61     snapshot = new TestDisplaySnapshot();
     62     mode = new DisplayMode(gfx::Size(800, 600), false, 60.0);
     63     snapshot->set_modes(std::vector<const DisplayMode*>(1, mode));
     64     snapshot->set_native_mode(mode);
     65     displays_.push_back(snapshot);
     66 
     67     // Display without native mode. Must not be matched to any touch screen.
     68     displays_.push_back(new TestDisplaySnapshot());
     69 
     70     snapshot = new TestDisplaySnapshot();
     71     mode = new DisplayMode(gfx::Size(1024, 768), false, 60.0);
     72     snapshot->set_modes(std::vector<const DisplayMode*>(1, mode));
     73     snapshot->set_native_mode(mode);
     74     displays_.push_back(snapshot);
     75   }
     76 
     77   virtual void TearDown() OVERRIDE {
     78     // The snapshots do not own the modes, so we need to delete them.
     79     for (size_t i = 0; i < displays_.size(); ++i) {
     80       if (displays_[i]->native_mode())
     81         delete displays_[i]->native_mode();
     82     }
     83 
     84     displays_.clear();
     85   }
     86 
     87   std::vector<DisplayConfigurator::DisplayState> GetDisplayStates() {
     88     std::vector<DisplayConfigurator::DisplayState> states(displays_.size());
     89     for (size_t i = 0; i < displays_.size(); ++i)
     90       states[i].display = displays_[i];
     91 
     92     return states;
     93   }
     94 
     95  protected:
     96   MockTouchscreenDeviceManager* device_manager_;  // Not owned.
     97   scoped_ptr<TouchscreenDelegateImpl> delegate_;
     98   ScopedVector<DisplaySnapshot> displays_;
     99 
    100  private:
    101   DISALLOW_COPY_AND_ASSIGN(TouchscreenDelegateImplTest);
    102 };
    103 
    104 TEST_F(TouchscreenDelegateImplTest, NoTouchscreens) {
    105   std::vector<DisplayConfigurator::DisplayState> display_states =
    106       GetDisplayStates();
    107   delegate_->AssociateTouchscreens(&display_states);
    108 
    109   for (size_t i = 0; i < display_states.size(); ++i)
    110     EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[i].touch_device_id);
    111 }
    112 
    113 TEST_F(TouchscreenDelegateImplTest, OneToOneMapping) {
    114   device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(800, 600), false));
    115   device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768), false));
    116 
    117   std::vector<DisplayConfigurator::DisplayState> display_states =
    118       GetDisplayStates();
    119   delegate_->AssociateTouchscreens(&display_states);
    120 
    121   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id);
    122   EXPECT_EQ(1, display_states[1].touch_device_id);
    123   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
    124   EXPECT_EQ(2, display_states[3].touch_device_id);
    125 }
    126 
    127 TEST_F(TouchscreenDelegateImplTest, MapToCorrectDisplaySize) {
    128   device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768), false));
    129 
    130   std::vector<DisplayConfigurator::DisplayState> display_states =
    131       GetDisplayStates();
    132   delegate_->AssociateTouchscreens(&display_states);
    133 
    134   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id);
    135   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[1].touch_device_id);
    136   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
    137   EXPECT_EQ(2, display_states[3].touch_device_id);
    138 }
    139 
    140 TEST_F(TouchscreenDelegateImplTest, MapWhenSizeDiffersByOne) {
    141   device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(801, 600), false));
    142   device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1023, 768), false));
    143 
    144   std::vector<DisplayConfigurator::DisplayState> display_states =
    145       GetDisplayStates();
    146   delegate_->AssociateTouchscreens(&display_states);
    147 
    148   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id);
    149   EXPECT_EQ(1, display_states[1].touch_device_id);
    150   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
    151   EXPECT_EQ(2, display_states[3].touch_device_id);
    152 }
    153 
    154 TEST_F(TouchscreenDelegateImplTest, MapWhenSizesDoNotMatch) {
    155   device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(1022, 768), false));
    156   device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(802, 600), false));
    157 
    158   std::vector<DisplayConfigurator::DisplayState> display_states =
    159       GetDisplayStates();
    160   delegate_->AssociateTouchscreens(&display_states);
    161 
    162   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[0].touch_device_id);
    163   EXPECT_EQ(1, display_states[1].touch_device_id);
    164   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
    165   EXPECT_EQ(2, display_states[3].touch_device_id);
    166 }
    167 
    168 TEST_F(TouchscreenDelegateImplTest, MapInternalTouchscreen) {
    169   device_manager_->AddDevice(
    170       TouchscreenDevice(1, gfx::Size(1920, 1080), false));
    171   device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(9999, 888), true));
    172 
    173   std::vector<DisplayConfigurator::DisplayState> display_states =
    174       GetDisplayStates();
    175   delegate_->AssociateTouchscreens(&display_states);
    176 
    177   // Internal touchscreen is always mapped to internal display.
    178   EXPECT_EQ(2, display_states[0].touch_device_id);
    179   EXPECT_EQ(1, display_states[1].touch_device_id);
    180   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
    181   EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[3].touch_device_id);
    182 }
    183 
    184 }  // namespace ui
    185