Warning, /frameworks/kirigami/autotests/pagepool/tst_layers.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Mason McParlane <mtmcp@outlook.com>
0003 *
0004 * SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Controls
0009 import QtQuick.Window
0010 import org.kde.kirigami as Kirigami
0011 import QtTest
0012
0013 TestCase {
0014 id: testCase
0015 width: 400
0016 height: 400
0017 name: "PagePoolWithLayers"
0018 when: windowShown
0019
0020 function initTestCase() {
0021 mainWindow.show()
0022 }
0023
0024 function cleanupTestCase() {
0025 mainWindow.close()
0026 }
0027
0028 Kirigami.ApplicationWindow {
0029 id: mainWindow
0030 width: 480
0031 height: 360
0032 }
0033
0034 Kirigami.PagePool {
0035 id: pool
0036 }
0037
0038 SignalSpy {
0039 id: stackSpy
0040 target: mainWindow.pageStack
0041 signalName: "onCurrentItemChanged"
0042 }
0043
0044 SignalSpy {
0045 id: layerSpy
0046 target: mainWindow.pageStack.layers
0047 signalName: "onCurrentItemChanged"
0048 }
0049
0050
0051 function init() {
0052 pool.clear()
0053 mainWindow.pageStack.layers.clear()
0054 compare(mainWindow.pageStack.layers.depth, 1)
0055 mainWindow.pageStack.clear()
0056
0057 for (var spy of [stackSpy, layerSpy, checkSpy_A, checkSpy_B, checkSpy_C, checkSpy_D, checkSpy_E]) {
0058 spy.clear()
0059 }
0060
0061 // Give mainWindow a bit of room to breathe so it can process item
0062 // deletion and other delayed signals.
0063 wait(50)
0064 }
0065
0066 ActionGroup {
0067 id: group
0068 exclusive: false
0069
0070 Kirigami.PagePoolAction {
0071 id: stackPageA
0072 objectName: "stackPageA"
0073 pagePool: pool
0074 pageStack: mainWindow.pageStack
0075 page: "TestPage.qml?page=A"
0076 initialProperties: { return {title: "A", objectName: "Page A" } }
0077 }
0078
0079 Kirigami.PagePoolAction {
0080 id: stackPageB
0081 objectName: "stackPageB"
0082 pagePool: pool
0083 pageStack: mainWindow.pageStack
0084 page: "TestPage.qml?page=B"
0085 initialProperties: { return {title: "B", objectName: "Page B" } }
0086 }
0087
0088 Kirigami.PagePoolAction {
0089 id: layerPageC
0090 objectName: "layerPageC"
0091 pagePool: pool
0092 pageStack: mainWindow.pageStack
0093 useLayers: true
0094 page: "TestPage.qml?page=C"
0095 initialProperties: { return {title: "C", objectName: "Page C" } }
0096 }
0097
0098 Kirigami.PagePoolAction {
0099 id: layerPageD
0100 objectName: "layerPageD"
0101 pagePool: pool
0102 pageStack: mainWindow.pageStack
0103 useLayers: true
0104 page: "TestPage.qml?page=D"
0105 initialProperties: { return {title: "D", objectName: "Page D" } }
0106 }
0107
0108 Kirigami.PagePoolAction {
0109 id: stackPageE
0110 objectName: "stackPageE"
0111 pagePool: pool
0112 pageStack: mainWindow.pageStack
0113 page: "TestPage.qml?page=E"
0114 initialProperties: { return {title: "E", objectName: "Page E" } }
0115 }
0116 }
0117
0118 function tapBack () {
0119 mouseClick(mainWindow, 10, 10)
0120 }
0121
0122 function test_pushLayerBackButtonPushAgain() {
0123 var stack = mainWindow.pageStack
0124 var layers = stack.layers
0125
0126 function pushA() {
0127 stackPageA.trigger()
0128 compare(stack.currentItem, pool.lastLoadedItem)
0129 }
0130
0131 function pushC () {
0132 layerPageC.trigger()
0133 compare(layers.currentItem, pool.lastLoadedItem)
0134 }
0135
0136 function pushD () {
0137 layerPageD.trigger()
0138 compare(layers.currentItem, pool.lastLoadedItem)
0139 }
0140
0141 compare(stackSpy.count, 0)
0142 pushA()
0143 compare(stackSpy.count, 1)
0144 compare(layerSpy.count, 0)
0145 pushC()
0146 compare(layerSpy.count, 1)
0147 pushD()
0148 compare(layerSpy.count, 2)
0149 compare(stackSpy.count, 1)
0150 tapBack()
0151 compare(layerSpy.count, 3)
0152 pushD()
0153 compare(layerSpy.count, 4)
0154 }
0155
0156 SignalSpy {
0157 id: checkSpy_A
0158 target: stackPageA
0159 signalName: "onCheckedChanged"
0160 }
0161
0162 SignalSpy {
0163 id: checkSpy_B
0164 target: stackPageB
0165 signalName: "onCheckedChanged"
0166 }
0167
0168 SignalSpy {
0169 id: checkSpy_C
0170 target: layerPageC
0171 signalName: "onCheckedChanged"
0172 }
0173
0174 SignalSpy {
0175 id: checkSpy_D
0176 target: layerPageD
0177 signalName: "onCheckedChanged"
0178 }
0179
0180 SignalSpy {
0181 id: checkSpy_E
0182 target: stackPageE
0183 signalName: "onCheckedChanged"
0184 }
0185
0186 function dump_layers(msg = "") {
0187 for (var i = 0; i < mainWindow.pageStack.layers.depth; ++i) {
0188 console.debug(`${msg} ${i}: ${mainWindow.pageStack.layers.get(i)}`)
0189 }
0190 }
0191
0192 function test_checked() {
0193 var stack = mainWindow.pageStack
0194 var layers = stack.layers
0195
0196 function testCheck(expected = {}) {
0197 let defaults = {
0198 a: false, b: false, c: false, d: false, e: false
0199 }
0200 let actual = Object.assign({}, defaults, expected)
0201 let pages = {a: stackPageA, b: stackPageB, c: layerPageC, d: layerPageD, e: stackPageE}
0202
0203 for (const prop in actual) {
0204 compare(pages[prop].checked, actual[prop],
0205 `${pages[prop]} should ${actual[prop] ? 'be checked' : 'not be checked'}`)
0206 }
0207 }
0208
0209 testCheck()
0210
0211 compare(stackSpy.count, 0)
0212 compare(layerSpy.count, 0)
0213 compare(checkSpy_A.count, 0)
0214 compare(checkSpy_B.count, 0)
0215 compare(checkSpy_C.count, 0)
0216 compare(checkSpy_D.count, 0)
0217 compare(checkSpy_E.count, 0)
0218
0219 stackPageA.trigger()
0220 compare(checkSpy_A.count, 1)
0221 testCheck({a:true})
0222 compare(stack.currentItem, stackPageA.pageItem())
0223
0224 stackPageB.trigger()
0225 compare(checkSpy_A.count, 2)
0226 compare(checkSpy_B.count, 3)
0227 testCheck({b:true})
0228 compare(stack.currentItem, stackPageB.pageItem())
0229
0230 layerPageC.trigger()
0231 testCheck({b:true, c:true})
0232 compare(checkSpy_C.count, 1)
0233 compare(stack.currentItem, stackPageB.pageItem())
0234 compare(layers.currentItem, layerPageC.pageItem())
0235 compare(layerPageC.layerContainsPage(), true)
0236
0237 layerPageD.trigger()
0238 compare(stack.currentItem, stackPageB.pageItem())
0239 compare(layers.currentItem, layerPageD.pageItem())
0240 testCheck({b:true, c:true, d:true})
0241
0242 stackPageE.basePage = stack.currentItem
0243 stackPageE.trigger()
0244 testCheck({b:true, e:true})
0245 compare(stack.currentItem, stackPageE.pageItem())
0246 verify(!(layers.currentItem instanceof Page),
0247 `Current item ${layers.currentItem} is a page but all pages should be popped`)
0248
0249 stackPageA.trigger()
0250 testCheck({a:true})
0251 compare(stack.currentItem, stackPageA.pageItem())
0252 verify(!(layers.currentItem instanceof Page),
0253 `Current item ${layers.currentItem} is a page but all pages should be popped`)
0254
0255 compare(checkSpy_A.count, 5)
0256 compare(checkSpy_B.count, 4)
0257 compare(checkSpy_C.count, 2)
0258 compare(checkSpy_D.count, 2)
0259 compare(checkSpy_E.count, 2)
0260 }
0261
0262 function test_push_A_C_D_A_popsLayers() {
0263 var stack = mainWindow.pageStack
0264 var layers = stack.layers
0265
0266 stackPageA.trigger()
0267 compare(stack.currentItem, stackPageA.pageItem())
0268
0269 layerPageC.trigger()
0270 compare(layers.currentItem, layerPageC.pageItem())
0271
0272 layerPageD.trigger()
0273 compare(layers.currentItem, layerPageD.pageItem())
0274
0275 stackPageA.trigger()
0276 compare(stack.currentItem, stackPageA.pageItem())
0277 verify(!(layers.currentItem instanceof Page),
0278 `Current item ${layers.currentItem} is a page but all pages should be popped`)
0279 }
0280
0281 function test_push_A_C_D_back_back_C_back_C() {
0282 var stack = mainWindow.pageStack
0283 var layers = stack.layers
0284
0285 stackPageA.trigger()
0286 layerPageC.trigger()
0287 layerPageD.trigger()
0288 tapBack()
0289 tapBack()
0290 layerPageC.trigger()
0291 tapBack()
0292 layerPageC.trigger()
0293 compare(layers.currentItem, layerPageC.pageItem())
0294 }
0295
0296 function test_exclusive_group() {
0297 var stack = mainWindow.pageStack
0298 var layers = stack.layers
0299
0300 group.exclusive = true
0301 stackPageA.trigger()
0302 compare(stackPageA.checked, true)
0303 compare(layerPageC.checked, false)
0304 layerPageC.trigger()
0305 compare(stackPageA.checked, false)
0306 compare(layerPageC.checked, true)
0307 tapBack()
0308 compare(stackPageA.checked, true)
0309 compare(layerPageC.checked, false)
0310 }
0311 }