1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Authors: keith.ray@gmail.com (Keith Ray)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Test filepath utilities
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file tests classes and functions used internally by
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Test.  They are subject to change without notice.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file is #included from gtest_unittest.cc, to avoid changing
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// build or make-files for some existing Google Test clients. Do not
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #include this file anywhere else!
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-filepath.h"
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Indicates that this translation unit is part of Google Test's
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementation.  It must come before gtest-internal-inl.h is
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// included, or there will be a compiler error.  This trick is to
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// prevent a user from accidentally including gtest-internal-inl.h in
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// his code.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_IMPLEMENTATION_ 1
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "src/gtest-internal-inl.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef GTEST_IMPLEMENTATION_
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS_MOBILE
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <windows.h>  // NOLINT
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif GTEST_OS_WINDOWS
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <direct.h>  // NOLINT
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS_MOBILE
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS_MOBILE
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(wan@google.com): Move these to the POSIX adapter section in
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// gtest-port.h.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Windows CE doesn't have the remove C function.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint remove(const char* path) {
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LPCWSTR wpath = String::AnsiToUtf16(path);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ret = DeleteFile(wpath) ? 0 : -1;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete [] wpath;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ret;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Windows CE doesn't have the _rmdir C function.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint _rmdir(const char* path) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath filepath(path);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LPCWSTR wpath = String::AnsiToUtf16(
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      filepath.RemoveTrailingPathSeparator().c_str());
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ret = RemoveDirectory(wpath) ? 0 : -1;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete [] wpath;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ret;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GetCurrentDirTest, ReturnsCurrentDir) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath original_dir = FilePath::GetCurrentDir();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(original_dir.IsEmpty());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  posix::ChDir(GTEST_PATH_SEP_);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath cwd = FilePath::GetCurrentDir();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  posix::ChDir(original_dir.c_str());
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_OS_WINDOWS
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Skips the ":".
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(cwd_without_drive != NULL);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# else
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_, cwd.c_str());
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS_MOBILE
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("").IsEmpty());
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(NULL).IsEmpty());
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("a").IsEmpty());
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath(".").IsEmpty());
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("a/b").IsEmpty());
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "" -> ""
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, WhenEmptyName) {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", FilePath("").RemoveDirectoryName().c_str());
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "afile" -> "afile"
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, ButNoDirectory) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("afile").RemoveDirectoryName().c_str());
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "/afile" -> "afile"
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "adir/" -> ""
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("",
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().c_str());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "adir/afile" -> "afile"
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName "adir/subdir/afile" -> "afile"
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RemoveDirectoryName().c_str());
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_ALT_PATH_SEP_
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that RemoveDirectoryName() works with the alternate separator
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// on Windows.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName("/afile") -> "afile"
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("/afile").RemoveDirectoryName().c_str());
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName("adir/") -> ""
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("",
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/").RemoveDirectoryName().c_str());
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName("adir/afile") -> "afile"
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/afile").RemoveDirectoryName().c_str());
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveDirectoryName("adir/subdir/afile") -> "afile"
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("afile",
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/subdir/afile").RemoveDirectoryName().c_str());
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName "" -> "./"
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, EmptyName) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS_MOBILE
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On Windows CE, we use the root as the current directory.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("").RemoveFileName().c_str());
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("." GTEST_PATH_SEP_,
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("").RemoveFileName().c_str());
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName "adir/" -> "adir/"
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, ButNoFile) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().c_str());
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName "adir/afile" -> "adir/"
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesDirName) {
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_ "afile")
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RemoveFileName().c_str());
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesDirAndSubDirName) {
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RemoveFileName().c_str());
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName "/afile" -> "/"
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesRootDir) {
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_,
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().c_str());
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_ALT_PATH_SEP_
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that RemoveFileName() works with the alternate separator on
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Windows.
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName("adir/") -> "adir/"
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/").RemoveFileName().c_str());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName("adir/afile") -> "adir/"
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_,
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/afile").RemoveFileName().c_str());
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("adir/subdir/afile").RemoveFileName().c_str());
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveFileName("/afile") -> "\"
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_,
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("/afile").RemoveFileName().c_str());
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      0, "xml");
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      12, "xml");
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("bar"), 0, "xml");
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("bar"), 12, "xml");
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      0, "xml");
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("bar.xml", actual.c_str());
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      14, "xml");
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("bar_14.xml", actual.c_str());
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath("bar.xml"));
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath("bar.xml"));
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, Path1BeingEmpty) {
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath(""),
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath("bar.xml"));
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("bar.xml", actual.c_str());
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, Path2BeingEmpty) {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(""));
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_, actual.c_str());
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, BothPathBeingEmpty) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath(""),
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(""));
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", actual.c_str());
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, Path1ContainsPathSep) {
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath("foobar.xml"));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               actual.c_str());
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, Path2ContainsPathSep) {
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("foo" GTEST_PATH_SEP_),
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               actual.c_str());
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ConcatPathsTest, Path2EndsWithPathSep) {
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath("bar" GTEST_PATH_SEP_));
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.c_str());
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveTrailingPathSeparator "" -> ""
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveTrailingPathSeparatorTest, EmptyString) {
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("",
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("").RemoveTrailingPathSeparator().c_str());
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveTrailingPathSeparator "foo" -> "foo"
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo",
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("foo").RemoveTrailingPathSeparator().c_str());
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveTrailingPathSeparator "foo/" -> "foo"
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "foo",
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().c_str());
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_ALT_PATH_SEP_
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo",
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo/").RemoveTrailingPathSeparator().c_str());
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               .RemoveTrailingPathSeparator().c_str());
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ "bar")
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               .RemoveTrailingPathSeparator().c_str());
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DirectoryTest, RootDirectoryExists) {
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS  // We are on Windows.
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char current_drive[_MAX_PATH];  // NOLINT
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_drive[1] = ':';
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_drive[2] = '\\';
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_drive[3] = '\0';
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("/").DirectoryExists());
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int saved_drive_ = _getdrive();
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (char drive = 'Z'; drive >= 'A'; drive--)
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (_chdrive(drive - 'A' + 1) == -1) {
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      char non_drive[_MAX_PATH];  // NOLINT
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      non_drive[0] = drive;
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      non_drive[1] = ':';
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      non_drive[2] = '\\';
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      non_drive[3] = '\0';
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  _chdrive(saved_drive_);
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_WINDOWS_MOBILE
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Windows CE _does_ consider an empty directory to exist.
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("").DirectoryExists());
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !GTEST_OS_WINDOWS_MOBILE
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DirectoryTest, CurrentDirectoryExists) {
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS  // We are on Windows.
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(".").DirectoryExists());
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // _WIN32_CE
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(".").DirectoryExists());
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("./").DirectoryExists());
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NormalizeTest, NullStringsEqualEmptyDirectory) {
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", FilePath(NULL).c_str());
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", FilePath(String(NULL)).c_str());
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "foo/bar" == foo//bar" == "foo///bar"
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ "bar").c_str());
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        GTEST_PATH_SEP_ "bar").c_str());
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "/bar" == //bar" == "///bar"
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath(GTEST_PATH_SEP_ "bar").c_str());
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "foo/" == foo//" == "foo///"
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath("foo" GTEST_PATH_SEP_).c_str());
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_ALT_PATH_SEP_
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that separators at the end of the string are normalized
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// regardless of their combination (e.g. "foo\" =="foo/\" ==
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "foo\\/").
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo/").c_str());
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo" GTEST_PATH_SEP_ "/").c_str());
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("foo" GTEST_PATH_SEP_,
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               FilePath("foo//" GTEST_PATH_SEP_).c_str());
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath default_path;
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath non_default_path("path");
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  non_default_path = default_path;
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", non_default_path.c_str());
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", default_path.c_str());  // RHS var is unchanged.
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath non_default_path("path");
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath default_path;
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_path = non_default_path;
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("path", default_path.c_str());
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("path", non_default_path.c_str());  // RHS var is unchanged.
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath const_default_path("const_path");
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath non_default_path("path");
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  non_default_path = const_default_path;
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("const_path", non_default_path.c_str());
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DirectoryCreationTest : public Test {
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    testdata_path_.Set(FilePath(String::Format("%s%s%s",
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        TempDir().c_str(), GetCurrentExecutableName().c_str(),
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_)));
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        0, "txt"));
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        1, "txt"));
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(testdata_file_.c_str());
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(unique_file0_.c_str());
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(unique_file1_.c_str());
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    posix::RmDir(testdata_path_.c_str());
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(testdata_file_.c_str());
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(unique_file0_.c_str());
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    remove(unique_file1_.c_str());
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    posix::RmDir(testdata_path_.c_str());
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  String TempDir() const {
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS_MOBILE
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return String("\\temp\\");
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif GTEST_OS_WINDOWS
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const char* temp_dir = posix::GetEnv("TEMP");
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (temp_dir == NULL || temp_dir[0] == '\0')
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return String("\\temp\\");
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    else if (String(temp_dir).EndsWith("\\"))
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return String(temp_dir);
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    else
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return String::Format("%s\\", temp_dir);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return String("/tmp/");
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS_MOBILE
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateTextFile(const char* filename) {
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FILE* f = posix::FOpen(filename, "w");
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    fprintf(f, "text\n");
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    fclose(f);
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Strings representing a directory and a file, with identical paths
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // except for the trailing separator character that distinquishes
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a directory named 'test' from a file named 'test'. Example names:
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath testdata_file_;  // "/tmp/directory_creation/test"
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(testdata_path_.DirectoryExists());
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Call 'create' again... should still succeed.
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("unique"), "txt"));
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(unique_file0_.c_str(), file_path.c_str());
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  testdata_path_.CreateDirectoriesRecursively();
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_path.c_str());
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_path.FileOrDirectoryExists());
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FilePath("unique"), "txt"));
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ(unique_file1_.c_str(), file_path2.c_str());
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_path2.c_str());
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // force a failure by putting a file where we will try to create a directory.
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(testdata_file_.c_str());
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(testdata_file_.DirectoryExists());
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath test_detail_xml("test_detail.xml");
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, DefaultConstructor) {
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath fp;
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", fp.c_str());
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, CharAndCopyConstructors) {
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath fp("spicy");
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("spicy", fp.c_str());
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath fp_copy(fp);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("spicy", fp_copy.c_str());
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, StringConstructor) {
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath fp(String("cider"));
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("cider", fp.c_str());
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, Set) {
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath apple("apple");
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath mac("mac");
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("apple", mac.c_str());
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("apple", apple.c_str());
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, ToString) {
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath file("drink");
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  String str(file.ToString());
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("drink", str.c_str());
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, RemoveExtension) {
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("app", FilePath("app.exe").RemoveExtension("exe").c_str());
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("APP", FilePath("APP.EXE").RemoveExtension("exe").c_str());
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("app", FilePath("app").RemoveExtension("exe").c_str());
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, IsDirectory) {
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("cola").IsDirectory());
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_ALT_PATH_SEP_
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("koala/").IsDirectory());
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, IsAbsolutePath) {
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("").IsAbsolutePath());
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              .IsAbsolutePath());
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FilePathTest, IsRootDirectory) {
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("").IsRootDirectory());
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("/").IsRootDirectory());
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(FilePath("//").IsRootDirectory());
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("").IsRootDirectory());
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
697