Unity 8
__init__.py
1 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2 #
3 # Unity Indicators Autopilot Test Suite
4 # Copyright (C) 2015 Canonical
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18 import ubuntuuitoolkit
19 from autopilot import introspection
20 
21 from unity8.shell import emulators
22 from unity8 import fixture_setup
23 
24 
25 class IndicatorPage(emulators.UnityEmulatorBase):
26 
27  """Autopilot helper for the IndicatorPage component."""
28 
29  # XXX Because of https://bugs.launchpad.net/autopilot-qt/+bug/1341671
30  # we need to make sure it does not match in any selection.
31  # --elopio - 2015-01-20
32 
33  @classmethod
34  def validate_dbus_object(cls, path, state):
35  return False
36 
37 class Indicator():
38 
39  def __init__(self, main_window, name):
40  self._main_window = main_window
41  self._name = name
42 
43  def is_indicator_icon_visible(self):
44  panel_item = self._main_window.wait_select_single(
45  objectName=self._name+'-panelItem')
46  return panel_item.indicatorVisible
47 
48  def open(self):
49  """Open the indicator page.
50 
51  :return: The custom proxy object for the indicator page.
52 
53  """
54  if self.is_indicator_icon_visible():
55  return self._main_window.open_indicator_page(self._name)
56  else:
57  return self._open_indicator_with_icon_not_visible()
58 
59  def _open_indicator_with_icon_not_visible(self):
60  # Open any displayed indicator.
61  self._main_window.open_indicator_page('indicator-datetime')
62  self._make_indicator_icon_visible()
63  indicator_rotation_icon = self._main_window.select_single(
64  objectName=self._name+'-panelItem')
65  self._main_window.pointing_device.click_object(indicator_rotation_icon)
66  return self._main_window.wait_select_single(
67  objectName=self._name+'-page')
68 
69  def _make_indicator_icon_visible(self):
70  indicators_bar_flickable = self._main_window.select_single(
71  'IndicatorsBar').select_single(
72  ubuntuuitoolkit.QQuickFlickable, objectName='flickable')
73  self._swipe_flickable_to_x_end(indicators_bar_flickable)
74 
75  def _swipe_flickable_to_x_end(self, flickable):
76  # XXX this should be implemented as a general horizontal swiping in
77  # the toolkit custom proxy object. -- elopio - 2015-01-20
78  if not flickable.atXEnd:
79  while not flickable.atXEnd:
80  start_y = stop_y = (
81  flickable.globalRect.y +
82  (flickable.globalRect.height // 2))
83  # We can't start the swipe from the border because it would
84  # open the launcher
85  start_x = flickable.globalRect.x + 45
86  stop_x = (
87  flickable.globalRect.x + flickable.globalRect.width - 5)
88  flickable.pointing_device.drag(
89  start_x, start_y, stop_x, stop_y)
90  flickable.dragging.wait_for(False)
91  flickable.moving.wait_for(False)
92 
93  def close(self):
94  """Close the indicator page."""
95  self._main_window.close_indicator_page()
96 
97 
98 class DisplayIndicator(Indicator):
99 
100  def __init__(self, main_window):
101  super(DisplayIndicator, self).__init__(main_window, 'indicator-rotation-lock')
102  self._main_window = main_window
103 
104 
106 
107  """Autopilot helper for the display indicator page."""
108 
109  @classmethod
110  def validate_dbus_object(cls, path, state):
111  name = introspection.get_classname_from_path(path)
112  if name == b'IndicatorPage':
113  if state['objectName'][1] == 'indicator-rotation-lock-page':
114  return True
115  return False
116 
117  def lock_rotation(self):
118  """Toggle the rotation lock indicator to locked."""
119  switcher = self._get_switcher()
120  switcher.check()
121  switcher.checked.wait_for(True)
122 
123  def _get_switcher(self):
124  return self.select_single(
125  ubuntuuitoolkit.CheckBox, objectName='switcher')
126 
127  def unlock_rotation(self):
128  """Toggle the rotation lock indicator to unlocked."""
129  switcher = self._get_switcher()
130  switcher.uncheck()
131  switcher.checked.wait_for(False)
132 
133 
134 class TestIndicator(Indicator):
135 
136  def __init__(self, main_window):
137  super(TestIndicator, self).__init__(main_window, 'indicator-mock')
138  self._main_window = main_window
139 
140 
142 
143  """Autopilot helper for the mock indicator page."""
144 
145  @classmethod
146  def validate_dbus_object(cls, path, state):
147  name = introspection.get_classname_from_path(path)
148  if name == b'IndicatorPage':
149  if state['objectName'][1] == 'indicator-mock-page':
150  return True
151  return False
152 
153  def get_switcher(self):
154  return self.select_single(
155  ubuntuuitoolkit.CheckBox, objectName='switcher')
156 
157  def get_switch_menu(self):
158  return self.select_single(
159  'SwitchMenu', objectName='indicator.action.switch')
160 
161  def get_slider(self):
162  return self.select_single(objectName='slider')
163 
164  def get_slider_menu(self):
165  return self.select_single(objectName='indicator.action.slider')
166 
167 
168 class Slider(emulators.UnityEmulatorBase):
169 
170  """Autopilot helper for the Slider component."""
171 
172  # XXX Because of https://bugs.launchpad.net/autopilot-qt/+bug/1341671
173  # we need to make sure it does not match in any selection.
174  # --elopio - 2015-01-20
175 
176  @classmethod
177  def validate_dbus_object(cls, path, state):
178  name = introspection.get_classname_from_path(path)
179  if name == b'Slider':
180  return True
181  return False
182 
183  def slide_left(self, timeout=10):
184  x, y, width, height = self.globalRect
185 
186  rate = 5
187  start_x = x + width/2
188  start_y = stop_y = y + height/2
189  stop_x = x
190 
191  self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate)
192  self.value.wait_for(self.minimumValue, timeout);
193 
194  def slide_right(self, timeout=10):
195  x, y, width, height = self.globalRect
196 
197  rate = 5
198  start_x = x + width/2
199  start_y = stop_y = y + height/2
200  stop_x = x + width
201 
202  self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate)
203  self.value.wait_for(self.maximumValue, timeout);