1
from testtools import TestCase
2
from testtools.matchers import Equals
4
from autopilot.emulators.unity import Launcher
5
from autopilot.glibrunner import GlibRunner
7
class LauncherTests(TestCase):
8
run_test_with = GlibRunner
1
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2
# Copyright 2012 Canonical
3
# Authors: Thomi Richards,
4
# Marco Trevisan (TreviƱo)
6
# This program is free software: you can redistribute it and/or modify it
7
# under the terms of the GNU General Public License version 3, as published
8
# by the Free Software Foundation.
11
from testtools.matchers import Equals, NotEquals, LessThan, GreaterThan
12
from time import sleep
14
from autopilot.tests import AutopilotTestCase
15
from autopilot.emulators.X11 import ScreenGeometry
17
logger = logging.getLogger(__name__)
19
def _make_scenarios():
20
"""Make scenarios for launcher test cases based on the number of configured
23
screen_geometry = ScreenGeometry()
24
num_monitors = screen_geometry.get_num_monitors()
26
return [('Single Monitor', {'launcher_num': 0})]
28
return [('Monitor %d' % (i), {'launcher_num': i}) for i in range(num_monitors)]
31
class ScenariodLauncherTests(AutopilotTestCase):
32
"""A base class for all launcher tests that want to use scenarios to run on
33
each launcher (for multi-monitor setups).
36
scenarios = _make_scenarios()
38
def get_launcher(self):
39
"""Get the launcher for the current scenario."""
40
return self.launcher.get_launcher_for_monitor(self.launcher_num)
43
super(ScenariodLauncherTests, self).setUp()
44
self.set_unity_log_level("unity.launcher", "DEBUG")
47
class LauncherTests(ScenariodLauncherTests):
48
"""Test the launcher."""
11
51
super(LauncherTests, self).setUp()
12
self.server = Launcher()
54
def test_launcher_switcher_starts_at_index_zero(self):
55
"""Test that starting the Launcher switcher puts the keyboard focus on item 0."""
57
launcher_instance = self.get_launcher()
58
launcher_instance.switcher_start()
59
self.addCleanup(launcher_instance.switcher_end, True)
62
self.assertThat(self.launcher.key_nav_is_active, Equals(True))
63
self.assertThat(self.launcher.key_nav_is_grabbed, Equals(False))
64
self.assertThat(self.launcher.key_nav_selection, Equals(0))
66
def test_launcher_switcher_end_works(self):
67
"""Test that ending the launcher switcher actually works."""
69
launcher_instance = self.get_launcher()
70
launcher_instance.switcher_start()
72
launcher_instance.switcher_end(cancel=True)
74
self.assertThat(self.launcher.key_nav_is_active, Equals(False))
76
def test_launcher_switcher_escape_works(self):
77
"""Test that ending the launcher switcher actually works."""
79
launcher_instance = self.get_launcher()
80
launcher_instance.switcher_start()
81
self.addCleanup(launcher_instance.switcher_end, True)
83
self.assertThat(self.launcher.key_nav_is_active, Equals(True))
85
self.keyboard.press_and_release("Escape")
87
self.assertThat(self.launcher.key_nav_is_active, Equals(False))
89
def test_launcher_switcher_next_works(self):
90
"""Moving to the next launcher item while switcher is activated must work."""
92
launcher_instance = self.get_launcher()
93
launcher_instance.switcher_start()
94
self.addCleanup(launcher_instance.switcher_end, True)
97
launcher_instance.switcher_next()
99
self.assertThat(self.launcher.key_nav_selection, Equals(1))
101
def test_launcher_switcher_prev_works(self):
102
"""Moving to the previous launcher item while switcher is activated must work."""
104
launcher_instance = self.get_launcher()
105
launcher_instance.switcher_start()
106
self.addCleanup(launcher_instance.switcher_end, True)
108
self.assertThat(self.launcher.key_nav_selection, Equals(0))
110
launcher_instance.switcher_prev()
112
self.assertThat(self.launcher.key_nav_selection, NotEquals(0))
114
def test_launcher_switcher_down_works(self):
115
"""Pressing the down arrow key while switcher is activated must work."""
117
launcher_instance = self.get_launcher()
118
launcher_instance.switcher_start()
119
self.addCleanup(launcher_instance.switcher_end, True)
121
self.assertThat(self.launcher.key_nav_selection, Equals(0))
123
launcher_instance.switcher_down()
125
self.assertThat(self.launcher.key_nav_selection, Equals(1))
127
def test_launcher_switcher_up_works(self):
128
"""Pressing the up arrow key while switcher is activated must work."""
130
launcher_instance = self.get_launcher()
131
launcher_instance.switcher_start()
132
self.addCleanup(launcher_instance.switcher_end, True)
134
self.assertThat(self.launcher.key_nav_selection, Equals(0))
136
launcher_instance.switcher_up()
138
self.assertThat(self.launcher.key_nav_selection, NotEquals(0))
140
def test_launcher_switcher_next_doesnt_show_shortcuts(self):
141
"""Moving forward in launcher switcher must not show launcher shortcuts."""
143
launcher_instance = self.get_launcher()
144
launcher_instance.switcher_start()
145
self.addCleanup(launcher_instance.switcher_end, True)
147
launcher_instance.switcher_next()
149
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(False))
151
def test_launcher_switcher_prev_doesnt_show_shortcuts(self):
152
"""Moving backward in launcher switcher must not show launcher shortcuts."""
154
launcher_instance = self.get_launcher()
155
launcher_instance.switcher_start()
156
self.addCleanup(launcher_instance.switcher_end, True)
158
launcher_instance.switcher_next()
160
launcher_instance.switcher_prev()
162
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(False))
165
def test_launcher_switcher_cycling_forward(self):
166
"""Launcher Switcher must loop through icons when cycling forwards"""
168
launcher_instance = self.get_launcher()
169
launcher_instance.switcher_start()
170
self.addCleanup(launcher_instance.switcher_end, True)
174
num_icons = self.launcher.model.num_launcher_icons()
175
logger.info("This launcher has %d icons", num_icons)
176
for icon in range(1, num_icons):
177
launcher_instance.switcher_next()
179
# FIXME We can't directly check for selection/icon number equalty
180
# since the launcher model also contains "hidden" icons that aren't
181
# shown, so the selection index can increment by more than 1.
182
self.assertThat(prev_icon, LessThan(self.launcher.key_nav_selection))
183
prev_icon = self.launcher.key_nav_selection
186
launcher_instance.switcher_next()
187
self.assertThat(self.launcher.key_nav_selection, Equals(0))
189
def test_launcher_switcher_cycling_backward(self):
190
"""Launcher Switcher must loop through icons when cycling backwards"""
192
launcher_instance = self.get_launcher()
193
launcher_instance.switcher_start()
194
self.addCleanup(launcher_instance.switcher_end, True)
197
launcher_instance.switcher_prev()
198
# FIXME We can't directly check for self.launcher.num_launcher_icons - 1
199
self.assertThat(self.launcher.key_nav_selection, GreaterThan(1))
201
def test_launcher_keyboard_reveal_works(self):
202
"""Revealing launcher with keyboard must work."""
203
launcher_instance = self.get_launcher()
204
launcher_instance.keyboard_reveal_launcher()
205
self.addCleanup(launcher_instance.keyboard_unreveal_launcher)
207
self.assertThat(launcher_instance.is_showing(), Equals(True))
209
def test_launcher_keyboard_reveal_shows_shortcut_hints(self):
210
"""Launcher icons must show shortcut hints after revealing with keyboard."""
211
launcher_instance = self.get_launcher()
212
launcher_instance.move_mouse_to_right_of_launcher()
213
launcher_instance.keyboard_reveal_launcher()
214
self.addCleanup(launcher_instance.keyboard_unreveal_launcher)
217
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(True))
219
def test_launcher_switcher_keeps_shorcuts(self):
220
"""Initiating launcher switcher after showing shortcuts must not hide shortcuts"""
222
launcher_instance = self.get_launcher()
223
launcher_instance.move_mouse_to_right_of_launcher()
224
launcher_instance.keyboard_reveal_launcher()
225
self.addCleanup(launcher_instance.keyboard_unreveal_launcher)
228
launcher_instance.switcher_start()
229
self.addCleanup(launcher_instance.switcher_end, True)
232
self.assertThat(self.launcher.key_nav_is_active, Equals(True))
233
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(True))
235
def test_launcher_switcher_next_and_prev_keep_shortcuts(self):
236
"""Launcher switcher next and prev actions must keep shortcuts after they've been shown."""
238
launcher_instance = self.get_launcher()
239
launcher_instance.move_mouse_to_right_of_launcher()
240
launcher_instance.keyboard_reveal_launcher()
241
self.addCleanup(launcher_instance.keyboard_unreveal_launcher)
244
launcher_instance.switcher_start()
245
self.addCleanup(launcher_instance.switcher_end, True)
248
launcher_instance.switcher_next()
250
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(True))
252
launcher_instance.switcher_prev()
254
self.assertThat(launcher_instance.are_shortcuts_showing(), Equals(True))
256
def test_launcher_switcher_using_shorcuts(self):
257
"""Using some other shortcut while switcher is active must cancel switcher."""
260
launcher_instance = self.get_launcher()
261
launcher_instance.move_mouse_to_right_of_launcher()
262
launcher_instance.keyboard_reveal_launcher()
263
self.addCleanup(launcher_instance.keyboard_unreveal_launcher)
265
launcher_instance.switcher_start()
266
self.addCleanup(launcher_instance.switcher_end, True)
269
self.keyboard.press_and_release("s")
271
self.keyboard.press_and_release("Escape")
274
self.assertThat(self.launcher.key_nav_is_active, Equals(False))
276
def test_launcher_keynav_initiate_works(self):
277
"""Tests we can initiate keyboard navigation on the launcher."""
278
launcher_instance = self.get_launcher()
280
launcher_instance.key_nav_start()
281
self.addCleanup(launcher_instance.key_nav_end, True)
284
self.assertThat(self.launcher.key_nav_is_active, Equals(True))
285
self.assertThat(self.launcher.key_nav_is_grabbed, Equals(True))
287
def test_launcher_keynav_end_works(self):
288
"""Test that we can exit keynav mode."""
289
launcher_instance = self.get_launcher()
291
launcher_instance.key_nav_start()
293
launcher_instance.key_nav_end(cancel=True)
294
self.assertThat(self.launcher.key_nav_is_active, Equals(False))
295
self.assertThat(self.launcher.key_nav_is_grabbed, Equals(False))
297
def test_launcher_keynav_starts_at_index_zero(self):
298
"""Test keynav mode starts at index 0."""
299
launcher_instance = self.get_launcher()
301
launcher_instance.key_nav_start()
302
self.addCleanup(launcher_instance.key_nav_end, True)
305
self.assertThat(self.launcher.key_nav_selection, Equals(0))
307
def test_launcher_keynav_forward_works(self):
308
"""Must be able to move forwards while in keynav mode."""
309
launcher_instance = self.get_launcher()
311
launcher_instance.key_nav_start()
312
self.addCleanup(launcher_instance.key_nav_end, True)
314
launcher_instance.key_nav_next()
316
self.assertThat(self.launcher.key_nav_selection, Equals(1))
318
def test_launcher_keynav_prev_works(self):
319
"""Must be able to move backwards while in keynav mode."""
320
launcher_instance = self.get_launcher()
322
launcher_instance.key_nav_start()
323
self.addCleanup(launcher_instance.key_nav_end, True)
325
launcher_instance.key_nav_next()
327
launcher_instance.key_nav_prev()
329
self.assertThat(self.launcher.key_nav_selection, Equals(0))
331
def test_launcher_keynav_cycling_forward(self):
332
"""Launcher keynav must loop through icons when cycling forwards"""
333
launcher_instance = self.get_launcher()
335
launcher_instance.key_nav_start()
336
self.addCleanup(launcher_instance.key_nav_end, True)
340
for icon in range(1, self.launcher.model.num_launcher_icons()):
341
launcher_instance.key_nav_next()
343
# FIXME We can't directly check for selection/icon number equalty
344
# since the launcher model also contains "hidden" icons that aren't
345
# shown, so the selection index can increment by more than 1.
346
self.assertThat(prev_icon, LessThan(self.launcher.key_nav_selection))
347
prev_icon = self.launcher.key_nav_selection
350
launcher_instance.key_nav_next()
351
self.assertThat(self.launcher.key_nav_selection, Equals(0))
353
def test_launcher_keynav_cycling_backward(self):
354
"""Launcher keynav must loop through icons when cycling backwards"""
355
launcher_instance = self.get_launcher()
357
launcher_instance.key_nav_start()
358
self.addCleanup(launcher_instance.key_nav_end, True)
361
launcher_instance.key_nav_prev()
362
# FIXME We can't directly check for self.launcher.num_launcher_icons - 1
363
self.assertThat(self.launcher.key_nav_selection, GreaterThan(1))
365
def test_launcher_keynav_can_open_quicklist(self):
366
"""Tests that we can open a quicklist from keynav mode."""
367
launcher_instance = self.get_launcher()
368
launcher_instance.move_mouse_to_right_of_launcher()
370
launcher_instance.key_nav_start()
371
self.addCleanup(launcher_instance.key_nav_end, True)
373
launcher_instance.key_nav_next()
375
launcher_instance.key_nav_enter_quicklist()
376
self.addCleanup(launcher_instance.key_nav_exit_quicklist)
378
self.assertThat(launcher_instance.is_quicklist_open(), Equals(True))
380
def test_launcher_keynav_can_close_quicklist(self):
381
"""Tests that we can close a quicklist from keynav mode."""
382
launcher_instance = self.get_launcher()
383
launcher_instance.move_mouse_to_right_of_launcher()
385
launcher_instance.key_nav_start()
386
self.addCleanup(launcher_instance.key_nav_end, True)
388
launcher_instance.key_nav_next()
390
launcher_instance.key_nav_enter_quicklist()
392
launcher_instance.key_nav_exit_quicklist()
394
self.assertThat(launcher_instance.is_quicklist_open(), Equals(False))
395
self.assertThat(self.launcher.key_nav_is_active, Equals(True))
396
self.assertThat(self.launcher.key_nav_is_grabbed, Equals(True))
398
class LauncherRevealTests(ScenariodLauncherTests):
399
"""Test the launcher reveal bahavior when in autohide mode."""
402
super(LauncherRevealTests, self).setUp()
403
self.set_unity_option('launcher_hide_mode', True)
14
406
def test_reveal_on_mouse_to_edge(self):
15
self.server.move_mouse_outside_of_boundry()
16
self.server.move_mouse_to_reveal_pos()
17
self.assertThat(self.server.is_showing(), Equals(True))
407
"""Tests reveal of launchers by mouse pressure."""
408
launcher_instance = self.get_launcher()
409
launcher_instance.move_mouse_to_right_of_launcher()
410
launcher_instance.reveal_launcher()
411
self.assertThat(launcher_instance.is_showing(), Equals(True))
413
def test_reveal_with_mouse_under_launcher(self):
414
"""Tests that the launcher hides properly if the
415
mouse is under the launcher when it is revealed.
418
launcher_instance = self.get_launcher()
420
launcher_instance.move_mouse_over_launcher()
421
# we can't use "launcher_instance.keyboard_reveal_launcher()"
422
# since it moves the mouse out of the way, invalidating the test.
423
self.keybinding_hold("launcher/reveal")
425
self.keybinding_release("launcher/reveal")
427
self.assertThat(launcher_instance.is_showing(), Equals(False))
429
def test_reveal_does_not_hide_again(self):
430
"""Tests reveal of launchers by mouse pressure to ensure it doesn't
431
automatically hide again.
434
launcher_instance = self.get_launcher()
436
launcher_instance.move_mouse_to_right_of_launcher()
437
launcher_instance.reveal_launcher()
439
self.assertThat(launcher_instance.is_showing(), Equals(True))
441
def test_launcher_does_not_reveal_with_mouse_down(self):
442
"""Launcher must not reveal if have mouse button 1 down."""
443
launcher_instance = self.get_launcher()
444
screens = ScreenGeometry()
446
screens.move_mouse_to_monitor(launcher_instance.monitor)
448
launcher_instance.reveal_launcher()
449
self.assertThat(launcher_instance.is_showing(), Equals(False))
450
self.mouse.release(1)