diff options
Diffstat (limited to 'tests/auto/qdirmodel/tst_qdirmodel.cpp')
-rw-r--r-- | tests/auto/qdirmodel/tst_qdirmodel.cpp | 669 |
1 files changed, 669 insertions, 0 deletions
diff --git a/tests/auto/qdirmodel/tst_qdirmodel.cpp b/tests/auto/qdirmodel/tst_qdirmodel.cpp new file mode 100644 index 0000000..f6887da --- /dev/null +++ b/tests/auto/qdirmodel/tst_qdirmodel.cpp @@ -0,0 +1,669 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> +#include <qdirmodel.h> +#include <qapplication.h> +#include <qtreeview.h> +#include <qdir.h> +#include <qdebug.h> + +//TESTED_CLASS= +//TESTED_FILES= + +class tst_QDirModel : public QObject +{ + Q_OBJECT + +public: + + tst_QDirModel(); + virtual ~tst_QDirModel(); + + +public slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); +private slots: + void getSetCheck(); + /* + void construct(); + void rowCount(); + void columnCount(); + void t_data(); + void setData(); + void hasChildren(); + void isEditable(); + void isDragEnabled(); + void isDropEnabled(); + void sort(); + */ + bool rowsAboutToBeRemoved_init(const QString &test_path, const QStringList &initial_files); + bool rowsAboutToBeRemoved_cleanup(const QString &test_path); + void rowsAboutToBeRemoved_data(); + void rowsAboutToBeRemoved(); + + void mkdir_data(); + void mkdir(); + + void rmdir_data(); + void rmdir(); + + void filePath(); + + void hidden(); + + void fileName(); + void fileName_data(); + void task196768_sorting(); + void filter(); + + void task244669_remove(); +}; + +// Testing get/set functions +void tst_QDirModel::getSetCheck() +{ + QDirModel obj1; + // QFileIconProvider * QDirModel::iconProvider() + // void QDirModel::setIconProvider(QFileIconProvider *) + QFileIconProvider *var1 = new QFileIconProvider; + obj1.setIconProvider(var1); + QCOMPARE(var1, obj1.iconProvider()); + obj1.setIconProvider((QFileIconProvider *)0); + QCOMPARE((QFileIconProvider *)0, obj1.iconProvider()); + delete var1; + + // bool QDirModel::resolveSymlinks() + // void QDirModel::setResolveSymlinks(bool) + obj1.setResolveSymlinks(false); + QCOMPARE(false, obj1.resolveSymlinks()); + obj1.setResolveSymlinks(true); + QCOMPARE(true, obj1.resolveSymlinks()); + + // bool QDirModel::lazyChildCount() + // void QDirModel::setLazyChildCount(bool) + obj1.setLazyChildCount(false); + QCOMPARE(false, obj1.lazyChildCount()); + obj1.setLazyChildCount(true); + QCOMPARE(true, obj1.lazyChildCount()); +} + + +Q_DECLARE_METATYPE(QModelIndex) +Q_DECLARE_METATYPE(QModelIndexList) + +tst_QDirModel::tst_QDirModel() + +{ +} + +tst_QDirModel::~tst_QDirModel() +{ +} + +void tst_QDirModel::initTestCase() +{ +} + +void tst_QDirModel::cleanupTestCase() +{ + QDir current; + current.rmdir(".qtest_hidden"); +} + +void tst_QDirModel::init() +{ +} + +void tst_QDirModel::cleanup() +{ +} + +/* + tests +*/ +/* +void tst_QDirModel::construct() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QFileInfo info(QDir::currentPath() + "/test/file03.tst"); + QCOMPARE(model.filePath(index), info.absoluteFilePath()); +} + +void tst_QDirModel::rowCount() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + QCOMPARE(model.rowCount(index), 4); +} + +void tst_QDirModel::columnCount() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + QCOMPARE(model.columnCount(index), 4); +} + +void tst_QDirModel::t_data() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + QCOMPARE(model.rowCount(index), 4); + + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QCOMPARE(model.data(index).toString(), QString::fromLatin1("file03.tst")); + QCOMPARE(model.rowCount(index), 0); +} + +void tst_QDirModel::setData() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QVERIFY(!model.setData(index, "file0X.tst", Qt::EditRole)); +} + +void tst_QDirModel::hasChildren() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QVERIFY(!model.hasChildren(index)); +} + +void tst_QDirModel::isEditable() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QVERIFY(!(model.flags(index) & Qt::ItemIsEditable)); +} + +void tst_QDirModel::isDragEnabled() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + + index = model.index(2, 0, index); + QVERIFY(index.isValid()); + QVERIFY(model.flags(index) & Qt::ItemIsDragEnabled); +} + +void tst_QDirModel::isDropEnabled() +{ + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/test"); + QVERIFY(index.isValid()); + + index = model.index(2, 0, index); + QVERIFY(!(model.flags(index) & Qt::ItemIsDropEnabled)); +} + +void tst_QDirModel::sort() +{ + QDirModel model; + QModelIndex parent = model.index(QDir::currentPath() + "/test"); + QVERIFY(parent.isValid()); + + QModelIndex index = model.index(0, 0, parent); + QCOMPARE(model.data(index).toString(), QString::fromLatin1("file01.tst")); + + index = model.index(3, 0, parent); + QCOMPARE(model.data(index).toString(), QString::fromLatin1("file04.tst")); + + model.sort(0, Qt::DescendingOrder); + parent = model.index(QDir::currentPath() + "/test"); + + index = model.index(0, 0, parent); + QCOMPARE(model.data(index).toString(), QString::fromLatin1("file04.tst")); + + index = model.index(3, 0, parent); + QCOMPARE(model.data(index).toString(), QString::fromLatin1("file01.tst")); +} +*/ + +void tst_QDirModel::mkdir_data() +{ + QTest::addColumn<QString>("dirName"); // the directory to be made under <currentpath>/dirtest + QTest::addColumn<bool>("mkdirSuccess"); + QTest::addColumn<int>("rowCount"); + + QTest::newRow("okDirName") << QString("test2") << true << 2; + QTest::newRow("existingDirName") << QString("test1") << false << 1; + QTest::newRow("nameWithSpace") << QString("ab cd") << true << 2; + QTest::newRow("emptyDirName") << QString("") << false << 1; + QTest::newRow("nullDirName") << QString() << false << 1; + +/* + QTest::newRow("recursiveDirName") << QString("test2/test3") << false << false; + QTest::newRow("singleDotDirName") << QString("./test3") << true << true; + QTest::newRow("outOfTreeDirName") << QString("../test4") << false << false; + QTest::newRow("insideTreeDirName") << QString("../dirtest/test4") << true << true; + QTest::newRow("insideTreeDirName2") << QString("./././././../dirtest/./../dirtest/test4") << true << true; + QTest::newRow("absoluteDirName") << QString(QDir::currentPath() + "/dirtest/test5") << true << true; + QTest::newRow("outOfTreeDirName") << QString(QDir::currentPath() + "/test5") << false << false; + + // Directory names only illegal on Windows +#ifdef Q_WS_WIN + QTest::newRow("illegalDirName") << QString("*") << false << false; + QTest::newRow("illegalDirName2") << QString("|") << false << false; + QTest::newRow("onlySpace") << QString(" ") << false << false; +#endif + */ +} + +void tst_QDirModel::mkdir() +{ + QFETCH(QString, dirName); + QFETCH(bool, mkdirSuccess); + QFETCH(int, rowCount); + + QDirModel model; + model.setReadOnly(false); + + QModelIndex parent = model.index(SRCDIR "dirtest"); + QVERIFY(parent.isValid()); + QCOMPARE(model.rowCount(parent), 1); // start out with only 'test1' - in's in the depot + + QModelIndex index = model.mkdir(parent, dirName); + bool success = index.isValid(); + int rows = model.rowCount(parent); + + if (success && !model.rmdir(index)) + QVERIFY(QDir(SRCDIR "dirtests").rmdir(dirName)); + + QCOMPARE(rows, rowCount); + QCOMPARE(success, mkdirSuccess); +} + +void tst_QDirModel::rmdir_data() +{ + QTest::addColumn<QString>("dirName"); // <currentpath>/dirtest/dirname + QTest::addColumn<bool>("rmdirSuccess"); + QTest::addColumn<int>("rowCount"); + + QTest::newRow("okDirName") << QString("test2") << true << 2; + QTest::newRow("existingDirName") << QString("test1") << false << 1; + QTest::newRow("nameWithSpace") << QString("ab cd") << true << 2; + QTest::newRow("emptyDirName") << QString("") << false << 1; + QTest::newRow("nullDirName") << QString() << false << 1; +} + +void tst_QDirModel::rmdir() +{ + QFETCH(QString, dirName); + QFETCH(bool, rmdirSuccess); + QFETCH(int, rowCount); + + QDirModel model; + model.setReadOnly(false); + + QModelIndex parent = model.index(SRCDIR "/dirtest"); + QVERIFY(parent.isValid()); + QCOMPARE(model.rowCount(parent), 1); // start out with only 'test1' - in's in the depot + + QModelIndex index; + if (rmdirSuccess) { + index = model.mkdir(parent, dirName); + QVERIFY(index.isValid()); + } + + int rows = model.rowCount(parent); + bool success = model.rmdir(index); + + if (!success) { // cleanup + QDir dirtests(SRCDIR "/dirtests/"); + dirtests.rmdir(dirName); + } + + QCOMPARE(rows, rowCount); + QCOMPARE(success, rmdirSuccess); +} + +void tst_QDirModel::rowsAboutToBeRemoved_data() +{ + QTest::addColumn<QString>("test_path"); + QTest::addColumn<QStringList>("initial_files"); + QTest::addColumn<int>("remove_row"); + QTest::addColumn<QStringList>("remove_files"); + QTest::addColumn<QStringList>("expected_files"); + + QString test_path = "test2"; + QStringList initial_files = (QStringList() + << "file1.tst" + << "file2.tst" + << "file3.tst" + << "file4.tst"); + + QTest::newRow("removeFirstRow") + << test_path + << initial_files + << 0 + << (QStringList() << "file1.tst") + << (QStringList() << "file2.tst" << "file3.tst" << "file4.tst"); + + QTest::newRow("removeMiddle") + << test_path + << initial_files + << 1 + << (QStringList() << "file2.tst") + << (QStringList() << "file1.tst" << "file3.tst" << "file4.tst"); + + QTest::newRow("removeLastRow") + << test_path + << initial_files + << 3 + << (QStringList() << "file4.tst") + << (QStringList() << "file1.tst" << "file2.tst" << "file3.tst"); + +} + +bool tst_QDirModel::rowsAboutToBeRemoved_init(const QString &test_path, const QStringList &initial_files) +{ + QString path = QDir::currentPath() + "/" + test_path; + if (!QDir::current().mkdir(test_path) && false) { // FIXME + qDebug() << "failed to create dir" << path; + return false; + } + + for (int i = 0; i < initial_files.count(); ++i) { + QFile file(path + "/" + initial_files.at(i)); + if (!file.open(QIODevice::WriteOnly)) { + qDebug() << "failed to open file" << initial_files.at(i); + return false; + } + if (!file.resize(1024)) { + qDebug() << "failed to resize file" << initial_files.at(i); + return false; + } + if (!file.flush()) { + qDebug() << "failed to flush file" << initial_files.at(i); + return false; + } + } + + return true; +} + +bool tst_QDirModel::rowsAboutToBeRemoved_cleanup(const QString &test_path) +{ + QString path = QDir::currentPath() + "/" + test_path; + QDir dir(path, "*", QDir::SortFlags(QDir::Name|QDir::IgnoreCase), QDir::Files); + QStringList files = dir.entryList(); + + for (int i = 0; i < files.count(); ++i) { + if (!dir.remove(files.at(i))) { + qDebug() << "failed to remove file" << files.at(i); + return false; + } + } + + if (!QDir::current().rmdir(test_path) && false) { // FIXME + qDebug() << "failed to remove dir" << test_path; + return false; + } + + return true; +} + +void tst_QDirModel::rowsAboutToBeRemoved() +{ + QFETCH(QString, test_path); + QFETCH(QStringList, initial_files); + QFETCH(int, remove_row); + QFETCH(QStringList, remove_files); + QFETCH(QStringList, expected_files); + + rowsAboutToBeRemoved_cleanup(test_path); // clean up first + QVERIFY(rowsAboutToBeRemoved_init(test_path, initial_files)); + + QDirModel model; + model.setReadOnly(false); + + qRegisterMetaType<QModelIndex>("QModelIndex"); + + // NOTE: QDirModel will call refres() when a file is removed. refresh() will reread the entire directory, + // and emit layoutAboutToBeChanged and layoutChange. So, instead of checking for + // rowsAboutToBeRemoved/rowsRemoved we check for layoutAboutToBeChanged/layoutChanged + QSignalSpy spy(&model, SIGNAL(layoutAboutToBeChanged())); + + QModelIndex parent = model.index(test_path); + QVERIFY(parent.isValid()); + + // remove the file + { + QModelIndex index = model.index(remove_row, 0, parent); + QVERIFY(index.isValid()); + QVERIFY(model.remove(index)); + } + + QCOMPARE(spy.count(), 1); + + // Compare the result + for (int row = 0; row < expected_files.count(); ++row) { + QModelIndex index = model.index(row, 0, parent); + QString str = index.data().toString(); + QCOMPARE(str, expected_files.at(row)); + } + + QVERIFY(rowsAboutToBeRemoved_cleanup(test_path)); +} + +void tst_QDirModel::hidden() +{ +#ifdef Q_OS_UNIX + QDir current; + current.mkdir(".qtest_hidden"); + + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/.qtest_hidden"); + //QVERIFY(!index.isValid()); // hidden items are not listed, but if you specify a valid path, it will give a valid index + + current.mkdir(".qtest_hidden/qtest_visible"); + QModelIndex index2 = model.index(QDir::currentPath() + "/.qtest_hidden/qtest_visible"); + QVERIFY(index2.isValid()); + + QDirModel model2; + model2.setFilter(model2.filter() | QDir::Hidden); + index = model2.index(QDir::currentPath() + "/.qtest_hidden"); + QVERIFY(index.isValid()); +#else + QSKIP("Test not implemented on non-Unixes", SkipAll); +#endif +} + +void tst_QDirModel::fileName_data() +{ + QTest::addColumn<QString>("path"); + QTest::addColumn<QString>("result"); + + QTest::newRow("invalid") << "" << ""; + //QTest::newRow("root") << "/" << "/"; + //QTest::newRow("home") << "/home" << "home"; + // TODO add symlink test too +} + +void tst_QDirModel::fileName() +{ + QDirModel model; + + QFETCH(QString, path); + QFETCH(QString, result); + QCOMPARE(model.fileName(model.index(path)), result); +} + +#if 0 +void tst_QDirModel::unreadable() +{ +#ifdef Q_OS_UNIX + //QFile current("qtest_unreadable"); + //QVERIFY(current.setPermissions(QFile::WriteOwner)); + + QDirModel model; + QModelIndex index = model.index(QDir::currentPath() + "/qtest_unreadable"); + QVERIFY(!index.isValid()); + + QDirModel model2; + model2.setFilter(model2.filter() | QDir::Hidden); + index = model2.index(QDir::currentPath() + "/qtest_unreadable"); + QVERIFY(index.isValid()); +#else + QSKIP("Test not implemented on non-Unixes", SkipAll); +#endif +} +#endif + +void tst_QDirModel::filePath() +{ + QFile::remove(SRCDIR "test.lnk"); + QVERIFY(QFile(SRCDIR "tst_qdirmodel.cpp").link(SRCDIR "test.lnk")); + QDirModel model; + model.setResolveSymlinks(false); + QModelIndex index = model.index(SRCDIR "test.lnk"); + QVERIFY(index.isValid()); +#ifndef Q_OS_WINCE + QString path = SRCDIR; +#else + QString path = QFileInfo(SRCDIR).absoluteFilePath() + "/"; +#endif + QCOMPARE(model.filePath(index), path + QString( "test.lnk")); + model.setResolveSymlinks(true); + QCOMPARE(model.filePath(index), path + QString( "tst_qdirmodel.cpp")); + QFile::remove(SRCDIR "test.lnk"); +} + +void tst_QDirModel::task196768_sorting() +{ + //this task showed that the persistent model indexes got corrupted when sorting + QString path = SRCDIR; + + QDirModel model; + QTreeView view; + QPersistentModelIndex index = model.index(path); + + view.setModel(&model); + QModelIndex index2 = model.index(path); + QCOMPARE(index.data(), index2.data()); + view.setRootIndex(index); + index2 = model.index(path); + QCOMPARE(index.data(), index2.data()); + view.setCurrentIndex(index); + index2 = model.index(path); + QCOMPARE(index.data(), index2.data()); + view.setSortingEnabled(true); + index2 = model.index(path); + QCOMPARE(index.data(), index2.data()); +} + +#if QT_VERSION >= 0x040102 +void tst_QDirModel::filter() +{ + QDirModel model; + model.setNameFilters(QStringList() << "*.nada"); + QModelIndex index = model.index(SRCDIR "test"); + Q_ASSERT(model.rowCount(index) == 0); + QModelIndex index2 = model.index(SRCDIR "test/file01.tst"); + Q_ASSERT(!index2.isValid()); + Q_ASSERT(model.rowCount(index) == 0); +} +#endif + +void tst_QDirModel::task244669_remove() +{ + QFile f1(SRCDIR "dirtest/f1.txt"); + QVERIFY(f1.open(QIODevice::WriteOnly)); + f1.close(); + QFile f2(SRCDIR "dirtest/f2.txt"); + QVERIFY(f2.open(QIODevice::WriteOnly)); + f2.close(); + + QDirModel model; + model.setReadOnly(false); + QPersistentModelIndex parent = model.index(SRCDIR "dirtest"); + QPersistentModelIndex index2 = model.index(SRCDIR "dirtest/f2.txt"); + QPersistentModelIndex index1 = model.index(SRCDIR "dirtest/f1.txt"); + + QVERIFY(parent.isValid()); + QVERIFY(index1.isValid()); + QVERIFY(index2.isValid()); + QCOMPARE(parent.data() , model.index(SRCDIR "dirtest").data()); + QCOMPARE(index1.data() , model.index(SRCDIR "dirtest/f1.txt").data()); + QCOMPARE(index2.data() , model.index(SRCDIR "dirtest/f2.txt").data()); + + QVERIFY(model.remove(index1)); + + QVERIFY(parent.isValid()); + QVERIFY(!index1.isValid()); + QVERIFY(index2.isValid()); + QCOMPARE(parent.data() , model.index(SRCDIR "dirtest").data()); + QCOMPARE(index2.data() , model.index(SRCDIR "dirtest/f2.txt").data()); + + QVERIFY(model.remove(index2)); + + QVERIFY(parent.isValid()); + QVERIFY(!index2.isValid()); + QVERIFY(!index1.isValid()); + QCOMPARE(parent.data() , model.index(SRCDIR "dirtest").data()); +} + +QTEST_MAIN(tst_QDirModel) +#include "tst_qdirmodel.moc" |