3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-22 15:15:53 +00:00
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

320 lines
10 KiB
C++

/*
SPDX-FileCopyrightText: 2017 Klarälvdalens Datakonsult AB a KDAB Group company <info@kdab.com>
SPDX-FileCopyrightText: Andras Mantia <andras.mantia@kdab.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "positionertest.h"
#include <QSignalSpy>
#include <QTemporaryDir>
#include <QTest>
#include "foldermodel.h"
#include "positioner.h"
#include "screenmapper.h"
QTEST_MAIN(PositionerTest)
static const QLatin1String desktop(QLatin1String("Desktop"));
void PositionerTest::initTestCase()
{
m_currentActivity = QStringLiteral("00000000-0000-0000-0000-000000000000");
m_folderDir = new QTemporaryDir();
QDir dir(m_folderDir->path());
dir.mkdir(desktop);
dir.cd(desktop);
dir.mkdir(QStringLiteral("firstDir"));
QFile f;
for (int i = 1; i < 10; i++) {
f.setFileName(QStringLiteral("%1/file%2.txt").arg(dir.path(), QString::number(i)));
f.open(QFile::WriteOnly);
f.close();
}
}
void PositionerTest::cleanupTestCase()
{
delete m_folderDir;
}
void PositionerTest::init()
{
m_folderModel = new FolderModel(this);
m_folderModel->classBegin();
m_folderModel->setScreen(0);
m_folderModel->setUsedByContainment(true);
m_folderModel->componentComplete();
m_positioner = new Positioner(this);
m_positioner->setEnabled(true);
m_positioner->setFolderModel(m_folderModel);
m_positioner->setPerStripe(3);
m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop);
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
s.wait(1000);
}
void PositionerTest::cleanup()
{
delete m_folderModel;
m_folderModel = nullptr;
delete m_positioner;
m_positioner = nullptr;
}
void PositionerTest::tst_positions_data()
{
QTest::addColumn<int>("perStripe");
QTest::newRow("3 per column") << 3;
QTest::newRow("5 per column") << 5;
}
void PositionerTest::tst_positions()
{
QFETCH(int, perStripe);
m_positioner->setPerStripe(perStripe);
checkPositions(perStripe);
}
void PositionerTest::tst_map()
{
// by default the mapping is 1-1
for (int i = 0; i < m_positioner->rowCount(); i++) {
QCOMPARE(m_positioner->map(i), i);
}
}
void PositionerTest::tst_move_data()
{
QTest::addColumn<QVariantList>("moves");
QTest::addColumn<QVector<int>>("result");
QTest::newRow("First to last") << QVariantList({0, 10}) << QVector<int>({-1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0});
QTest::newRow("First to after last") << QVariantList({0, 11}) << QVector<int>({-1, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0});
QTest::newRow("Switch 2nd with 3rd ") << QVariantList({1, 2, 2, 1}) << QVector<int>({0, 2, 1, 3, 4, 5, 6, 7, 8, 9});
QTest::newRow("Switch 2nd with 2nd ") << QVariantList({1, 1, 1, 1}) << QVector<int>({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
QTest::newRow("2nd to last") << QVariantList({2, 10}) << QVector<int>({0, 1, -1, 3, 4, 5, 6, 7, 8, 9, 2});
}
void PositionerTest::tst_move()
{
QFETCH(QVariantList, moves);
QFETCH(QVector<int>, result);
m_positioner->move(moves);
for (int i = 0; i < m_positioner->rowCount(); i++) {
QCOMPARE(m_positioner->map(i), result[i]);
}
}
void PositionerTest::tst_nearestitem_data()
{
QTest::addColumn<int>("index");
QTest::addColumn<QVector<int>>("result");
QTest::newRow("Around first") << 0 << QVector<int>{-1, -1, 3, -1, 1};
QTest::newRow("Around second") << 1 << QVector<int>{-1, -1, 4, 0, 2};
QTest::newRow("Around 5th") << 4 << QVector<int>{-1, 1, 7, 3, 5};
QTest::newRow("Around last") << 9 << QVector<int>{-1, 6, -1, -1, 7};
QTest::newRow("Around invalid") << 11 << QVector<int>{-1, -1, -1, -1, -1};
}
void PositionerTest::tst_nearestitem()
{
QFETCH(int, index);
QFETCH(QVector<int>, result);
for (int i = Qt::NoArrow; i <= Qt::RightArrow; i++) {
QCOMPARE(m_positioner->nearestItem(index, (Qt::ArrowType)i), result[i]);
}
}
void PositionerTest::tst_isBlank()
{
QCOMPARE(m_positioner->isBlank(0), false);
QCOMPARE(m_positioner->isBlank(11), true);
m_positioner->move({0, 10});
QCOMPARE(m_positioner->isBlank(0), true);
}
void PositionerTest::tst_reset()
{
m_positioner->move({0, 10});
m_positioner->reset();
QSignalSpy s(m_positioner, &Positioner::positionsChanged);
s.wait(500);
QCOMPARE(s.count(), 1);
checkPositions(3);
for (int i = 0; i < m_positioner->rowCount(); i++) {
QCOMPARE(m_positioner->map(i), i);
}
}
void PositionerTest::tst_defaultValues()
{
Positioner positioner;
QVERIFY(!positioner.enabled());
QVERIFY(!positioner.folderModel());
QCOMPARE(positioner.perStripe(), 0);
QVERIFY(positioner.positions().isEmpty());
}
void PositionerTest::tst_changeEnabledStatus()
{
Positioner positioner;
QVERIFY(!positioner.enabled());
QSignalSpy s(&positioner, &Positioner::enabledChanged);
positioner.setEnabled(true);
QCOMPARE(s.count(), 1);
positioner.setEnabled(false);
QCOMPARE(s.count(), 2);
// No change
positioner.setEnabled(false);
QCOMPARE(s.count(), 2);
}
void PositionerTest::tst_changePerStripe()
{
Positioner positioner;
QCOMPARE(positioner.perStripe(), 0);
QSignalSpy s(&positioner, &Positioner::perStripeChanged);
positioner.setPerStripe(1);
QCOMPARE(s.count(), 1);
// No change
positioner.setPerStripe(1);
QCOMPARE(s.count(), 1);
positioner.setPerStripe(4);
QCOMPARE(s.count(), 2);
}
void PositionerTest::tst_proxyMapping()
{
auto *screenMapper = ScreenMapper::instance();
FolderModel secondFolderModel;
secondFolderModel.classBegin();
secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop);
secondFolderModel.setUsedByContainment(true);
secondFolderModel.setScreen(1);
secondFolderModel.componentComplete();
Positioner secondPositioner;
secondPositioner.setEnabled(true);
secondPositioner.setFolderModel(&secondFolderModel);
secondPositioner.setPerStripe(3);
QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted);
QVERIFY(s2.wait(1000));
QHash<int, int> expectedSource2ProxyScreen0;
QHash<int, int> expectedProxy2SourceScreen0;
QHash<int, int> expectedProxy2SourceScreen1;
QHash<int, int> expectedSource2ProxyScreen1;
for (int i = 0; i < m_folderModel->rowCount(); i++) {
expectedSource2ProxyScreen0[i] = i;
expectedProxy2SourceScreen0[i] = i;
}
// swap items 1 and 2 in the positioner
m_positioner->move({1, 2, 2, 1});
expectedSource2ProxyScreen0[1] = 2;
expectedSource2ProxyScreen0[2] = 1;
expectedProxy2SourceScreen0[1] = 2;
expectedProxy2SourceScreen0[2] = 1;
auto savedSource2ProxyScreen0 = expectedSource2ProxyScreen0;
auto savedProxy2SourceScreen0 = expectedProxy2SourceScreen0;
auto verifyMapping = [](const QHash<int, int> &actual, const QHash<int, int> &expected) {
auto ensureUnique = [](const QHash<int, int> mapping) {
auto values = mapping.values();
std::sort(values.begin(), values.end());
auto uniqueValues = values.toSet().values();
std::sort(uniqueValues.begin(), uniqueValues.end());
QVERIFY(uniqueValues == values);
};
ensureUnique(actual);
QCOMPARE(actual, expected);
};
verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0);
verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0);
verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1);
verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1);
const auto movedItem = m_folderModel->index(1, 0).data(FolderModel::UrlRole).toUrl();
// move the item 1 from source (now in position 2) to the second screen
screenMapper->addMapping(movedItem, 1, m_currentActivity);
expectedProxy2SourceScreen1[0] = 0;
expectedSource2ProxyScreen1[0] = 0;
expectedSource2ProxyScreen0.clear();
expectedProxy2SourceScreen0.clear();
for (int i = 0; i < m_folderModel->rowCount(); i++) {
// as item 1 disappeared, the mapping of all items after that are shifted
auto proxyIndex = (i <= 1) ? i : i + 1;
expectedProxy2SourceScreen0[proxyIndex] = i;
expectedSource2ProxyScreen0[i] = proxyIndex;
}
verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0);
verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0);
verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1);
verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1);
// move back the same item to the first screen
screenMapper->addMapping(movedItem, 0, m_currentActivity);
// nothing on the second screen
expectedSource2ProxyScreen1.clear();
expectedProxy2SourceScreen1.clear();
// first screen should look like in the beginning
expectedSource2ProxyScreen0 = savedSource2ProxyScreen0;
expectedProxy2SourceScreen0 = savedProxy2SourceScreen0;
verifyMapping(m_positioner->proxyToSourceMapping(), expectedProxy2SourceScreen0);
verifyMapping(m_positioner->sourceToProxyMapping(), expectedSource2ProxyScreen0);
verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1);
verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1);
}
void PositionerTest::checkPositions(int perStripe)
{
QSignalSpy s(m_positioner, &Positioner::positionsChanged);
s.wait(500);
const auto positions = m_positioner->positions();
struct Pos {
int x;
int y;
};
const auto fileCount = m_folderModel->rowCount();
QHash<QString, Pos> posHash;
QCOMPARE(positions[0].toInt(), 1 + ((fileCount - 1) / perStripe)); // rows
QCOMPARE(positions[1].toInt(), perStripe); // columns
for (int i = 2; i < positions.length() - 2; i += 3) {
posHash[positions[i]] = {positions[i + 1].toInt(), positions[i + 2].toInt()};
}
int row = 0;
int col = 0;
for (int i = 0; i < fileCount; i++) {
const auto index = m_folderModel->index(i, 0);
const auto url = index.data(FolderModel::UrlRole).toString();
const Pos pos = posHash[url];
QCOMPARE(pos.x, row);
QCOMPARE(pos.y, col);
col++;
if (col == perStripe) {
row++;
col = 0;
}
}
}