3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-22 23:25:52 +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

366 lines
13 KiB
C++

/*
SPDX-FileCopyrightText: 2017 Klarälvdalens Datakonsult AB a KDAB Group company <info@kdab.com>
SPDX-FileContributor: Andras Mantia <andras.mantia@kdab.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "foldermodeltest.h"
#include "foldermodel.h"
#include "screenmapper.h"
#include <QSignalSpy>
#include <QTemporaryDir>
#include <QTest>
QTEST_MAIN(FolderModelTest)
static const QLatin1String desktop(QLatin1String("Desktop"));
static QUrl stringToUrl(const QString &path)
{
return QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile);
}
void FolderModelTest::createTestFolder(const QString &path)
{
QDir dir(m_folderDir->path());
dir.mkdir(path);
dir.cd(path);
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 FolderModelTest::init()
{
m_currentActivity = QStringLiteral("00000000-0000-0000-0000-000000000000");
m_folderDir = new QTemporaryDir();
createTestFolder(desktop);
m_folderModel = new FolderModel(this);
m_folderModel->classBegin();
m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop);
m_folderModel->componentComplete();
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
s.wait(1000);
}
void FolderModelTest::cleanup()
{
delete m_folderDir;
m_folderDir = nullptr;
delete m_folderModel;
m_folderModel = nullptr;
}
void FolderModelTest::tst_listing()
{
QCOMPARE(m_folderModel->url(), m_folderDir->path() + QDir::separator() + desktop);
const auto count = m_folderModel->rowCount();
QCOMPARE(count, 10);
QCOMPARE(m_folderModel->index(0, 0).data(FolderModel::FileNameRole).toString(), QLatin1String("firstDir"));
for (int i = 1; i < count; i++) {
const auto index = m_folderModel->index(i, 0);
QCOMPARE(index.data(FolderModel::FileNameRole).toString(), QStringLiteral("file%1.txt").arg(i));
}
}
void FolderModelTest::tst_listingDescending()
{
m_folderModel->setSortDesc(true);
QCOMPARE(m_folderModel->index(0, 0).data(FolderModel::FileNameRole).toString(), QLatin1String("firstDir"));
const auto count = m_folderModel->rowCount();
for (int i = 1; i < count; i++) {
const auto index = m_folderModel->index(i, 0);
QCOMPARE(index.data(FolderModel::FileNameRole).toString(), QStringLiteral("file%1.txt").arg(count - i));
}
}
void FolderModelTest::tst_listingFolderNotFirst()
{
const auto count = m_folderModel->rowCount();
m_folderModel->setSortDirsFirst(false);
QCOMPARE(count, 10);
QCOMPARE(m_folderModel->index(9, 0).data(FolderModel::FileNameRole).toString(), QLatin1String("firstDir"));
for (int i = 0; i < count - 1; i++) {
const auto index = m_folderModel->index(i, 0);
QCOMPARE(index.data(FolderModel::FileNameRole).toString(), QStringLiteral("file%1.txt").arg(i + 1));
}
}
void FolderModelTest::tst_filterListing()
{
// a little bit weird API, as both pattern and mimetype needs to be set
m_folderModel->setFilterPattern(QStringLiteral("*.txt"));
m_folderModel->setFilterMimeTypes(QStringList{QStringLiteral("all/all")});
m_folderModel->setFilterMode(FolderModel::FilterShowMatches);
const auto count = m_folderModel->rowCount();
QCOMPARE(count, 9);
for (int i = 0; i < count; i++) {
const auto index = m_folderModel->index(i, 0);
QCOMPARE(index.data(FolderModel::FileNameRole).toString(), QStringLiteral("file%1.txt").arg(i + 1));
}
}
void FolderModelTest::tst_cd()
{
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
// go into firstDir subfolder
const auto url = m_folderModel->resolvedUrl();
m_folderModel->cd(0);
QVERIFY(s.wait(500));
QCOMPARE(s.count(), 1);
const auto url2 = m_folderModel->resolvedUrl();
QVERIFY(url.isParentOf(url2));
// go back to Desktop
m_folderModel->up();
// The first signal comes from KCoreDirListerCache::emitItemsFromCache
QVERIFY(s.wait(500));
QCOMPARE(s.count(), 2);
// The second signal comes from KCoreDirListerCache::slotUpdateResult
QVERIFY(s.wait(500));
QCOMPARE(s.count(), 3);
QCOMPARE(m_folderModel->resolvedUrl(), url);
// try to cd to an invalid entry (a file)
m_folderModel->cd(1);
// Signal is not emitted here as it's invalided
QVERIFY(!s.wait(500));
QCOMPARE(s.count(), 3);
QCOMPARE(m_folderModel->resolvedUrl(), url);
}
void FolderModelTest::tst_rename_data()
{
QTest::addColumn<int>("row");
QTest::addColumn<QString>("name");
QTest::newRow("Folder rename") << 0 << "firstDirRenamed";
QTest::newRow("File rename") << 1 << "file1.pdf";
QTest::newRow("Invalid rename") << 11 << "foo";
}
void FolderModelTest::tst_rename()
{
QFETCH(int, row);
QFETCH(QString, name);
m_folderModel->rename(row, name);
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
const auto index = m_folderModel->index(row, 0);
s.wait(500);
QEXPECT_FAIL("Invalid rename", "This is expected to fail", Continue);
QCOMPARE(index.data(FolderModel::FileNameRole).toString(), name);
}
void FolderModelTest::tst_selection()
{
m_folderModel->setSelected(1);
QVERIFY(m_folderModel->hasSelection());
QVERIFY(m_folderModel->isSelected(1));
m_folderModel->clearSelection();
QVERIFY(!m_folderModel->hasSelection());
m_folderModel->toggleSelected(1);
QVERIFY(m_folderModel->isSelected(1));
m_folderModel->toggleSelected(1);
QVERIFY(!m_folderModel->isSelected(1));
m_folderModel->setRangeSelected(1, 4);
QVERIFY(m_folderModel->hasSelection());
for (int i = 1; i <= 4; i++) {
QVERIFY(m_folderModel->isSelected(i));
}
m_folderModel->updateSelection({5, 6}, false);
for (int i = 1; i <= 4; i++) {
QVERIFY(!m_folderModel->isSelected(i));
}
QVERIFY(m_folderModel->isSelected(5));
QVERIFY(m_folderModel->isSelected(6));
m_folderModel->setRangeSelected(1, 4);
m_folderModel->pinSelection();
m_folderModel->updateSelection({5, 6}, true);
for (int i = 1; i <= 6; i++) {
QVERIFY(m_folderModel->isSelected(i));
}
m_folderModel->unpinSelection();
m_folderModel->updateSelection({5, 6}, true);
for (int i = 1; i <= 6; i++) {
if (i < 5) {
QVERIFY(!m_folderModel->isSelected(i));
} else {
QVERIFY(m_folderModel->isSelected(i));
}
}
}
void FolderModelTest::tst_defaultValues()
{
FolderModel folderModel;
QCOMPARE(folderModel.status(), FolderModel::Status::None);
QVERIFY(folderModel.locked());
QVERIFY(!folderModel.sortDesc());
QVERIFY(folderModel.sortDirsFirst());
QVERIFY(!folderModel.parseDesktopFiles());
QVERIFY(!folderModel.previews());
QVERIFY(!folderModel.usedByContainment());
QCOMPARE(folderModel.sortMode(), 0);
QCOMPARE(folderModel.filterMode(), (int)FolderModel::NoFilter);
QVERIFY(folderModel.newMenu());
QCOMPARE(folderModel.filterCaseSensitivity(), Qt::CaseInsensitive);
QVERIFY(folderModel.dynamicSortFilter());
QVERIFY(folderModel.isSortLocaleAware());
}
void FolderModelTest::tst_actionMenu()
{
const QStringList lst{QStringLiteral("open"),
QStringLiteral("cut"),
QStringLiteral("open"),
QStringLiteral("cut"),
QStringLiteral("undo"),
QStringLiteral("copy"),
QStringLiteral("paste"),
QStringLiteral("pasteto"),
QStringLiteral("refresh"),
QStringLiteral("rename"),
QStringLiteral("trash"),
QStringLiteral("del"),
QStringLiteral("restoreFromTrash"),
QStringLiteral("emptyTrash")};
for (const QString &str : lst) {
QVERIFY(m_folderModel->action(str));
}
}
void FolderModelTest::tst_lockedChanged()
{
QSignalSpy s(m_folderModel, &FolderModel::lockedChanged);
m_folderModel->setLocked(false);
QCOMPARE(s.count(), 1);
m_folderModel->setLocked(false);
QCOMPARE(s.count(), 1);
m_folderModel->setLocked(true);
QCOMPARE(s.count(), 2);
}
void FolderModelTest::tst_multiScreen()
{
delete m_folderModel;
// Custom instance for this test to set used by containment before marking component
// as complete.
m_folderModel = new FolderModel(this);
m_folderModel->classBegin();
m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop);
m_folderModel->setUsedByContainment(true);
m_folderModel->setScreen(0);
m_folderModel->componentComplete();
auto *screenMapper = ScreenMapper::instance();
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
QVERIFY(s.wait(1000));
const auto count = m_folderModel->rowCount();
for (int i = 0; i < count; i++) {
const auto index = m_folderModel->index(i, 0);
const auto name = index.data(FolderModel::UrlRole).toUrl();
// all items are on the first screen by default
QCOMPARE(screenMapper->screenForItem(name, m_currentActivity), 0);
}
// move one file to a new screen
const auto movedItem = m_folderModel->index(0, 0).data(FolderModel::UrlRole).toUrl();
FolderModel secondFolderModel;
secondFolderModel.classBegin();
secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop);
secondFolderModel.setUsedByContainment(true);
secondFolderModel.setScreen(1);
secondFolderModel.componentComplete();
QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted);
QVERIFY(s2.wait(1000));
const auto count2 = secondFolderModel.rowCount();
QCOMPARE(count2, 0);
screenMapper->addMapping(movedItem, 1, m_currentActivity);
m_folderModel->invalidate();
secondFolderModel.invalidate();
s.wait(1000);
s2.wait(1000);
// we have one less item
QCOMPARE(m_folderModel->rowCount(), count - 1);
QCOMPARE(secondFolderModel.rowCount(), 1);
QCOMPARE(secondFolderModel.index(0, 0).data(FolderModel::UrlRole).toUrl(), movedItem);
QCOMPARE(screenMapper->screenForItem(movedItem, m_currentActivity), 1);
// remove extra screen, we have all items back
screenMapper->removeScreen(1, m_currentActivity, stringToUrl(m_folderModel->url()));
s.wait(500);
QCOMPARE(m_folderModel->rowCount(), count);
QCOMPARE(secondFolderModel.rowCount(), 0);
QCOMPARE(screenMapper->screenForItem(movedItem, m_currentActivity), 0);
// add back extra screen, the item is moved there
screenMapper->addScreen(1, m_currentActivity, stringToUrl(m_folderModel->url()));
s.wait(500);
s2.wait(500);
QCOMPARE(m_folderModel->rowCount(), count - 1);
QCOMPARE(secondFolderModel.rowCount(), 1);
QCOMPARE(secondFolderModel.index(0, 0).data(FolderModel::UrlRole).toUrl(), movedItem);
QCOMPARE(screenMapper->screenForItem(movedItem, m_currentActivity), 1);
// create a new item, it appears on the first screen
QDir dir(m_folderDir->path());
dir.cd(desktop);
dir.mkdir(QStringLiteral("secondDir"));
dir.cd(QStringLiteral("secondDir"));
s.wait(1000);
QCOMPARE(m_folderModel->rowCount(), count);
QCOMPARE(secondFolderModel.rowCount(), 1);
QCOMPARE(screenMapper->screenForItem(stringToUrl(QLatin1String("file://") + dir.path()), m_currentActivity), 0);
}
void FolderModelTest::tst_multiScreenDifferenPath()
{
m_folderModel->setUsedByContainment(true);
m_folderModel->setScreen(0);
QSignalSpy s(m_folderModel, &FolderModel::listingCompleted);
s.wait(1000);
const auto count = m_folderModel->rowCount();
QCOMPARE(count, 10);
const QLatin1String desktop2(QLatin1String("Desktop2"));
createTestFolder(desktop2);
FolderModel secondFolderModel;
secondFolderModel.setUsedByContainment(true);
secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop2);
secondFolderModel.setScreen(1);
QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted);
s2.wait(1000);
const auto count2 = secondFolderModel.rowCount();
QCOMPARE(count2, 10);
// create a new item, it appears on the first screen
QDir dir(m_folderDir->path());
dir.cd(desktop);
dir.mkdir(QStringLiteral("secondDir"));
s.wait(1000);
QCOMPARE(m_folderModel->rowCount(), count + 1);
QCOMPARE(secondFolderModel.rowCount(), count2);
// create a new item, it appears on the second screen
dir.cd(m_folderDir->path() + QDir::separator() + desktop2);
dir.mkdir(QStringLiteral("secondDir2"));
s.wait(1000);
QCOMPARE(m_folderModel->rowCount(), count + 1);
QCOMPARE(secondFolderModel.rowCount(), count2 + 1);
}