264 lines
9.8 KiB
C++
264 lines
9.8 KiB
C++
|
/********************************************************************
|
||
|
KWin - the KDE window manager
|
||
|
This file is part of the KDE project.
|
||
|
|
||
|
Copyright (C) 2013 Martin Gräßlin <mgraesslin@kde.org>
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*********************************************************************/
|
||
|
|
||
|
// KWin
|
||
|
#include "../desktopchain.h"
|
||
|
|
||
|
#include <QTest>
|
||
|
|
||
|
using namespace KWin::TabBox;
|
||
|
|
||
|
class TestDesktopChain : public QObject
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
private slots:
|
||
|
void chainInit_data();
|
||
|
void chainInit();
|
||
|
void chainAdd_data();
|
||
|
void chainAdd();
|
||
|
void resize_data();
|
||
|
void resize();
|
||
|
void resizeAdd();
|
||
|
void useChain();
|
||
|
};
|
||
|
|
||
|
void TestDesktopChain::chainInit_data()
|
||
|
{
|
||
|
QTest::addColumn<uint>("size");
|
||
|
QTest::addColumn<uint>("next");
|
||
|
QTest::addColumn<uint>("result");
|
||
|
|
||
|
QTest::newRow("0/1") << (uint)0 << (uint)1 << (uint)1;
|
||
|
QTest::newRow("0/5") << (uint)0 << (uint)5 << (uint)1;
|
||
|
QTest::newRow("1/1") << (uint)1 << (uint)1 << (uint)1;
|
||
|
QTest::newRow("1/2") << (uint)1 << (uint)2 << (uint)1;
|
||
|
QTest::newRow("4/1") << (uint)4 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("4/2") << (uint)4 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("4/3") << (uint)4 << (uint)3 << (uint)4;
|
||
|
QTest::newRow("4/4") << (uint)4 << (uint)4 << (uint)1;
|
||
|
QTest::newRow("4/5") << (uint)4 << (uint)5 << (uint)1;
|
||
|
QTest::newRow("4/7") << (uint)4 << (uint)7 << (uint)1;
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::chainInit()
|
||
|
{
|
||
|
QFETCH(uint, size);
|
||
|
QFETCH(uint, next);
|
||
|
DesktopChain chain(size);
|
||
|
QTEST(chain.next(next), "result");
|
||
|
|
||
|
DesktopChainManager manager(this);
|
||
|
manager.resize(0, size);
|
||
|
QTEST(manager.next(next), "result");
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::chainAdd_data()
|
||
|
{
|
||
|
QTest::addColumn<uint>("size");
|
||
|
QTest::addColumn<uint>("add");
|
||
|
QTest::addColumn<uint>("next");
|
||
|
QTest::addColumn<uint>("result");
|
||
|
|
||
|
// invalid size, should not crash
|
||
|
QTest::newRow("0/1/1/1") << (uint)0 << (uint)1 << (uint)1 << (uint)1;
|
||
|
// moving first element to the front, shouldn't change the chain
|
||
|
QTest::newRow("4/1/1/2") << (uint)4 << (uint)1 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("4/1/2/3") << (uint)4 << (uint)1 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("4/1/3/4") << (uint)4 << (uint)1 << (uint)3 << (uint)4;
|
||
|
QTest::newRow("4/1/4/1") << (uint)4 << (uint)1 << (uint)4 << (uint)1;
|
||
|
// moving an element from middle to front, should reorder
|
||
|
QTest::newRow("4/3/1/1") << (uint)4 << (uint)3 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("4/3/2/4") << (uint)4 << (uint)3 << (uint)2 << (uint)4;
|
||
|
QTest::newRow("4/3/3/1") << (uint)4 << (uint)3 << (uint)3 << (uint)1;
|
||
|
QTest::newRow("4/3/4/3") << (uint)4 << (uint)3 << (uint)4 << (uint)3;
|
||
|
// adding an element which does not exist - should leave the chain untouched
|
||
|
QTest::newRow("4/5/1/2") << (uint)4 << (uint)5 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("4/5/2/3") << (uint)4 << (uint)5 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("4/5/3/4") << (uint)4 << (uint)5 << (uint)3 << (uint)4;
|
||
|
QTest::newRow("4/5/4/1") << (uint)4 << (uint)5 << (uint)4 << (uint)1;
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::chainAdd()
|
||
|
{
|
||
|
QFETCH(uint, size);
|
||
|
QFETCH(uint, add);
|
||
|
QFETCH(uint, next);
|
||
|
DesktopChain chain(size);
|
||
|
chain.add(add);
|
||
|
QTEST(chain.next(next), "result");
|
||
|
|
||
|
DesktopChainManager manager(this);
|
||
|
manager.resize(0, size);
|
||
|
manager.addDesktop(0, add);
|
||
|
QTEST(manager.next(next), "result");
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::resize_data()
|
||
|
{
|
||
|
QTest::addColumn<uint>("size");
|
||
|
QTest::addColumn<uint>("add");
|
||
|
QTest::addColumn<uint>("newSize");
|
||
|
QTest::addColumn<uint>("next");
|
||
|
QTest::addColumn<uint>("result");
|
||
|
|
||
|
// basic test - increment by one
|
||
|
QTest::newRow("1->2/1") << (uint)1 << (uint)1 << (uint)2 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("1->2/2") << (uint)1 << (uint)1 << (uint)2 << (uint)2 << (uint)1;
|
||
|
// more complex test - increment by three, keep chain untouched
|
||
|
QTest::newRow("3->6/1") << (uint)3 << (uint)1 << (uint)6 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("3->6/2") << (uint)3 << (uint)1 << (uint)6 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("3->6/3") << (uint)3 << (uint)1 << (uint)6 << (uint)3 << (uint)4;
|
||
|
QTest::newRow("3->6/4") << (uint)3 << (uint)1 << (uint)6 << (uint)4 << (uint)5;
|
||
|
QTest::newRow("3->6/5") << (uint)3 << (uint)1 << (uint)6 << (uint)5 << (uint)6;
|
||
|
QTest::newRow("3->6/6") << (uint)3 << (uint)1 << (uint)6 << (uint)6 << (uint)1;
|
||
|
// increment by three, but change it before
|
||
|
QTest::newRow("3->6/3/1") << (uint)3 << (uint)3 << (uint)6 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("3->6/3/2") << (uint)3 << (uint)3 << (uint)6 << (uint)2 << (uint)4;
|
||
|
QTest::newRow("3->6/3/3") << (uint)3 << (uint)3 << (uint)6 << (uint)3 << (uint)1;
|
||
|
QTest::newRow("3->6/3/4") << (uint)3 << (uint)3 << (uint)6 << (uint)4 << (uint)5;
|
||
|
QTest::newRow("3->6/3/5") << (uint)3 << (uint)3 << (uint)6 << (uint)5 << (uint)6;
|
||
|
QTest::newRow("3->6/3/6") << (uint)3 << (uint)3 << (uint)6 << (uint)6 << (uint)3;
|
||
|
|
||
|
// basic test - decrement by one
|
||
|
QTest::newRow("2->1/1") << (uint)2 << (uint)1 << (uint)1 << (uint)1 << (uint)1;
|
||
|
QTest::newRow("2->1/2") << (uint)2 << (uint)2 << (uint)1 << (uint)1 << (uint)1;
|
||
|
// more complex test - decrement by three, keep chain untouched
|
||
|
QTest::newRow("6->3/1") << (uint)6 << (uint)1 << (uint)3 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("6->3/2") << (uint)6 << (uint)1 << (uint)3 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("6->3/3") << (uint)6 << (uint)1 << (uint)3 << (uint)3 << (uint)1;
|
||
|
// more complex test - decrement by three, move element to front
|
||
|
QTest::newRow("6->3/6/1") << (uint)6 << (uint)6 << (uint)3 << (uint)1 << (uint)2;
|
||
|
QTest::newRow("6->3/6/2") << (uint)6 << (uint)6 << (uint)3 << (uint)2 << (uint)3;
|
||
|
QTest::newRow("6->3/6/3") << (uint)6 << (uint)6 << (uint)3 << (uint)3 << (uint)1;
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::resize()
|
||
|
{
|
||
|
QFETCH(uint, size);
|
||
|
DesktopChain chain(size);
|
||
|
QFETCH(uint, add);
|
||
|
chain.add(add);
|
||
|
QFETCH(uint, newSize);
|
||
|
chain.resize(size, newSize);
|
||
|
QFETCH(uint, next);
|
||
|
QTEST(chain.next(next), "result");
|
||
|
|
||
|
DesktopChainManager manager(this);
|
||
|
manager.resize(0, size);
|
||
|
manager.addDesktop(0, add);
|
||
|
manager.resize(size, newSize);
|
||
|
QTEST(manager.next(next), "result");
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::resizeAdd()
|
||
|
{
|
||
|
// test that verifies that add works after shrinking the chain
|
||
|
DesktopChain chain(6);
|
||
|
DesktopChainManager manager(this);
|
||
|
manager.resize(0, 6);
|
||
|
chain.add(4);
|
||
|
manager.addDesktop(0, 4);
|
||
|
chain.add(5);
|
||
|
manager.addDesktop(4, 5);
|
||
|
chain.add(6);
|
||
|
manager.addDesktop(5, 6);
|
||
|
QCOMPARE(chain.next(6), (uint)5);
|
||
|
QCOMPARE(manager.next(6), (uint)5);
|
||
|
QCOMPARE(chain.next(5), (uint)4);
|
||
|
QCOMPARE(manager.next(5), (uint)4);
|
||
|
QCOMPARE(chain.next(4), (uint)1);
|
||
|
QCOMPARE(manager.next(4), (uint)1);
|
||
|
chain.resize(6, 3);
|
||
|
manager.resize(6, 3);
|
||
|
QCOMPARE(chain.next(3), (uint)3);
|
||
|
QCOMPARE(manager.next(3), (uint)3);
|
||
|
QCOMPARE(chain.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
QCOMPARE(chain.next(2), (uint)3);
|
||
|
QCOMPARE(manager.next(2), (uint)3);
|
||
|
// add
|
||
|
chain.add(1);
|
||
|
manager.addDesktop(3, 1);
|
||
|
QCOMPARE(chain.next(3), (uint)3);
|
||
|
QCOMPARE(manager.next(3), (uint)3);
|
||
|
QCOMPARE(chain.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
chain.add(2);
|
||
|
manager.addDesktop(1, 2);
|
||
|
QCOMPARE(chain.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
QCOMPARE(chain.next(2), (uint)1);
|
||
|
QCOMPARE(manager.next(2), (uint)1);
|
||
|
QCOMPARE(chain.next(3), (uint)2);
|
||
|
QCOMPARE(manager.next(3), (uint)2);
|
||
|
}
|
||
|
|
||
|
void TestDesktopChain::useChain()
|
||
|
{
|
||
|
DesktopChainManager manager(this);
|
||
|
manager.resize(0, 4);
|
||
|
manager.addDesktop(0, 3);
|
||
|
// creating the first chain, should keep it unchanged
|
||
|
manager.useChain("test");
|
||
|
QCOMPARE(manager.next(3), (uint)1);
|
||
|
QCOMPARE(manager.next(1), (uint)2);
|
||
|
QCOMPARE(manager.next(2), (uint)4);
|
||
|
QCOMPARE(manager.next(4), (uint)3);
|
||
|
// but creating a second chain, should create an empty one
|
||
|
manager.useChain("second chain");
|
||
|
QCOMPARE(manager.next(1), (uint)2);
|
||
|
QCOMPARE(manager.next(2), (uint)3);
|
||
|
QCOMPARE(manager.next(3), (uint)4);
|
||
|
QCOMPARE(manager.next(4), (uint)1);
|
||
|
// adding a desktop should only affect the currently used one
|
||
|
manager.addDesktop(3, 2);
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(2), (uint)1);
|
||
|
QCOMPARE(manager.next(3), (uint)4);
|
||
|
QCOMPARE(manager.next(4), (uint)2);
|
||
|
// verify by switching back
|
||
|
manager.useChain("test");
|
||
|
QCOMPARE(manager.next(3), (uint)1);
|
||
|
QCOMPARE(manager.next(1), (uint)2);
|
||
|
QCOMPARE(manager.next(2), (uint)4);
|
||
|
QCOMPARE(manager.next(4), (uint)3);
|
||
|
manager.addDesktop(3, 1);
|
||
|
// use second chain again and put 4th desktop to front
|
||
|
manager.useChain("second chain");
|
||
|
manager.addDesktop(3, 4);
|
||
|
// just for the fun a third chain, and let's shrink it
|
||
|
manager.useChain("third chain");
|
||
|
manager.resize(4, 3);
|
||
|
QCOMPARE(manager.next(1), (uint)2);
|
||
|
QCOMPARE(manager.next(2), (uint)3);
|
||
|
// it must have affected all chains
|
||
|
manager.useChain("test");
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(3), (uint)2);
|
||
|
QCOMPARE(manager.next(2), (uint)1);
|
||
|
manager.useChain("second chain");
|
||
|
QCOMPARE(manager.next(3), (uint)2);
|
||
|
QCOMPARE(manager.next(1), (uint)3);
|
||
|
QCOMPARE(manager.next(2), (uint)1);
|
||
|
}
|
||
|
|
||
|
QTEST_MAIN(TestDesktopChain)
|
||
|
#include "test_desktopchain.moc"
|