~charlesk/unity8/lp-1410915-re-enable-rotation-lock-test

« back to all changes in this revision

Viewing changes to tests/qmltests/Greeter/tst_SingleGreeter.qml

  • Committer: CI Train Bot
  • Author(s): Michael Terry
  • Date: 2015-02-24 10:15:04 UTC
  • mfrom: (1432.6.56 greeter-refactor)
  • Revision ID: ci-train-bot@canonical.com-20150224101504-r428zccy160yhxq6
Refactor the greeter code to be more compartmented and isolatable.

This will help make it an optional piece of the shell when we allow a split greeter/shell.

My driving goals were:

- Remove as much logic from Shell.qml as possible. Right now, there is so much Greeter logic spread all throughout Shell.qml in different bits. For example, the Lockscreen widget sitting there instead of in qml/Greeter/.

- Clean up how we load the two different views (tablet & phone). Right now we have some widgets always present but sometimes hidden (Lockscreen) and Loaders within Loaders (LoginList inside GreeterContent). I wanted just two top-level view widgets that could be separately loaded depending on which mode we are in.

- Toward that end, I wanted to consolidate all the Greeter logic out of Shell and out of those two view classes to avoid duplication. So I made the main Greeter entry point widget handle all the login logic and interactions with LightDM. It controls the views, who always ask it to do things on their behalf. Classic MVC stuff.

- I separated out some of the widgetry from the previous Greeter class into a CoverPage class that both NarrowView and WideView use. This class now holds the drag handle for sliding the greeter away and the infographic.

- Now that each piece of the greeter has a much more brightly defined boundary, testing them in isolation is much easier. I've added tst_WideView, tst_NarrowView, and tst_Greeter files. I've moved existing tests around a bit and added some more. But it should be much more clear where a prospective test belongs now (logic tests in Greeter, visual tests in the respective View).

- I also moved some tests we had in qmluitests/ that were purely testing the LightDM plugin into their own plugin test file.
Approved by: Daniel d'Andrada

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright 2013 Canonical Ltd.
3
 
 *
4
 
 * This program is free software; you can redistribute it and/or modify
5
 
 * it under the terms of the GNU General Public License as published by
6
 
 * the Free Software Foundation; version 3.
7
 
 *
8
 
 * This program is distributed in the hope that it will be useful,
9
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
 * GNU General Public License for more details.
12
 
 *
13
 
 * You should have received a copy of the GNU General Public License
14
 
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
 
 */
16
 
 
17
 
import QtQuick 2.0
18
 
import QtTest 1.0
19
 
import ".."
20
 
import "../../../qml/Greeter"
21
 
import AccountsService 0.1
22
 
import LightDM 0.1 as LightDM
23
 
import Ubuntu.Components 0.1
24
 
import Unity.Test 0.1 as UT
25
 
 
26
 
Rectangle {
27
 
    color: "darkblue"
28
 
    width: units.gu(60)
29
 
    height: units.gu(80)
30
 
 
31
 
    Button {
32
 
        anchors.centerIn: parent
33
 
        text: "Show Greeter"
34
 
        onClicked: {
35
 
            if (greeterLoader.item)
36
 
                greeterLoader.item.show();
37
 
        }
38
 
    }
39
 
 
40
 
    Loader {
41
 
        id: greeterLoader
42
 
        anchors.fill: parent
43
 
 
44
 
        property bool itemDestroyed: false
45
 
 
46
 
        sourceComponent: Component {
47
 
            Greeter {
48
 
                width: greeterLoader.width
49
 
                height: greeterLoader.height
50
 
 
51
 
                Component.onDestruction: {
52
 
                    greeterLoader.itemDestroyed = true;
53
 
                }
54
 
                SignalSpy {
55
 
                    objectName: "selectedSpy"
56
 
                    target: parent
57
 
                    signalName: "selected"
58
 
                }
59
 
            }
60
 
        }
61
 
    }
62
 
 
63
 
    SignalSpy {
64
 
        id: unlockSpy
65
 
        target: greeterLoader.item
66
 
        signalName: "unlocked"
67
 
    }
68
 
 
69
 
    SignalSpy {
70
 
        id: tappedSpy
71
 
        target: greeterLoader.item
72
 
        signalName: "tapped"
73
 
    }
74
 
 
75
 
    SignalSpy {
76
 
        id: infographicDataChangedSpy
77
 
        target: LightDM.Infographic
78
 
        signalName: "dataChanged"
79
 
    }
80
 
 
81
 
    UT.UnityTestCase {
82
 
        name: "SingleGreeter"
83
 
        when: windowShown
84
 
 
85
 
        property Greeter greeter: greeterLoader.item
86
 
 
87
 
        function cleanup() {
88
 
            AccountsService.statsWelcomeScreen = true
89
 
 
90
 
            // force a reload so that we get a fresh Greeter for the next test
91
 
            greeterLoader.itemDestroyed = false;
92
 
            greeterLoader.active = false;
93
 
            tryCompare(greeterLoader, "itemDestroyed", true);
94
 
 
95
 
            unlockSpy.clear();
96
 
            tappedSpy.clear();
97
 
 
98
 
            greeterLoader.active = true;
99
 
            tryCompare(greeterLoader, "status", Loader.Ready);
100
 
            removeTimeConstraintsFromDirectionalDragAreas(greeterLoader.item);
101
 
        }
102
 
 
103
 
        function test_properties() {
104
 
            compare(greeter.multiUser, false)
105
 
            compare(greeter.narrowMode, true)
106
 
        }
107
 
 
108
 
        function test_teasingArea_data() {
109
 
            return [
110
 
                {tag: "left", posX: units.gu(2), leftPressed: true, rightPressed: false},
111
 
                {tag: "right", posX: greeter.width - units.gu(2), leftPressed: false, rightPressed: true}
112
 
            ]
113
 
        }
114
 
 
115
 
        function test_teasingArea(data) {
116
 
            tappedSpy.clear()
117
 
            tap(greeter, data.posX, greeter.height - units.gu(1))
118
 
            tappedSpy.wait()
119
 
            tryCompare(tappedSpy, "count", 1)
120
 
        }
121
 
 
122
 
        function test_statsWelcomeScreen() {
123
 
            // Test logic in greeter that turns statsWelcomeScreen setting into infographic changes
124
 
            compare(AccountsService.statsWelcomeScreen, true)
125
 
            tryCompare(LightDM.Infographic, "username", "single")
126
 
            AccountsService.statsWelcomeScreen = false
127
 
            tryCompare(LightDM.Infographic, "username", "")
128
 
            AccountsService.statsWelcomeScreen = true
129
 
            tryCompare(LightDM.Infographic, "username", "single")
130
 
        }
131
 
 
132
 
        function test_initial_selected_signal() {
133
 
            var selectedSpy = findChild(greeter, "selectedSpy");
134
 
            selectedSpy.wait();
135
 
            tryCompare(selectedSpy, "count", 1);
136
 
        }
137
 
 
138
 
        /*
139
 
            Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1388359
140
 
            "User metrics can no longer be changed by double tap"
141
 
        */
142
 
        function test_doubleTapSwitchesToNextInfographic() {
143
 
            infographicDataChangedSpy.clear();
144
 
 
145
 
            var infographicPrivate = findInvisibleChild(greeter, "infographicPrivate");
146
 
            verify(infographicPrivate);
147
 
 
148
 
            // wait for the UI to settle down before double tapping it
149
 
            tryCompare(infographicPrivate, "animating", false);
150
 
 
151
 
            var dataCircle = findChild(greeter, "dataCircle");
152
 
            verify(dataCircle);
153
 
 
154
 
            tap(dataCircle);
155
 
            wait(1);
156
 
            tap(dataCircle);
157
 
 
158
 
            tryCompare(infographicDataChangedSpy, "count", 1);
159
 
        }
160
 
 
161
 
        function test_movesBackIntoPlaceWhenNotDraggedFarEnough() {
162
 
 
163
 
            var dragEvaluator = findInvisibleChild(greeter, "edgeDragEvaluator");
164
 
            verify(dragEvaluator);
165
 
 
166
 
            // Make it easier to get a rejection/rollback. Otherwise would have to inject
167
 
            // a fake timer into dragEvaluator.
168
 
            // Afterall, we are testing if the Greeter indeed moves back on a
169
 
            // rollback decision, not the drag evaluation itself.
170
 
            dragEvaluator.minDragDistance = dragEvaluator.maxDragDistance / 2;
171
 
 
172
 
            // it starts as fully shown
173
 
            compare(greeter.x, 0);
174
 
 
175
 
            // then we drag it a bit
176
 
            var startX = greeter.width - 1;
177
 
            var touchY = greeter.height / 2;
178
 
            var dragXDelta = -(dragEvaluator.minDragDistance * 0.3);
179
 
            touchFlick(greeter,
180
 
                       startX , touchY, // start pos
181
 
                       startX + dragXDelta, touchY, // end pos
182
 
                       true /* beginTouch */, false /* endTouch  */);
183
 
 
184
 
            // which should make it move a bit
185
 
            tryCompareFunction(function(){return greeter.x < 0;}, true);
186
 
 
187
 
            // then we release it
188
 
            touchRelease(greeter, startX + dragXDelta, touchY);
189
 
 
190
 
            // which should make it move back into its original position as it didn't move
191
 
            // far enough to have it hidden
192
 
            tryCompare(greeter, "x", 0);
193
 
        }
194
 
 
195
 
        function test_dragToHide_data() {
196
 
            return [
197
 
                {tag: "left", startX: greeter.width * 0.95, endX: greeter.width * 0.1, hiddenX: -greeter.width},
198
 
                {tag: "right", startX: greeter.width * 0.1, endX: greeter.width * 0.95, hiddenX: greeter.width},
199
 
            ];
200
 
        }
201
 
        function test_dragToHide(data) {
202
 
            compare(greeter.x, 0);
203
 
            compare(greeter.visible, true);
204
 
            compare(greeter.shown, true);
205
 
            compare(greeter.showProgress, 1);
206
 
 
207
 
            touchFlick(greeter,
208
 
                    data.startX, greeter.height / 2, // start pos
209
 
                    data.endX, greeter.height / 2); // end pos
210
 
 
211
 
            tryCompare(greeter, "x", data.hiddenX);
212
 
            tryCompare(greeter, "visible", false);
213
 
            tryCompare(greeter, "shown", false);
214
 
            tryCompare(greeter, "showProgress", 0);
215
 
        }
216
 
 
217
 
        function test_hiddenGreeterRemainsHiddenAfterResize_data() {
218
 
            return [
219
 
                {tag: "left", startX: greeter.width * 0.95, endX: greeter.width * 0.1},
220
 
                {tag: "right", startX: greeter.width * 0.1, endX: greeter.width * 0.95},
221
 
            ];
222
 
        }
223
 
        function test_hiddenGreeterRemainsHiddenAfterResize(data) {
224
 
            touchFlick(greeter,
225
 
                    data.startX, greeter.height / 2, // start pos
226
 
                    data.endX, greeter.height / 2); // end pos
227
 
 
228
 
            tryCompare(greeter, "x", data.tag == "left" ? -greeter.width : greeter.width);
229
 
            tryCompare(greeter, "visible", false);
230
 
            tryCompare(greeter, "shown", false);
231
 
            tryCompare(greeter, "showProgress", 0);
232
 
 
233
 
            // flip dimensions to simulate an orientation change
234
 
            greeter.width = greeterLoader.height;
235
 
            greeter.height = greeterLoader.width;
236
 
 
237
 
            // All properties should remain consistent
238
 
            tryCompare(greeter, "x", data.tag == "left" ? -greeter.width : greeter.width);
239
 
            tryCompare(greeter, "visible", false);
240
 
            tryCompare(greeter, "shown", false);
241
 
            tryCompare(greeter, "showProgress", 0);
242
 
        }
243
 
    }
244
 
}