2
* Copyright 2014 Canonical Ltd.
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.
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.
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/>.
20
import "../../../qml/Greeter"
21
import LightDM 0.1 as LightDM
22
import Ubuntu.Components 0.1
23
import Unity.Test 0.1 as UT
34
width: root.width - controls.width
37
property bool itemDestroyed: false
38
sourceComponent: Component {
40
background: Qt.resolvedUrl("../../../qml/graphics/phone_background.jpg")
41
userModel: LightDM.Users
42
infographicModel: LightDM.Infographic
44
launcherOffset: parseFloat(launcherOffsetField.text)
45
currentIndex: parseInt(currentIndexField.text, 10)
46
delayMinutes: parseInt(delayMinutesField.text, 10)
47
backgroundTopMargin: parseFloat(backgroundTopMarginField.text)
48
locked: lockedCheckBox.checked
49
alphanumeric: alphanumericCheckBox.checked
51
Component.onDestruction: {
52
loader.itemDestroyed = true
56
currentIndexField.text = index;
69
anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
74
text: "Show Last Chance"
75
onClicked: loader.item.showLastChance()
81
onClicked: loader.item.hide()
87
onClicked: loader.item.reset()
93
onClicked: loader.item.showMessage(messageField.text)
104
onClicked: loader.item.showPrompt(promptField.text, isSecretCheckBox.checked, isDefaultPromptCheckBox.checked)
118
id: isDefaultPromptCheckBox
126
text: "Authenticated"
128
if (successCheckBox.checked) {
129
loader.item.notifyAuthenticationSucceeded();
131
loader.item.notifyAuthenticationFailed();
144
text: "Try To Unlock"
145
onClicked: loader.item.tryToUnlock(toTheRightCheckBox.checked)
148
id: toTheRightCheckBox
156
id: launcherOffsetField
161
text: "launcherOffset"
166
id: currentIndexField
176
id: delayMinutesField
186
id: backgroundTopMarginField
191
text: "backgroundTopMargin"
204
id: alphanumericCheckBox
212
text: "selected: " + selectedSpy.count
217
text: "responded: " + respondedSpy.count
222
text: "teased: " + teaseSpy.count
227
text: "emergency: " + emergencySpy.count
234
loader.active = false;
235
loader.active = true;
244
target: LightDM.Infographic
252
signalName: "selected"
258
signalName: "responded"
270
signalName: "emergencyCall"
274
id: infographicDataChangedSpy
275
target: LightDM.Infographic
276
signalName: "dataChanged"
283
property Item view: loader.status === Loader.Ready ? loader.item : null
286
view.currentIndex = 0; // break binding with text field
289
respondedSpy.clear();
291
emergencySpy.clear();
292
infographicDataChangedSpy.clear();
296
loader.itemDestroyed = false;
297
loader.active = false;
298
tryCompare(loader, "status", Loader.Null);
299
tryCompare(loader, "item", null);
300
tryCompare(loader, "itemDestroyed", true);
301
loader.active = true;
302
tryCompare(loader, "status", Loader.Ready);
303
removeTimeConstraintsFromDirectionalDragAreas(loader.item);
306
function swipeAwayCover(toTheRight) {
307
if (toTheRight === undefined) {
311
tryCompare(view, "fullyShown", true);
312
var touchY = view.height / 2;
314
touchFlick(view, 0, touchY, view.width, touchY);
316
touchFlick(view, view.width, touchY, 0, touchY);
318
var coverPage = findChild(view, "coverPage");
319
tryCompare(coverPage, "showProgress", 0);
320
waitForRendering(view);
323
function enterPin(pin) {
324
for (var i = 0; i < pin.length; ++i) {
325
var character = pin.charAt(i);
326
var button = findChild(view, "pinPadButton" + character);
331
function test_tease_data() {
333
{tag: "left", x: 0, offset: 0, count: 1},
334
{tag: "leftWithOffsetPass", x: 10, offset: 10, count: 1},
335
{tag: "leftWithOffsetFail", x: 9, offset: 10, count: 0},
336
{tag: "right", x: view.width, offset: 0, count: 1},
339
function test_tease(data) {
340
view.dragHandleLeftMargin = data.offset;
341
tap(view, data.x, 0);
342
compare(teaseSpy.count, data.count);
345
function test_respondedWithPin() {
349
compare(respondedSpy.count, 1);
350
compare(respondedSpy.signalArguments[0][0], "1234");
353
function test_respondedWithPassphrase() {
355
view.alphanumeric = true;
358
keyClick(Qt.Key_Enter);
359
compare(respondedSpy.count, 1);
360
compare(respondedSpy.signalArguments[0][0], "test");
363
function test_respondedWithSwipe_data() {
365
{tag: "left", toTheRight: false, hiddenX: -view.width},
366
{tag: "right", toTheRight: true, hiddenX: view.width},
369
function test_respondedWithSwipe(data) {
370
swipeAwayCover(data.toTheRight);
371
var coverPage = findChild(view, "coverPage");
372
compare(coverPage.x, data.hiddenX);
373
compare(respondedSpy.count, 1);
374
compare(respondedSpy.signalArguments[0][0], "");
377
function test_emergencyCall() {
380
var emergencyCallLabel = findChild(view, "emergencyCallLabel");
381
tap(emergencyCallLabel);
382
compare(emergencySpy.count, 1);
385
function test_fullyShown() {
386
tryCompare(view, "fullyShown", true);
388
tryCompare(view, "fullyShown", false);
390
tryCompare(view, "fullyShown", true);
392
tryCompare(view, "fullyShown", false);
395
function test_required() {
396
tryCompare(view, "required", true);
398
tryCompare(view, "required", false);
400
tryCompare(view, "required", true);
402
tryCompare(view, "required", false);
405
function test_tryToUnlock() {
406
var coverPage = findChild(view, "coverPage");
407
tryCompare(coverPage, "showProgress", 1);
408
compare(view.tryToUnlock(false), true);
409
tryCompare(coverPage, "showProgress", 0);
410
compare(view.tryToUnlock(false), false);
414
Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1388359
415
"User metrics can no longer be changed by double tap"
417
function test_doubleTapSwitchesToNextInfographic() {
418
var infographicPrivate = findInvisibleChild(view, "infographicPrivate");
419
verify(infographicPrivate);
421
// wait for the UI to settle down before double tapping it
422
tryCompare(infographicPrivate, "animating", false);
424
var dataCircle = findChild(view, "dataCircle");
431
tryCompare(infographicDataChangedSpy, "count", 1);
434
function test_movesBackIntoPlaceWhenNotDraggedFarEnough() {
435
var coverPage = findChild(view, "coverPage");
437
var dragEvaluator = findInvisibleChild(coverPage, "edgeDragEvaluator");
438
verify(dragEvaluator);
440
// Make it easier to get a rejection/rollback. Otherwise would have to inject
441
// a fake timer into dragEvaluator.
442
// Afterall, we are testing if the CoverPage indeed moves back on a
443
// rollback decision, not the drag evaluation itself.
444
dragEvaluator.minDragDistance = dragEvaluator.maxDragDistance / 2;
446
// it starts as fully shown
447
compare(coverPage.x, 0);
449
// then we drag it a bit
450
var startX = coverPage.width - 1;
451
var touchY = coverPage.height / 2;
452
var dragXDelta = -(dragEvaluator.minDragDistance * 0.3);
453
touchFlick(coverPage,
454
startX , touchY, // start pos
455
startX + dragXDelta, touchY, // end pos
456
true /* beginTouch */, false /* endTouch */);
458
// which should make it move a bit
459
tryCompareFunction(function() {return coverPage.x < 0;}, true);
461
// then we release it
462
touchRelease(coverPage, startX + dragXDelta, touchY);
464
// which should make it move back into its original position as it didn't move
465
// far enough to have it hidden
466
tryCompare(coverPage, "x", 0);
469
function test_dragToHide_data() {
471
{tag: "left", startX: view.width * 0.95, endX: view.width * 0.1, hiddenX: -view.width},
472
{tag: "right", startX: view.width * 0.1, endX: view.width * 0.95, hiddenX: view.width},
475
function test_dragToHide(data) {
476
var coverPage = findChild(view, "coverPage");
477
compare(coverPage.x, 0);
478
compare(coverPage.visible, true);
479
compare(coverPage.shown, true);
480
compare(coverPage.showProgress, 1);
481
compare(view.fullyShown, true);
484
data.startX, view.height / 2, // start pos
485
data.endX, view.height / 2); // end pos
487
tryCompare(coverPage, "x", data.hiddenX);
488
tryCompare(coverPage, "visible", false);
489
tryCompare(coverPage, "shown", false);
490
tryCompare(coverPage, "showProgress", 0);
491
compare(view.fullyShown, false);
494
function test_hiddenViewRemainsHiddenAfterResize_data() {
496
{tag: "left", startX: view.width * 0.95, endX: view.width * 0.1},
497
{tag: "right", startX: view.width * 0.1, endX: view.width * 0.95},
500
function test_hiddenViewRemainsHiddenAfterResize(data) {
502
data.startX, view.height / 2, // start pos
503
data.endX, view.height / 2); // end pos
505
var coverPage = findChild(view, "coverPage");
506
tryCompare(coverPage, "x", data.tag == "left" ? -view.width : view.width);
507
tryCompare(coverPage, "visible", false);
508
tryCompare(coverPage, "shown", false);
509
tryCompare(coverPage, "showProgress", 0);
511
// flip dimensions to simulate an orientation change
512
view.width = loader.height;
513
view.height = loader.width;
515
// All properties should remain consistent
516
tryCompare(coverPage, "x", data.tag == "left" ? -view.width : view.width);
517
tryCompare(coverPage, "visible", false);
518
tryCompare(coverPage, "shown", false);
519
tryCompare(coverPage, "showProgress", 0);