| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2017 Intel Corporation. |
| 4 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 5 | ** Contact: https://www.qt.io/licensing/ |
| 6 | ** |
| 7 | ** This file is part of the test suite of the Qt Toolkit. |
| 8 | ** |
| 9 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| 10 | ** Commercial License Usage |
| 11 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 12 | ** accordance with the commercial license agreement provided with the |
| 13 | ** Software or, alternatively, in accordance with the terms contained in |
| 14 | ** a written agreement between you and The Qt Company. For licensing terms |
| 15 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 16 | ** information use the contact form at https://www.qt.io/contact-us. |
| 17 | ** |
| 18 | ** GNU General Public License Usage |
| 19 | ** Alternatively, this file may be used under the terms of the GNU |
| 20 | ** General Public License version 3 as published by the Free Software |
| 21 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| 22 | ** included in the packaging of this file. Please review the following |
| 23 | ** information to ensure the GNU General Public License requirements will |
| 24 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 25 | ** |
| 26 | ** $QT_END_LICENSE$ |
| 27 | ** |
| 28 | ****************************************************************************/ |
| 29 | |
| 30 | #include <QtTest/QtTest> |
| 31 | |
| 32 | #include <qcoreapplication.h> |
| 33 | #include <qdebug.h> |
| 34 | #include <qdir.h> |
| 35 | #include <qfileinfo.h> |
| 36 | #include <qstringlist.h> |
| 37 | |
| 38 | #if defined(Q_OS_WIN) |
| 39 | #include <QtCore/private/qfsfileengine_p.h> |
| 40 | #include "../../../network-settings.h" |
| 41 | #endif |
| 42 | |
| 43 | #if defined(Q_OS_WIN) && !defined(_WIN32_WINNT) |
| 44 | #define _WIN32_WINNT 0x500 |
| 45 | #endif |
| 46 | |
| 47 | #include "../../../../shared/filesystem.h" |
| 48 | |
| 49 | #if defined(Q_OS_UNIX) |
| 50 | # include <unistd.h> |
| 51 | # include <sys/stat.h> |
| 52 | #endif |
| 53 | |
| 54 | #if defined(Q_OS_VXWORKS) || defined(Q_OS_WINRT) |
| 55 | #define Q_NO_SYMLINKS |
| 56 | #endif |
| 57 | |
| 58 | #ifdef Q_OS_WIN |
| 59 | #define DRIVE "Q:" |
| 60 | #else |
| 61 | #define DRIVE |
| 62 | #endif |
| 63 | |
| 64 | #ifdef QT_BUILD_INTERNAL |
| 65 | #include "private/qdir_p.h" |
| 66 | #endif |
| 67 | |
| 68 | static QByteArray msgDoesNotExist(const QString &name) |
| 69 | { |
| 70 | return (QLatin1Char('"') + QDir::toNativeSeparators(pathName: name) |
| 71 | + QLatin1String("\" does not exist." )).toLocal8Bit(); |
| 72 | } |
| 73 | |
| 74 | class tst_QDir : public QObject |
| 75 | { |
| 76 | Q_OBJECT |
| 77 | |
| 78 | public: |
| 79 | enum UncHandling { HandleUnc, IgnoreUnc }; |
| 80 | tst_QDir(); |
| 81 | |
| 82 | private slots: |
| 83 | void init(); |
| 84 | void initTestCase(); |
| 85 | void cleanupTestCase(); |
| 86 | |
| 87 | void getSetCheck(); |
| 88 | void construction(); |
| 89 | |
| 90 | void setPath_data(); |
| 91 | void setPath(); |
| 92 | |
| 93 | void entryList_data(); |
| 94 | void entryList(); |
| 95 | |
| 96 | void entryListWithTestFiles_data(); |
| 97 | void entryListWithTestFiles(); |
| 98 | |
| 99 | void entryListTimedSort(); |
| 100 | |
| 101 | void entryListSimple_data(); |
| 102 | void entryListSimple(); |
| 103 | |
| 104 | void entryListWithSymLinks(); |
| 105 | |
| 106 | void mkdirRmdir_data(); |
| 107 | void mkdirRmdir(); |
| 108 | void mkdirOnSymlink(); |
| 109 | |
| 110 | void makedirReturnCode(); |
| 111 | |
| 112 | void removeRecursively_data(); |
| 113 | void removeRecursively(); |
| 114 | void removeRecursivelyFailure(); |
| 115 | void removeRecursivelySymlink(); |
| 116 | |
| 117 | void exists_data(); |
| 118 | void exists(); |
| 119 | |
| 120 | void isRelativePath_data(); |
| 121 | void isRelativePath(); |
| 122 | |
| 123 | void canonicalPath_data(); |
| 124 | void canonicalPath(); |
| 125 | |
| 126 | void current_data(); |
| 127 | void current(); |
| 128 | |
| 129 | void cd_data(); |
| 130 | void cd(); |
| 131 | |
| 132 | void setNameFilters_data(); |
| 133 | void setNameFilters(); |
| 134 | |
| 135 | void cleanPath_data(); |
| 136 | void cleanPath(); |
| 137 | |
| 138 | #ifdef QT_BUILD_INTERNAL |
| 139 | void normalizePathSegments_data(); |
| 140 | void normalizePathSegments(); |
| 141 | #endif |
| 142 | |
| 143 | void compare(); |
| 144 | void QDir_default(); |
| 145 | |
| 146 | void filePath_data(); |
| 147 | void filePath(); |
| 148 | |
| 149 | void absoluteFilePath_data(); |
| 150 | void absoluteFilePath(); |
| 151 | |
| 152 | void absolutePath_data(); |
| 153 | void absolutePath(); |
| 154 | |
| 155 | void relativeFilePath_data(); |
| 156 | void relativeFilePath(); |
| 157 | |
| 158 | void remove(); |
| 159 | void rename(); |
| 160 | |
| 161 | void exists2_data(); |
| 162 | void exists2(); |
| 163 | |
| 164 | void dirName_data(); |
| 165 | void dirName(); |
| 166 | |
| 167 | void operator_eq(); |
| 168 | |
| 169 | void dotAndDotDot(); |
| 170 | |
| 171 | void homePath(); |
| 172 | void tempPath(); |
| 173 | void rootPath(); |
| 174 | |
| 175 | void nativeSeparators(); |
| 176 | |
| 177 | void searchPaths(); |
| 178 | void searchPaths_data(); |
| 179 | |
| 180 | void entryListWithSearchPaths(); |
| 181 | |
| 182 | void longFileName_data(); |
| 183 | void longFileName(); |
| 184 | |
| 185 | void updateFileLists(); |
| 186 | |
| 187 | void detachingOperations(); |
| 188 | |
| 189 | void testCaching(); |
| 190 | |
| 191 | void isRoot_data(); |
| 192 | void isRoot(); |
| 193 | |
| 194 | #ifndef QT_NO_REGEXP |
| 195 | void match_data(); |
| 196 | void match(); |
| 197 | #endif |
| 198 | |
| 199 | void drives(); |
| 200 | |
| 201 | void arrayOperator(); |
| 202 | |
| 203 | void equalityOperator_data(); |
| 204 | void equalityOperator(); |
| 205 | |
| 206 | void isRelative_data(); |
| 207 | void isRelative(); |
| 208 | |
| 209 | void isReadable(); |
| 210 | |
| 211 | void cdNonreadable(); |
| 212 | |
| 213 | void cdBelowRoot_data(); |
| 214 | void cdBelowRoot(); |
| 215 | |
| 216 | void emptyDir(); |
| 217 | void nonEmptyDir(); |
| 218 | |
| 219 | private: |
| 220 | #ifdef BUILTIN_TESTDATA |
| 221 | QString m_dataPath; |
| 222 | QSharedPointer<QTemporaryDir> m_dataDir; |
| 223 | #else |
| 224 | const QString m_dataPath; |
| 225 | #endif |
| 226 | }; |
| 227 | |
| 228 | Q_DECLARE_METATYPE(tst_QDir::UncHandling) |
| 229 | |
| 230 | tst_QDir::tst_QDir() |
| 231 | #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) |
| 232 | : m_dataPath(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) |
| 233 | #elif !defined(BUILTIN_TESTDATA) |
| 234 | : m_dataPath(QFileInfo(QFINDTESTDATA("testData" )).absolutePath()) |
| 235 | #endif |
| 236 | { |
| 237 | #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) |
| 238 | QString resourceSourcePath = QStringLiteral(":/android_testdata/" ); |
| 239 | QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories); |
| 240 | while (it.hasNext()) { |
| 241 | it.next(); |
| 242 | |
| 243 | QFileInfo fileInfo = it.fileInfo(); |
| 244 | |
| 245 | if (!fileInfo.isDir()) { |
| 246 | QString destination = m_dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length()); |
| 247 | QFileInfo destinationFileInfo(destination); |
| 248 | if (!destinationFileInfo.exists()) { |
| 249 | QDir().mkpath(destinationFileInfo.path()); |
| 250 | if (!QFile::copy(fileInfo.filePath(), destination)) |
| 251 | qWarning("Failed to copy %s" , qPrintable(fileInfo.filePath())); |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | } |
| 256 | |
| 257 | if (!QDir::setCurrent(m_dataPath)) |
| 258 | qWarning("Couldn't set current path to %s" , qPrintable(m_dataPath)); |
| 259 | #endif |
| 260 | } |
| 261 | |
| 262 | void tst_QDir::init() |
| 263 | { |
| 264 | // Some tests want to use "." as relative path to data. |
| 265 | QVERIFY2(QDir::setCurrent(m_dataPath), qPrintable("Could not chdir to " + m_dataPath)); |
| 266 | } |
| 267 | |
| 268 | void tst_QDir::initTestCase() |
| 269 | { |
| 270 | #ifdef BUILTIN_TESTDATA |
| 271 | m_dataDir = QEXTRACTTESTDATA("/" ); |
| 272 | QVERIFY2(!m_dataDir.isNull(), qPrintable("Did not find testdata. Is this builtin?" )); |
| 273 | m_dataPath = m_dataDir->path(); |
| 274 | #endif |
| 275 | |
| 276 | QVERIFY2(!m_dataPath.isEmpty(), "test data not found" ); |
| 277 | } |
| 278 | |
| 279 | void tst_QDir::cleanupTestCase() |
| 280 | { |
| 281 | #ifdef BUILTIN_TESTDATA |
| 282 | // We need to reset the current directory outside of QTemporaryDir for successful deletion |
| 283 | QDir::setCurrent(QCoreApplication::applicationDirPath()); |
| 284 | #else |
| 285 | QDir(QDir::currentPath() + "/tmpdir" ).removeRecursively(); |
| 286 | #endif |
| 287 | } |
| 288 | |
| 289 | // Testing get/set functions |
| 290 | void tst_QDir::getSetCheck() |
| 291 | { |
| 292 | QDir obj1; |
| 293 | // Filters QDir::filter() |
| 294 | // void QDir::setFilter(Filters) |
| 295 | obj1.setFilter(QDir::Filters(QDir::Dirs)); |
| 296 | QCOMPARE(QDir::Filters(QDir::Dirs), obj1.filter()); |
| 297 | obj1.setFilter(QDir::Filters(QDir::Dirs | QDir::Files)); |
| 298 | QCOMPARE(QDir::Filters(QDir::Dirs | QDir::Files), obj1.filter()); |
| 299 | obj1.setFilter(QDir::Filters(QDir::NoFilter)); |
| 300 | QCOMPARE(QDir::Filters(QDir::NoFilter), obj1.filter()); |
| 301 | |
| 302 | // SortFlags QDir::sorting() |
| 303 | // void QDir::setSorting(SortFlags) |
| 304 | obj1.setSorting(QDir::SortFlags(QDir::Name)); |
| 305 | QCOMPARE(QDir::SortFlags(QDir::Name), obj1.sorting()); |
| 306 | obj1.setSorting(QDir::SortFlags(QDir::Name | QDir::IgnoreCase)); |
| 307 | QCOMPARE(QDir::SortFlags(QDir::Name | QDir::IgnoreCase), obj1.sorting()); |
| 308 | obj1.setSorting(QDir::SortFlags(QDir::NoSort)); |
| 309 | QCOMPARE(QDir::SortFlags(QDir::NoSort), obj1.sorting()); |
| 310 | } |
| 311 | |
| 312 | void tst_QDir::construction() |
| 313 | { |
| 314 | QFileInfo myFileInfo("/machine/share/dir1/file1" ); |
| 315 | QDir myDir(myFileInfo.absoluteDir()); // this asserted |
| 316 | QCOMPARE(myFileInfo.absoluteDir().absolutePath(), myDir.absolutePath()); |
| 317 | } |
| 318 | |
| 319 | void tst_QDir::setPath_data() |
| 320 | { |
| 321 | QTest::addColumn<QString>(name: "dir1" ); |
| 322 | QTest::addColumn<QString>(name: "dir2" ); |
| 323 | |
| 324 | QTest::newRow(dataTag: "data0" ) << QString("." ) << QString(".." ); |
| 325 | #if defined(Q_OS_WIN) |
| 326 | QTest::newRow("data1" ) << QString("c:/" ) << QDir::currentPath(); |
| 327 | #endif |
| 328 | } |
| 329 | |
| 330 | void tst_QDir::setPath() |
| 331 | { |
| 332 | QFETCH(QString, dir1); |
| 333 | QFETCH(QString, dir2); |
| 334 | |
| 335 | QDir shared; |
| 336 | QDir qDir1(dir1); |
| 337 | QStringList entries1 = qDir1.entryList(); |
| 338 | shared.setPath(dir1); |
| 339 | QCOMPARE(shared.entryList(), entries1); |
| 340 | |
| 341 | QDir qDir2(dir2); |
| 342 | QStringList entries2 = qDir2.entryList(); |
| 343 | shared.setPath(dir2); |
| 344 | QCOMPARE(shared.entryList(), entries2); |
| 345 | } |
| 346 | |
| 347 | void tst_QDir::mkdirRmdir_data() |
| 348 | { |
| 349 | QTest::addColumn<QString>(name: "path" ); |
| 350 | QTest::addColumn<bool>(name: "recurse" ); |
| 351 | |
| 352 | const struct { |
| 353 | const char *name; // shall have a prefix added |
| 354 | const char *path; // relative |
| 355 | bool recurse; |
| 356 | } cases[] = { |
| 357 | { .name: "plain" , .path: "testdir/one" , .recurse: false }, |
| 358 | { .name: "recursive" , .path: "testdir/two/three/four" , .recurse: true }, |
| 359 | { .name: "with-.." , .path: "testdir/../testdir/three" , .recurse: false }, |
| 360 | }; |
| 361 | |
| 362 | for (const auto &it : cases) { |
| 363 | QVERIFY(!QFile::exists(it.path)); |
| 364 | QTest::addRow(format: "absolute-%s" , it.name) << (QDir::currentPath() + "/" ) + it.path << it.recurse; |
| 365 | QTest::addRow(format: "relative-%s" , it.name) << QString::fromLatin1(str: it.path) << it.recurse; |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | void tst_QDir::mkdirRmdir() |
| 370 | { |
| 371 | QFETCH(QString, path); |
| 372 | QFETCH(bool, recurse); |
| 373 | |
| 374 | QDir dir; |
| 375 | dir.rmdir(dirName: path); |
| 376 | if (recurse) |
| 377 | QVERIFY(dir.mkpath(path)); |
| 378 | else |
| 379 | QVERIFY(dir.mkdir(path)); |
| 380 | |
| 381 | //make sure it really exists (ie that mkdir returns the right value) |
| 382 | QFileInfo fi(path); |
| 383 | QVERIFY2(fi.exists() && fi.isDir(), msgDoesNotExist(path).constData()); |
| 384 | |
| 385 | if (recurse) |
| 386 | QVERIFY(dir.rmpath(path)); |
| 387 | else |
| 388 | QVERIFY(dir.rmdir(path)); |
| 389 | |
| 390 | //make sure it really doesn't exist (ie that rmdir returns the right value) |
| 391 | fi.refresh(); |
| 392 | QVERIFY(!fi.exists()); |
| 393 | } |
| 394 | |
| 395 | void tst_QDir::mkdirOnSymlink() |
| 396 | { |
| 397 | #if !defined(Q_OS_UNIX) || defined(Q_NO_SYMLINKS) |
| 398 | QSKIP("Test only valid on an OS that supports symlinks" ); |
| 399 | #else |
| 400 | // Create the structure: |
| 401 | // . |
| 402 | // ├── symlink -> two/three |
| 403 | // └── two |
| 404 | // └── three |
| 405 | // so when we mkdir("symlink/../four/five"), we end up with: |
| 406 | // . |
| 407 | // ├── symlink -> two/three |
| 408 | // └── two |
| 409 | // ├── four |
| 410 | // │ └── five |
| 411 | // └── three |
| 412 | |
| 413 | QDir dir; |
| 414 | struct Clean { |
| 415 | QDir &dir; |
| 416 | Clean(QDir &dir) : dir(dir) {} |
| 417 | ~Clean() { doClean(); } |
| 418 | void doClean() { |
| 419 | dir.rmpath(dirPath: "two/three" ); |
| 420 | dir.rmpath(dirPath: "two/four/five" ); |
| 421 | // in case the test fails, don't leave junk behind |
| 422 | dir.rmpath(dirPath: "four/five" ); |
| 423 | QFile::remove(fileName: "symlink" ); |
| 424 | } |
| 425 | }; |
| 426 | Clean clean(dir); |
| 427 | clean.doClean(); |
| 428 | |
| 429 | // create our structure: |
| 430 | dir.mkpath(dirPath: "two/three" ); |
| 431 | ::symlink(from: "two/three" , to: "symlink" ); |
| 432 | |
| 433 | // try it: |
| 434 | QString path = "symlink/../four/five" ; |
| 435 | QVERIFY(dir.mkpath(path)); |
| 436 | QFileInfo fi(path); |
| 437 | QVERIFY2(fi.exists() && fi.isDir(), msgDoesNotExist(path).constData()); |
| 438 | |
| 439 | path = "two/four/five" ; |
| 440 | fi.setFile(path); |
| 441 | QVERIFY2(fi.exists() && fi.isDir(), msgDoesNotExist(path).constData()); |
| 442 | #endif |
| 443 | } |
| 444 | |
| 445 | void tst_QDir::makedirReturnCode() |
| 446 | { |
| 447 | QString dirName = QString::fromLatin1(str: "makedirReturnCode" ); |
| 448 | QFile f(QDir::current().filePath(fileName: dirName)); |
| 449 | |
| 450 | // cleanup a previous run. |
| 451 | f.remove(); |
| 452 | QDir::current().rmdir(dirName); |
| 453 | |
| 454 | QDir dir(dirName); |
| 455 | QVERIFY(!dir.exists()); |
| 456 | QVERIFY(QDir::current().mkdir(dirName)); |
| 457 | QVERIFY(!QDir::current().mkdir(dirName)); // calling mkdir on an existing dir will fail. |
| 458 | QVERIFY(QDir::current().mkpath(dirName)); // calling mkpath on an existing dir will pass |
| 459 | |
| 460 | // Remove the directory and create a file with the same path |
| 461 | QDir::current().rmdir(dirName); |
| 462 | QVERIFY(!f.exists()); |
| 463 | f.open(flags: QIODevice::WriteOnly); |
| 464 | f.write(data: "test" ); |
| 465 | f.close(); |
| 466 | QVERIFY2(f.exists(), msgDoesNotExist(f.fileName()).constData()); |
| 467 | QVERIFY(!QDir::current().mkdir(dirName)); // calling mkdir on an existing file will fail. |
| 468 | QVERIFY(!QDir::current().mkpath(dirName)); // calling mkpath on an existing file will fail. |
| 469 | f.remove(); |
| 470 | } |
| 471 | |
| 472 | void tst_QDir::removeRecursively_data() |
| 473 | { |
| 474 | QTest::addColumn<QString>(name: "path" ); |
| 475 | |
| 476 | // Create dirs and files |
| 477 | const QString tmpdir = QDir::currentPath() + "/tmpdir/" ; |
| 478 | QStringList dirs; |
| 479 | dirs << tmpdir + "empty" |
| 480 | << tmpdir + "one" |
| 481 | << tmpdir + "two/three" |
| 482 | << "relative" ; |
| 483 | QDir dir; |
| 484 | for (int i = 0; i < dirs.count(); ++i) |
| 485 | dir.mkpath(dirPath: dirs.at(i)); |
| 486 | QStringList files; |
| 487 | files << tmpdir + "one/file" ; |
| 488 | files << tmpdir + "two/three/file" ; |
| 489 | for (int i = 0; i < files.count(); ++i) { |
| 490 | QFile file(files.at(i)); |
| 491 | QVERIFY(file.open(QIODevice::WriteOnly)); |
| 492 | file.write(data: "Hello" ); |
| 493 | } |
| 494 | |
| 495 | QTest::newRow(dataTag: "empty" ) << tmpdir + "empty" ; |
| 496 | QTest::newRow(dataTag: "one" ) << tmpdir + "one" ; |
| 497 | QTest::newRow(dataTag: "two" ) << tmpdir + "two" ; |
| 498 | QTest::newRow(dataTag: "does not exist" ) << tmpdir + "doesnotexist" ; |
| 499 | QTest::newRow(dataTag: "relative" ) << "relative" ; |
| 500 | } |
| 501 | |
| 502 | void tst_QDir::removeRecursively() |
| 503 | { |
| 504 | QFETCH(QString, path); |
| 505 | |
| 506 | QDir dir(path); |
| 507 | QVERIFY(dir.removeRecursively()); |
| 508 | |
| 509 | //make sure it really doesn't exist (ie that remove worked) |
| 510 | QVERIFY(!dir.exists()); |
| 511 | } |
| 512 | |
| 513 | void tst_QDir::removeRecursivelyFailure() |
| 514 | { |
| 515 | #ifdef Q_OS_UNIX |
| 516 | if (::getuid() == 0) |
| 517 | QSKIP("Running this test as root doesn't make sense" ); |
| 518 | #endif |
| 519 | const QString tmpdir = QDir::currentPath() + "/tmpdir/" ; |
| 520 | const QString path = tmpdir + "undeletable" ; |
| 521 | QDir().mkpath(dirPath: path); |
| 522 | |
| 523 | // Need a file in there, otherwise rmdir works even w/o permissions |
| 524 | QFile file(path + "/file" ); |
| 525 | QVERIFY(file.open(QIODevice::WriteOnly)); |
| 526 | file.write(data: "Hello" ); |
| 527 | file.close(); |
| 528 | |
| 529 | #ifdef Q_OS_UNIX |
| 530 | QFile dirAsFile(path); // yay, I have to use QFile to change a dir's permissions... |
| 531 | QVERIFY(dirAsFile.setPermissions({})); // no permissions |
| 532 | |
| 533 | QVERIFY(!QDir().rmdir(path)); |
| 534 | QDir dir(path); |
| 535 | QVERIFY(!dir.removeRecursively()); // didn't work |
| 536 | QVERIFY2(dir.exists(), msgDoesNotExist(dir.absolutePath()).constData()); // still exists |
| 537 | |
| 538 | QVERIFY(dirAsFile.setPermissions(QFile::Permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner))); |
| 539 | QVERIFY(dir.removeRecursively()); |
| 540 | QVERIFY(!dir.exists()); |
| 541 | #else // Q_OS_UNIX |
| 542 | QVERIFY(file.setPermissions(QFile::ReadOwner)); |
| 543 | QVERIFY(!QDir().rmdir(path)); |
| 544 | QDir dir(path); |
| 545 | QVERIFY(dir.removeRecursively()); |
| 546 | QVERIFY(!dir.exists()); |
| 547 | #endif // !Q_OS_UNIX |
| 548 | } |
| 549 | |
| 550 | void tst_QDir::removeRecursivelySymlink() |
| 551 | { |
| 552 | #ifndef Q_NO_SYMLINKS |
| 553 | const QString tmpdir = QDir::currentPath() + "/tmpdir/" ; |
| 554 | QDir().mkpath(dirPath: tmpdir); |
| 555 | QDir currentDir; |
| 556 | currentDir.mkdir(dirName: "myDir" ); |
| 557 | QFile("testfile" ).open(flags: QIODevice::WriteOnly); |
| 558 | const QString link = tmpdir + "linkToDir.lnk" ; |
| 559 | const QString linkToFile = tmpdir + "linkToFile.lnk" ; |
| 560 | #ifndef Q_NO_SYMLINKS_TO_DIRS |
| 561 | QVERIFY(QFile::link("../myDir" , link)); |
| 562 | QVERIFY(QFile::link("../testfile" , linkToFile)); |
| 563 | #endif |
| 564 | |
| 565 | QDir dir(tmpdir); |
| 566 | QVERIFY(dir.removeRecursively()); |
| 567 | QVERIFY(QDir("myDir" ).exists()); // it didn't follow the symlink, good. |
| 568 | QVERIFY(QFile::exists("testfile" )); |
| 569 | |
| 570 | currentDir.rmdir(dirName: "myDir" ); |
| 571 | QFile::remove(fileName: "testfile" ); |
| 572 | #endif |
| 573 | } |
| 574 | |
| 575 | void tst_QDir::exists_data() |
| 576 | { |
| 577 | QTest::addColumn<QString>(name: "path" ); |
| 578 | QTest::addColumn<bool>(name: "expected" ); |
| 579 | |
| 580 | QTest::newRow(dataTag: "data0" ) << QDir::currentPath() << true; |
| 581 | QTest::newRow(dataTag: "data0.1" ) << QDir::currentPath() + "/" << true; |
| 582 | QTest::newRow(dataTag: "data1" ) << QString("/I/Do_not_expect_this_path_to_exist/" ) << false; |
| 583 | QTest::newRow(dataTag: "resource0" ) << QString(":/tst_qdir/" ) << true; |
| 584 | QTest::newRow(dataTag: "resource1" ) << QString(":/I/Do_not_expect_this_resource_to_exist/" ) << false; |
| 585 | |
| 586 | QTest::newRow(dataTag: "simple dir" ) << (m_dataPath + "/resources" ) << true; |
| 587 | QTest::newRow(dataTag: "simple dir with slash" ) << (m_dataPath + "/resources/" ) << true; |
| 588 | #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) |
| 589 | const QString uncRoot = QStringLiteral("//" ) + QtNetworkSettings::winServerName(); |
| 590 | QTest::newRow("unc 1" ) << uncRoot << true; |
| 591 | QTest::newRow("unc 2" ) << uncRoot + QLatin1Char('/') << true; |
| 592 | QTest::newRow("unc 3" ) << uncRoot + "/testshare" << true; |
| 593 | QTest::newRow("unc 4" ) << uncRoot + "/testshare/" << true; |
| 594 | QTest::newRow("unc 5" ) << uncRoot + "/testshare/tmp" << true; |
| 595 | QTest::newRow("unc 6" ) << uncRoot + "/testshare/tmp/" << true; |
| 596 | QTest::newRow("unc 7" ) << uncRoot + "/testshare/adirthatshouldnotexist" << false; |
| 597 | QTest::newRow("unc 8" ) << uncRoot + "/asharethatshouldnotexist" << false; |
| 598 | QTest::newRow("unc 9" ) << "//ahostthatshouldnotexist" << false; |
| 599 | #endif |
| 600 | #if (defined(Q_OS_WIN) && !defined(Q_OS_WINRT)) |
| 601 | QTest::newRow("This drive should exist" ) << "C:/" << true; |
| 602 | // find a non-existing drive and check if it does not exist |
| 603 | #ifdef QT_BUILD_INTERNAL |
| 604 | QFileInfoList drives = QFSFileEngine::drives(); |
| 605 | QStringList driveLetters; |
| 606 | for (int i = 0; i < drives.count(); ++i) { |
| 607 | driveLetters+=drives.at(i).absoluteFilePath(); |
| 608 | } |
| 609 | char drive = 'Z'; |
| 610 | QString driv; |
| 611 | do { |
| 612 | driv = drive + QLatin1String(":/" ); |
| 613 | if (!driveLetters.contains(driv)) break; |
| 614 | --drive; |
| 615 | } while (drive >= 'A'); |
| 616 | if (drive >= 'A') { |
| 617 | QTest::newRow("This drive should not exist" ) << driv << false; |
| 618 | } |
| 619 | #endif |
| 620 | #endif |
| 621 | } |
| 622 | |
| 623 | void tst_QDir::exists() |
| 624 | { |
| 625 | QFETCH(QString, path); |
| 626 | QFETCH(bool, expected); |
| 627 | |
| 628 | QDir dir(path); |
| 629 | if (expected) |
| 630 | QVERIFY2(dir.exists(), msgDoesNotExist(path).constData()); |
| 631 | else |
| 632 | QVERIFY(!dir.exists()); |
| 633 | } |
| 634 | |
| 635 | void tst_QDir::isRelativePath_data() |
| 636 | { |
| 637 | QTest::addColumn<QString>(name: "path" ); |
| 638 | QTest::addColumn<bool>(name: "relative" ); |
| 639 | |
| 640 | QTest::newRow(dataTag: "data0" ) << "../somedir" << true; |
| 641 | #if defined(Q_OS_WIN) |
| 642 | QTest::newRow("data1" ) << "C:/sOmedir" << false; |
| 643 | #endif |
| 644 | QTest::newRow(dataTag: "data2" ) << "somedir" << true; |
| 645 | QTest::newRow(dataTag: "data3" ) << "/somedir" << false; |
| 646 | |
| 647 | QTest::newRow(dataTag: "resource0" ) << ":/prefix" << false; |
| 648 | QTest::newRow(dataTag: "resource1" ) << ":/prefix/foo.bar" << false; |
| 649 | } |
| 650 | |
| 651 | void tst_QDir::isRelativePath() |
| 652 | { |
| 653 | QFETCH(QString, path); |
| 654 | QFETCH(bool, relative); |
| 655 | |
| 656 | QCOMPARE(QDir::isRelativePath(path),relative); |
| 657 | } |
| 658 | |
| 659 | |
| 660 | void tst_QDir::QDir_default() |
| 661 | { |
| 662 | //default constructor QDir(); |
| 663 | QDir dir; // according to documentation should be currentDirPath |
| 664 | QCOMPARE(dir.absolutePath(), QDir::currentPath()); |
| 665 | } |
| 666 | |
| 667 | void tst_QDir::compare() |
| 668 | { |
| 669 | // operator== |
| 670 | |
| 671 | // Not using QCOMPARE to test result of QDir::operator== |
| 672 | |
| 673 | QDir dir; |
| 674 | dir.makeAbsolute(); |
| 675 | QVERIFY(dir == QDir::currentPath()); |
| 676 | |
| 677 | QCOMPARE(QDir(), QDir(QDir::currentPath())); |
| 678 | QVERIFY(QDir("../" ) == QDir(QDir::currentPath() + "/.." )); |
| 679 | } |
| 680 | |
| 681 | static QStringList filterLinks(const QStringList &list) |
| 682 | { |
| 683 | #ifndef Q_NO_SYMLINKS |
| 684 | return list; |
| 685 | #else |
| 686 | QStringList result; |
| 687 | foreach (QString str, list) { |
| 688 | if (!str.endsWith(QLatin1String(".lnk" ))) |
| 689 | result.append(str); |
| 690 | } |
| 691 | return result; |
| 692 | #endif |
| 693 | } |
| 694 | |
| 695 | void tst_QDir::entryList_data() |
| 696 | { |
| 697 | QTest::addColumn<QString>(name: "dirName" ); // relative from current path or abs |
| 698 | QTest::addColumn<QStringList>(name: "nameFilters" ); |
| 699 | QTest::addColumn<int>(name: "filterspec" ); |
| 700 | QTest::addColumn<int>(name: "sortspec" ); |
| 701 | QTest::addColumn<QStringList>(name: "expected" ); |
| 702 | QTest::newRow(dataTag: "spaces1" ) << (m_dataPath + "/testdir/spaces" ) << QStringList("*. bar" ) |
| 703 | << (int)(QDir::NoFilter) << (int)(QDir::NoSort) |
| 704 | << QStringList("foo. bar" ); // notice how spaces5 works |
| 705 | QTest::newRow(dataTag: "spaces2" ) << (m_dataPath + "/testdir/spaces" ) << QStringList("*.bar" ) |
| 706 | << (int)(QDir::NoFilter) << (int)(QDir::NoSort) |
| 707 | << QStringList("foo.bar" ); |
| 708 | QTest::newRow(dataTag: "spaces3" ) << (m_dataPath + "/testdir/spaces" ) << QStringList("foo.*" ) |
| 709 | << (int)(QDir::NoFilter) << (int)(QDir::NoSort) |
| 710 | << QString("foo. bar,foo.bar" ).split(sep: ','); |
| 711 | QTest::newRow(dataTag: "files1" ) << (m_dataPath + "/testdir/dir" ) << QString("*r.cpp *.pro" ).split(sep: " " ) |
| 712 | << (int)(QDir::NoFilter) << (int)(QDir::NoSort) |
| 713 | << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp" ).split(sep: ','); |
| 714 | QTest::newRow(dataTag: "testdir1" ) << (m_dataPath + "/testdir" ) << QStringList() |
| 715 | << (int)(QDir::AllDirs) << (int)(QDir::NoSort) |
| 716 | << QString(".,..,dir,spaces" ).split(sep: ','); |
| 717 | QTest::newRow(dataTag: "resources1" ) << QString(":/tst_qdir/resources/entryList" ) << QStringList("*.data" ) |
| 718 | << (int)(QDir::NoFilter) << (int)(QDir::NoSort) |
| 719 | << QString("file1.data,file2.data,file3.data" ).split(sep: ','); |
| 720 | QTest::newRow(dataTag: "resources2" ) << QString(":/tst_qdir/resources/entryList" ) << QStringList("*.data" ) |
| 721 | << (int)(QDir::Files) << (int)(QDir::NoSort) |
| 722 | << QString("file1.data,file2.data,file3.data" ).split(sep: ','); |
| 723 | } |
| 724 | |
| 725 | void tst_QDir::entryList() |
| 726 | { |
| 727 | QFETCH(QString, dirName); |
| 728 | QFETCH(QStringList, nameFilters); |
| 729 | QFETCH(int, filterspec); |
| 730 | QFETCH(int, sortspec); |
| 731 | QFETCH(QStringList, expected); |
| 732 | |
| 733 | QDir dir(dirName); |
| 734 | QVERIFY2(dir.exists(), msgDoesNotExist(dirName).constData()); |
| 735 | |
| 736 | QStringList actual = dir.entryList(nameFilters, filters: (QDir::Filters)filterspec, |
| 737 | sort: (QDir::SortFlags)sortspec); |
| 738 | |
| 739 | QCOMPARE(actual, expected); |
| 740 | } |
| 741 | |
| 742 | void tst_QDir::entryListWithTestFiles_data() |
| 743 | { |
| 744 | QTest::addColumn<QString>(name: "dirName" ); // relative from current path or abs |
| 745 | QTest::addColumn<QStringList>(name: "nameFilters" ); |
| 746 | QTest::addColumn<int>(name: "filterspec" ); |
| 747 | QTest::addColumn<int>(name: "sortspec" ); |
| 748 | QTest::addColumn<QStringList>(name: "expected" ); |
| 749 | |
| 750 | QTest::newRow(dataTag: "nofilter" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 751 | << int(QDir::NoFilter) << int(QDir::Name) |
| 752 | << filterLinks(list: QString(".,..,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 753 | QTest::newRow(dataTag: "QDir::AllEntries" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 754 | << int(QDir::AllEntries) << int(QDir::Name) |
| 755 | << filterLinks(list: QString(".,..,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 756 | QTest::newRow(dataTag: "QDir::Files" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 757 | << int(QDir::Files) << int(QDir::Name) |
| 758 | << filterLinks(list: QString("file,linktofile.lnk,writable" ).split(sep: ',')); |
| 759 | QTest::newRow(dataTag: "QDir::Dirs" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 760 | << int(QDir::Dirs) << int(QDir::Name) |
| 761 | << filterLinks(list: QString(".,..,directory,linktodirectory.lnk" ).split(sep: ',')); |
| 762 | QTest::newRow(dataTag: "QDir::Dirs | QDir::NoDotAndDotDot" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 763 | << int(QDir::Dirs | QDir::NoDotAndDotDot) << int(QDir::Name) |
| 764 | << filterLinks(list: QString("directory,linktodirectory.lnk" ).split(sep: ',')); |
| 765 | QTest::newRow(dataTag: "QDir::AllDirs" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 766 | << int(QDir::AllDirs) << int(QDir::Name) |
| 767 | << filterLinks(list: QString(".,..,directory,linktodirectory.lnk" ).split(sep: ',')); |
| 768 | QTest::newRow(dataTag: "QDir::AllDirs | QDir::Dirs" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 769 | << int(QDir::AllDirs | QDir::Dirs) << int(QDir::Name) |
| 770 | << filterLinks(list: QString(".,..,directory,linktodirectory.lnk" ).split(sep: ',')); |
| 771 | QTest::newRow(dataTag: "QDir::AllDirs | QDir::Files" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 772 | << int(QDir::AllDirs | QDir::Files) << int(QDir::Name) |
| 773 | << filterLinks(list: QString(".,..,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 774 | QTest::newRow(dataTag: "QDir::AllEntries | QDir::NoSymLinks" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 775 | << int(QDir::AllEntries | QDir::NoSymLinks) << int(QDir::Name) |
| 776 | << filterLinks(list: QString(".,..,directory,file,writable" ).split(sep: ',')); |
| 777 | QTest::newRow(dataTag: "QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 778 | << int(QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot) << int(QDir::Name) |
| 779 | << filterLinks(list: QString("directory,file,writable" ).split(sep: ',')); |
| 780 | QTest::newRow(dataTag: "QDir::Files | QDir::NoSymLinks" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 781 | << int(QDir::Files | QDir::NoSymLinks) << int(QDir::Name) |
| 782 | << filterLinks(list: QString("file,writable" ).split(sep: ',')); |
| 783 | QTest::newRow(dataTag: "QDir::Dirs | QDir::NoSymLinks" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 784 | << int(QDir::Dirs | QDir::NoSymLinks) << int(QDir::Name) |
| 785 | << filterLinks(list: QString(".,..,directory" ).split(sep: ',')); |
| 786 | QTest::newRow(dataTag: "QDir::Drives | QDir::Files | QDir::NoDotAndDotDot" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 787 | << int(QDir::Drives | QDir::Files | QDir::NoDotAndDotDot) << int(QDir::Name) |
| 788 | << filterLinks(list: QString("file,linktofile.lnk,writable" ).split(sep: ',')); |
| 789 | QTest::newRow(dataTag: "QDir::System" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 790 | << int(QDir::System) << int(QDir::Name) |
| 791 | << filterLinks(list: QStringList("brokenlink.lnk" )); |
| 792 | QTest::newRow(dataTag: "QDir::Hidden" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 793 | << int(QDir::Hidden) << int(QDir::Name) |
| 794 | << QStringList(); |
| 795 | QTest::newRow(dataTag: "QDir::System | QDir::Hidden" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 796 | << int(QDir::System | QDir::Hidden) << int(QDir::Name) |
| 797 | << filterLinks(list: QStringList("brokenlink.lnk" )); |
| 798 | QTest::newRow(dataTag: "QDir::AllDirs | QDir::NoSymLinks" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 799 | << int(QDir::AllDirs | QDir::NoSymLinks) << int(QDir::Name) |
| 800 | << filterLinks(list: QString(".,..,directory" ).split(sep: ',')); |
| 801 | QTest::newRow(dataTag: "QDir::AllEntries | QDir::Hidden | QDir::System" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 802 | << int(QDir::AllEntries | QDir::Hidden | QDir::System) << int(QDir::Name) |
| 803 | << filterLinks(list: QString(".,..,brokenlink.lnk,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 804 | QTest::newRow(dataTag: "QDir::AllEntries | QDir::Readable" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 805 | << int(QDir::AllEntries | QDir::Readable) << int(QDir::Name) |
| 806 | << filterLinks(list: QString(".,..,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 807 | QTest::newRow(dataTag: "QDir::AllEntries | QDir::Writable" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 808 | << int(QDir::AllEntries | QDir::Writable) << int(QDir::Name) |
| 809 | << filterLinks(list: QString(".,..,directory,linktodirectory.lnk,writable" ).split(sep: ',')); |
| 810 | QTest::newRow(dataTag: "QDir::Files | QDir::Readable" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 811 | << int(QDir::Files | QDir::Readable) << int(QDir::Name) |
| 812 | << filterLinks(list: QString("file,linktofile.lnk,writable" ).split(sep: ',')); |
| 813 | QTest::newRow(dataTag: "QDir::Dirs | QDir::Readable" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 814 | << int(QDir::Dirs | QDir::Readable) << int(QDir::Name) |
| 815 | << filterLinks(list: QString(".,..,directory,linktodirectory.lnk" ).split(sep: ',')); |
| 816 | QTest::newRow(dataTag: "Namefilters b*" ) << (m_dataPath + "/entrylist/" ) << QStringList("d*" ) |
| 817 | << int(QDir::NoFilter) << int(QDir::Name) |
| 818 | << filterLinks(list: QString("directory" ).split(sep: ',')); |
| 819 | QTest::newRow(dataTag: "Namefilters f*" ) << (m_dataPath + "/entrylist/" ) << QStringList("f*" ) |
| 820 | << int(QDir::NoFilter) << int(QDir::Name) |
| 821 | << filterLinks(list: QString("file" ).split(sep: ',')); |
| 822 | QTest::newRow(dataTag: "Namefilters link*" ) << (m_dataPath + "/entrylist/" ) << QStringList("link*" ) |
| 823 | << int(QDir::NoFilter) << int(QDir::Name) |
| 824 | << filterLinks(list: QString("linktodirectory.lnk,linktofile.lnk" ).split(sep: ',')); |
| 825 | QTest::newRow(dataTag: "Namefilters *to*" ) << (m_dataPath + "/entrylist/" ) << QStringList("*to*" ) |
| 826 | << int(QDir::NoFilter) << int(QDir::Name) |
| 827 | << filterLinks(list: QString("directory,linktodirectory.lnk,linktofile.lnk" ).split(sep: ',')); |
| 828 | QTest::newRow(dataTag: "Sorting QDir::Name" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 829 | << int(QDir::NoFilter) << int(QDir::Name) |
| 830 | << filterLinks(list: QString(".,..,directory,file,linktodirectory.lnk,linktofile.lnk,writable" ).split(sep: ',')); |
| 831 | QTest::newRow(dataTag: "Sorting QDir::Name | QDir::Reversed" ) << (m_dataPath + "/entrylist/" ) << QStringList("*" ) |
| 832 | << int(QDir::NoFilter) << int(QDir::Name | QDir::Reversed) |
| 833 | << filterLinks(list: QString("writable,linktofile.lnk,linktodirectory.lnk,file,directory,..,." ).split(sep: ',')); |
| 834 | |
| 835 | QTest::newRow(dataTag: "Sorting QDir::Type" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 836 | << int(QDir::NoFilter) << int(QDir::Type) |
| 837 | << QString(".,..,a,b,c,d,e,f,a.a,b.a,c.a,d.a,e.a,f.a,a.b,b.b,c.b,d.b,e.b,f.b,a.c,b.c,c.c,d.c,e.c,f.c" ).split(sep: ','); |
| 838 | QTest::newRow(dataTag: "Sorting QDir::Type | QDir::Reversed" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 839 | << int(QDir::NoFilter) << int(QDir::Type | QDir::Reversed) |
| 840 | << QString("f.c,e.c,d.c,c.c,b.c,a.c,f.b,e.b,d.b,c.b,b.b,a.b,f.a,e.a,d.a,c.a,b.a,a.a,f,e,d,c,b,a,..,." ).split(sep: ','); |
| 841 | QTest::newRow(dataTag: "Sorting QDir::Type | QDir::DirsLast" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 842 | << int(QDir::NoFilter) << int(QDir::Type | QDir::DirsLast) |
| 843 | << QString("a,b,c,a.a,b.a,c.a,a.b,b.b,c.b,a.c,b.c,c.c,.,..,d,e,f,d.a,e.a,f.a,d.b,e.b,f.b,d.c,e.c,f.c" ).split(sep: ','); |
| 844 | QTest::newRow(dataTag: "Sorting QDir::Type | QDir::DirsFirst" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 845 | << int(QDir::NoFilter) << int(QDir::Type | QDir::DirsFirst) |
| 846 | << QString(".,..,d,e,f,d.a,e.a,f.a,d.b,e.b,f.b,d.c,e.c,f.c,a,b,c,a.a,b.a,c.a,a.b,b.b,c.b,a.c,b.c,c.c" ).split(sep: ','); |
| 847 | QTest::newRow(dataTag: "Sorting QDir::Size" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 848 | << int(QDir::AllEntries|QDir::NoDotAndDotDot) << int(QDir::Size | QDir::DirsFirst) |
| 849 | << QString("d,d.a,d.b,d.c,e,e.a,e.b,e.c,f,f.a,f.b,f.c,c.a,c.b,c.c,b.a,b.c,b.b,a.c,a.b,a.a,a,b,c" ).split(sep: ','); |
| 850 | QTest::newRow(dataTag: "Sorting QDir::Size | QDir::Reversed" ) << (m_dataPath + "/types/" ) << QStringList("*" ) |
| 851 | << int(QDir::AllEntries|QDir::NoDotAndDotDot) << int(QDir::Size | QDir::Reversed | QDir::DirsLast) |
| 852 | << QString("c,b,a,a.a,a.b,a.c,b.b,b.c,b.a,c.c,c.b,c.a,f.c,f.b,f.a,f,e.c,e.b,e.a,e,d.c,d.b,d.a,d" ).split(sep: ','); |
| 853 | } |
| 854 | |
| 855 | void tst_QDir::entryListWithTestFiles() |
| 856 | { |
| 857 | QFETCH(QString, dirName); |
| 858 | QFETCH(QStringList, nameFilters); |
| 859 | QFETCH(int, filterspec); |
| 860 | QFETCH(int, sortspec); |
| 861 | QFETCH(QStringList, expected); |
| 862 | |
| 863 | QStringList testFiles; |
| 864 | |
| 865 | QString entrylistPath = (m_dataPath + "/entrylist/" ); |
| 866 | |
| 867 | { |
| 868 | const QString writableFileName = entrylistPath + "writable" ; |
| 869 | QFile writableFile(writableFileName); |
| 870 | testFiles.append(t: writableFileName); |
| 871 | |
| 872 | QVERIFY2(writableFile.open(QIODevice::ReadWrite), |
| 873 | qPrintable(writableFile.errorString())); |
| 874 | } |
| 875 | |
| 876 | { |
| 877 | QFile readOnlyFile(entrylistPath + "file" ); |
| 878 | QVERIFY2(readOnlyFile.setPermissions(QFile::ReadOwner | QFile::ReadUser), |
| 879 | qPrintable(readOnlyFile.errorString())); |
| 880 | } |
| 881 | |
| 882 | |
| 883 | #ifndef Q_NO_SYMLINKS |
| 884 | #if defined(Q_OS_WIN) |
| 885 | // ### Sadly, this is a platform difference right now. |
| 886 | // Note we are using capital L in entryList on one side here, to test case-insensitivity |
| 887 | const QVector<QPair<QString, QString> > symLinks = |
| 888 | { |
| 889 | {m_dataPath + "/entryList/file" , entrylistPath + "linktofile.lnk" }, |
| 890 | {m_dataPath + "/entryList/directory" , entrylistPath + "linktodirectory.lnk" }, |
| 891 | {m_dataPath + "/entryList/nothing" , entrylistPath + "brokenlink.lnk" } |
| 892 | }; |
| 893 | #else |
| 894 | const QVector<QPair<QString, QString> > symLinks = |
| 895 | { |
| 896 | {"file" , entrylistPath + "linktofile.lnk" }, |
| 897 | {"directory" , entrylistPath + "linktodirectory.lnk" }, |
| 898 | {"nothing" , entrylistPath + "brokenlink.lnk" } |
| 899 | }; |
| 900 | #endif |
| 901 | for (const auto &symLink : symLinks) { |
| 902 | QVERIFY2(QFile::link(symLink.first, symLink.second), |
| 903 | qPrintable(symLink.first + "->" + symLink.second)); |
| 904 | testFiles.append(t: symLink.second); |
| 905 | } |
| 906 | #endif //Q_NO_SYMLINKS |
| 907 | |
| 908 | QDir dir(dirName); |
| 909 | QVERIFY2(dir.exists(), msgDoesNotExist(dirName).constData()); |
| 910 | |
| 911 | QStringList actual = dir.entryList(nameFilters, filters: (QDir::Filters)filterspec, |
| 912 | sort: (QDir::SortFlags)sortspec); |
| 913 | |
| 914 | bool doContentCheck = true; |
| 915 | #if defined(Q_OS_UNIX) |
| 916 | if (qstrcmp(str1: QTest::currentDataTag(), str2: "QDir::AllEntries | QDir::Writable" ) == 0) { |
| 917 | // for root, everything is writeable |
| 918 | if (::getuid() == 0) |
| 919 | doContentCheck = false; |
| 920 | } |
| 921 | #endif |
| 922 | |
| 923 | for (int i = testFiles.size() - 1; i >= 0; --i) |
| 924 | QVERIFY2(QFile::remove(testFiles.at(i)), qPrintable(testFiles.at(i))); |
| 925 | |
| 926 | if (doContentCheck) |
| 927 | QCOMPARE(actual, expected); |
| 928 | } |
| 929 | |
| 930 | void tst_QDir::entryListTimedSort() |
| 931 | { |
| 932 | #if QT_CONFIG(process) |
| 933 | const QString touchBinary = "/bin/touch" ; |
| 934 | if (!QFile::exists(fileName: touchBinary)) |
| 935 | QSKIP("/bin/touch not found" ); |
| 936 | |
| 937 | const QString entrylistPath = m_dataPath + "/entrylist/" ; |
| 938 | QTemporaryFile aFile(entrylistPath + "A-XXXXXX.qws" ); |
| 939 | QTemporaryFile bFile(entrylistPath + "B-XXXXXX.qws" ); |
| 940 | |
| 941 | QVERIFY2(aFile.open(), qPrintable(aFile.errorString())); |
| 942 | QVERIFY2(bFile.open(), qPrintable(bFile.errorString())); |
| 943 | { |
| 944 | QProcess p; |
| 945 | p.start(program: touchBinary, arguments: QStringList() << "-t" << "201306021513" << aFile.fileName()); |
| 946 | QVERIFY(p.waitForFinished(1000)); |
| 947 | } |
| 948 | { |
| 949 | QProcess p; |
| 950 | p.start(program: touchBinary, arguments: QStringList() << "-t" << "201504131513" << bFile.fileName()); |
| 951 | QVERIFY(p.waitForFinished(1000)); |
| 952 | } |
| 953 | |
| 954 | QStringList actual = QDir(entrylistPath).entryList(nameFilters: QStringList() << "*.qws" , filters: QDir::NoFilter, |
| 955 | sort: QDir::Time); |
| 956 | |
| 957 | QFileInfo aFileInfo(aFile); |
| 958 | QFileInfo bFileInfo(bFile); |
| 959 | QVERIFY(bFileInfo.lastModified().msecsTo(aFileInfo.lastModified()) < 0); |
| 960 | |
| 961 | QCOMPARE(actual.size(), 2); |
| 962 | QCOMPARE(actual.first(), bFileInfo.fileName()); |
| 963 | QCOMPARE(actual.last(), aFileInfo.fileName()); |
| 964 | #else |
| 965 | QSKIP("This test requires QProcess support." ); |
| 966 | #endif // QT_CONFIG(process) |
| 967 | } |
| 968 | |
| 969 | void tst_QDir::entryListSimple_data() |
| 970 | { |
| 971 | QTest::addColumn<QString>(name: "dirName" ); |
| 972 | QTest::addColumn<int>(name: "countMin" ); |
| 973 | |
| 974 | QTest::newRow(dataTag: "data2" ) << "do_not_expect_this_path_to_exist/" << 0; |
| 975 | QTest::newRow(dataTag: "simple dir" ) << (m_dataPath + "/resources" ) << 2; |
| 976 | QTest::newRow(dataTag: "simple dir with slash" ) << (m_dataPath + "/resources/" ) << 2; |
| 977 | |
| 978 | #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) |
| 979 | const QString uncRoot = QStringLiteral("//" ) + QtNetworkSettings::winServerName(); |
| 980 | QTest::newRow("unc 1" ) << uncRoot << 2; |
| 981 | QTest::newRow("unc 2" ) << uncRoot + QLatin1Char('/') << 2; |
| 982 | QTest::newRow("unc 3" ) << uncRoot + "/testshare" << 2; |
| 983 | QTest::newRow("unc 4" ) << uncRoot + "/testshare/" << 2; |
| 984 | QTest::newRow("unc 5" ) << uncRoot + "/testshare/tmp" << 2; |
| 985 | QTest::newRow("unc 6" ) << uncRoot + "/testshare/tmp/" << 2; |
| 986 | QTest::newRow("unc 7" ) << uncRoot + "/testshare/adirthatshouldnotexist" << 0; |
| 987 | QTest::newRow("unc 8" ) << uncRoot + "/asharethatshouldnotexist" << 0; |
| 988 | QTest::newRow("unc 9" ) << "//ahostthatshouldnotexist" << 0; |
| 989 | #endif |
| 990 | } |
| 991 | |
| 992 | static QByteArray msgEntryListFailed(int actual, int expectedMin, const QString &name) |
| 993 | { |
| 994 | return QByteArray::number(actual) + " < " + QByteArray::number(expectedMin) + " in \"" |
| 995 | + QFile::encodeName(fileName: QDir::toNativeSeparators(pathName: name)) + '"'; |
| 996 | } |
| 997 | |
| 998 | void tst_QDir::entryListSimple() |
| 999 | { |
| 1000 | QFETCH(QString, dirName); |
| 1001 | QFETCH(int, countMin); |
| 1002 | |
| 1003 | QDir dir(dirName); |
| 1004 | QStringList actual = dir.entryList(); |
| 1005 | QVERIFY2(actual.count() >= countMin, msgEntryListFailed(actual.count(), countMin, dirName).constData()); |
| 1006 | } |
| 1007 | |
| 1008 | void tst_QDir::entryListWithSymLinks() |
| 1009 | { |
| 1010 | #ifndef Q_NO_SYMLINKS |
| 1011 | # ifndef Q_NO_SYMLINKS_TO_DIRS |
| 1012 | QFile::remove(fileName: "myLinkToDir.lnk" ); |
| 1013 | # endif |
| 1014 | QFile::remove(fileName: "myLinkToFile.lnk" ); |
| 1015 | QFile::remove(fileName: "testfile.cpp" ); |
| 1016 | QDir dir; |
| 1017 | dir.mkdir(dirName: "myDir" ); |
| 1018 | QFile("testfile.cpp" ).open(flags: QIODevice::WriteOnly); |
| 1019 | # ifndef Q_NO_SYMLINKS_TO_DIRS |
| 1020 | QVERIFY(QFile::link("myDir" , "myLinkToDir.lnk" )); |
| 1021 | # endif |
| 1022 | QVERIFY(QFile::link("testfile.cpp" , "myLinkToFile.lnk" )); |
| 1023 | |
| 1024 | { |
| 1025 | QStringList entryList = QDir().entryList(); |
| 1026 | QVERIFY(entryList.contains("myDir" )); |
| 1027 | # ifndef Q_NO_SYMLINKS_TO_DIRS |
| 1028 | QVERIFY(entryList.contains("myLinkToDir.lnk" )); |
| 1029 | #endif |
| 1030 | QVERIFY(entryList.contains("myLinkToFile.lnk" )); |
| 1031 | } |
| 1032 | { |
| 1033 | QStringList entryList = QDir().entryList(filters: QDir::Dirs); |
| 1034 | QVERIFY(entryList.contains("myDir" )); |
| 1035 | # ifndef Q_NO_SYMLINKS_TO_DIRS |
| 1036 | QVERIFY(entryList.contains("myLinkToDir.lnk" )); |
| 1037 | #endif |
| 1038 | QVERIFY(!entryList.contains("myLinkToFile.lnk" )); |
| 1039 | } |
| 1040 | { |
| 1041 | QStringList entryList = QDir().entryList(filters: QDir::Dirs | QDir::NoSymLinks); |
| 1042 | QVERIFY(entryList.contains("myDir" )); |
| 1043 | QVERIFY(!entryList.contains("myLinkToDir.lnk" )); |
| 1044 | QVERIFY(!entryList.contains("myLinkToFile.lnk" )); |
| 1045 | } |
| 1046 | |
| 1047 | QFile::remove(fileName: "myLinkToDir.lnk" ); |
| 1048 | QFile::remove(fileName: "myLinkToFile.lnk" ); |
| 1049 | QFile::remove(fileName: "testfile.cpp" ); |
| 1050 | dir.rmdir(dirName: "myDir" ); |
| 1051 | #endif |
| 1052 | } |
| 1053 | |
| 1054 | void tst_QDir::canonicalPath_data() |
| 1055 | { |
| 1056 | QTest::addColumn<QString>(name: "path" ); |
| 1057 | QTest::addColumn<QString>(name: "canonicalPath" ); |
| 1058 | |
| 1059 | QTest::newRow(dataTag: "relative" ) << "." << m_dataPath; |
| 1060 | QTest::newRow(dataTag: "relativeSubDir" ) << "./testData/../testData" << m_dataPath + "/testData" ; |
| 1061 | #ifndef Q_OS_WIN |
| 1062 | QTest::newRow(dataTag: "absPath" ) << m_dataPath + "/testData/../testData" << m_dataPath + "/testData" ; |
| 1063 | #else |
| 1064 | QTest::newRow("absPath" ) << m_dataPath + "\\testData\\..\\testData" << m_dataPath + "/testData" ; |
| 1065 | #endif |
| 1066 | QTest::newRow(dataTag: "nonexistant" ) << "testd" << QString(); |
| 1067 | |
| 1068 | QTest::newRow(dataTag: "rootPath" ) << QDir::rootPath() << QDir::rootPath(); |
| 1069 | QTest::newRow(dataTag: "rootPath + ./" ) << QDir::rootPath().append(s: "./" ) << QDir::rootPath(); |
| 1070 | QTest::newRow(dataTag: "rootPath + ../.. " ) << QDir::rootPath().append(s: "../.." ) << QDir::rootPath(); |
| 1071 | #if defined(Q_OS_WIN) |
| 1072 | QTest::newRow("drive:\\" ) << QDir::toNativeSeparators(QDir::rootPath()) << QDir::rootPath(); |
| 1073 | QTest::newRow("drive:\\.\\" ) << QDir::toNativeSeparators(QDir::rootPath().append("./" )) << QDir::rootPath(); |
| 1074 | QTest::newRow("drive:\\..\\.." ) << QDir::toNativeSeparators(QDir::rootPath().append("../.." )) << QDir::rootPath(); |
| 1075 | QTest::newRow("drive:" ) << QDir().canonicalPath().left(2) << QDir().canonicalPath(); |
| 1076 | #endif |
| 1077 | |
| 1078 | QTest::newRow(dataTag: "resource" ) << ":/tst_qdir/resources/entryList" << ":/tst_qdir/resources/entryList" ; |
| 1079 | } |
| 1080 | |
| 1081 | void tst_QDir::canonicalPath() |
| 1082 | { |
| 1083 | QDir dataDir(m_dataPath); |
| 1084 | if (dataDir.absolutePath() != dataDir.canonicalPath()) |
| 1085 | QSKIP("This test does not work if this directory path consists of symlinks." ); |
| 1086 | |
| 1087 | QString oldpwd = QDir::currentPath(); |
| 1088 | QDir::setCurrent(dataDir.absolutePath()); |
| 1089 | |
| 1090 | QFETCH(QString, path); |
| 1091 | QFETCH(QString, canonicalPath); |
| 1092 | |
| 1093 | QDir dir(path); |
| 1094 | #if defined(Q_OS_WIN) |
| 1095 | QCOMPARE(dir.canonicalPath().toLower(), canonicalPath.toLower()); |
| 1096 | #else |
| 1097 | QCOMPARE(dir.canonicalPath(), canonicalPath); |
| 1098 | #endif |
| 1099 | |
| 1100 | QDir::setCurrent(oldpwd); |
| 1101 | } |
| 1102 | |
| 1103 | void tst_QDir::current_data() |
| 1104 | { |
| 1105 | QTest::addColumn<QString>(name: "path" ); |
| 1106 | QTest::addColumn<QString>(name: "currentDir" ); |
| 1107 | |
| 1108 | QTest::newRow(dataTag: "startup" ) << QString() << m_dataPath; |
| 1109 | QTest::newRow(dataTag: "relPath" ) << "testData" << m_dataPath + "/testData" ; |
| 1110 | #ifndef Q_OS_WIN |
| 1111 | QTest::newRow(dataTag: "absPath" ) << m_dataPath + "/testData" << m_dataPath + "/testData" ; |
| 1112 | #else |
| 1113 | QTest::newRow("absPath" ) << m_dataPath + "\\testData" << m_dataPath + "/testData" ; |
| 1114 | #endif |
| 1115 | QTest::newRow(dataTag: "nonexistant" ) << "testd" << QString(); |
| 1116 | |
| 1117 | QTest::newRow(dataTag: "parent" ) << ".." << m_dataPath.left(n: m_dataPath.lastIndexOf(c: '/')); |
| 1118 | } |
| 1119 | |
| 1120 | void tst_QDir::current() |
| 1121 | { |
| 1122 | QString oldDir = QDir::currentPath(); |
| 1123 | QDir::setCurrent(m_dataPath); |
| 1124 | QFETCH(QString, path); |
| 1125 | QFETCH(QString, currentDir); |
| 1126 | |
| 1127 | if (!path.isEmpty()) { |
| 1128 | bool b = QDir::setCurrent(path); |
| 1129 | // If path is non existent, then setCurrent should be false (currentDir is empty in testData) |
| 1130 | QCOMPARE(b, !currentDir.isEmpty()); |
| 1131 | } |
| 1132 | if (!currentDir.isEmpty()) { |
| 1133 | QDir newCurrent = QDir::current(); |
| 1134 | QDir::setCurrent(oldDir); |
| 1135 | #if defined(Q_OS_WIN) |
| 1136 | QCOMPARE(newCurrent.absolutePath().toLower(), currentDir.toLower()); |
| 1137 | #else |
| 1138 | QCOMPARE(newCurrent.absolutePath(), currentDir); |
| 1139 | #endif |
| 1140 | } |
| 1141 | |
| 1142 | QDir::setCurrent(oldDir); |
| 1143 | } |
| 1144 | |
| 1145 | void tst_QDir::cd_data() |
| 1146 | { |
| 1147 | QTest::addColumn<QString>(name: "startDir" ); |
| 1148 | QTest::addColumn<QString>(name: "cdDir" ); |
| 1149 | QTest::addColumn<bool>(name: "successExpected" ); |
| 1150 | QTest::addColumn<QString>(name: "newDir" ); |
| 1151 | |
| 1152 | int index = m_dataPath.lastIndexOf(c: QLatin1Char('/')); |
| 1153 | QTest::newRow(dataTag: "cdUp" ) << m_dataPath << ".." << true << m_dataPath.left(n: index==0?1:index); |
| 1154 | QTest::newRow(dataTag: "cdUp non existent (relative dir)" ) << "anonexistingDir" << ".." |
| 1155 | << true << m_dataPath; |
| 1156 | QTest::newRow(dataTag: "cdUp non existent (absolute dir)" ) << m_dataPath + "/anonexistingDir" << ".." |
| 1157 | << true << m_dataPath; |
| 1158 | QTest::newRow(dataTag: "noChange" ) << m_dataPath << "." << true << m_dataPath; |
| 1159 | #if defined(Q_OS_WIN) // on windows QDir::root() is usually c:/ but cd "/" will not force it to be root |
| 1160 | QTest::newRow("absolute" ) << m_dataPath << "/" << true << "/" ; |
| 1161 | #else |
| 1162 | QTest::newRow(dataTag: "absolute" ) << m_dataPath << "/" << true << QDir::root().absolutePath(); |
| 1163 | #endif |
| 1164 | QTest::newRow(dataTag: "non existant" ) << "." << "../anonexistingdir" << false << m_dataPath; |
| 1165 | QTest::newRow(dataTag: "self" ) << "." << (QString("../" ) + QFileInfo(m_dataPath).fileName()) << true << m_dataPath; |
| 1166 | QTest::newRow(dataTag: "file" ) << "." << "qdir.pro" << false << m_dataPath; |
| 1167 | } |
| 1168 | |
| 1169 | void tst_QDir::cd() |
| 1170 | { |
| 1171 | QFETCH(QString, startDir); |
| 1172 | QFETCH(QString, cdDir); |
| 1173 | QFETCH(bool, successExpected); |
| 1174 | QFETCH(QString, newDir); |
| 1175 | |
| 1176 | QDir d = startDir; |
| 1177 | bool notUsed = d.exists(); // make sure we cache this before so we can see if 'cd' fails to flush this |
| 1178 | Q_UNUSED(notUsed); |
| 1179 | QCOMPARE(d.cd(cdDir), successExpected); |
| 1180 | QCOMPARE(d.absolutePath(), newDir); |
| 1181 | } |
| 1182 | |
| 1183 | void tst_QDir::setNameFilters_data() |
| 1184 | { |
| 1185 | // Effectively copied from entryList2() test |
| 1186 | |
| 1187 | QTest::addColumn<QString>(name: "dirName" ); // relative from current path or abs |
| 1188 | QTest::addColumn<QStringList>(name: "nameFilters" ); |
| 1189 | QTest::addColumn<QStringList>(name: "expected" ); |
| 1190 | |
| 1191 | QTest::newRow(dataTag: "spaces1" ) << m_dataPath + "/testdir/spaces" << QStringList("*. bar" ) |
| 1192 | << QStringList("foo. bar" ); |
| 1193 | QTest::newRow(dataTag: "spaces2" ) << m_dataPath + "/testdir/spaces" << QStringList("*.bar" ) |
| 1194 | << QStringList("foo.bar" ); |
| 1195 | QTest::newRow(dataTag: "spaces3" ) << m_dataPath + "/testdir/spaces" << QStringList("foo.*" ) |
| 1196 | << QString("foo. bar,foo.bar" ).split(sep: QLatin1Char(',')); |
| 1197 | QTest::newRow(dataTag: "files1" ) << m_dataPath + "/testdir/dir" << QString("*r.cpp *.pro" ).split(sep: QLatin1Char(' ')) |
| 1198 | << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp" ).split(sep: QLatin1Char(',')); |
| 1199 | QTest::newRow(dataTag: "resources1" ) << QString(":/tst_qdir/resources/entryList" ) << QStringList("*.data" ) |
| 1200 | << QString("file1.data,file2.data,file3.data" ).split(sep: QLatin1Char(',')); |
| 1201 | } |
| 1202 | |
| 1203 | void tst_QDir::setNameFilters() |
| 1204 | { |
| 1205 | QFETCH(QString, dirName); |
| 1206 | QFETCH(QStringList, nameFilters); |
| 1207 | QFETCH(QStringList, expected); |
| 1208 | |
| 1209 | QDir dir(dirName); |
| 1210 | QVERIFY2(dir.exists(), msgDoesNotExist(dirName).constData()); |
| 1211 | |
| 1212 | dir.setNameFilters(nameFilters); |
| 1213 | QStringList actual = dir.entryList(); |
| 1214 | int max = qMin(a: actual.count(), b: expected.count()); |
| 1215 | |
| 1216 | for (int i=0; i<max; ++i) |
| 1217 | QCOMPARE(actual[i], expected[i]); |
| 1218 | QCOMPARE(actual.count(), expected.count()); |
| 1219 | } |
| 1220 | |
| 1221 | void |
| 1222 | tst_QDir::cleanPath_data() |
| 1223 | { |
| 1224 | QTest::addColumn<QString>(name: "path" ); |
| 1225 | QTest::addColumn<QString>(name: "expected" ); |
| 1226 | |
| 1227 | QTest::newRow(dataTag: "data0" ) << "/Users/sam/troll/qt4.0//.." << "/Users/sam/troll" ; |
| 1228 | QTest::newRow(dataTag: "data1" ) << "/Users/sam////troll/qt4.0//.." << "/Users/sam/troll" ; |
| 1229 | QTest::newRow(dataTag: "data2" ) << "/" << "/" ; |
| 1230 | QTest::newRow(dataTag: "data2-up" ) << "/path/.." << "/" ; |
| 1231 | QTest::newRow(dataTag: "data2-above-root" ) << "/.." << "/.." ; |
| 1232 | QTest::newRow(dataTag: "data3" ) << QDir::cleanPath(path: "../." ) << ".." ; |
| 1233 | QTest::newRow(dataTag: "data4" ) << QDir::cleanPath(path: "../.." ) << "../.." ; |
| 1234 | #if defined(Q_OS_WIN) |
| 1235 | QTest::newRow("data5" ) << "d:\\a\\bc\\def\\.." << "d:/a/bc" ; |
| 1236 | QTest::newRow("data6" ) << "d:\\a\\bc\\def\\../../.." << "d:/" ; |
| 1237 | #else |
| 1238 | QTest::newRow(dataTag: "data5" ) << "d:\\a\\bc\\def\\.." << "d:\\a\\bc\\def\\.." ; |
| 1239 | QTest::newRow(dataTag: "data6" ) << "d:\\a\\bc\\def\\../../.." << ".." ; |
| 1240 | #endif |
| 1241 | QTest::newRow(dataTag: "data7" ) << ".//file1.txt" << "file1.txt" ; |
| 1242 | QTest::newRow(dataTag: "data8" ) << "/foo/bar/..//file1.txt" << "/foo/file1.txt" ; |
| 1243 | QTest::newRow(dataTag: "data9" ) << "//" << "/" ; |
| 1244 | #if defined Q_OS_WIN |
| 1245 | QTest::newRow("data10" ) << "c:\\" << "c:/" ; |
| 1246 | #else |
| 1247 | QTest::newRow(dataTag: "data10" ) << "/:/" << "/:" ; |
| 1248 | #endif |
| 1249 | #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) |
| 1250 | QTest::newRow("data11" ) << "//foo//bar" << "//foo/bar" ; |
| 1251 | #endif |
| 1252 | QTest::newRow(dataTag: "data12" ) << "ab/a/" << "ab/a" ; // Path item with length of 2 |
| 1253 | #ifdef Q_OS_WIN |
| 1254 | QTest::newRow("data13" ) << "c://" << "c:/" ; |
| 1255 | #else |
| 1256 | QTest::newRow(dataTag: "data13" ) << "c://" << "c:" ; |
| 1257 | #endif |
| 1258 | |
| 1259 | QTest::newRow(dataTag: "data14" ) << "c://foo" << "c:/foo" ; |
| 1260 | // Drive letters and unc path in one string |
| 1261 | #if defined(Q_OS_WINRT) |
| 1262 | const QString root = QDir::rootPath(); // has trailing slash |
| 1263 | QTest::newRow("root-up" ) << (root + "path/.." ) << root; |
| 1264 | QTest::newRow("above-root" ) << (root + ".." ) << (root + ".." ); |
| 1265 | #elif defined(Q_OS_WIN) |
| 1266 | QTest::newRow("data15" ) << "//c:/foo" << "//c:/foo" ; |
| 1267 | QTest::newRow("drive-up" ) << "A:/path/.." << "A:/" ; |
| 1268 | QTest::newRow("drive-above-root" ) << "A:/.." << "A:/.." ; |
| 1269 | QTest::newRow("unc-server-up" ) << "//server/path/.." << "//server" ; |
| 1270 | QTest::newRow("unc-server-above-root" ) << "//server/.." << "//server/.." ; |
| 1271 | QTest::newRow("longpath" ) << "\\\\?\\d:\\" << "d:/" ; |
| 1272 | #else |
| 1273 | QTest::newRow(dataTag: "data15" ) << "//c:/foo" << "/c:/foo" ; |
| 1274 | #endif // non-windows |
| 1275 | |
| 1276 | QTest::newRow(dataTag: "QTBUG-23892_0" ) << "foo/.." << "." ; |
| 1277 | QTest::newRow(dataTag: "QTBUG-23892_1" ) << "foo/../" << "." ; |
| 1278 | |
| 1279 | QTest::newRow(dataTag: "QTBUG-3472_0" ) << "/foo/./bar" << "/foo/bar" ; |
| 1280 | QTest::newRow(dataTag: "QTBUG-3472_1" ) << "./foo/.." << "." ; |
| 1281 | QTest::newRow(dataTag: "QTBUG-3472_2" ) << "./foo/../" << "." ; |
| 1282 | |
| 1283 | QTest::newRow(dataTag: "resource0" ) << ":/prefix/foo.bar" << ":/prefix/foo.bar" ; |
| 1284 | QTest::newRow(dataTag: "resource1" ) << "://prefix/..//prefix/foo.bar" << ":/prefix/foo.bar" ; |
| 1285 | } |
| 1286 | |
| 1287 | |
| 1288 | void |
| 1289 | tst_QDir::cleanPath() |
| 1290 | { |
| 1291 | QFETCH(QString, path); |
| 1292 | QFETCH(QString, expected); |
| 1293 | QString cleaned = QDir::cleanPath(path); |
| 1294 | QCOMPARE(cleaned, expected); |
| 1295 | } |
| 1296 | |
| 1297 | #ifdef QT_BUILD_INTERNAL |
| 1298 | void tst_QDir::normalizePathSegments_data() |
| 1299 | { |
| 1300 | QTest::addColumn<QString>(name: "path" ); |
| 1301 | QTest::addColumn<UncHandling>(name: "uncHandling" ); |
| 1302 | QTest::addColumn<QString>(name: "expected" ); |
| 1303 | |
| 1304 | QTest::newRow(dataTag: "data0" ) << "/Users/sam/troll/qt4.0//.." << HandleUnc << "/Users/sam/troll" ; |
| 1305 | QTest::newRow(dataTag: "data1" ) << "/Users/sam////troll/qt4.0//.." << HandleUnc << "/Users/sam/troll" ; |
| 1306 | QTest::newRow(dataTag: "data2" ) << "/" << HandleUnc << "/" ; |
| 1307 | QTest::newRow(dataTag: "data3" ) << "//" << HandleUnc << "//" ; |
| 1308 | QTest::newRow(dataTag: "data4" ) << "//" << IgnoreUnc << "/" ; |
| 1309 | QTest::newRow(dataTag: "data5" ) << "/." << HandleUnc << "/" ; |
| 1310 | QTest::newRow(dataTag: "data6" ) << "/./" << HandleUnc << "/" ; |
| 1311 | QTest::newRow(dataTag: "data7" ) << "/.." << HandleUnc << "/.." ; |
| 1312 | QTest::newRow(dataTag: "data8" ) << "/../" << HandleUnc << "/../" ; |
| 1313 | QTest::newRow(dataTag: "data9" ) << "." << HandleUnc << "." ; |
| 1314 | QTest::newRow(dataTag: "data10" ) << "./" << HandleUnc << "./" ; |
| 1315 | QTest::newRow(dataTag: "data11" ) << "./." << HandleUnc << "." ; |
| 1316 | QTest::newRow(dataTag: "data12" ) << "././" << HandleUnc << "./" ; |
| 1317 | QTest::newRow(dataTag: "data13" ) << ".." << HandleUnc << ".." ; |
| 1318 | QTest::newRow(dataTag: "data14" ) << "../" << HandleUnc << "../" ; |
| 1319 | QTest::newRow(dataTag: "data15" ) << "../." << HandleUnc << ".." ; |
| 1320 | QTest::newRow(dataTag: "data16" ) << ".././" << HandleUnc << "../" ; |
| 1321 | QTest::newRow(dataTag: "data17" ) << "../.." << HandleUnc << "../.." ; |
| 1322 | QTest::newRow(dataTag: "data18" ) << "../../" << HandleUnc << "../../" ; |
| 1323 | QTest::newRow(dataTag: "data19" ) << ".//file1.txt" << HandleUnc << "file1.txt" ; |
| 1324 | QTest::newRow(dataTag: "data20" ) << "/foo/bar/..//file1.txt" << HandleUnc << "/foo/file1.txt" ; |
| 1325 | QTest::newRow(dataTag: "data21" ) << "foo/.." << HandleUnc << "." ; |
| 1326 | QTest::newRow(dataTag: "data22" ) << "./foo/.." << HandleUnc << "." ; |
| 1327 | QTest::newRow(dataTag: "data23" ) << ".foo/.." << HandleUnc << "." ; |
| 1328 | QTest::newRow(dataTag: "data24" ) << "foo/bar/../.." << HandleUnc << "." ; |
| 1329 | QTest::newRow(dataTag: "data25" ) << "./foo/bar/../.." << HandleUnc << "." ; |
| 1330 | QTest::newRow(dataTag: "data26" ) << "../foo/bar" << HandleUnc << "../foo/bar" ; |
| 1331 | QTest::newRow(dataTag: "data27" ) << "./../foo/bar" << HandleUnc << "../foo/bar" ; |
| 1332 | QTest::newRow(dataTag: "data28" ) << "../../foo/../bar" << HandleUnc << "../../bar" ; |
| 1333 | QTest::newRow(dataTag: "data29" ) << "./foo/bar/.././.." << HandleUnc << "." ; |
| 1334 | QTest::newRow(dataTag: "data30" ) << "/./foo" << HandleUnc << "/foo" ; |
| 1335 | QTest::newRow(dataTag: "data31" ) << "/../foo/" << HandleUnc << "/../foo/" ; |
| 1336 | QTest::newRow(dataTag: "data32" ) << "c:/" << HandleUnc << "c:/" ; |
| 1337 | QTest::newRow(dataTag: "data33" ) << "c://" << HandleUnc << "c:/" ; |
| 1338 | QTest::newRow(dataTag: "data34" ) << "c://foo" << HandleUnc << "c:/foo" ; |
| 1339 | QTest::newRow(dataTag: "data35" ) << "c:" << HandleUnc << "c:" ; |
| 1340 | QTest::newRow(dataTag: "data36" ) << "c:foo/bar" << IgnoreUnc << "c:foo/bar" ; |
| 1341 | #if defined Q_OS_WIN |
| 1342 | QTest::newRow("data37" ) << "c:/." << HandleUnc << "c:/" ; |
| 1343 | QTest::newRow("data38" ) << "c:/.." << HandleUnc << "c:/.." ; |
| 1344 | QTest::newRow("data39" ) << "c:/../" << HandleUnc << "c:/../" ; |
| 1345 | #else |
| 1346 | QTest::newRow(dataTag: "data37" ) << "c:/." << HandleUnc << "c:" ; |
| 1347 | QTest::newRow(dataTag: "data38" ) << "c:/.." << HandleUnc << "." ; |
| 1348 | QTest::newRow(dataTag: "data39" ) << "c:/../" << HandleUnc << "./" ; |
| 1349 | #endif |
| 1350 | QTest::newRow(dataTag: "data40" ) << "c:/./" << HandleUnc << "c:/" ; |
| 1351 | QTest::newRow(dataTag: "data41" ) << "foo/../foo/.." << HandleUnc << "." ; |
| 1352 | QTest::newRow(dataTag: "data42" ) << "foo/../foo/../.." << HandleUnc << ".." ; |
| 1353 | QTest::newRow(dataTag: "data43" ) << "..foo.bar/foo" << HandleUnc << "..foo.bar/foo" ; |
| 1354 | QTest::newRow(dataTag: "data44" ) << ".foo./bar/.." << HandleUnc << ".foo." ; |
| 1355 | QTest::newRow(dataTag: "data45" ) << "foo/..bar.." << HandleUnc << "foo/..bar.." ; |
| 1356 | QTest::newRow(dataTag: "data46" ) << "foo/.bar./.." << HandleUnc << "foo" ; |
| 1357 | QTest::newRow(dataTag: "data47" ) << "//foo//bar" << HandleUnc << "//foo/bar" ; |
| 1358 | QTest::newRow(dataTag: "data48" ) << "..." << HandleUnc << "..." ; |
| 1359 | QTest::newRow(dataTag: "data49" ) << "foo/.../bar" << HandleUnc << "foo/.../bar" ; |
| 1360 | QTest::newRow(dataTag: "data50" ) << "ab/a/" << HandleUnc << "ab/a/" ; // Path item with length of 2 |
| 1361 | // Drive letters and unc path in one string. The drive letter isn't handled as a drive letter |
| 1362 | // but as a host name in this case (even though Windows host names can't contain a ':') |
| 1363 | QTest::newRow(dataTag: "data51" ) << "//c:/foo" << HandleUnc << "//c:/foo" ; |
| 1364 | QTest::newRow(dataTag: "data52" ) << "//c:/foo" << IgnoreUnc << "/c:/foo" ; |
| 1365 | |
| 1366 | QTest::newRow(dataTag: "resource0" ) << ":/prefix/foo.bar" << HandleUnc << ":/prefix/foo.bar" ; |
| 1367 | QTest::newRow(dataTag: "resource1" ) << "://prefix/..//prefix/foo.bar" << HandleUnc << ":/prefix/foo.bar" ; |
| 1368 | } |
| 1369 | |
| 1370 | void tst_QDir::normalizePathSegments() |
| 1371 | { |
| 1372 | QFETCH(QString, path); |
| 1373 | QFETCH(UncHandling, uncHandling); |
| 1374 | QFETCH(QString, expected); |
| 1375 | QString cleaned = qt_normalizePathSegments(name: path, flags: uncHandling == HandleUnc ? QDirPrivate::AllowUncPaths : QDirPrivate::DefaultNormalization); |
| 1376 | QCOMPARE(cleaned, expected); |
| 1377 | if (path == expected) |
| 1378 | QVERIFY2(path.isSharedWith(cleaned), "Strings are same but data is not shared" ); |
| 1379 | } |
| 1380 | # endif //QT_BUILD_INTERNAL |
| 1381 | |
| 1382 | void tst_QDir::absoluteFilePath_data() |
| 1383 | { |
| 1384 | QTest::addColumn<QString>(name: "path" ); |
| 1385 | QTest::addColumn<QString>(name: "fileName" ); |
| 1386 | QTest::addColumn<QString>(name: "expectedFilePath" ); |
| 1387 | |
| 1388 | #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) |
| 1389 | QTest::newRow("UNC-rel" ) << "//machine/share" << "dir" << "//machine/share/dir" ; |
| 1390 | QTest::newRow("UNC-abs" ) << "//machine/share/path/to/blah" << "/dir" << "//machine/share/dir" ; |
| 1391 | QTest::newRow("UNC-UNC" ) << "//machine/share/path/to/blah" << "//host/share/path" << "//host/share/path" ; |
| 1392 | QTest::newRow("Drive-UNC" ) << "c:/side/town" << "//host/share/path" << "//host/share/path" ; |
| 1393 | QTest::newRow("Drive-LTUNC" ) << "c:/side/town" << "\\/leaning\\toothpick/path" << "\\/leaning\\toothpick/path" ; |
| 1394 | QTest::newRow("Drive-abs" ) << "c:/side/town" << "/my/way/home" << "c:/my/way/home" ; |
| 1395 | #endif |
| 1396 | |
| 1397 | QTest::newRow(dataTag: "0" ) << DRIVE "/etc" << "/passwd" << DRIVE "/passwd" ; |
| 1398 | QTest::newRow(dataTag: "1" ) << DRIVE "/etc" << "passwd" << DRIVE "/etc/passwd" ; |
| 1399 | QTest::newRow(dataTag: "2" ) << DRIVE "/" << "passwd" << DRIVE "/passwd" ; |
| 1400 | QTest::newRow(dataTag: "3" ) << "relative" << "path" << QDir::currentPath() + "/relative/path" ; |
| 1401 | QTest::newRow(dataTag: "4" ) << "" << "" << QDir::currentPath(); |
| 1402 | |
| 1403 | // Resource paths are absolute: |
| 1404 | QTest::newRow(dataTag: "resource-rel" ) << ":/prefix" << "foo.bar" << ":/prefix/foo.bar" ; |
| 1405 | QTest::newRow(dataTag: "abs-res-res" ) << ":/prefix" << ":/abc.txt" << ":/abc.txt" ; |
| 1406 | QTest::newRow(dataTag: "abs-res-path" ) << DRIVE "/etc" << ":/abc.txt" << ":/abc.txt" ; |
| 1407 | } |
| 1408 | |
| 1409 | void tst_QDir::absoluteFilePath() |
| 1410 | { |
| 1411 | QFETCH(QString, path); |
| 1412 | QFETCH(QString, fileName); |
| 1413 | QFETCH(QString, expectedFilePath); |
| 1414 | |
| 1415 | QDir dir(path); |
| 1416 | QString absFilePath = dir.absoluteFilePath(fileName); |
| 1417 | QCOMPARE(absFilePath, expectedFilePath); |
| 1418 | } |
| 1419 | |
| 1420 | void tst_QDir::absolutePath_data() |
| 1421 | { |
| 1422 | QTest::addColumn<QString>(name: "path" ); |
| 1423 | QTest::addColumn<QString>(name: "expectedPath" ); |
| 1424 | |
| 1425 | QTest::newRow(dataTag: "0" ) << "/machine/share/dir1" << "/machine/share/dir1" ; |
| 1426 | #if (defined(Q_OS_WIN) && !defined(Q_OS_WINRT)) |
| 1427 | QTest::newRow("1" ) << "\\machine\\share\\dir1" << "/machine/share/dir1" ; |
| 1428 | QTest::newRow("2" ) << "//machine/share/dir1" << "//machine/share/dir1" ; |
| 1429 | QTest::newRow("3" ) << "\\\\machine\\share\\dir1" << "//machine/share/dir1" ; |
| 1430 | QTest::newRow("4" ) << "c:/machine/share/dir1" << "c:/machine/share/dir1" ; |
| 1431 | QTest::newRow("5" ) << "c:\\machine\\share\\dir1" << "c:/machine/share/dir1" ; |
| 1432 | #endif |
| 1433 | //test dirty paths are cleaned (QTBUG-19995) |
| 1434 | QTest::newRow(dataTag: "/home/qt/." ) << QDir::rootPath() + "home/qt/." << QDir::rootPath() + "home/qt" ; |
| 1435 | QTest::newRow(dataTag: "/system/data/../config" ) << QDir::rootPath() + "system/data/../config" << QDir::rootPath() + "system/config" ; |
| 1436 | QTest::newRow(dataTag: "//home//qt/" ) << QDir::rootPath() + "/home//qt/" << QDir::rootPath() + "home/qt" ; |
| 1437 | QTest::newRow(dataTag: "foo/../bar" ) << "foo/../bar" << QDir::currentPath() + "/bar" ; |
| 1438 | QTest::newRow(dataTag: "resource" ) << ":/prefix/foo.bar" << ":/prefix/foo.bar" ; |
| 1439 | } |
| 1440 | |
| 1441 | void tst_QDir::absolutePath() |
| 1442 | { |
| 1443 | QFETCH(QString, path); |
| 1444 | QFETCH(QString, expectedPath); |
| 1445 | |
| 1446 | QDir dir(path); |
| 1447 | QCOMPARE(dir.absolutePath(), expectedPath); |
| 1448 | } |
| 1449 | |
| 1450 | void tst_QDir::relativeFilePath_data() |
| 1451 | { |
| 1452 | QTest::addColumn<QString>(name: "dir" ); |
| 1453 | QTest::addColumn<QString>(name: "path" ); |
| 1454 | QTest::addColumn<QString>(name: "expected" ); |
| 1455 | |
| 1456 | QTest::newRow(dataTag: "0" ) << "/foo/bar" << "ding.txt" << "ding.txt" ; |
| 1457 | QTest::newRow(dataTag: "1" ) << "/foo/bar" << "ding/dong.txt" << "ding/dong.txt" ; |
| 1458 | QTest::newRow(dataTag: "2" ) << "/foo/bar" << "../ding/dong.txt" << "../ding/dong.txt" ; |
| 1459 | |
| 1460 | QTest::newRow(dataTag: "3" ) << "/foo/bar" << "/foo/bar/ding.txt" << "ding.txt" ; |
| 1461 | QTest::newRow(dataTag: "4" ) << "/foo/bar/" << "/foo/bar/ding/dong.txt" << "ding/dong.txt" ; |
| 1462 | QTest::newRow(dataTag: "5" ) << "/foo/bar/" << "/ding/dong.txt" << "../../ding/dong.txt" ; |
| 1463 | |
| 1464 | QTest::newRow(dataTag: "6" ) << "/" << "/ding/dong.txt" << "ding/dong.txt" ; |
| 1465 | QTest::newRow(dataTag: "7" ) << "/" << "/ding/" << "ding" ; |
| 1466 | QTest::newRow(dataTag: "8" ) << "/" << "/ding//" << "ding" ; |
| 1467 | QTest::newRow(dataTag: "9" ) << "/" << "/ding/../dong" << "dong" ; |
| 1468 | QTest::newRow(dataTag: "10" ) << "/" << "/ding/../../../../dong" << "../../../dong" ; |
| 1469 | |
| 1470 | QTest::newRow(dataTag: "11" ) << "" << "" << "" ; |
| 1471 | |
| 1472 | QTest::newRow(dataTag: "same path 1" ) << "/tmp" << "/tmp" << "." ; |
| 1473 | QTest::newRow(dataTag: "same path 2" ) << "//tmp" << "/tmp/" << "." ; |
| 1474 | |
| 1475 | #if defined(Q_OS_WIN) |
| 1476 | QTest::newRow("12" ) << "C:/foo/bar" << "ding" << "ding" ; |
| 1477 | QTest::newRow("13" ) << "C:/foo/bar" << "C:/ding/dong" << "../../ding/dong" ; |
| 1478 | QTest::newRow("14" ) << "C:/foo/bar" << "/ding/dong" << "../../ding/dong" ; |
| 1479 | QTest::newRow("15" ) << "C:/foo/bar" << "D:/ding/dong" << "D:/ding/dong" ; |
| 1480 | QTest::newRow("16" ) << "C:" << "C:/ding/dong" << "ding/dong" ; |
| 1481 | QTest::newRow("17" ) << "C:/" << "C:/ding/dong" << "ding/dong" ; |
| 1482 | QTest::newRow("18" ) << "C:" << "C:" << "." ; |
| 1483 | QTest::newRow("19" ) << "C:/" << "C:" << "." ; |
| 1484 | QTest::newRow("20" ) << "C:" << "C:/" << "." ; |
| 1485 | QTest::newRow("21" ) << "C:/" << "C:/" << "." ; |
| 1486 | QTest::newRow("22" ) << "C:" << "C:file.txt" << "file.txt" ; |
| 1487 | QTest::newRow("23" ) << "C:/" << "C:file.txt" << "file.txt" ; |
| 1488 | QTest::newRow("24" ) << "C:" << "C:/file.txt" << "file.txt" ; |
| 1489 | QTest::newRow("25" ) << "C:/" << "C:/file.txt" << "file.txt" ; |
| 1490 | QTest::newRow("26" ) << "C:" << "D:" << "D:" ; |
| 1491 | QTest::newRow("27" ) << "C:" << "D:/" << "D:/" ; |
| 1492 | QTest::newRow("28" ) << "C:/" << "D:" << "D:" ; |
| 1493 | QTest::newRow("29" ) << "C:/" << "D:/" << "D:/" ; |
| 1494 | #ifndef Q_OS_WINRT |
| 1495 | QTest::newRow("30" ) << "C:/foo/bar" << "//anotherHost/foo/bar" << "//anotherHost/foo/bar" ; |
| 1496 | QTest::newRow("31" ) << "//anotherHost/foo" << "//anotherHost/foo/bar" << "bar" ; |
| 1497 | QTest::newRow("32" ) << "//anotherHost/foo" << "bar" << "bar" ; |
| 1498 | QTest::newRow("33" ) << "//anotherHost/foo" << "C:/foo/bar" << "C:/foo/bar" ; |
| 1499 | #endif // !Q_OS_WINRT |
| 1500 | #endif |
| 1501 | |
| 1502 | QTest::newRow(dataTag: "resource0" ) << ":/prefix" << "foo.bar" << "foo.bar" ; |
| 1503 | QTest::newRow(dataTag: "resource1" ) << ":/prefix" << ":/prefix/foo.bar" << "foo.bar" ; |
| 1504 | } |
| 1505 | |
| 1506 | void tst_QDir::relativeFilePath() |
| 1507 | { |
| 1508 | QFETCH(QString, dir); |
| 1509 | QFETCH(QString, path); |
| 1510 | QFETCH(QString, expected); |
| 1511 | |
| 1512 | QCOMPARE(QDir(dir).relativeFilePath(path), expected); |
| 1513 | } |
| 1514 | |
| 1515 | void tst_QDir::filePath_data() |
| 1516 | { |
| 1517 | QTest::addColumn<QString>(name: "path" ); |
| 1518 | QTest::addColumn<QString>(name: "fileName" ); |
| 1519 | QTest::addColumn<QString>(name: "expectedFilePath" ); |
| 1520 | |
| 1521 | QTest::newRow(dataTag: "abs-abs" ) << DRIVE "/etc" << DRIVE "/passwd" << DRIVE "/passwd" ; |
| 1522 | QTest::newRow(dataTag: "abs-rel" ) << DRIVE "/etc" << "passwd" << DRIVE "/etc/passwd" ; |
| 1523 | QTest::newRow(dataTag: "root-rel" ) << DRIVE "/" << "passwd" << DRIVE "/passwd" ; |
| 1524 | QTest::newRow(dataTag: "rel-rel" ) << "relative" << "path" << "relative/path" ; |
| 1525 | QTest::newRow(dataTag: "empty-empty" ) << "" << "" << "." ; |
| 1526 | QTest::newRow(dataTag: "resource" ) << ":/prefix" << "foo.bar" << ":/prefix/foo.bar" ; |
| 1527 | #ifdef Q_OS_IOS |
| 1528 | QTest::newRow("assets-rel" ) << "assets-library:/" << "foo/bar.baz" << "assets-library:/foo/bar.baz" ; |
| 1529 | QTest::newRow("assets-abs" ) << "assets-library:/" << "/foo/bar.baz" << "/foo/bar.baz" ; |
| 1530 | QTest::newRow("abs-assets" ) << "/some/path" << "assets-library:/foo/bar.baz" << "assets-library:/foo/bar.baz" ; |
| 1531 | #endif |
| 1532 | #ifdef Q_OS_WIN |
| 1533 | QTest::newRow("abs-LTUNC" ) << "Q:/path" << "\\/leaning\\tooth/pick" << "\\/leaning\\tooth/pick" ; |
| 1534 | QTest::newRow("LTUNC-slash" ) << "\\/leaning\\tooth/pick" << "/path" << "//leaning/tooth/path" ; |
| 1535 | QTest::newRow("LTUNC-abs" ) << "\\/leaning\\tooth/pick" << "Q:/path" << "Q:/path" ; |
| 1536 | #endif |
| 1537 | } |
| 1538 | |
| 1539 | void tst_QDir::filePath() |
| 1540 | { |
| 1541 | QFETCH(QString, path); |
| 1542 | QFETCH(QString, fileName); |
| 1543 | QFETCH(QString, expectedFilePath); |
| 1544 | |
| 1545 | QDir dir(path); |
| 1546 | QString absFilePath = dir.filePath(fileName); |
| 1547 | QCOMPARE(absFilePath, expectedFilePath); |
| 1548 | } |
| 1549 | |
| 1550 | void tst_QDir::remove() |
| 1551 | { |
| 1552 | QFile f("remove-test" ); |
| 1553 | f.open(flags: QIODevice::WriteOnly); |
| 1554 | f.close(); |
| 1555 | QDir dir; |
| 1556 | QVERIFY(dir.remove("remove-test" )); |
| 1557 | // Test that the file just removed is gone |
| 1558 | QVERIFY(!dir.remove("remove-test" )); |
| 1559 | QTest::ignoreMessage(type: QtWarningMsg, message: "QDir::remove: Empty or null file name" ); |
| 1560 | QVERIFY(!dir.remove("" )); |
| 1561 | } |
| 1562 | |
| 1563 | void tst_QDir::rename() |
| 1564 | { |
| 1565 | QFile f("rename-test" ); |
| 1566 | f.open(flags: QIODevice::WriteOnly); |
| 1567 | f.close(); |
| 1568 | QDir dir; |
| 1569 | QVERIFY(dir.rename("rename-test" , "rename-test-renamed" )); |
| 1570 | QVERIFY(dir.rename("rename-test-renamed" , "rename-test" )); |
| 1571 | #if defined(Q_OS_MAC) |
| 1572 | QVERIFY(!dir.rename("rename-test" , "/etc/rename-test-renamed" )); |
| 1573 | #elif !defined(Q_OS_WIN) |
| 1574 | // on windows this is possible - maybe make the test a bit better |
| 1575 | #ifdef Q_OS_UNIX |
| 1576 | // not valid if run as root so skip if needed |
| 1577 | if (::getuid() != 0) |
| 1578 | QVERIFY(!dir.rename("rename-test" , "/rename-test-renamed" )); |
| 1579 | #else |
| 1580 | QVERIFY(!dir.rename("rename-test" , "/rename-test-renamed" )); |
| 1581 | #endif |
| 1582 | #endif |
| 1583 | QTest::ignoreMessage(type: QtWarningMsg, message: "QDir::rename: Empty or null file name(s)" ); |
| 1584 | QVERIFY(!dir.rename("rename-test" , "" )); |
| 1585 | QTest::ignoreMessage(type: QtWarningMsg, message: "QDir::rename: Empty or null file name(s)" ); |
| 1586 | QVERIFY(!dir.rename("" , "rename-test-renamed" )); |
| 1587 | QVERIFY(!dir.rename("some-file-that-does-not-exist" , "rename-test-renamed" )); |
| 1588 | |
| 1589 | QVERIFY(dir.remove("rename-test" )); |
| 1590 | } |
| 1591 | |
| 1592 | void tst_QDir::exists2_data() |
| 1593 | { |
| 1594 | QTest::addColumn<QString>(name: "path" ); |
| 1595 | QTest::addColumn<bool>(name: "exists" ); |
| 1596 | |
| 1597 | QTest::newRow(dataTag: "0" ) << "." << true; |
| 1598 | QTest::newRow(dataTag: "1" ) << "/" << true; |
| 1599 | QTest::newRow(dataTag: "2" ) << "" << false; |
| 1600 | QTest::newRow(dataTag: "3" ) << "testData" << true; |
| 1601 | QTest::newRow(dataTag: "4" ) << "/testData" << false; |
| 1602 | #ifdef Q_OS_WIN |
| 1603 | QTest::newRow("abs" ) << "Q:/testData" << false; |
| 1604 | #endif |
| 1605 | QTest::newRow(dataTag: "5" ) << "tst_qdir.cpp" << true; |
| 1606 | QTest::newRow(dataTag: "6" ) << "/resources.cpp" << false; |
| 1607 | QTest::newRow(dataTag: "resource0" ) << ":/prefix/foo.bar" << false; |
| 1608 | QTest::newRow(dataTag: "resource1" ) << ":/tst_qdir/resources/entryList/file1.data" << true; |
| 1609 | } |
| 1610 | |
| 1611 | void tst_QDir::exists2() |
| 1612 | { |
| 1613 | QFETCH(QString, path); |
| 1614 | QFETCH(bool, exists); |
| 1615 | |
| 1616 | QString oldpwd = QDir::currentPath(); |
| 1617 | QDir::setCurrent((m_dataPath + "/." )); |
| 1618 | |
| 1619 | if (path.isEmpty()) |
| 1620 | QTest::ignoreMessage(type: QtWarningMsg, message: "QDir::exists: Empty or null file name" ); |
| 1621 | |
| 1622 | QDir dir; |
| 1623 | if (exists) |
| 1624 | QVERIFY2(dir.exists(path), msgDoesNotExist(path).constData()); |
| 1625 | else |
| 1626 | QVERIFY(!dir.exists(path)); |
| 1627 | |
| 1628 | QDir::setCurrent(oldpwd); |
| 1629 | } |
| 1630 | |
| 1631 | void tst_QDir::dirName_data() |
| 1632 | { |
| 1633 | QTest::addColumn<QString>(name: "path" ); |
| 1634 | QTest::addColumn<QString>(name: "dirName" ); |
| 1635 | |
| 1636 | QTest::newRow(dataTag: "slash0" ) << "c:/winnt/system32" << "system32" ; |
| 1637 | QTest::newRow(dataTag: "slash1" ) << "/winnt/system32" << "system32" ; |
| 1638 | QTest::newRow(dataTag: "slash2" ) << "c:/winnt/system32/kernel32.dll" << "kernel32.dll" ; |
| 1639 | #if defined(Q_OS_WIN) |
| 1640 | QTest::newRow("bslash0" ) << "c:\\winnt\\system32" << "system32" ; |
| 1641 | QTest::newRow("bslash1" ) << "\\winnt\\system32" << "system32" ; |
| 1642 | QTest::newRow("bslash2" ) << "c:\\winnt\\system32\\kernel32.dll" << "kernel32.dll" ; |
| 1643 | #endif |
| 1644 | |
| 1645 | QTest::newRow(dataTag: "resource" ) << ":/prefix" << "prefix" ; |
| 1646 | } |
| 1647 | |
| 1648 | void tst_QDir::dirName() |
| 1649 | { |
| 1650 | QFETCH(QString, path); |
| 1651 | QFETCH(QString, dirName); |
| 1652 | |
| 1653 | QDir dir(path); |
| 1654 | QCOMPARE(dir.dirName(), dirName); |
| 1655 | } |
| 1656 | |
| 1657 | void tst_QDir::operator_eq() |
| 1658 | { |
| 1659 | QDir dir1("." ); |
| 1660 | dir1 = dir1; |
| 1661 | dir1.setPath(".." ); |
| 1662 | } |
| 1663 | |
| 1664 | // WinCE does not have . nor .. |
| 1665 | void tst_QDir::dotAndDotDot() |
| 1666 | { |
| 1667 | QDir dir(QString((m_dataPath + "/testdir/" ))); |
| 1668 | QStringList entryList = dir.entryList(filters: QDir::Dirs); |
| 1669 | QCOMPARE(entryList, QStringList() << QString("." ) << QString(".." ) << QString("dir" ) << QString("spaces" )); |
| 1670 | entryList = dir.entryList(filters: QDir::Dirs | QDir::NoDotAndDotDot); |
| 1671 | QCOMPARE(entryList, QStringList() << QString("dir" ) << QString("spaces" )); |
| 1672 | } |
| 1673 | |
| 1674 | void tst_QDir::homePath() |
| 1675 | { |
| 1676 | QDir homeDir = QDir::home(); |
| 1677 | QString strHome = QDir::homePath(); |
| 1678 | |
| 1679 | // docs say that homePath() is an absolute path |
| 1680 | QCOMPARE(strHome, homeDir.absolutePath()); |
| 1681 | QVERIFY(QDir::isAbsolutePath(strHome)); |
| 1682 | |
| 1683 | #ifdef Q_OS_UNIX |
| 1684 | if (strHome.length() > 1) // root dir = "/" |
| 1685 | QVERIFY(!strHome.endsWith('/')); |
| 1686 | |
| 1687 | QByteArray envHome = qgetenv(varName: "HOME" ); |
| 1688 | unsetenv(name: "HOME" ); |
| 1689 | QCOMPARE(QDir::homePath(), QDir::rootPath()); |
| 1690 | qputenv(varName: "HOME" , value: envHome); |
| 1691 | |
| 1692 | #elif defined(Q_OS_WIN) |
| 1693 | if (strHome.length() > 3 // root dir = "c:/"; "//" is not really valid... |
| 1694 | #if defined(Q_OS_WINRT) |
| 1695 | && strHome.length() > QDir::rootPath().length() |
| 1696 | #endif |
| 1697 | ) |
| 1698 | QVERIFY(!strHome.endsWith('/')); |
| 1699 | #endif |
| 1700 | |
| 1701 | QStringList entries = homeDir.entryList(); |
| 1702 | for (int i = 0; i < entries.count(); ++i) { |
| 1703 | QFileInfo fi(QDir::homePath() + "/" + entries[i]); |
| 1704 | QCOMPARE(fi.exists(), true); |
| 1705 | } |
| 1706 | } |
| 1707 | |
| 1708 | void tst_QDir::tempPath() |
| 1709 | { |
| 1710 | QDir dir = QDir::temp(); |
| 1711 | QString path = QDir::tempPath(); |
| 1712 | |
| 1713 | // docs say that tempPath() is an absolute path |
| 1714 | QCOMPARE(path, dir.absolutePath()); |
| 1715 | QVERIFY(QDir::isAbsolutePath(path)); |
| 1716 | |
| 1717 | #ifdef Q_OS_UNIX |
| 1718 | if (path.length() > 1) // root dir = "/" |
| 1719 | QVERIFY(!path.endsWith('/')); |
| 1720 | #elif defined(Q_OS_WIN) |
| 1721 | if (path.length() > 3) // root dir = "c:/"; "//" is not really valid... |
| 1722 | QVERIFY(!path.endsWith('/')); |
| 1723 | QVERIFY2(!path.contains(QLatin1Char('~')), |
| 1724 | qPrintable(QString::fromLatin1("Temp path (%1) must not be a short name." ).arg(path))); |
| 1725 | #endif |
| 1726 | } |
| 1727 | |
| 1728 | void tst_QDir::rootPath() |
| 1729 | { |
| 1730 | QDir dir = QDir::root(); |
| 1731 | QString path = QDir::rootPath(); |
| 1732 | |
| 1733 | // docs say that tempPath() is an absolute path |
| 1734 | QCOMPARE(path, dir.absolutePath()); |
| 1735 | QVERIFY(QDir::isAbsolutePath(path)); |
| 1736 | |
| 1737 | #if defined(Q_OS_UNIX) |
| 1738 | QCOMPARE(path, QString("/" )); |
| 1739 | #endif |
| 1740 | } |
| 1741 | |
| 1742 | void tst_QDir::nativeSeparators() |
| 1743 | { |
| 1744 | #if defined(Q_OS_WIN) |
| 1745 | QCOMPARE(QDir::toNativeSeparators(QLatin1String("/" )), QString("\\" )); |
| 1746 | QCOMPARE(QDir::toNativeSeparators(QLatin1String("\\" )), QString("\\" )); |
| 1747 | QCOMPARE(QDir::fromNativeSeparators(QLatin1String("/" )), QString("/" )); |
| 1748 | QCOMPARE(QDir::fromNativeSeparators(QLatin1String("\\" )), QString("/" )); |
| 1749 | QCOMPARE(QDir::fromNativeSeparators(QLatin1String("\\\\?\\C:\\" )), QString("C:/" )); |
| 1750 | #else |
| 1751 | QCOMPARE(QDir::toNativeSeparators(QLatin1String("/" )), QString("/" )); |
| 1752 | QCOMPARE(QDir::toNativeSeparators(QLatin1String("\\" )), QString("\\" )); |
| 1753 | QCOMPARE(QDir::fromNativeSeparators(QLatin1String("/" )), QString("/" )); |
| 1754 | QCOMPARE(QDir::fromNativeSeparators(QLatin1String("\\" )), QString("\\" )); |
| 1755 | #endif |
| 1756 | } |
| 1757 | |
| 1758 | void tst_QDir::searchPaths_data() |
| 1759 | { |
| 1760 | QTest::addColumn<QString>(name: "filename" ); |
| 1761 | QTest::addColumn<QString>(name: "searchPathPrefixes" ); |
| 1762 | QTest::addColumn<QString>(name: "searchPaths" ); |
| 1763 | QTest::addColumn<QString>(name: "expectedAbsolutePath" ); |
| 1764 | |
| 1765 | QString searchDir = (m_dataPath + "/searchdir" ); |
| 1766 | QString srcdir = QFileInfo(searchDir).absolutePath(); |
| 1767 | |
| 1768 | // sanity |
| 1769 | QTest::newRow(dataTag: "nopath" ) << "picker.png" << QString() << QString() << QString(); |
| 1770 | QTest::newRow(dataTag: "emptysearchpath" ) << "subdir1/picker.png" << QString() << QString() << QString(); |
| 1771 | QTest::newRow(dataTag: "searchpathwithoutprefix" ) << (m_dataPath + "/searchdir/subdir1/picker.png" ) << QString("searchpath" ) << QString("searchdir" ) << (searchDir+"/subdir1/picker.png" ); |
| 1772 | |
| 1773 | // new |
| 1774 | QTest::newRow(dataTag: "novalidsearchpath" ) << "searchpath:subdir1/picker.png" << QString() << QString() << QString(); |
| 1775 | QTest::newRow(dataTag: "invalidsearchpath" ) << "searchpath:subdir1/picker.png" << QString("invalid" ) << QString("invalid" ) << QString(); |
| 1776 | QTest::newRow(dataTag: "onlyvalidsearchpath" ) << "searchpath:subdir1/picker.png" << QString("searchpath" ) << QString((m_dataPath + "/searchdir" )) << (searchDir+"/subdir1/picker.png" ); |
| 1777 | QTest::newRow(dataTag: "validandinvalidsearchpath" ) << "searchpath:subdir1/picker.png" << QString("invalid;searchpath" ) << ("invalid;" + (m_dataPath + "/searchdir" )) << (searchDir+"/subdir1/picker.png" ); |
| 1778 | QTest::newRow(dataTag: "precedence1" ) << "searchpath:picker.png" << QString("invalid;searchpath" ) << ("invalid;" + (m_dataPath + "/searchdir/subdir1" ) + "," + (m_dataPath + "/searchdir/subdir2" )) << (searchDir+"/subdir1/picker.png" ); |
| 1779 | QTest::newRow(dataTag: "precedence2" ) << "searchpath:picker.png" << QString("invalid;searchpath" ) << ("invalid;" + (m_dataPath + "/searchdir/subdir2" ) + "," + (m_dataPath + "/searchdir/subdir1" )) << (searchDir+"/subdir2/picker.png" ); |
| 1780 | QTest::newRow(dataTag: "precedence3" ) << "searchpath2:picker.png" << QString("searchpath1;searchpath2" ) << ((m_dataPath + "/searchdir/subdir1" ) + ";" + (m_dataPath + "/searchdir/subdir2" )) << (searchDir+"/subdir2/picker.png" ); |
| 1781 | |
| 1782 | // re |
| 1783 | } |
| 1784 | |
| 1785 | void tst_QDir::searchPaths() |
| 1786 | { |
| 1787 | QFETCH(QString, filename); |
| 1788 | QFETCH(QString, searchPathPrefixes); |
| 1789 | QStringList searchPathPrefixList = searchPathPrefixes.split(sep: ";" , behavior: Qt::SkipEmptyParts); |
| 1790 | QFETCH(QString, searchPaths); |
| 1791 | QStringList searchPathsList = searchPaths.split(sep: ";" , behavior: Qt::SkipEmptyParts); |
| 1792 | QFETCH(QString, expectedAbsolutePath); |
| 1793 | bool exists = !expectedAbsolutePath.isEmpty(); |
| 1794 | |
| 1795 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1796 | QDir::setSearchPaths(prefix: searchPathPrefixList.at(i), searchPaths: searchPathsList.at(i).split(sep: "," )); |
| 1797 | } |
| 1798 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1799 | QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split("," )); |
| 1800 | } |
| 1801 | |
| 1802 | QCOMPARE(QFile(filename).exists(), exists); |
| 1803 | QCOMPARE(QFileInfo(filename).exists(), exists); |
| 1804 | |
| 1805 | if (exists) { |
| 1806 | QCOMPARE(QFileInfo(filename).absoluteFilePath(), expectedAbsolutePath); |
| 1807 | } |
| 1808 | |
| 1809 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1810 | QDir::setSearchPaths(prefix: searchPathPrefixList.at(i), searchPaths: QStringList()); |
| 1811 | } |
| 1812 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1813 | QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)).isEmpty()); |
| 1814 | } |
| 1815 | |
| 1816 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1817 | foreach (QString path, searchPathsList.at(i).split("," )) { |
| 1818 | QDir::addSearchPath(prefix: searchPathPrefixList.at(i), path); |
| 1819 | } |
| 1820 | } |
| 1821 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1822 | QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split("," )); |
| 1823 | } |
| 1824 | |
| 1825 | QCOMPARE(QFile(filename).exists(), exists); |
| 1826 | QCOMPARE(QFileInfo(filename).exists(), exists); |
| 1827 | |
| 1828 | if (exists) { |
| 1829 | QCOMPARE(QFileInfo(filename).absoluteFilePath(), expectedAbsolutePath); |
| 1830 | } |
| 1831 | |
| 1832 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1833 | QDir::setSearchPaths(prefix: searchPathPrefixList.at(i), searchPaths: QStringList()); |
| 1834 | } |
| 1835 | for (int i = 0; i < searchPathPrefixList.count(); ++i) { |
| 1836 | QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)).isEmpty()); |
| 1837 | } |
| 1838 | } |
| 1839 | |
| 1840 | void tst_QDir::entryListWithSearchPaths() |
| 1841 | { |
| 1842 | QDir realDir(":/tst_qdir/resources/entryList" ); |
| 1843 | QVERIFY(realDir.exists()); |
| 1844 | QVERIFY(!realDir.entryList().isEmpty()); |
| 1845 | QVERIFY(realDir.entryList().contains("file3.data" )); |
| 1846 | |
| 1847 | QDir::setSearchPaths(prefix: "searchpath" , searchPaths: QStringList(":/tst_qdir/resources" )); |
| 1848 | QDir dir("searchpath:entryList/" ); |
| 1849 | QCOMPARE(dir.path(), QString(":/tst_qdir/resources/entryList" )); |
| 1850 | QVERIFY(dir.exists()); |
| 1851 | QStringList entryList = dir.entryList(); |
| 1852 | QVERIFY(entryList.contains("file3.data" )); |
| 1853 | } |
| 1854 | |
| 1855 | void tst_QDir::longFileName_data() |
| 1856 | { |
| 1857 | QTest::addColumn<int>(name: "length" ); |
| 1858 | |
| 1859 | QTest::newRow(dataTag: "128" ) << 128; |
| 1860 | QTest::newRow(dataTag: "256" ) << 256; |
| 1861 | QTest::newRow(dataTag: "512" ) << 512; |
| 1862 | QTest::newRow(dataTag: "1024" ) << 1024; |
| 1863 | QTest::newRow(dataTag: "2048" ) << 2048; |
| 1864 | QTest::newRow(dataTag: "4096" ) << 4096; |
| 1865 | } |
| 1866 | |
| 1867 | void tst_QDir::longFileName() |
| 1868 | { |
| 1869 | QFETCH(int, length); |
| 1870 | |
| 1871 | QString fileName(length, QLatin1Char('a')); |
| 1872 | fileName += QLatin1String(".txt" ); |
| 1873 | |
| 1874 | QFile file(fileName); |
| 1875 | if (!file.open(flags: QFile::WriteOnly)) |
| 1876 | QSKIP("Cannot create long file names" ); |
| 1877 | |
| 1878 | QFile file2(fileName); |
| 1879 | QVERIFY(file2.open(QFile::ReadOnly)); |
| 1880 | |
| 1881 | QVERIFY(QDir().entryList().contains(fileName)); |
| 1882 | |
| 1883 | file.close(); |
| 1884 | file2.close(); |
| 1885 | |
| 1886 | QFile::remove(fileName); |
| 1887 | } |
| 1888 | |
| 1889 | void tst_QDir::updateFileLists() |
| 1890 | { |
| 1891 | // Test setup |
| 1892 | |
| 1893 | FileSystem fs; |
| 1894 | const QString dirName = QStringLiteral("update-file-lists" ); |
| 1895 | |
| 1896 | QVERIFY( fs.createDirectory(dirName)); |
| 1897 | QVERIFY( fs.createFile(dirName + QStringLiteral("/file1.txt" )) ); |
| 1898 | QVERIFY( fs.createFile(dirName + QStringLiteral("/file2.doc" )) ); |
| 1899 | |
| 1900 | QVERIFY( fs.createDirectory(dirName + QStringLiteral("/sub-dir1" )) ); |
| 1901 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir1/file3.txt" )) ); |
| 1902 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir1/file4.doc" )) ); |
| 1903 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir1/file5.txt" )) ); |
| 1904 | |
| 1905 | QVERIFY( fs.createDirectory(dirName + QStringLiteral("/sub-dir2" )) ); |
| 1906 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir2/file6.txt" )) ); |
| 1907 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir2/file7.txt" )) ); |
| 1908 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir2/file8.doc" )) ); |
| 1909 | QVERIFY( fs.createFile(dirName + QStringLiteral("/sub-dir2/file9.doc" )) ); |
| 1910 | |
| 1911 | // Actual test |
| 1912 | |
| 1913 | QDir dir(fs.absoluteFilePath(fileName: dirName)); |
| 1914 | |
| 1915 | QCOMPARE(dir.count(), uint(6)); |
| 1916 | QCOMPARE(dir.entryList().size(), 6); |
| 1917 | QCOMPARE(dir.entryInfoList().size(), 6); |
| 1918 | |
| 1919 | dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); |
| 1920 | |
| 1921 | QCOMPARE(dir.entryList().size(), 4); |
| 1922 | QCOMPARE(dir.count(), uint(4)); |
| 1923 | QCOMPARE(dir.entryInfoList().size(), 4); |
| 1924 | |
| 1925 | dir.setPath(fs.absoluteFilePath(fileName: dirName + QStringLiteral("/sub-dir1" ))); |
| 1926 | |
| 1927 | QCOMPARE(dir.entryInfoList().size(), 3); |
| 1928 | QCOMPARE(dir.count(), uint(3)); |
| 1929 | QCOMPARE(dir.entryList().size(), 3); |
| 1930 | |
| 1931 | dir.setNameFilters(QStringList("*.txt" )); |
| 1932 | |
| 1933 | QCOMPARE(dir.entryInfoList().size(), 2); |
| 1934 | QCOMPARE(dir.entryList().size(), 2); |
| 1935 | QCOMPARE(dir.count(), uint(2)); |
| 1936 | |
| 1937 | dir.setPath(fs.absoluteFilePath(fileName: dirName)); |
| 1938 | dir = QDir(dir.path(), |
| 1939 | "*.txt" , |
| 1940 | QDir::Name | QDir::DirsLast, |
| 1941 | QDir::AllEntries | QDir::AllDirs | QDir::NoDotAndDotDot); |
| 1942 | |
| 1943 | QCOMPARE(dir.count(), uint(3)); |
| 1944 | QCOMPARE(dir.entryList().size(), 3); |
| 1945 | QCOMPARE(dir.entryInfoList().size(), 3); |
| 1946 | QCOMPARE(dir.entryList(), QStringList() << "file1.txt" << "sub-dir1" << "sub-dir2" ); |
| 1947 | |
| 1948 | dir.setSorting(QDir::Name | QDir::DirsFirst); |
| 1949 | |
| 1950 | QCOMPARE(dir.count(), uint(3)); |
| 1951 | QCOMPARE(dir.entryList().size(), 3); |
| 1952 | QCOMPARE(dir.entryInfoList().size(), 3); |
| 1953 | QCOMPARE(dir.entryList(), QStringList() << "sub-dir1" << "sub-dir2" << "file1.txt" ); |
| 1954 | |
| 1955 | { |
| 1956 | QVERIFY( fs.createFile(dirName + QStringLiteral("/extra-file.txt" )) ); |
| 1957 | |
| 1958 | QDir dir2(dir); |
| 1959 | |
| 1960 | QCOMPARE(dir2.count(), uint(3)); |
| 1961 | QCOMPARE(dir2.entryList().size(), 3); |
| 1962 | QCOMPARE(dir2.entryInfoList().size(), 3); |
| 1963 | QCOMPARE(dir2.entryList(), QStringList() << "sub-dir1" << "sub-dir2" << "file1.txt" ); |
| 1964 | |
| 1965 | dir2.refresh(); |
| 1966 | |
| 1967 | QCOMPARE(dir2.count(), uint(4)); |
| 1968 | QCOMPARE(dir2.entryList().size(), 4); |
| 1969 | QCOMPARE(dir2.entryInfoList().size(), 4); |
| 1970 | QCOMPARE(dir2.entryList(), QStringList() << "sub-dir1" << "sub-dir2" << "extra-file.txt" << "file1.txt" ); |
| 1971 | } |
| 1972 | |
| 1973 | QCOMPARE(dir.count(), uint(3)); |
| 1974 | QCOMPARE(dir.entryList().size(), 3); |
| 1975 | QCOMPARE(dir.entryInfoList().size(), 3); |
| 1976 | QCOMPARE(dir.entryList(), QStringList() << "sub-dir1" << "sub-dir2" << "file1.txt" ); |
| 1977 | } |
| 1978 | |
| 1979 | void tst_QDir::detachingOperations() |
| 1980 | { |
| 1981 | QString const defaultPath("." ); |
| 1982 | QStringList const defaultNameFilters = QStringList("*" ); |
| 1983 | QDir::SortFlags const defaultSorting = QDir::Name | QDir::IgnoreCase; |
| 1984 | QDir::Filters const defaultFilter = QDir::AllEntries; |
| 1985 | |
| 1986 | QString const path1(".." ); |
| 1987 | QString const path2("./foo" ); |
| 1988 | QStringList const nameFilters = QStringList(QString("*.txt" )); |
| 1989 | QDir::SortFlags const sorting = QDir::Name | QDir::DirsLast | QDir::Reversed; |
| 1990 | QDir::Filters const filter = QDir::Writable; |
| 1991 | |
| 1992 | QDir dir1; |
| 1993 | |
| 1994 | QCOMPARE(dir1.path(), defaultPath); |
| 1995 | QCOMPARE(dir1.filter(), defaultFilter); |
| 1996 | QCOMPARE(dir1.nameFilters(), defaultNameFilters); |
| 1997 | QCOMPARE(dir1.sorting(), defaultSorting); |
| 1998 | |
| 1999 | dir1.setPath(path1); |
| 2000 | QCOMPARE(dir1.path(), path1); |
| 2001 | QCOMPARE(dir1.filter(), defaultFilter); |
| 2002 | QCOMPARE(dir1.nameFilters(), defaultNameFilters); |
| 2003 | QCOMPARE(dir1.sorting(), defaultSorting); |
| 2004 | |
| 2005 | dir1.setFilter(filter); |
| 2006 | QCOMPARE(dir1.path(), path1); |
| 2007 | QCOMPARE(dir1.filter(), filter); |
| 2008 | QCOMPARE(dir1.nameFilters(), defaultNameFilters); |
| 2009 | QCOMPARE(dir1.sorting(), defaultSorting); |
| 2010 | |
| 2011 | dir1.setNameFilters(nameFilters); |
| 2012 | QCOMPARE(dir1.path(), path1); |
| 2013 | QCOMPARE(dir1.filter(), filter); |
| 2014 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2015 | QCOMPARE(dir1.sorting(), defaultSorting); |
| 2016 | |
| 2017 | dir1.setSorting(sorting); |
| 2018 | QCOMPARE(dir1.path(), path1); |
| 2019 | QCOMPARE(dir1.filter(), filter); |
| 2020 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2021 | QCOMPARE(dir1.sorting(), sorting); |
| 2022 | |
| 2023 | dir1.setPath(path2); |
| 2024 | QCOMPARE(dir1.path(), path2); |
| 2025 | QCOMPARE(dir1.filter(), filter); |
| 2026 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2027 | QCOMPARE(dir1.sorting(), sorting); |
| 2028 | |
| 2029 | { |
| 2030 | QDir dir2(dir1); |
| 2031 | QCOMPARE(dir2.path(), path2); |
| 2032 | QCOMPARE(dir2.filter(), filter); |
| 2033 | QCOMPARE(dir2.nameFilters(), nameFilters); |
| 2034 | QCOMPARE(dir2.sorting(), sorting); |
| 2035 | } |
| 2036 | |
| 2037 | { |
| 2038 | QDir dir2; |
| 2039 | QCOMPARE(dir2.path(), defaultPath); |
| 2040 | QCOMPARE(dir2.filter(), defaultFilter); |
| 2041 | QCOMPARE(dir2.nameFilters(), defaultNameFilters); |
| 2042 | QCOMPARE(dir2.sorting(), defaultSorting); |
| 2043 | |
| 2044 | dir2 = dir1; |
| 2045 | QCOMPARE(dir2.path(), path2); |
| 2046 | QCOMPARE(dir2.filter(), filter); |
| 2047 | QCOMPARE(dir2.nameFilters(), nameFilters); |
| 2048 | QCOMPARE(dir2.sorting(), sorting); |
| 2049 | |
| 2050 | dir2.setPath(path1); |
| 2051 | QCOMPARE(dir2.path(), path1); |
| 2052 | QCOMPARE(dir2.filter(), filter); |
| 2053 | QCOMPARE(dir2.nameFilters(), nameFilters); |
| 2054 | QCOMPARE(dir2.sorting(), sorting); |
| 2055 | } |
| 2056 | |
| 2057 | dir1.refresh(); |
| 2058 | QCOMPARE(dir1.path(), path2); |
| 2059 | QCOMPARE(dir1.filter(), filter); |
| 2060 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2061 | QCOMPARE(dir1.sorting(), sorting); |
| 2062 | |
| 2063 | QString const currentPath = QDir::currentPath(); |
| 2064 | QVERIFY(dir1.cd(currentPath)); |
| 2065 | QCOMPARE(dir1.path(), currentPath); |
| 2066 | QCOMPARE(dir1.filter(), filter); |
| 2067 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2068 | QCOMPARE(dir1.sorting(), sorting); |
| 2069 | |
| 2070 | QVERIFY(dir1.cdUp()); |
| 2071 | QCOMPARE(dir1.filter(), filter); |
| 2072 | QCOMPARE(dir1.nameFilters(), nameFilters); |
| 2073 | QCOMPARE(dir1.sorting(), sorting); |
| 2074 | } |
| 2075 | |
| 2076 | void tst_QDir::testCaching() |
| 2077 | { |
| 2078 | QString dirName = QString::fromLatin1(str: "testCaching" ); |
| 2079 | QDir::current().rmdir(dirName); // cleanup a previous run. |
| 2080 | QDir dir(dirName); |
| 2081 | QVERIFY(!dir.exists()); |
| 2082 | QDir::current().mkdir(dirName); |
| 2083 | QVERIFY(QDir(dirName).exists()); // dir exists |
| 2084 | QVERIFY(dir.exists()); // QDir doesn't cache the 'exist' between calls. |
| 2085 | } |
| 2086 | |
| 2087 | void tst_QDir::isRoot_data() |
| 2088 | { |
| 2089 | QTest::addColumn<QString>(name: "path" ); |
| 2090 | QTest::addColumn<bool>(name: "isRoot" ); |
| 2091 | |
| 2092 | QString test = QDir::rootPath(); |
| 2093 | QTest::newRow(dataTag: QString("rootPath " + test).toLatin1()) << test << true; |
| 2094 | test = QDir::rootPath().append(s: "./" ); |
| 2095 | QTest::newRow(dataTag: QString("./ appended " + test).toLatin1()) << test << false; |
| 2096 | |
| 2097 | test = QDir(QDir::rootPath().append(s: "./" )).canonicalPath(); |
| 2098 | QTest::newRow(dataTag: QString("canonicalPath " + test).toLatin1()) << test << true; |
| 2099 | |
| 2100 | #if defined(Q_OS_WIN) |
| 2101 | test = QDir::rootPath().left(2); |
| 2102 | QTest::newRow(QString("drive relative " + test).toLatin1()) << test << false; |
| 2103 | #endif |
| 2104 | |
| 2105 | QTest::newRow(dataTag: "resources root" ) << ":/" << true; |
| 2106 | QTest::newRow(dataTag: "resources nonroot" ) << ":/entrylist" << false; |
| 2107 | } |
| 2108 | |
| 2109 | void tst_QDir::isRoot() |
| 2110 | { |
| 2111 | QFETCH(QString, path); |
| 2112 | QFETCH(bool, isRoot); |
| 2113 | |
| 2114 | QDir dir(path); |
| 2115 | QCOMPARE(dir.isRoot(),isRoot); |
| 2116 | } |
| 2117 | |
| 2118 | #ifndef QT_NO_REGEXP |
| 2119 | void tst_QDir::match_data() |
| 2120 | { |
| 2121 | QTest::addColumn<QString>(name: "filter" ); |
| 2122 | QTest::addColumn<QString>(name: "filename" ); |
| 2123 | QTest::addColumn<bool>(name: "match" ); |
| 2124 | |
| 2125 | QTest::newRow(dataTag: "single, matching" ) << "*.cpp" << "tst_qdir.cpp" << true; |
| 2126 | QTest::newRow(dataTag: "single, not matching" ) << "*.cpp" << "tst_qdir.h" << false; |
| 2127 | QTest::newRow(dataTag: "multi, matching" ) << "*.cpp;*.h" << "tst_qdir.cpp" << true; |
| 2128 | QTest::newRow(dataTag: "multi, matching2" ) << "*.cpp;*.h" << "tst_qdir.h" << true; |
| 2129 | QTest::newRow(dataTag: "multi, not matching" ) << "*.cpp;*.h" << "readme.txt" << false; |
| 2130 | } |
| 2131 | |
| 2132 | void tst_QDir::match() |
| 2133 | { |
| 2134 | QFETCH(QString, filter); |
| 2135 | QFETCH(QString, filename); |
| 2136 | QFETCH(bool, match); |
| 2137 | |
| 2138 | QCOMPARE(QDir::match(filter, filename), match); |
| 2139 | QCOMPARE(QDir::match(filter.split(QLatin1Char(';')), filename), match); |
| 2140 | } |
| 2141 | #endif |
| 2142 | |
| 2143 | void tst_QDir::drives() |
| 2144 | { |
| 2145 | QFileInfoList list(QDir::drives()); |
| 2146 | #if defined(Q_OS_WIN) |
| 2147 | QVERIFY(list.count() >= 1); //system |
| 2148 | QLatin1Char systemdrive('c'); |
| 2149 | #endif |
| 2150 | #if defined(Q_OS_WINRT) |
| 2151 | QSKIP("WinRT has no concept of drives" ); |
| 2152 | #endif |
| 2153 | #if defined(Q_OS_WIN) |
| 2154 | QVERIFY(list.count() <= 26); |
| 2155 | bool foundsystem = false; |
| 2156 | foreach (QFileInfo fi, list) { |
| 2157 | QCOMPARE(fi.absolutePath().size(), 3); //"x:/" |
| 2158 | QCOMPARE(fi.absolutePath().at(1), QChar(QLatin1Char(':'))); |
| 2159 | QCOMPARE(fi.absolutePath().at(2), QChar(QLatin1Char('/'))); |
| 2160 | if (fi.absolutePath().at(0).toLower() == systemdrive) |
| 2161 | foundsystem = true; |
| 2162 | } |
| 2163 | QCOMPARE(foundsystem, true); |
| 2164 | #else |
| 2165 | QCOMPARE(list.count(), 1); //root |
| 2166 | QCOMPARE(list.at(0).absolutePath(), QLatin1String("/" )); |
| 2167 | #endif |
| 2168 | } |
| 2169 | |
| 2170 | void tst_QDir::arrayOperator() |
| 2171 | { |
| 2172 | QDir dir1((m_dataPath + "/entrylist/" )); |
| 2173 | QDir dir2((m_dataPath + "/entrylist/" )); |
| 2174 | |
| 2175 | QStringList entries(dir1.entryList()); |
| 2176 | int i = dir2.count(); |
| 2177 | QCOMPARE(i, entries.count()); |
| 2178 | --i; |
| 2179 | for (;i>=0;--i) { |
| 2180 | QCOMPARE(dir2[i], entries.at(i)); |
| 2181 | } |
| 2182 | } |
| 2183 | |
| 2184 | void tst_QDir::equalityOperator_data() |
| 2185 | { |
| 2186 | QTest::addColumn<QString>(name: "leftPath" ); |
| 2187 | QTest::addColumn<QString>(name: "leftNameFilters" ); |
| 2188 | QTest::addColumn<int>(name: "leftSort" ); |
| 2189 | QTest::addColumn<int>(name: "leftFilters" ); |
| 2190 | QTest::addColumn<QString>(name: "rightPath" ); |
| 2191 | QTest::addColumn<QString>(name: "rightNameFilters" ); |
| 2192 | QTest::addColumn<int>(name: "rightSort" ); |
| 2193 | QTest::addColumn<int>(name: "rightFilters" ); |
| 2194 | QTest::addColumn<bool>(name: "expected" ); |
| 2195 | |
| 2196 | QTest::newRow(dataTag: "same" ) << (m_dataPath + "/." ) << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2197 | << (m_dataPath + "/." ) << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2198 | << true; |
| 2199 | |
| 2200 | QTest::newRow(dataTag: "relativepaths" ) << "entrylist/" << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2201 | << "./entrylist" << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2202 | << true; |
| 2203 | |
| 2204 | QTest::newRow(dataTag: "QTBUG-20495" ) << QDir::currentPath() + "/entrylist/.." << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2205 | << "." << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2206 | << true; |
| 2207 | |
| 2208 | //need a path in the root directory that is unlikely to be a symbolic link. |
| 2209 | #if defined (Q_OS_WINRT) |
| 2210 | QString pathinroot(QDir::rootPath() + QLatin1String("assets/.." )); |
| 2211 | #elif defined (Q_OS_WIN) |
| 2212 | QString pathinroot("c:/windows/.." ); |
| 2213 | #elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) |
| 2214 | QString pathinroot("/system/.." ); |
| 2215 | #elif defined(Q_OS_HAIKU) |
| 2216 | QString pathinroot("/boot/.." ); |
| 2217 | #else |
| 2218 | QString pathinroot("/usr/.." ); |
| 2219 | #endif |
| 2220 | QTest::newRow(dataTag: "QTBUG-20495-root" ) << pathinroot << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2221 | << QDir::rootPath() << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2222 | << true; |
| 2223 | |
| 2224 | QTest::newRow(dataTag: "slashdot" ) << QDir::rootPath() + "." << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2225 | << QDir::rootPath() << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2226 | << true; |
| 2227 | |
| 2228 | QTest::newRow(dataTag: "slashdotslash" ) << QDir::rootPath() + "./" << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2229 | << QDir::rootPath() << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2230 | << true; |
| 2231 | |
| 2232 | QTest::newRow(dataTag: "nonexistantpaths" ) << "dir-that-dont-exist" << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2233 | << "another-dir-that-dont-exist" << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2234 | << false; |
| 2235 | |
| 2236 | QTest::newRow(dataTag: "diff-filters" ) << (m_dataPath + "/." ) << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2237 | << m_dataPath << "*.cpp" << int(QDir::Name) << int(QDir::Dirs) |
| 2238 | << false; |
| 2239 | |
| 2240 | QTest::newRow(dataTag: "diff-sort" ) << (m_dataPath + "/." ) << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2241 | << m_dataPath << "*.cpp" << int(QDir::Time) << int(QDir::Files) |
| 2242 | << false; |
| 2243 | |
| 2244 | QTest::newRow(dataTag: "diff-namefilters" ) << (m_dataPath + "/." ) << "*.cpp" << int(QDir::Name) << int(QDir::Files) |
| 2245 | << m_dataPath << "*.jpg" << int(QDir::Name) << int(QDir::Files) |
| 2246 | << false; |
| 2247 | } |
| 2248 | |
| 2249 | void tst_QDir::equalityOperator() |
| 2250 | { |
| 2251 | QFETCH(QString, leftPath); |
| 2252 | QFETCH(QString, leftNameFilters); |
| 2253 | QFETCH(int, leftSort); |
| 2254 | QFETCH(int, leftFilters); |
| 2255 | QFETCH(QString, rightPath); |
| 2256 | QFETCH(QString, rightNameFilters); |
| 2257 | QFETCH(int, rightSort); |
| 2258 | QFETCH(int, rightFilters); |
| 2259 | QFETCH(bool, expected); |
| 2260 | |
| 2261 | QDir dir1(leftPath, leftNameFilters, QDir::SortFlags(leftSort), QDir::Filters(leftFilters)); |
| 2262 | QDir dir2(rightPath, rightNameFilters, QDir::SortFlags(rightSort), QDir::Filters(rightFilters)); |
| 2263 | |
| 2264 | QCOMPARE((dir1 == dir2), expected); |
| 2265 | QCOMPARE((dir2 == dir1), expected); |
| 2266 | QCOMPARE((dir1 != dir2), !expected); |
| 2267 | QCOMPARE((dir2 != dir1), !expected); |
| 2268 | } |
| 2269 | |
| 2270 | void tst_QDir::isRelative_data() |
| 2271 | { |
| 2272 | QTest::addColumn<QString>(name: "path" ); |
| 2273 | QTest::addColumn<bool>(name: "relative" ); |
| 2274 | |
| 2275 | QTest::newRow(dataTag: "." ) << "./" << true; |
| 2276 | QTest::newRow(dataTag: ".." ) << "../" << true; |
| 2277 | QTest::newRow(dataTag: "content" ) << "entrylist/" << true; |
| 2278 | QTest::newRow(dataTag: "current" ) << QDir::currentPath() << false; |
| 2279 | QTest::newRow(dataTag: "homepath" ) << QDir::homePath() << false; |
| 2280 | QTest::newRow(dataTag: "temppath" ) << QDir::tempPath() << false; |
| 2281 | QTest::newRow(dataTag: "rootpath" ) << QDir::rootPath() << false; |
| 2282 | foreach (QFileInfo root, QDir::drives()) { |
| 2283 | QTest::newRow(dataTag: root.absolutePath().toLocal8Bit()) << root.absolutePath() << false; |
| 2284 | } |
| 2285 | |
| 2286 | QTest::newRow(dataTag: "resource" ) << ":/prefix" << false; |
| 2287 | } |
| 2288 | |
| 2289 | void tst_QDir::isRelative() |
| 2290 | { |
| 2291 | QFETCH(QString, path); |
| 2292 | QFETCH(bool, relative); |
| 2293 | |
| 2294 | QCOMPARE(QDir(path).isRelative(), relative); |
| 2295 | } |
| 2296 | |
| 2297 | void tst_QDir::isReadable() |
| 2298 | { |
| 2299 | #ifdef Q_OS_UNIX |
| 2300 | if (::getuid() == 0) |
| 2301 | QSKIP("Running this test as root doesn't make sense" ); |
| 2302 | #endif |
| 2303 | QDir dir; |
| 2304 | |
| 2305 | QVERIFY(dir.isReadable()); |
| 2306 | #if defined (Q_OS_UNIX) |
| 2307 | QVERIFY(dir.mkdir("nonreadabledir" )); |
| 2308 | QVERIFY(0 == ::chmod("nonreadabledir" , 0)); |
| 2309 | QVERIFY(!QDir("nonreadabledir" ).isReadable()); |
| 2310 | QVERIFY(0 == ::chmod("nonreadabledir" , S_IRUSR | S_IWUSR | S_IXUSR)); |
| 2311 | QVERIFY(dir.rmdir("nonreadabledir" )); |
| 2312 | #endif |
| 2313 | } |
| 2314 | |
| 2315 | void tst_QDir::cdNonreadable() |
| 2316 | { |
| 2317 | #ifdef Q_OS_UNIX |
| 2318 | if (::getuid() == 0) |
| 2319 | QSKIP("Running this test as root doesn't make sense" ); |
| 2320 | |
| 2321 | QDir dir; |
| 2322 | QVERIFY(dir.mkdir("nonreadabledir2" )); |
| 2323 | QVERIFY(0 == ::chmod("nonreadabledir2" , S_IWUSR | S_IXUSR)); |
| 2324 | QVERIFY(dir.cd("nonreadabledir2" )); |
| 2325 | QVERIFY(!dir.isReadable()); |
| 2326 | QVERIFY(dir.cd(".." )); |
| 2327 | QVERIFY(0 == ::chmod("nonreadabledir2" , S_IRUSR | S_IWUSR | S_IXUSR)); |
| 2328 | QVERIFY(dir.rmdir("nonreadabledir2" )); |
| 2329 | #endif |
| 2330 | } |
| 2331 | |
| 2332 | void tst_QDir::cdBelowRoot_data() |
| 2333 | { |
| 2334 | QTest::addColumn<QString>(name: "rootPath" ); |
| 2335 | QTest::addColumn<QString>(name: "cdInto" ); |
| 2336 | QTest::addColumn<QString>(name: "targetPath" ); |
| 2337 | |
| 2338 | #if defined(Q_OS_ANDROID) |
| 2339 | QTest::newRow("android" ) << "/" << "system" << "/system" ; |
| 2340 | #elif defined(Q_OS_UNIX) |
| 2341 | QTest::newRow(dataTag: "unix" ) << "/" << "tmp" << "/tmp" ; |
| 2342 | #elif defined(Q_OS_WINRT) |
| 2343 | QTest::newRow("winrt" ) << QDir::rootPath() << QDir::rootPath() << QDir::rootPath(); |
| 2344 | #else // Windows+CE |
| 2345 | const QString systemDrive = QString::fromLocal8Bit(qgetenv("SystemDrive" )) + QLatin1Char('/'); |
| 2346 | const QString systemRoot = QString::fromLocal8Bit(qgetenv("SystemRoot" )); |
| 2347 | QTest::newRow("windows-drive" ) |
| 2348 | << systemDrive << systemRoot.mid(3) << QDir::cleanPath(systemRoot); |
| 2349 | const QString uncRoot = QStringLiteral("//" ) + QtNetworkSettings::winServerName(); |
| 2350 | const QString testDirectory = QStringLiteral("testshare" ); |
| 2351 | QTest::newRow("windows-share" ) |
| 2352 | << uncRoot << testDirectory << QDir::cleanPath(uncRoot + QLatin1Char('/') + testDirectory); |
| 2353 | #endif // Windows |
| 2354 | } |
| 2355 | |
| 2356 | void tst_QDir::cdBelowRoot() |
| 2357 | { |
| 2358 | QFETCH(QString, rootPath); |
| 2359 | QFETCH(QString, cdInto); |
| 2360 | QFETCH(QString, targetPath); |
| 2361 | |
| 2362 | QDir root(rootPath); |
| 2363 | QVERIFY2(!root.cd(".." ), qPrintable(root.absolutePath())); |
| 2364 | QCOMPARE(root.path(), rootPath); |
| 2365 | QVERIFY(root.cd(cdInto)); |
| 2366 | QCOMPARE(root.path(), targetPath); |
| 2367 | #ifdef Q_OS_UNIX |
| 2368 | if (::getuid() == 0) |
| 2369 | QSKIP("Running this test as root doesn't make sense" ); |
| 2370 | #endif |
| 2371 | #ifdef Q_OS_WINRT |
| 2372 | QSKIP("WinRT has no concept of system root" ); |
| 2373 | #endif |
| 2374 | QDir dir(targetPath); |
| 2375 | QVERIFY2(!dir.cd("../.." ), qPrintable(dir.absolutePath())); |
| 2376 | QCOMPARE(dir.path(), targetPath); |
| 2377 | QVERIFY2(!dir.cd("../abs/../.." ), qPrintable(dir.absolutePath())); |
| 2378 | QCOMPARE(dir.path(), targetPath); |
| 2379 | QVERIFY(dir.cd(".." )); |
| 2380 | QCOMPARE(dir.path(), rootPath); |
| 2381 | } |
| 2382 | |
| 2383 | void tst_QDir::emptyDir() |
| 2384 | { |
| 2385 | const QString tempDir = QDir::currentPath() + "/tmpdir/" ; |
| 2386 | QDir temp(tempDir); |
| 2387 | if (!temp.exists()) { |
| 2388 | QVERIFY(QDir().mkdir(tempDir)); |
| 2389 | } |
| 2390 | QVERIFY(temp.mkdir("emptyDirectory" )); |
| 2391 | |
| 2392 | QDir testDir(tempDir + "emptyDirectory" ); |
| 2393 | QVERIFY(testDir.isEmpty()); |
| 2394 | QVERIFY(!testDir.isEmpty(QDir::AllEntries)); |
| 2395 | QVERIFY(!testDir.isEmpty(QDir::AllEntries | QDir::NoDot)); |
| 2396 | QVERIFY(!testDir.isEmpty(QDir::AllEntries | QDir::NoDotDot)); |
| 2397 | QVERIFY(QDir(tempDir).removeRecursively()); |
| 2398 | } |
| 2399 | |
| 2400 | void tst_QDir::nonEmptyDir() |
| 2401 | { |
| 2402 | const QDir dir(m_dataPath); |
| 2403 | QVERIFY(!dir.isEmpty()); |
| 2404 | } |
| 2405 | |
| 2406 | QTEST_MAIN(tst_QDir) |
| 2407 | #include "tst_qdir.moc" |
| 2408 | |
| 2409 | |