1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008, Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Authors: keith.ray@gmail.com (Keith Ray)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Test filepath utilities
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file tests classes and functions used internally by
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Test.  They are subject to change without notice.
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file is #included from gtest_unittest.cc, to avoid changing
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// build or make-files for some existing Google Test clients. Do not
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// #include this file anywhere else!
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-filepath.h"
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h"
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Indicates that this translation unit is part of Google Test's
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// implementation.  It must come before gtest-internal-inl.h is
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// included, or there will be a compiler error.  This trick is to
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// prevent a user from accidentally including gtest-internal-inl.h in
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// his code.
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_IMPLEMENTATION_ 1
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include "src/gtest-internal-inl.h"
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#undef GTEST_IMPLEMENTATION_
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_OS_WINDOWS_MOBILE
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <windows.h>  // NOLINT
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#elif GTEST_OS_WINDOWS
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <direct.h>  // NOLINT
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_OS_WINDOWS_MOBILE
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace {
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
6346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_OS_WINDOWS_MOBILE
6446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// TODO(wan@google.com): Move these to the POSIX adapter section in
6546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// gtest-port.h.
6646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Windows CE doesn't have the remove C function.
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterint remove(const char* path) {
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  LPCWSTR wpath = String::AnsiToUtf16(path);
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int ret = DeleteFile(wpath) ? 0 : -1;
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete [] wpath;
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return ret;
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Windows CE doesn't have the _rmdir C function.
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterint _rmdir(const char* path) {
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath filepath(path);
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  LPCWSTR wpath = String::AnsiToUtf16(
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      filepath.RemoveTrailingPathSeparator().c_str());
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int ret = RemoveDirectory(wpath) ? 0 : -1;
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete [] wpath;
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return ret;
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
8446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GetCurrentDirTest, ReturnsCurrentDir) {
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath original_dir = FilePath::GetCurrentDir();
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(original_dir.IsEmpty());
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  posix::ChDir(GTEST_PATH_SEP_);
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath cwd = FilePath::GetCurrentDir();
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  posix::ChDir(original_dir.c_str());
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
9446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# if GTEST_OS_WINDOWS
9546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Skips the ":".
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(cwd_without_drive != NULL);
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
10046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# else
10246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_, cwd.c_str());
10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_OS_WINDOWS_MOBILE
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath("").IsEmpty());
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(NULL).IsEmpty());
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("a").IsEmpty());
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath(".").IsEmpty());
118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("a/b").IsEmpty());
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "" -> ""
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, WhenEmptyName) {
124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", FilePath("").RemoveDirectoryName().c_str());
125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "afile" -> "afile"
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, ButNoDirectory) {
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("afile",
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("afile").RemoveDirectoryName().c_str());
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "/afile" -> "afile"
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("afile",
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "adir/" -> ""
140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("",
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().c_str());
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "adir/afile" -> "afile"
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("afile",
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveDirectoryName "adir/subdir/afile" -> "afile"
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("afile",
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RemoveDirectoryName().c_str());
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_ALT_PATH_SEP_
15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that RemoveDirectoryName() works with the alternate separator
16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// on Windows.
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveDirectoryName("/afile") -> "afile"
16446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("afile",
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("/afile").RemoveDirectoryName().c_str());
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveDirectoryName("adir/") -> ""
17046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
17146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("",
17246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/").RemoveDirectoryName().c_str());
17346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
17446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
17546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveDirectoryName("adir/afile") -> "afile"
17646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
17746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("afile",
17846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/afile").RemoveDirectoryName().c_str());
17946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
18046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveDirectoryName("adir/subdir/afile") -> "afile"
18246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
18346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("afile",
18446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/subdir/afile").RemoveDirectoryName().c_str());
18546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
18646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveFileName "" -> "./"
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveFileNameTest, EmptyName) {
19146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_OS_WINDOWS_MOBILE
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // On Windows CE, we use the root as the current directory.
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_,
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("").RemoveFileName().c_str());
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("." GTEST_PATH_SEP_,
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("").RemoveFileName().c_str());
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveFileName "adir/" -> "adir/"
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveFileNameTest, ButNoFile) {
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().c_str());
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveFileName "adir/afile" -> "adir/"
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveFileNameTest, GivesDirName) {
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_ "afile")
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RemoveFileName().c_str());
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveFileNameTest, GivesDirAndSubDirName) {
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RemoveFileName().c_str());
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveFileName "/afile" -> "/"
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveFileNameTest, GivesRootDir) {
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_,
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().c_str());
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
22746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_ALT_PATH_SEP_
22846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
22946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that RemoveFileName() works with the alternate separator on
23046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Windows.
23146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
23246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveFileName("adir/") -> "adir/"
23346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
23446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
23546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/").RemoveFileName().c_str());
23646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
23746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
23846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveFileName("adir/afile") -> "adir/"
23946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
24046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
24146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/afile").RemoveFileName().c_str());
24246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
24346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
24446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
24546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
24646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
24746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("adir/subdir/afile").RemoveFileName().c_str());
24846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
24946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
25046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// RemoveFileName("/afile") -> "\"
25146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
25246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ(GTEST_PATH_SEP_,
25346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("/afile").RemoveFileName().c_str());
25446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
25546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
25646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      0, "xml");
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      12, "xml");
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("bar"), 0, "xml");
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("bar"), 12, "xml");
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      0, "xml");
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("bar.xml", actual.c_str());
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      14, "xml");
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("bar_14.xml", actual.c_str());
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath("bar.xml"));
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath("bar.xml"));
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, Path1BeingEmpty) {
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath(""),
308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath("bar.xml"));
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("bar.xml", actual.c_str());
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, Path2BeingEmpty) {
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath(""));
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_, actual.c_str());
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, BothPathBeingEmpty) {
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath(""),
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath(""));
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", actual.c_str());
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, Path1ContainsPathSep) {
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath("foobar.xml"));
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               actual.c_str());
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, Path2ContainsPathSep) {
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("foo" GTEST_PATH_SEP_),
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               actual.c_str());
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConcatPathsTest, Path2EndsWithPathSep) {
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                          FilePath("bar" GTEST_PATH_SEP_));
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.c_str());
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveTrailingPathSeparator "" -> ""
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveTrailingPathSeparatorTest, EmptyString) {
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("",
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("").RemoveTrailingPathSeparator().c_str());
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveTrailingPathSeparator "foo" -> "foo"
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo",
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("foo").RemoveTrailingPathSeparator().c_str());
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveTrailingPathSeparator "foo/" -> "foo"
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "foo",
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().c_str());
36246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_ALT_PATH_SEP_
36346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("foo",
36446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("foo/").RemoveTrailingPathSeparator().c_str());
36546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               .RemoveTrailingPathSeparator().c_str());
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               FilePath("foo" GTEST_PATH_SEP_ "bar")
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               .RemoveTrailingPathSeparator().c_str());
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DirectoryTest, RootDirectoryExists) {
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_WINDOWS  // We are on Windows.
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  char current_drive[_MAX_PATH];  // NOLINT
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  current_drive[1] = ':';
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  current_drive[2] = '\\';
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  current_drive[3] = '\0';
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath("/").DirectoryExists());
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_OS_WINDOWS
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_WINDOWS
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const int saved_drive_ = _getdrive();
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  for (char drive = 'Z'; drive >= 'A'; drive--)
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (_chdrive(drive - 'A' + 1) == -1) {
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      char non_drive[_MAX_PATH];  // NOLINT
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      non_drive[0] = drive;
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      non_drive[1] = ':';
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      non_drive[2] = '\\';
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      non_drive[3] = '\0';
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      break;
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  _chdrive(saved_drive_);
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_OS_WINDOWS
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
41346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if !GTEST_OS_WINDOWS_MOBILE
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Windows CE _does_ consider an empty directory to exist.
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("").DirectoryExists());
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
41846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // !GTEST_OS_WINDOWS_MOBILE
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DirectoryTest, CurrentDirectoryExists) {
421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_WINDOWS  // We are on Windows.
42246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
42346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(".").DirectoryExists());
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
42646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
42746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif  // _WIN32_CE
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(".").DirectoryExists());
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath("./").DirectoryExists());
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_OS_WINDOWS
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NormalizeTest, NullStringsEqualEmptyDirectory) {
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", FilePath(NULL).c_str());
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", FilePath(String(NULL)).c_str());
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "foo/bar" == foo//bar" == "foo///bar"
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               FilePath("foo" GTEST_PATH_SEP_ "bar").c_str());
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                        GTEST_PATH_SEP_ "bar").c_str());
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "/bar" == //bar" == "///bar"
451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath(GTEST_PATH_SEP_ "bar").c_str());
454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "foo/" == foo//" == "foo///"
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath("foo" GTEST_PATH_SEP_).c_str());
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
47046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_ALT_PATH_SEP_
47146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
47246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that separators at the end of the string are normalized
47346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// regardless of their combination (e.g. "foo\" =="foo/\" ==
47446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// "foo\\/").
47546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
47646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
47746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("foo/").c_str());
47846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
47946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("foo" GTEST_PATH_SEP_ "/").c_str());
48046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
48146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               FilePath("foo//" GTEST_PATH_SEP_).c_str());
48246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
48346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
48446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
48546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath default_path;
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath non_default_path("path");
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  non_default_path = default_path;
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", non_default_path.c_str());
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", default_path.c_str());  // RHS var is unchanged.
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath non_default_path("path");
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath default_path;
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  default_path = non_default_path;
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("path", default_path.c_str());
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("path", non_default_path.c_str());  // RHS var is unchanged.
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath const_default_path("const_path");
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath non_default_path("path");
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  non_default_path = const_default_path;
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("const_path", non_default_path.c_str());
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DirectoryCreationTest : public Test {
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected:
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void SetUp() {
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    testdata_path_.Set(FilePath(String::Format("%s%s%s",
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        TempDir().c_str(), GetCurrentExecutableName().c_str(),
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_)));
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        0, "txt"));
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        1, "txt"));
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(testdata_file_.c_str());
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(unique_file0_.c_str());
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(unique_file1_.c_str());
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    posix::RmDir(testdata_path_.c_str());
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void TearDown() {
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(testdata_file_.c_str());
530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(unique_file0_.c_str());
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    remove(unique_file1_.c_str());
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    posix::RmDir(testdata_path_.c_str());
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  String TempDir() const {
53646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_OS_WINDOWS_MOBILE
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return String("\\temp\\");
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#elif GTEST_OS_WINDOWS
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const char* temp_dir = posix::GetEnv("TEMP");
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (temp_dir == NULL || temp_dir[0] == '\0')
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return String("\\temp\\");
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else if (String(temp_dir).EndsWith("\\"))
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return String(temp_dir);
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return String::Format("%s\\", temp_dir);
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return String("/tmp/");
54846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_OS_WINDOWS_MOBILE
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void CreateTextFile(const char* filename) {
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FILE* f = posix::FOpen(filename, "w");
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    fprintf(f, "text\n");
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    fclose(f);
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Strings representing a directory and a file, with identical paths
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // except for the trailing separator character that distinquishes
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // a directory named 'test' from a file named 'test'. Example names:
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath testdata_file_;  // "/tmp/directory_creation/test"
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(testdata_path_.DirectoryExists());
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Call 'create' again... should still succeed.
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("unique"), "txt"));
582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(unique_file0_.c_str(), file_path.c_str());
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  testdata_path_.CreateDirectoriesRecursively();
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CreateTextFile(file_path.c_str());
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(file_path.FileOrDirectoryExists());
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      FilePath("unique"), "txt"));
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ(unique_file1_.c_str(), file_path2.c_str());
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CreateTextFile(file_path2.c_str());
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // force a failure by putting a file where we will try to create a directory.
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CreateTextFile(testdata_file_.c_str());
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(testdata_file_.DirectoryExists());
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath test_detail_xml("test_detail.xml");
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, DefaultConstructor) {
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath fp;
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("", fp.c_str());
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, CharAndCopyConstructors) {
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath fp("spicy");
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("spicy", fp.c_str());
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath fp_copy(fp);
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("spicy", fp_copy.c_str());
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, StringConstructor) {
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath fp(String("cider"));
626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("cider", fp.c_str());
627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, Set) {
630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath apple("apple");
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  FilePath mac("mac");
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("apple", mac.c_str());
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("apple", apple.c_str());
635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, ToString) {
638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const FilePath file("drink");
639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  String str(file.ToString());
640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("drink", str.c_str());
641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, RemoveExtension) {
644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("app", FilePath("app.exe").RemoveExtension("exe").c_str());
645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("APP", FilePath("APP.EXE").RemoveExtension("exe").c_str());
646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_STREQ("app", FilePath("app").RemoveExtension("exe").c_str());
650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, IsDirectory) {
653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("cola").IsDirectory());
654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
65546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_ALT_PATH_SEP_
65646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("koala/").IsDirectory());
65746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FilePathTest, IsAbsolutePath) {
661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("").IsAbsolutePath());
663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_WINDOWS
664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
66746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
66846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else
670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              .IsAbsolutePath());
672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_OS_WINDOWS
673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
67546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(FilePathTest, IsRootDirectory) {
67646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_OS_WINDOWS
67746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
67846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
67946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
68046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("").IsRootDirectory());
68146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
68246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
68346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
68446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
68546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else
68646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("/").IsRootDirectory());
68746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(FilePath("//").IsRootDirectory());
68846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("").IsRootDirectory());
68946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
69046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
69146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
69246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
69346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace
695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
697