38#include "gtest/internal/gtest-filepath.h"
39#include "gtest/gtest.h"
40#include "src/gtest-internal-inl.h"
42#if GTEST_OS_WINDOWS_MOBILE
52#if GTEST_OS_WINDOWS_MOBILE
55int remove(
const char* path) {
56 LPCWSTR wpath = String::AnsiToUtf16(path);
57 int ret = DeleteFile(wpath) ? 0 : -1;
62int _rmdir(
const char* path) {
63 FilePath filepath(path);
64 LPCWSTR wpath = String::AnsiToUtf16(
65 filepath.RemoveTrailingPathSeparator().c_str());
66 int ret = RemoveDirectory(wpath) ? 0 : -1;
73TEST(GetCurrentDirTest, ReturnsCurrentDir) {
74 const FilePath original_dir = FilePath::GetCurrentDir();
75 EXPECT_FALSE(original_dir.IsEmpty());
77 posix::ChDir(GTEST_PATH_SEP_);
78 const FilePath cwd = FilePath::GetCurrentDir();
79 posix::ChDir(original_dir.c_str());
81# if GTEST_OS_WINDOWS || GTEST_OS_OS2
84 const char*
const cwd_without_drive = strchr(cwd.c_str(),
':');
85 ASSERT_TRUE(cwd_without_drive != NULL);
86 EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
90 EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
97TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
98 EXPECT_TRUE(FilePath(
"").IsEmpty());
101TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
102 EXPECT_FALSE(FilePath(
"a").IsEmpty());
103 EXPECT_FALSE(FilePath(
".").IsEmpty());
104 EXPECT_FALSE(FilePath(
"a/b").IsEmpty());
105 EXPECT_FALSE(FilePath(
"a\\b\\").IsEmpty());
109TEST(RemoveDirectoryNameTest, WhenEmptyName) {
110 EXPECT_EQ(
"", FilePath(
"").RemoveDirectoryName().
string());
114TEST(RemoveDirectoryNameTest, ButNoDirectory) {
116 FilePath(
"afile").RemoveDirectoryName().
string());
120TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
122 FilePath(GTEST_PATH_SEP_
"afile").RemoveDirectoryName().
string());
126TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
128 FilePath(
"adir" GTEST_PATH_SEP_).RemoveDirectoryName().
string());
132TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
134 FilePath(
"adir" GTEST_PATH_SEP_
"afile").RemoveDirectoryName().
string());
138TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
140 FilePath(
"adir" GTEST_PATH_SEP_
"subdir" GTEST_PATH_SEP_
"afile")
141 .RemoveDirectoryName().
string());
144#if GTEST_HAS_ALT_PATH_SEP_
150TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
151 EXPECT_EQ(
"afile", FilePath(
"/afile").RemoveDirectoryName().
string());
155TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
156 EXPECT_EQ(
"", FilePath(
"adir/").RemoveDirectoryName().
string());
160TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
161 EXPECT_EQ(
"afile", FilePath(
"adir/afile").RemoveDirectoryName().
string());
165TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
167 FilePath(
"adir/subdir/afile").RemoveDirectoryName().
string());
173TEST(RemoveFileNameTest, EmptyName) {
174#if GTEST_OS_WINDOWS_MOBILE
176 EXPECT_EQ(GTEST_PATH_SEP_, FilePath(
"").RemoveFileName().
string());
178 EXPECT_EQ(
"." GTEST_PATH_SEP_, FilePath(
"").RemoveFileName().
string());
183TEST(RemoveFileNameTest, ButNoFile) {
184 EXPECT_EQ(
"adir" GTEST_PATH_SEP_,
185 FilePath(
"adir" GTEST_PATH_SEP_).RemoveFileName().
string());
189TEST(RemoveFileNameTest, GivesDirName) {
190 EXPECT_EQ(
"adir" GTEST_PATH_SEP_,
191 FilePath(
"adir" GTEST_PATH_SEP_
"afile").RemoveFileName().
string());
195TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
196 EXPECT_EQ(
"adir" GTEST_PATH_SEP_
"subdir" GTEST_PATH_SEP_,
197 FilePath(
"adir" GTEST_PATH_SEP_
"subdir" GTEST_PATH_SEP_
"afile")
198 .RemoveFileName().
string());
202TEST(RemoveFileNameTest, GivesRootDir) {
203 EXPECT_EQ(GTEST_PATH_SEP_,
204 FilePath(GTEST_PATH_SEP_
"afile").RemoveFileName().
string());
207#if GTEST_HAS_ALT_PATH_SEP_
213TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
214 EXPECT_EQ(
"adir" GTEST_PATH_SEP_,
215 FilePath(
"adir/").RemoveFileName().
string());
219TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
220 EXPECT_EQ(
"adir" GTEST_PATH_SEP_,
221 FilePath(
"adir/afile").RemoveFileName().
string());
225TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
226 EXPECT_EQ(
"adir" GTEST_PATH_SEP_
"subdir" GTEST_PATH_SEP_,
227 FilePath(
"adir/subdir/afile").RemoveFileName().
string());
231TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
232 EXPECT_EQ(GTEST_PATH_SEP_, FilePath(
"/afile").RemoveFileName().
string());
237TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
238 FilePath actual = FilePath::MakeFileName(FilePath(
"foo"), FilePath(
"bar"),
240 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar.xml", actual.string());
243TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
244 FilePath actual = FilePath::MakeFileName(FilePath(
"foo"), FilePath(
"bar"),
246 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar_12.xml", actual.string());
249TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
250 FilePath actual = FilePath::MakeFileName(FilePath(
"foo" GTEST_PATH_SEP_),
251 FilePath(
"bar"), 0,
"xml");
252 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar.xml", actual.string());
255TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
256 FilePath actual = FilePath::MakeFileName(FilePath(
"foo" GTEST_PATH_SEP_),
257 FilePath(
"bar"), 12,
"xml");
258 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar_12.xml", actual.string());
261TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
262 FilePath actual = FilePath::MakeFileName(FilePath(
""), FilePath(
"bar"),
264 EXPECT_EQ(
"bar.xml", actual.string());
267TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
268 FilePath actual = FilePath::MakeFileName(FilePath(
""), FilePath(
"bar"),
270 EXPECT_EQ(
"bar_14.xml", actual.string());
273TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
274 FilePath actual = FilePath::ConcatPaths(FilePath(
"foo"),
275 FilePath(
"bar.xml"));
276 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar.xml", actual.string());
279TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
280 FilePath actual = FilePath::ConcatPaths(FilePath(
"foo" GTEST_PATH_SEP_),
281 FilePath(
"bar.xml"));
282 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar.xml", actual.string());
285TEST(ConcatPathsTest, Path1BeingEmpty) {
286 FilePath actual = FilePath::ConcatPaths(FilePath(
""),
287 FilePath(
"bar.xml"));
288 EXPECT_EQ(
"bar.xml", actual.string());
291TEST(ConcatPathsTest, Path2BeingEmpty) {
292 FilePath actual = FilePath::ConcatPaths(FilePath(
"foo"), FilePath(
""));
293 EXPECT_EQ(
"foo" GTEST_PATH_SEP_, actual.string());
296TEST(ConcatPathsTest, BothPathBeingEmpty) {
297 FilePath actual = FilePath::ConcatPaths(FilePath(
""),
299 EXPECT_EQ(
"", actual.string());
302TEST(ConcatPathsTest, Path1ContainsPathSep) {
303 FilePath actual = FilePath::ConcatPaths(FilePath(
"foo" GTEST_PATH_SEP_
"bar"),
304 FilePath(
"foobar.xml"));
305 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar" GTEST_PATH_SEP_
"foobar.xml",
309TEST(ConcatPathsTest, Path2ContainsPathSep) {
310 FilePath actual = FilePath::ConcatPaths(
311 FilePath(
"foo" GTEST_PATH_SEP_),
312 FilePath(
"bar" GTEST_PATH_SEP_
"bar.xml"));
313 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar" GTEST_PATH_SEP_
"bar.xml",
317TEST(ConcatPathsTest, Path2EndsWithPathSep) {
318 FilePath actual = FilePath::ConcatPaths(FilePath(
"foo"),
319 FilePath(
"bar" GTEST_PATH_SEP_));
320 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar" GTEST_PATH_SEP_, actual.string());
324TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
325 EXPECT_EQ(
"", FilePath(
"").RemoveTrailingPathSeparator().
string());
329TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
330 EXPECT_EQ(
"foo", FilePath(
"foo").RemoveTrailingPathSeparator().
string());
334TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
336 FilePath(
"foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().
string());
337#if GTEST_HAS_ALT_PATH_SEP_
338 EXPECT_EQ(
"foo", FilePath(
"foo/").RemoveTrailingPathSeparator().
string());
343TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
344 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar",
345 FilePath(
"foo" GTEST_PATH_SEP_
"bar" GTEST_PATH_SEP_)
346 .RemoveTrailingPathSeparator().
string());
350TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
351 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar",
352 FilePath(
"foo" GTEST_PATH_SEP_
"bar")
353 .RemoveTrailingPathSeparator().
string());
356TEST(DirectoryTest, RootDirectoryExists) {
358 char current_drive[_MAX_PATH];
359 current_drive[0] =
static_cast<char>(_getdrive() +
'A' - 1);
360 current_drive[1] =
':';
361 current_drive[2] =
'\\';
362 current_drive[3] =
'\0';
363 EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
365 EXPECT_TRUE(FilePath(
"/").DirectoryExists());
370TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
371 const int saved_drive_ = _getdrive();
373 for (
char drive =
'Z'; drive >=
'A'; drive--)
374 if (_chdrive(drive -
'A' + 1) == -1) {
375 char non_drive[_MAX_PATH];
376 non_drive[0] = drive;
380 EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
383 _chdrive(saved_drive_);
387#if !GTEST_OS_WINDOWS_MOBILE
389TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
390 EXPECT_FALSE(FilePath(
"").DirectoryExists());
394TEST(DirectoryTest, CurrentDirectoryExists) {
398 EXPECT_TRUE(FilePath(
".").DirectoryExists());
399 EXPECT_TRUE(FilePath(
".\\").DirectoryExists());
403 EXPECT_TRUE(FilePath(
".").DirectoryExists());
404 EXPECT_TRUE(FilePath(
"./").DirectoryExists());
409TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
410 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar",
411 FilePath(
"foo" GTEST_PATH_SEP_
"bar").
string());
412 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar",
413 FilePath(
"foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
"bar").
string());
414 EXPECT_EQ(
"foo" GTEST_PATH_SEP_
"bar",
415 FilePath(
"foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
416 GTEST_PATH_SEP_
"bar").
string());
420TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
421 EXPECT_EQ(GTEST_PATH_SEP_
"bar",
422 FilePath(GTEST_PATH_SEP_
"bar").
string());
423 EXPECT_EQ(GTEST_PATH_SEP_
"bar",
424 FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_
"bar").
string());
425 EXPECT_EQ(GTEST_PATH_SEP_
"bar",
426 FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_
"bar").
string());
430TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
431 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
432 FilePath(
"foo" GTEST_PATH_SEP_).
string());
433 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
434 FilePath(
"foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).
string());
435 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
436 FilePath(
"foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).
string());
439#if GTEST_HAS_ALT_PATH_SEP_
444TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
445 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
446 FilePath(
"foo/").
string());
447 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
448 FilePath(
"foo" GTEST_PATH_SEP_
"/").
string());
449 EXPECT_EQ(
"foo" GTEST_PATH_SEP_,
450 FilePath(
"foo//" GTEST_PATH_SEP_).
string());
455TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
456 FilePath default_path;
457 FilePath non_default_path(
"path");
458 non_default_path = default_path;
459 EXPECT_EQ(
"", non_default_path.string());
460 EXPECT_EQ(
"", default_path.string());
463TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
464 FilePath non_default_path(
"path");
465 FilePath default_path;
466 default_path = non_default_path;
467 EXPECT_EQ(
"path", default_path.string());
468 EXPECT_EQ(
"path", non_default_path.string());
471TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
472 const FilePath const_default_path(
"const_path");
473 FilePath non_default_path(
"path");
474 non_default_path = const_default_path;
475 EXPECT_EQ(
"const_path", non_default_path.string());
478class DirectoryCreationTest :
public Test {
480 void SetUp()
override {
481 testdata_path_.Set(FilePath(
482 TempDir() + GetCurrentExecutableName().
string() +
483 "_directory_creation" GTEST_PATH_SEP_
"test" GTEST_PATH_SEP_));
484 testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
486 unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath(
"unique"),
488 unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath(
"unique"),
491 remove(testdata_file_.c_str());
492 remove(unique_file0_.c_str());
493 remove(unique_file1_.c_str());
494 posix::RmDir(testdata_path_.c_str());
497 void TearDown()
override {
498 remove(testdata_file_.c_str());
499 remove(unique_file0_.c_str());
500 remove(unique_file1_.c_str());
501 posix::RmDir(testdata_path_.c_str());
504 void CreateTextFile(
const char* filename) {
505 FILE* f = posix::FOpen(filename,
"w");
506 fprintf(f,
"text\n");
513 FilePath testdata_path_;
514 FilePath testdata_file_;
515 FilePath unique_file0_;
516 FilePath unique_file1_;
519TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
520 EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
521 EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
522 EXPECT_TRUE(testdata_path_.DirectoryExists());
525TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
526 EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
527 EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
529 EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
532TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
533 FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
534 FilePath(
"unique"),
"txt"));
535 EXPECT_EQ(unique_file0_.string(), file_path.string());
536 EXPECT_FALSE(file_path.FileOrDirectoryExists());
538 testdata_path_.CreateDirectoriesRecursively();
539 EXPECT_FALSE(file_path.FileOrDirectoryExists());
540 CreateTextFile(file_path.c_str());
541 EXPECT_TRUE(file_path.FileOrDirectoryExists());
543 FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
544 FilePath(
"unique"),
"txt"));
545 EXPECT_EQ(unique_file1_.string(), file_path2.string());
546 EXPECT_FALSE(file_path2.FileOrDirectoryExists());
547 CreateTextFile(file_path2.c_str());
548 EXPECT_TRUE(file_path2.FileOrDirectoryExists());
551TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
553 CreateTextFile(testdata_file_.c_str());
554 EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
555 EXPECT_FALSE(testdata_file_.DirectoryExists());
556 EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
559TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
560 const FilePath test_detail_xml(
"test_detail.xml");
561 EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
564TEST(FilePathTest, DefaultConstructor) {
566 EXPECT_EQ(
"", fp.string());
569TEST(FilePathTest, CharAndCopyConstructors) {
570 const FilePath fp(
"spicy");
571 EXPECT_EQ(
"spicy", fp.string());
573 const FilePath fp_copy(fp);
574 EXPECT_EQ(
"spicy", fp_copy.string());
577TEST(FilePathTest, StringConstructor) {
578 const FilePath fp(std::string(
"cider"));
579 EXPECT_EQ(
"cider", fp.string());
582TEST(FilePathTest, Set) {
583 const FilePath apple(
"apple");
586 EXPECT_EQ(
"apple", mac.string());
587 EXPECT_EQ(
"apple", apple.string());
590TEST(FilePathTest, ToString) {
591 const FilePath file(
"drink");
592 EXPECT_EQ(
"drink", file.string());
595TEST(FilePathTest, RemoveExtension) {
596 EXPECT_EQ(
"app", FilePath(
"app.cc").RemoveExtension(
"cc").
string());
597 EXPECT_EQ(
"app", FilePath(
"app.exe").RemoveExtension(
"exe").
string());
598 EXPECT_EQ(
"APP", FilePath(
"APP.EXE").RemoveExtension(
"exe").
string());
601TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
602 EXPECT_EQ(
"app", FilePath(
"app").RemoveExtension(
"exe").
string());
605TEST(FilePathTest, IsDirectory) {
606 EXPECT_FALSE(FilePath(
"cola").IsDirectory());
607 EXPECT_TRUE(FilePath(
"koala" GTEST_PATH_SEP_).IsDirectory());
608#if GTEST_HAS_ALT_PATH_SEP_
609 EXPECT_TRUE(FilePath(
"koala/").IsDirectory());
613TEST(FilePathTest, IsAbsolutePath) {
614 EXPECT_FALSE(FilePath(
"is" GTEST_PATH_SEP_
"relative").IsAbsolutePath());
615 EXPECT_FALSE(FilePath(
"").IsAbsolutePath());
617 EXPECT_TRUE(FilePath(
"c:\\" GTEST_PATH_SEP_
"is_not"
618 GTEST_PATH_SEP_
"relative").IsAbsolutePath());
619 EXPECT_FALSE(FilePath(
"c:foo" GTEST_PATH_SEP_
"bar").IsAbsolutePath());
620 EXPECT_TRUE(FilePath(
"c:/" GTEST_PATH_SEP_
"is_not"
621 GTEST_PATH_SEP_
"relative").IsAbsolutePath());
623 EXPECT_TRUE(FilePath(GTEST_PATH_SEP_
"is_not" GTEST_PATH_SEP_
"relative")
628TEST(FilePathTest, IsRootDirectory) {
630 EXPECT_TRUE(FilePath(
"a:\\").IsRootDirectory());
631 EXPECT_TRUE(FilePath(
"Z:/").IsRootDirectory());
632 EXPECT_TRUE(FilePath(
"e://").IsRootDirectory());
633 EXPECT_FALSE(FilePath(
"").IsRootDirectory());
634 EXPECT_FALSE(FilePath(
"b:").IsRootDirectory());
635 EXPECT_FALSE(FilePath(
"b:a").IsRootDirectory());
636 EXPECT_FALSE(FilePath(
"8:/").IsRootDirectory());
637 EXPECT_FALSE(FilePath(
"c|/").IsRootDirectory());
639 EXPECT_TRUE(FilePath(
"/").IsRootDirectory());
640 EXPECT_TRUE(FilePath(
"//").IsRootDirectory());
641 EXPECT_FALSE(FilePath(
"").IsRootDirectory());
642 EXPECT_FALSE(FilePath(
"\\").IsRootDirectory());
643 EXPECT_FALSE(FilePath(
"/x").IsRootDirectory());