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 }