~nik90/ubuntu-clock-app/fix-blank-page

« back to all changes in this revision

Viewing changes to tests/autopilot/ubuntu_clock_app/emulators.py

  • Committer: Tarmac
  • Author(s): nskaggs
  • Date: 2013-10-22 16:52:21 UTC
  • mfrom: (240.1.9 ubuntu-clock-app)
  • Revision ID: tarmac-20131022165221-rj3nriy356b93cc2
Add autopilot tests for the alarm page, cleans up tests a little.

Approved by Nekhelesh Ramananthan, Ubuntu Phone Apps Jenkins Bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
from ubuntuuitoolkit import emulators as toolkit_emulators
18
18
from autopilot.matchers import Eventually
19
19
from testtools.matchers import Not, Is, Equals
 
20
from time import sleep
20
21
 
21
22
 
22
23
class MainView(toolkit_emulators.MainView):
 
24
 
 
25
    def _drag_page(self, page, test_case, direction):
 
26
        page_func = lambda: self.select_single(page)
 
27
        test_case.assertThat(page_func, Eventually(Not(Is(None))))
 
28
        page = self.select_single(page)
 
29
 
 
30
        x, y, w, h = page.globalRect
 
31
        tx = x + (w / 2)
 
32
        ty = y + (h / 2)
 
33
 
 
34
        if direction == "down":
 
35
            self.pointing_device.drag(tx, ty, tx, ty + h / 3)
 
36
        else:
 
37
            self.pointing_device.drag(tx, ty, tx, ty - h / 3)
 
38
 
 
39
        test_case.assertThat(lambda: page.select_single(
 
40
            "QQuickFlickable").moving,
 
41
            Eventually(Equals(False)))
 
42
 
 
43
    def drag_page_up(self, page, test_case):
 
44
        """Drag the given page up."""
 
45
        self._drag_page(page, test_case, "up")
 
46
 
 
47
    def drag_page_down(self, page, test_case):
 
48
        """Drag the given page down."""
 
49
        self._drag_page(page, test_case, "down")
 
50
 
 
51
    def longpress_object(self, obj):
 
52
        self.pointing_device.move_to_object(obj)
 
53
        self.pointing_device.press()
 
54
        sleep(2)
 
55
        self.pointing_device.release()
 
56
 
 
57
    #stopwatch page
23
58
    def get_stopwatch_label(self):
24
59
        """Returns the select for the stopwatch label"""
25
60
        return self.select_single("Label", objectName="labelStopwatch")
26
61
 
27
62
    def get_stopwatch_button(self):
28
63
        """Returns the select for the stopwatch button"""
29
 
        return self.select_single("AnalogStopwatch", objectName="buttonStopwatch")
 
64
        return self.select_single("AnalogStopwatch",
 
65
                                  objectName="buttonStopwatch")
30
66
 
31
67
    def get_lap_button(self):
32
68
        """Returns the select for the lap button"""
40
76
        """Returns the select for the lap count"""
41
77
        return self.select_single("ListModel", objectName="laps")
42
78
 
 
79
    #timer page
43
80
    def get_toolbar_timer(self):
44
81
        """Returns the toolbar of timer tab"""
45
82
        return self.select_single("ToolbarItems")
80
117
        """Return the label with the timer countdown"""
81
118
        return self.select_single("Label", objectName="labelTimer")
82
119
 
83
 
    def get_num_of_presets(self):
84
 
        """Returns the number of presets in the timer page."""
85
 
        timer_page = self.select_single("TimerPage")
86
 
        return int(timer_page.select_single("QQuickListView").count)
87
 
 
88
120
    def get_first_preset_list_item(self):
89
121
        """Returns the first preset list item in the timer page."""
90
122
        return self.select_single("Standard", objectName="preset0")
93
125
        """Return the label with the timer countdown"""
94
126
        return self.select_single("Label", objectName="currentTimeLabel")
95
127
 
 
128
    def get_num_of_presets(self):
 
129
        """Returns the number of presets in the timer page."""
 
130
        timer_page = self.select_single("TimerPage")
 
131
        return int(timer_page.select_single("QQuickListView").count)
 
132
 
 
133
    #alarm page
 
134
    def get_addalarm_page(self):
 
135
        """Returns the add alarm page object"""
 
136
        return self.select_single("Page", objectName="addAlarmPage")
 
137
 
 
138
    def get_alarm_page(self):
 
139
        """Returns the alarm page object"""
 
140
        return self.select_single("AlarmPage")
 
141
 
 
142
    def get_alarm_name_label(self):
 
143
        """Returns the TextField where insert the name of the preset"""
 
144
        return self.select_single("TextField", objectName="addAlarmName")
 
145
 
 
146
    def get_label_alarm(self):
 
147
        """Return the label with the alarm"""
 
148
        return self.select_single("Label", objectName="labelAlarmSetup")
 
149
 
 
150
    def get_num_of_alarms(self):
 
151
        """Returns the number of alarms in the alarm page."""
 
152
        listview = self.select_single("QQuickListView",
 
153
                                      objectName="listSavedAlarm")
 
154
        #each alarm has 3 labels
 
155
        return len(listview.select_many("Label", visible=True)) / 3
 
156
 
 
157
        #TODO: QQuickListView.count does not work as expected
 
158
        #fix once this is working properly and use it
 
159
 
 
160
    #TODO: all of the get_first functions need to
 
161
    #be refactored where possible to get X item, not
 
162
    #just the first
 
163
 
 
164
    def get_first_alarm_list_item(self):
 
165
        """Returns the first alarm list item in the alarm page."""
 
166
        listview = self.select_single("QQuickListView",
 
167
                                      objectName="listSavedAlarm")
 
168
        return listview.select_many("Base")[0]
 
169
 
 
170
    def toggle_first_alarm(self, test_case):
 
171
        """Toggles the alarm on and off in the alarm page."""
 
172
        alarm = self.select_single("CheckBox",
 
173
                                   objectName="listAlarmStatus")
 
174
        self.pointing_device.click_object(alarm)
 
175
 
 
176
        test_case.assertThat(lambda: self.get_alarm_page().select_single(
 
177
                     "QQuickFlickable").moving,
 
178
                     Eventually(Equals(False)))
 
179
 
 
180
    def get_first_alarm_time(self):
 
181
        """Gets the first alarm time in the alarm page."""
 
182
        alarm = self.get_first_alarm_list_item()
 
183
        return alarm.select_single("Label",
 
184
                                   objectName="listAlarmTime").text
 
185
 
 
186
    def get_first_alarm_subtitle(self):
 
187
        """Gets the first alarm subtitle in the alarm page."""
 
188
        alarm = self.get_first_alarm_list_item()
 
189
        return alarm.select_single("Label",
 
190
                                   objectName="listAlarmSubtitle").text
 
191
 
 
192
    def get_first_alarm_label(self):
 
193
        """Gets the first alarm label in the alarm page."""
 
194
        alarm = self.get_first_alarm_list_item()
 
195
        return alarm.select_single("Label",
 
196
                                   objectName="listAlarmLabel").text
 
197
 
 
198
    def get_first_alarm_status(self):
 
199
        """Gets the first alarm checkbox status in the alarm page."""
 
200
        alarm = self.get_first_alarm_list_item()
 
201
        return alarm.select_single("CheckBox",
 
202
                                   objectName="listAlarmStatus").checked
 
203
 
 
204
    def get_alarm_minute_hand(self):
 
205
        """Returns the hour hand of clock in alarm tab"""
 
206
        return self.select_single("AnalogClockHand",
 
207
                                  objectName="alarmMinuteHand")
 
208
 
 
209
    def get_alarm_hour_hand(self):
 
210
        """Returns the hour hand of clock in alarm tab"""
 
211
        return self.select_single("AnalogClockHand",
 
212
                                  objectName="alarmHourHand")
 
213
 
 
214
    def set_alarm_week(self, day, test_case):
 
215
        #TODO: add support for setting days of week
 
216
        dayselectDialog = self.select_single("Dialog",
 
217
                                             objectName="alarmDaysDialog")
 
218
 
 
219
        return dayselectDialog
 
220
 
 
221
    def _retry_selector_assert(self, clickobj, selector, status, test_case):
 
222
        test_case.assertThat(lambda: self.get_alarm_page().select_single(
 
223
                             "QQuickFlickable").moving,
 
224
                             Eventually(Equals(False)))
 
225
        timeout = 0
 
226
        test_case.assertThat(lambda: selector.select_single(
 
227
            "OptionSelectorDelegate", selected=True),
 
228
            Eventually(Not(Is(None))))
 
229
 
 
230
        option = selector.select_single("OptionSelectorDelegate",
 
231
                                        selected=True).state
 
232
        while option != status and timeout < 10:
 
233
            self.pointing_device.click_object(clickobj)
 
234
            option = selector.select_single("OptionSelectorDelegate",
 
235
                                            selected=True).state
 
236
            sleep(1)
 
237
            timeout += 1
 
238
 
 
239
        test_case.assertThat(lambda: self.get_alarm_page().select_single(
 
240
                             "QQuickFlickable").moving,
 
241
                             Eventually(Equals(False)))
 
242
 
 
243
    def set_alarm_day(self, day, test_case):
 
244
        select = self.select_single("OptionSelector",
 
245
                                    objectName="OccursSelector")
 
246
        occur = select.select_single("StyledItem", objectName="listContainer")
 
247
        #optionslist = occur.select_single("OptionSelectorDelegate",
 
248
        #                                   selected=True)
 
249
        occurlist = occur.select_many("Label", visible=True)
 
250
 
 
251
        self.pointing_device.click_object(select)
 
252
        self._retry_selector_assert(select, occur,
 
253
                                    "dividerExpanded", test_case)
 
254
 
 
255
        self.drag_page_up("AlarmPage", test_case)
 
256
        self.pointing_device.click_object(occurlist[day])
 
257
        self._retry_selector_assert(select, occur,
 
258
                                    "dividerCollapsed", test_case)
 
259
 
 
260
        #check index
 
261
        #TODO: clock doesn't put things in in the proper order atm
 
262
        #test_case.assertThat(lambda: self.select_single("OptionSelector",
 
263
        #                     objectName="OccursSelector").selectedIndex+1,
 
264
        #                     Eventually(Equals(day)))
 
265
 
 
266
    def set_alarm_frequency(self, occurence, test_case):
 
267
        select = self.select_single("OptionSelector",
 
268
                                    objectName="RepeatSelector")
 
269
        repeat = select.select_single("StyledItem",
 
270
                                      objectName="listContainer")
 
271
        #optionslist = occur.select_single("OptionSelectorDelegate",
 
272
        #                                   selected=True)
 
273
        repeatlist = repeat.select_many("Label", visible=True)
 
274
 
 
275
        self.pointing_device.click_object(repeat)
 
276
        self._retry_selector_assert(select, repeat,
 
277
                                    "dividerExpanded", test_case)
 
278
 
 
279
        self.drag_page_up("AlarmPage", test_case)
 
280
        self.pointing_device.click_object(repeatlist[occurence])
 
281
        self._retry_selector_assert(select, repeat,
 
282
                                    "dividerCollapsed", test_case)
 
283
 
 
284
        #check index
 
285
        test_case.assertThat(lambda: self.select_single(
 
286
            "OptionSelector", objectName="RepeatSelector").selectedIndex+1,
 
287
            Eventually(Equals(occurence)))
 
288
 
 
289
    #world clock page
96
290
    def get_add_city_button(self):
97
291
        """Return the button for adding a new clock location."""
98
292
        return self.select_single(
111
305
        return self.select_single(objectName="worldList")
112
306
 
113
307
    def get_selected_cities_list(self):
114
 
        """Return the component containing the list of selected clock locations."""
 
308
        """Return the component containing list of selected clock locations."""
115
309
        return self.select_single(objectName="listWorldClocks")
116
 
 
117
 
    def drag_page_up(self, page, test_case):
118
 
        """Drag the given page up."""
119
 
 
120
 
        page_func = lambda: self.select_single(page)
121
 
        test_case.assertThat(page_func, Eventually(Not(Is(None))))
122
 
        page = self.select_single(page)
123
 
 
124
 
        x, y, w, h = page.globalRect
125
 
        tx = x + (w / 2)
126
 
        ty = y + (h / 2)
127
 
 
128
 
        self.pointing_device.drag(tx, ty, tx, ty - h / 3)
129
 
 
130
 
        test_case.assertThat(page.select_single(
131
 
            "QQuickFlickable", objectName="animationContainer").moving,
132
 
            Eventually(Equals(False)))