From 029d119f4c0e13afbcbd5a0724af7d158acaf8e2 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Thu, 30 Apr 2015 16:51:49 +0200 Subject: ControlSpy: Accept a list of signals to spy on This API is cleaner than having to connect to each signal handler namually. We solve the 'pressed' signal problem by connecting to the other signal accessor, namely 'onPressed'. And we do so for all signals. We also lay foundation to capture the signal parameters as each signal is emitted. What we may do with those values is not clear yet. Auto-tests updated accordingly. Change-Id: Ieda96a43072ca7dff2b183e07f6f67aa49c8cf5d Reviewed-by: Mitch Curtis --- tests/auto/controls/data/ControlSpy.qml | 56 ++++++++++++++++++++++++------- tests/auto/controls/data/tst_button.qml | 20 +++++------ tests/auto/controls/data/tst_checkbox.qml | 10 +----- 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/tests/auto/controls/data/ControlSpy.qml b/tests/auto/controls/data/ControlSpy.qml index 23601707..45d603b8 100644 --- a/tests/auto/controls/data/ControlSpy.qml +++ b/tests/auto/controls/data/ControlSpy.qml @@ -42,18 +42,46 @@ import QtQuick 2.5 QtObject { property QtObject target: null + property var signals: [] property var expectedSequence: [] property int sequenceIndex: 0 property bool sequenceFailure: false - readonly property bool success: sequenceIndex === expectedSequence.length - && !sequenceFailure + readonly property bool success: !sequenceFailure && sequenceIndex === expectedSequence.length function reset() { sequenceIndex = 0 sequenceFailure = false } - function checkSignal(signalName) { + property QtObject __oldTarget: null + property var __connections: [] + + onExpectedSequenceChanged: reset() + onTargetChanged: __setup() + onSignalsChanged: __setup() + + function __setup() { + if (__oldTarget) { + __connections.forEach(function (cx) { + __oldTarget[cx.name].disconnect(cx.method) + }) + __oldTarget = null + } + + __connections = [] + + if (!!target && !!signals && signals.length > 0) { + signals.forEach(function (signalName) { + var handlerName = "on" + signalName.substr(0, 1).toUpperCase() + signalName.substr(1) + var method = function() { __checkSignal(signalName, arguments) } + target[handlerName].connect(method) + __connections.push({ "name": handlerName, "method": method }) + }) + __oldTarget = target + } + } + + function __checkSignal(signalName, signalArgs) { if (sequenceFailure) return; @@ -70,28 +98,30 @@ QtObject { return } } else if (typeof expectedSignal === "object") { - expectedSignal = expectedSignal[0] + var expectedSignalData = expectedSignal + expectedSignal = expectedSignalData[0] if (expectedSignal === signalName) { - var expectedValues = expectedSequence[sequenceIndex][1] - for (var p in expectedValues) + var expectedValues = expectedSignalData[1] + for (var p in expectedValues) { if (target[p] != expectedValues[p]) { console.warn("ControlSpy: Value mismatch for property '" + p + "' after '" + signalName + "' signal." + - "\n Actual : " + target[p] + - "\n Expected : " + expectedValues[p] + - "\n Sequence index: " + sequenceIndex) + __mismatchValuesFormat(target[p], expectedValues[p])) sequenceFailure = true return } + } sequenceIndex++ return } } console.warn("ControlSpy: Received unexpected signal." + - "\n Actual : " + signalName + - "\n Expected : " + expectedSignal + - "\n Sequence index: " + sequenceIndex) + __mismatchValuesFormat(signalName, expectedSignal)) sequenceFailure = true } - onExpectedSequenceChanged: reset() + function __mismatchValuesFormat(actual, expected) { + return "\n Actual : " + actual + + "\n Expected : " + expected + + "\n Sequence index: " + sequenceIndex + } } diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml index 865b495b..ce3ae6c5 100644 --- a/tests/auto/controls/data/tst_button.qml +++ b/tests/auto/controls/data/tst_button.qml @@ -56,15 +56,9 @@ TestCase { id: control property ControlSpy spy: ControlSpy { - id: spy target: control + signals: ["pressed", "released", "canceled", "clicked", "pressedChanged"] } - - onPressed: spy.checkSignal("pressed") - onReleased: spy.checkSignal("released") - onCanceled: spy.checkSignal("canceled") - onClicked: spy.checkSignal("clicked") - onPressedChanged: spy.checkSignal("pressedChanged") } } @@ -102,7 +96,9 @@ TestCase { compare(control.pressed, true) verify(control.spy.success) - control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], "released", "clicked"] + control.spy.expectedSequence = [["pressedChanged", { "pressed": false }], + "released", + "clicked"] mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) compare(control.pressed, false) verify(control.spy.success) @@ -142,8 +138,11 @@ TestCase { verify(control.activeFocus) // click - control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], "pressed", - ["pressedChanged", { "pressed": false }], "released", "clicked"] + control.spy.expectedSequence = [["pressedChanged", { "pressed": true }], + "pressed", + ["pressedChanged", { "pressed": false }], + "released", + "clicked"] keyClick(Qt.Key_Space) verify(control.spy.success) @@ -151,6 +150,7 @@ TestCase { control.spy.expectedSequence = [] var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] for (var i = 0; i < keys.length; ++i) { + control.spy.reset() keyClick(keys[i]) verify(control.spy.success) } diff --git a/tests/auto/controls/data/tst_checkbox.qml b/tests/auto/controls/data/tst_checkbox.qml index 734f5464..e3414595 100644 --- a/tests/auto/controls/data/tst_checkbox.qml +++ b/tests/auto/controls/data/tst_checkbox.qml @@ -56,16 +56,9 @@ TestCase { id: control property ControlSpy spy: ControlSpy { - id: spy target: control + signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged"] } - - onPressed: spy.checkSignal("pressed") - onReleased: spy.checkSignal("released") - onCanceled: spy.checkSignal("canceled") - onClicked: spy.checkSignal("clicked") - onPressedChanged: spy.checkSignal("pressedChanged") - onCheckedChanged: spy.checkSignal("checkedChanged") } } @@ -147,7 +140,6 @@ TestCase { function test_mouse() { var control = checkBox.createObject(testCase) - // check control.spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }], "pressed"] -- cgit v1.2.3