From a7cf808dea256ed541540b3cba0c6b4b08ba546c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 25 Sep 2014 08:45:23 +0200 Subject: [PATCH] Improve the TestScreens autotest --- autotests/test_screens.cpp | 135 ++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-) diff --git a/autotests/test_screens.cpp b/autotests/test_screens.cpp index cfdf428df6..68920d7bfc 100644 --- a/autotests/test_screens.cpp +++ b/autotests/test_screens.cpp @@ -21,6 +21,8 @@ along with this program. If not, see . #include "../cursor.h" #include "mock_screens.h" #include "mock_client.h" +// frameworks +#include // Qt #include @@ -28,9 +30,10 @@ along with this program. If not, see . namespace KWin { +static QPoint s_cursorPos = QPoint(); QPoint Cursor::pos() { - return QPoint(); + return s_cursorPos; } } @@ -39,7 +42,10 @@ class TestScreens : public QObject { Q_OBJECT private Q_SLOTS: + void init(); void testCurrentFollowsMouse(); + void testReconfigure_data(); + void testReconfigure(); void testSize_data(); void testSize(); void testCount(); @@ -48,8 +54,17 @@ private Q_SLOTS: void testCurrent_data(); void testCurrent(); void testCurrentClient(); + void testCurrentWithFollowsMouse_data(); + void testCurrentWithFollowsMouse(); + void testCurrentPoint_data(); + void testCurrentPoint(); }; +void TestScreens::init() +{ + KWin::s_cursorPos = QPoint(); +} + void TestScreens::testCurrentFollowsMouse() { KWin::MockWorkspace ws; @@ -57,8 +72,54 @@ void TestScreens::testCurrentFollowsMouse() QVERIFY(!screens->isCurrentFollowsMouse()); screens->setCurrentFollowsMouse(true); QVERIFY(screens->isCurrentFollowsMouse()); + // setting to same should not do anything + screens->setCurrentFollowsMouse(true); + QVERIFY(screens->isCurrentFollowsMouse()); + + // setting back to other value screens->setCurrentFollowsMouse(false); QVERIFY(!screens->isCurrentFollowsMouse()); + // setting to same should not do anything + screens->setCurrentFollowsMouse(false); + QVERIFY(!screens->isCurrentFollowsMouse()); +} + +void TestScreens::testReconfigure_data() +{ + QTest::addColumn("focusPolicy"); + QTest::addColumn("expectedDefault"); + QTest::addColumn("setting"); + + QTest::newRow("ClickToFocus") << QStringLiteral("ClickToFocus") << false << true; + QTest::newRow("FocusFollowsMouse") << QStringLiteral("FocusFollowsMouse") << true << false; + QTest::newRow("FocusUnderMouse") << QStringLiteral("FocusUnderMouse") << true << false; + QTest::newRow("FocusStrictlyUnderMouse") << QStringLiteral("FocusStrictlyUnderMouse") << true << false; +} + +void TestScreens::testReconfigure() +{ + using namespace KWin; + MockWorkspace ws; + Screens::create(&ws); + screens()->reconfigure(); + QVERIFY(!screens()->isCurrentFollowsMouse()); + + QFETCH(QString, focusPolicy); + + KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); + config->group("Windows").writeEntry("FocusPolicy", focusPolicy); + config->group("Windows").sync(); + config->sync(); + + screens()->setConfig(config); + screens()->reconfigure(); + QTEST(screens()->isCurrentFollowsMouse(), "expectedDefault"); + + QFETCH(bool, setting); + config->group("Windows").writeEntry("ActiveMouseScreen", setting); + config->sync(); + screens()->reconfigure(); + QCOMPARE(screens()->isCurrentFollowsMouse(), setting); } void TestScreens::testSize_data() @@ -221,11 +282,83 @@ void TestScreens::testCurrentClient() QCOMPARE(currentChangedSpy.count(), 1); QCOMPARE(screens()->current(), 1); + // setting current with the same client again should not change, though + screens()->setCurrent(client); + QCOMPARE(currentChangedSpy.count(), 1); + // and it should even still be on screen 1 if we make the client non-current again ws.setActiveClient(nullptr); client->setActive(false); QCOMPARE(screens()->current(), 1); } +void TestScreens::testCurrentWithFollowsMouse_data() +{ + QTest::addColumn< QList >("geometries"); + QTest::addColumn("cursorPos"); + QTest::addColumn("expected"); + + QTest::newRow("empty") << QList{{QRect()}} << QPoint(100, 100) << 0; + QTest::newRow("cloned") << QList{{QRect{0, 0, 200, 100}, QRect{0, 0, 200, 100}}} << QPoint(50, 50) << 0; + QTest::newRow("adjacent-0") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(199, 99) << 0; + QTest::newRow("adjacent-1") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(200, 100) << 1; + QTest::newRow("gap") << QList{{QRect{0, 0, 10, 20}, QRect{20, 40, 10, 20}}} << QPoint(15, 30) << 1; +} + +void TestScreens::testCurrentWithFollowsMouse() +{ + using namespace KWin; + MockWorkspace ws; + MockScreens *mockScreens = static_cast(Screens::create(&ws)); + QSignalSpy changedSpy(screens(), SIGNAL(changed())); + QVERIFY(changedSpy.isValid()); + screens()->setCurrentFollowsMouse(true); + QCOMPARE(screens()->current(), 0); + + QFETCH(QList, geometries); + mockScreens->setGeometries(geometries); + // first is before it's updated + QVERIFY(changedSpy.wait()); + // second is after it's updated + QVERIFY(changedSpy.wait()); + + QFETCH(QPoint, cursorPos); + KWin::s_cursorPos = cursorPos; + QTEST(screens()->current(), "expected"); +} + +void TestScreens::testCurrentPoint_data() +{ + QTest::addColumn< QList >("geometries"); + QTest::addColumn("cursorPos"); + QTest::addColumn("expected"); + + QTest::newRow("empty") << QList{{QRect()}} << QPoint(100, 100) << 0; + QTest::newRow("cloned") << QList{{QRect{0, 0, 200, 100}, QRect{0, 0, 200, 100}}} << QPoint(50, 50) << 0; + QTest::newRow("adjacent-0") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(199, 99) << 0; + QTest::newRow("adjacent-1") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(200, 100) << 1; + QTest::newRow("gap") << QList{{QRect{0, 0, 10, 20}, QRect{20, 40, 10, 20}}} << QPoint(15, 30) << 1; +} + +void TestScreens::testCurrentPoint() +{ + using namespace KWin; + MockWorkspace ws; + MockScreens *mockScreens = static_cast(Screens::create(&ws)); + QSignalSpy changedSpy(screens(), SIGNAL(changed())); + QVERIFY(changedSpy.isValid()); + + QFETCH(QList, geometries); + mockScreens->setGeometries(geometries); + // first is before it's updated + QVERIFY(changedSpy.wait()); + // second is after it's updated + QVERIFY(changedSpy.wait()); + + QFETCH(QPoint, cursorPos); + screens()->setCurrent(cursorPos); + QTEST(screens()->current(), "expected"); +} + QTEST_MAIN(TestScreens) #include "test_screens.moc"