From 3a6b7ffc79a1d0d9476fc0e47643e73269ad8ecf Mon Sep 17 00:00:00 2001 From: Jarek Janik Date: Wed, 19 Jun 2024 17:48:29 +0200 Subject: [PATCH] Add tests for Toggle Raise and Lower functionality --- autotests/integration/stacking_order_test.cpp | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/autotests/integration/stacking_order_test.cpp b/autotests/integration/stacking_order_test.cpp index 72fe86f946..b3e070a749 100644 --- a/autotests/integration/stacking_order_test.cpp +++ b/autotests/integration/stacking_order_test.cpp @@ -48,6 +48,9 @@ private Q_SLOTS: void testKeepBelow(); void testPreserveRelativeWindowStacking(); + + void testToggleRaiseLowerInSingleLayer(); + void testToggleRaiseLowerInMultipleLayers(); }; void StackingOrderTest::initTestCase() @@ -906,5 +909,130 @@ void StackingOrderTest::testPreserveRelativeWindowStacking() QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[3], windows[4], windows[1], windows[2]})); } +void StackingOrderTest::testToggleRaiseLowerInSingleLayer() +{ + // This test verifies that Toggle Raise Lower causes proper action (lowering or raising) to top-most, + // bottom-most and middle-stacked windows, as well as this action doesn't transfer focus + + const int windowCount = 3; + + std::unique_ptr surfaces[windowCount]; + std::unique_ptr shellSurfaces[windowCount]; + Window *windows[windowCount]; + + // Create 3 windows. + for (int i = 0; i < windowCount; i++) { + surfaces[i] = Test::createSurface(); + QVERIFY(surfaces[i]); + shellSurfaces[i] = Test::createXdgToplevelSurface(surfaces[i].get()); + QVERIFY(shellSurfaces[i]); + windows[i] = Test::renderAndWaitForShown(surfaces[i].get(), QSize(128, 128), Qt::green); + QVERIFY(windows[i]); + } + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2]})); + + // Activate window 0, verify effects. + workspace()->activateWindow(windows[0]); + QVERIFY(windows[0]->isActive()); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[1], windows[2], windows[0]})); + + // TR&L (Toggle Raise Lower) top-most window 0. + workspace()->raiseOrLowerWindow(windows[0]); + + // Verify that window 0 has been lowered and still has focus. + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2]})); + QVERIFY(windows[0]->isActive()); + + // TR&L window 0, which is now bottom-most. + workspace()->raiseOrLowerWindow(windows[0]); + + // verify that window 0 has been raised and still has focus. + QCOMPARE(workspace()->stackingOrder(), (QList{windows[1], windows[2], windows[0]})); + QVERIFY(windows[0]->isActive()); + + // TR&L window 2, which is in the middle. + workspace()->raiseOrLowerWindow(windows[2]); + // verify that it got raised and focus stays with window 0. + QCOMPARE(workspace()->stackingOrder(), (QList{windows[1], windows[0], windows[2]})); + QVERIFY(!windows[2]->isActive()); + QVERIFY(windows[0]->isActive()); + + // TR&L window 2, which is top-most now, but doesn't have focus. + workspace()->raiseOrLowerWindow(windows[2]); + // verify that it got lower and focus stays with window 0. + QCOMPARE(workspace()->stackingOrder(), (QList{windows[2], windows[1], windows[0]})); + QVERIFY(!windows[2]->isActive()); + QVERIFY(windows[0]->isActive()); +} + +void StackingOrderTest::testToggleRaiseLowerInMultipleLayers() +{ + // This test verifies that Toggle Raise & Lower works independently within each window layer + + const int windowCount = 9; + + std::unique_ptr surfaces[windowCount]; + std::unique_ptr shellSurfaces[windowCount]; + Window *windows[windowCount]; + + // Create 9 windows, place them in 3 layers, move to the same position, so they overlap each other. + for (int i = 0; i < windowCount; i++) { + surfaces[i] = Test::createSurface(); + QVERIFY(surfaces[i]); + shellSurfaces[i] = Test::createXdgToplevelSurface(surfaces[i].get()); + QVERIFY(shellSurfaces[i]); + windows[i] = Test::renderAndWaitForShown(surfaces[i].get(), QSize(128, 128), Qt::green); + QVERIFY(windows[i]); + windows[i]->move(QPoint(0, 0)); + } + windows[0]->setKeepBelow(true); + windows[1]->setKeepBelow(true); + windows[2]->setKeepBelow(true); + windows[6]->setKeepAbove(true); + windows[7]->setKeepAbove(true); + windows[8]->setKeepAbove(true); + + // Verify initial stacking order + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[3], windows[4], windows[5], + windows[6], windows[7], windows[8]})); + + // TR&L window 0 (lowest in BelowLayer), verify that it got raised within its layer + workspace()->raiseOrLowerWindow(windows[0]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[1], windows[2], windows[0], + windows[3], windows[4], windows[5], + windows[6], windows[7], windows[8]})); + + // TR&L window 0, verify that it got lowered within its layer + workspace()->raiseOrLowerWindow(windows[0]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[3], windows[4], windows[5], + windows[6], windows[7], windows[8]})); + + // TR&L window 4 (middle in NormalLayer), verify that it got raised within its layer + workspace()->raiseOrLowerWindow(windows[4]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[3], windows[5], windows[4], + windows[6], windows[7], windows[8]})); + + // TR&L window 4, verify that it got lowered within NormalLayer + workspace()->raiseOrLowerWindow(windows[4]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[4], windows[3], windows[5], + windows[6], windows[7], windows[8]})); + + // TR&L window 8 (topmost in AboveLayer), verify that it got lowered within its layer + workspace()->raiseOrLowerWindow(windows[8]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[4], windows[3], windows[5], + windows[8], windows[6], windows[7]})); + + // TR&L window 8, verify that it got raised within its layer + workspace()->raiseOrLowerWindow(windows[8]); + QCOMPARE(workspace()->stackingOrder(), (QList{windows[0], windows[1], windows[2], + windows[4], windows[3], windows[5], + windows[6], windows[7], windows[8]})); +} + WAYLANDTEST_MAIN(StackingOrderTest) #include "stacking_order_test.moc"