~mterry/+junk/u8.2

« back to all changes in this revision

Viewing changes to tests/qmltests/Notifications/tst_OptionToggle.qml

  • Committer: Michael Terry
  • Date: 2014-11-17 14:56:04 UTC
  • mfrom: (1317.1.118 unity8)
  • Revision ID: michael.terry@canonical.com-20141117145604-96dn9p5nwkifq2f4
MergeĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2014 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/Notifications"
 
21
import Ubuntu.Components 0.1
 
22
import Unity.Test 0.1
 
23
import Unity.Notifications 1.0
 
24
import QtMultimedia 5.0
 
25
 
 
26
Row {
 
27
    id: rootRow
 
28
 
 
29
    Component {
 
30
        id: mockNotification
 
31
 
 
32
        QtObject {
 
33
            function invokeAction(actionId) {
 
34
                console.log("Action invoked", actionId);
 
35
                mockModel.actionInvoked(actionId)
 
36
            }
 
37
        }
 
38
    }
 
39
 
 
40
    ListModel {
 
41
        id: mockModel
 
42
 
 
43
        signal actionInvoked(string actionId)
 
44
 
 
45
        function getRaw(id) {
 
46
            return mockNotification.createObject(mockModel)
 
47
        }
 
48
 
 
49
        // add the default/PlaceHolder notification to the model
 
50
        Component.onCompleted: {
 
51
            var n = {
 
52
                type: Notification.PlaceHolder,
 
53
                hints: {},
 
54
                summary: "",
 
55
                body: "",
 
56
                icon: "",
 
57
                secondaryIcon: "",
 
58
                actions: []
 
59
            }
 
60
 
 
61
            append(n)
 
62
        }
 
63
    }
 
64
 
 
65
    function addSnapDecisionNotification() {
 
66
        var n = {
 
67
            type: Notification.SnapDecision,
 
68
            hints: {"x-canonical-private-affirmative-tint": "true"},
 
69
            summary: "Incoming call",
 
70
            body: "Frank Zappa\n+44 (0)7736 027340",
 
71
            icon: "../graphics/avatars/funky.png",
 
72
            secondaryIcon: "image://theme/incoming-call",
 
73
            actions: [{ id: "ok_id", label: "Ok"},
 
74
                      { id: "cancel_id", label: "Cancel"},
 
75
                      { id: "dummy_id", label: "Quick reply"},
 
76
                      { id: "late_id", label: "messages:I'm running late. I'm on my way."},
 
77
                      { id: "later_id", label: "messages:I'm busy at the moment. I'll call later."}]
 
78
        }
 
79
 
 
80
        mockModel.append(n)
 
81
    }
 
82
 
 
83
    function clearNotifications() {
 
84
        mockModel.clear()
 
85
    }
 
86
 
 
87
    function remove1stNotification() {
 
88
        if (mockModel.count > 0)
 
89
            mockModel.remove(0)
 
90
    }
 
91
 
 
92
    Rectangle {
 
93
        id: notificationsRect
 
94
 
 
95
        width: units.gu(40)
 
96
        height: units.gu(81)
 
97
        color: "#cccccc"
 
98
 
 
99
        MouseArea{
 
100
            id: clickThroughCatcher
 
101
 
 
102
            anchors.fill: parent
 
103
        }
 
104
 
 
105
        Notifications {
 
106
            id: notifications
 
107
 
 
108
            margin: units.gu(1)
 
109
 
 
110
            anchors.fill: parent
 
111
            model: mockModel
 
112
        }
 
113
    }
 
114
 
 
115
    Rectangle {
 
116
        id: interactiveControls
 
117
 
 
118
        width: units.gu(30)
 
119
        height: units.gu(81)
 
120
        color: "grey"
 
121
 
 
122
        Column {
 
123
            spacing: units.gu(1)
 
124
            anchors.fill: parent
 
125
            anchors.margins: units.gu(1)
 
126
 
 
127
            Button {
 
128
                width: parent.width
 
129
                text: "add a snap-decision"
 
130
                onClicked: addSnapDecisionNotification()
 
131
            }
 
132
 
 
133
            Button {
 
134
                width: parent.width
 
135
                text: "remove 1st notification"
 
136
                onClicked: remove1stNotification()
 
137
            }
 
138
 
 
139
            Button {
 
140
                width: parent.width
 
141
                text: "clear model"
 
142
                onClicked: clearNotifications()
 
143
            }
 
144
        }
 
145
    }
 
146
 
 
147
    UnityTestCase {
 
148
        id: root
 
149
        name: "NotificationRendererTest"
 
150
        when: windowShown
 
151
 
 
152
        function test_NotificationRenderer_data() {
 
153
            return [
 
154
            {
 
155
                tag: "Snap Decision with secondary icon, button-tint and OptionToggle",
 
156
                type: Notification.SnapDecision,
 
157
                hints: {"x-canonical-private-affirmative-tint": "true"},
 
158
                summary: "Incoming call",
 
159
                body: "Frank Zappa\n+44 (0)7736 027340",
 
160
                icon: "../graphics/avatars/funky.png",
 
161
                secondaryIcon: "image://theme/incoming-call",
 
162
                actions: [{ id: "ok_id", label: "Ok"},
 
163
                          { id: "cancel_id", label: "Cancel"},
 
164
                          { id: "dummy_id", label: "Quick reply"},
 
165
                          { id: "late_id", label: "messages:I'm running late. I'm on my way."},
 
166
                          { id: "later_id", label: "messages:I'm busy at the moment. I'll call later."}],
 
167
                summaryVisible: true,
 
168
                bodyVisible: true,
 
169
                iconVisible: true,
 
170
                shaped: true,
 
171
                secondaryIconVisible: true,
 
172
                buttonRowVisible: true,
 
173
                buttonTinted: true,
 
174
                hasSound: false
 
175
            }
 
176
            ]
 
177
        }
 
178
 
 
179
        SignalSpy {
 
180
            id: clickThroughSpy
 
181
 
 
182
            target: clickThroughCatcher
 
183
            signalName: "clicked"
 
184
        }
 
185
 
 
186
        SignalSpy {
 
187
            id: actionSpy
 
188
 
 
189
            target: mockModel
 
190
            signalName: "actionInvoked"
 
191
        }
 
192
 
 
193
        function cleanup() {
 
194
            clickThroughSpy.clear()
 
195
            actionSpy.clear()
 
196
        }
 
197
 
 
198
        function test_NotificationRenderer(data) {
 
199
            // populate model with some mock notifications
 
200
            mockModel.append(data)
 
201
 
 
202
            // make sure the view is properly updated before going on
 
203
            notifications.forceLayout();
 
204
            waitForRendering(notifications);
 
205
 
 
206
            var notification = findChild(notifications, "notification" + (mockModel.count - 1))
 
207
            verify(notification !== undefined, "notification wasn't found");
 
208
 
 
209
            waitForRendering(notification);
 
210
 
 
211
            var icon = findChild(notification, "icon")
 
212
            var shapedIcon = findChild(notification, "shapedIcon")
 
213
            var nonShapedIcon = findChild(notification, "nonShapedIcon")
 
214
            var interactiveArea = findChild(notification, "interactiveArea")
 
215
            var secondaryIcon = findChild(notification, "secondaryIcon")
 
216
            var summaryLabel = findChild(notification, "summaryLabel")
 
217
            var bodyLabel = findChild(notification, "bodyLabel")
 
218
            var buttonRow = findChild(notification, "buttonRow")
 
219
 
 
220
            compare(icon.visible, data.iconVisible, "avatar-icon visibility is incorrect")
 
221
            if (icon.visible) {
 
222
                compare(icon.shaped, data.shaped, "shaped-status is incorrect")
 
223
            }
 
224
 
 
225
            // test input does not fall through
 
226
            mouseClick(notification, notification.width / 2, notification.height / 2)
 
227
            if(data.type == Notification.Interactive) {
 
228
                actionSpy.wait()
 
229
                compare(actionSpy.signalArguments[0][0], data.actions[0]["id"], "got wrong id for interactive action")
 
230
            }
 
231
            compare(clickThroughSpy.count, 0, "click on notification fell through")
 
232
 
 
233
            compare(secondaryIcon.visible, data.secondaryIconVisible, "secondary-icon visibility is incorrect")
 
234
            compare(summaryLabel.visible, data.summaryVisible, "summary-text visibility is incorrect")
 
235
            compare(bodyLabel.visible, data.bodyVisible, "body-text visibility is incorrect")
 
236
            compare(buttonRow.visible, data.buttonRowVisible, "button visibility is incorrect")
 
237
 
 
238
            var audioItem = findInvisibleChild(notification, "sound")
 
239
            compare(audioItem.playbackState, data.hasSound ? Audio.PlayingState : Audio.StoppedState, "Audio has wrong state")
 
240
 
 
241
            if(data.buttonRowVisible) {
 
242
                var buttonCancel = findChild(buttonRow, "notify_button1")
 
243
                var buttonAccept = findChild(buttonRow, "notify_button0")
 
244
 
 
245
                // only test the left/cancel-button if two actions have been passed in
 
246
                if (data.actions.length == 2) {
 
247
                    tryCompareFunction(function() { mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2); return actionSpy.signalArguments.length > 0; }, true);
 
248
                    compare(actionSpy.signalArguments[0][0], data.actions[1]["id"], "got wrong id for negative action")
 
249
                    actionSpy.clear()
 
250
                }
 
251
 
 
252
                // check the tinting of the positive/right button
 
253
                verify(buttonAccept.color === data.buttonTinted ? "#3fb24f" : "#dddddd", "button has the wrong color-tint")
 
254
 
 
255
                // click the positive/right button
 
256
                tryCompareFunction(function() { mouseClick(buttonAccept, buttonAccept.width / 2, buttonAccept.height / 2); return actionSpy.signalArguments.length > 0; }, true);
 
257
                compare(actionSpy.signalArguments[0][0], data.actions[0]["id"], "got wrong id positive action")
 
258
                actionSpy.clear()
 
259
                waitForRendering(notification)
 
260
 
 
261
                // check if there's a OptionToggle created due to more actions being passed
 
262
                if (data.actions.length > 2) {
 
263
                    var optionToggle = findChild(notification, "notify_button2")
 
264
                    tryCompareFunction(function() { return optionToggle.expanded == false; }, true);
 
265
 
 
266
                    // click to expand
 
267
                    tryCompareFunction(function() { mouseClick(optionToggle, optionToggle.width / 2, optionToggle.height / 2); return optionToggle.expanded == true; }, true);
 
268
 
 
269
                    // try clicking on choices in expanded comboList
 
270
                    var choiceButton1 = findChild(notification, "notify_button3")
 
271
                    tryCompareFunction(function() { mouseClick(choiceButton1, choiceButton1.width / 2, choiceButton1.height / 2); return actionSpy.signalArguments.length > 0; }, true);
 
272
                    compare(actionSpy.signalArguments[0][0], data.actions[3]["id"], "got wrong id choice action 1")
 
273
                    actionSpy.clear()
 
274
 
 
275
                    var choiceButton2 = findChild(notification, "notify_button4")
 
276
                    tryCompareFunction(function() { mouseClick(choiceButton2, choiceButton2.width / 2, choiceButton2.height / 2); return actionSpy.signalArguments.length > 0; }, true);
 
277
                    compare(actionSpy.signalArguments[0][0], data.actions[4]["id"], "got wrong id choice action 2")
 
278
                    actionSpy.clear()
 
279
                } else {
 
280
                    mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2)
 
281
                    compare(actionSpy.signalArguments[0][0], data.actions[1]["id"], "got wrong id for negative action")
 
282
                }
 
283
            }
 
284
        }
 
285
    }
 
286
}