xref: /aosp_15_r20/external/libchrome/base/files/file_path_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <sstream>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "base/files/file_path.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
12*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
13*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*635a8641SAndroid Build Coastguard Worker #include "testing/platform_test.h"
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
17*635a8641SAndroid Build Coastguard Worker #include "base/test/scoped_locale.h"
18*635a8641SAndroid Build Coastguard Worker #endif
19*635a8641SAndroid Build Coastguard Worker 
20*635a8641SAndroid Build Coastguard Worker // This macro helps avoid wrapped lines in the test structs.
21*635a8641SAndroid Build Coastguard Worker #define FPL(x) FILE_PATH_LITERAL(x)
22*635a8641SAndroid Build Coastguard Worker 
23*635a8641SAndroid Build Coastguard Worker // This macro constructs strings which can contain NULs.
24*635a8641SAndroid Build Coastguard Worker #define FPS(x) FilePath::StringType(FPL(x), arraysize(FPL(x)) - 1)
25*635a8641SAndroid Build Coastguard Worker 
26*635a8641SAndroid Build Coastguard Worker namespace base {
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker struct UnaryTestData {
29*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* input;
30*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* expected;
31*635a8641SAndroid Build Coastguard Worker };
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker struct UnaryBooleanTestData {
34*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* input;
35*635a8641SAndroid Build Coastguard Worker   bool expected;
36*635a8641SAndroid Build Coastguard Worker };
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker struct BinaryTestData {
39*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* inputs[2];
40*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* expected;
41*635a8641SAndroid Build Coastguard Worker };
42*635a8641SAndroid Build Coastguard Worker 
43*635a8641SAndroid Build Coastguard Worker struct BinaryBooleanTestData {
44*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* inputs[2];
45*635a8641SAndroid Build Coastguard Worker   bool expected;
46*635a8641SAndroid Build Coastguard Worker };
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker struct BinaryIntTestData {
49*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* inputs[2];
50*635a8641SAndroid Build Coastguard Worker   int expected;
51*635a8641SAndroid Build Coastguard Worker };
52*635a8641SAndroid Build Coastguard Worker 
53*635a8641SAndroid Build Coastguard Worker struct UTF8TestData {
54*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* native;
55*635a8641SAndroid Build Coastguard Worker   const char* utf8;
56*635a8641SAndroid Build Coastguard Worker };
57*635a8641SAndroid Build Coastguard Worker 
58*635a8641SAndroid Build Coastguard Worker // file_util winds up using autoreleased objects on the Mac, so this needs
59*635a8641SAndroid Build Coastguard Worker // to be a PlatformTest
60*635a8641SAndroid Build Coastguard Worker typedef PlatformTest FilePathTest;
61*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,DirName)62*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, DirName) {
63*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
64*635a8641SAndroid Build Coastguard Worker     { FPL(""),              FPL(".") },
65*635a8641SAndroid Build Coastguard Worker     { FPL("aa"),            FPL(".") },
66*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb"),        FPL("/aa") },
67*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb/"),       FPL("/aa") },
68*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb//"),      FPL("/aa") },
69*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb/ccc"),    FPL("/aa/bb") },
70*635a8641SAndroid Build Coastguard Worker     { FPL("/aa"),           FPL("/") },
71*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/"),          FPL("/") },
72*635a8641SAndroid Build Coastguard Worker     { FPL("/"),             FPL("/") },
73*635a8641SAndroid Build Coastguard Worker     { FPL("//"),            FPL("//") },
74*635a8641SAndroid Build Coastguard Worker     { FPL("///"),           FPL("/") },
75*635a8641SAndroid Build Coastguard Worker     { FPL("aa/"),           FPL(".") },
76*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb"),         FPL("aa") },
77*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb/"),        FPL("aa") },
78*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb//"),       FPL("aa") },
79*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb//"),      FPL("aa") },
80*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb/"),       FPL("aa") },
81*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb"),        FPL("aa") },
82*635a8641SAndroid Build Coastguard Worker     { FPL("//aa/bb"),       FPL("//aa") },
83*635a8641SAndroid Build Coastguard Worker     { FPL("//aa/"),         FPL("//") },
84*635a8641SAndroid Build Coastguard Worker     { FPL("//aa"),          FPL("//") },
85*635a8641SAndroid Build Coastguard Worker     { FPL("0:"),            FPL(".") },
86*635a8641SAndroid Build Coastguard Worker     { FPL("@:"),            FPL(".") },
87*635a8641SAndroid Build Coastguard Worker     { FPL("[:"),            FPL(".") },
88*635a8641SAndroid Build Coastguard Worker     { FPL("`:"),            FPL(".") },
89*635a8641SAndroid Build Coastguard Worker     { FPL("{:"),            FPL(".") },
90*635a8641SAndroid Build Coastguard Worker     { FPL("\xB3:"),         FPL(".") },
91*635a8641SAndroid Build Coastguard Worker     { FPL("\xC5:"),         FPL(".") },
92*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/../bb/cc"),  FPL("/aa/../bb")},
93*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
94*635a8641SAndroid Build Coastguard Worker     { FPL("\x0143:"),       FPL(".") },
95*635a8641SAndroid Build Coastguard Worker #endif  // OS_WIN
96*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
97*635a8641SAndroid Build Coastguard Worker     { FPL("c:"),            FPL("c:") },
98*635a8641SAndroid Build Coastguard Worker     { FPL("C:"),            FPL("C:") },
99*635a8641SAndroid Build Coastguard Worker     { FPL("A:"),            FPL("A:") },
100*635a8641SAndroid Build Coastguard Worker     { FPL("Z:"),            FPL("Z:") },
101*635a8641SAndroid Build Coastguard Worker     { FPL("a:"),            FPL("a:") },
102*635a8641SAndroid Build Coastguard Worker     { FPL("z:"),            FPL("z:") },
103*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa"),          FPL("c:") },
104*635a8641SAndroid Build Coastguard Worker     { FPL("c:/"),           FPL("c:/") },
105*635a8641SAndroid Build Coastguard Worker     { FPL("c://"),          FPL("c://") },
106*635a8641SAndroid Build Coastguard Worker     { FPL("c:///"),         FPL("c:/") },
107*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa"),         FPL("c:/") },
108*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa/"),        FPL("c:/") },
109*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa/bb"),      FPL("c:/aa") },
110*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa/bb"),       FPL("c:aa") },
111*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
112*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
113*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb"),      FPL("\\aa") },
114*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\"),    FPL("\\aa") },
115*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\\\"),  FPL("\\aa") },
116*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\ccc"), FPL("\\aa\\bb") },
117*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa"),          FPL("\\") },
118*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\"),        FPL("\\") },
119*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),            FPL("\\") },
120*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\"),          FPL("\\\\") },
121*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\\\"),        FPL("\\") },
122*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\"),          FPL(".") },
123*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb"),        FPL("aa") },
124*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb\\"),      FPL("aa") },
125*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb\\\\"),    FPL("aa") },
126*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb\\\\"),  FPL("aa") },
127*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb\\"),    FPL("aa") },
128*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb"),      FPL("aa") },
129*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa\\bb"),    FPL("\\\\aa") },
130*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa\\"),      FPL("\\\\") },
131*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa"),        FPL("\\\\") },
132*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\..\\bb\\c"), FPL("aa\\..\\bb")},
133*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
134*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),          FPL("c:\\") },
135*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\"),        FPL("c:\\\\") },
136*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\\\"),      FPL("c:\\") },
137*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa"),        FPL("c:\\") },
138*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa\\"),      FPL("c:\\") },
139*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa\\bb"),    FPL("c:\\aa") },
140*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa\\bb"),      FPL("c:aa") },
141*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
142*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
143*635a8641SAndroid Build Coastguard Worker   };
144*635a8641SAndroid Build Coastguard Worker 
145*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
146*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
147*635a8641SAndroid Build Coastguard Worker     FilePath observed = input.DirName();
148*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
149*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
150*635a8641SAndroid Build Coastguard Worker   }
151*635a8641SAndroid Build Coastguard Worker }
152*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,BaseName)153*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, BaseName) {
154*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
155*635a8641SAndroid Build Coastguard Worker     { FPL(""),              FPL("") },
156*635a8641SAndroid Build Coastguard Worker     { FPL("aa"),            FPL("aa") },
157*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb"),        FPL("bb") },
158*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb/"),       FPL("bb") },
159*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb//"),      FPL("bb") },
160*635a8641SAndroid Build Coastguard Worker     { FPL("/aa/bb/ccc"),    FPL("ccc") },
161*635a8641SAndroid Build Coastguard Worker     { FPL("/aa"),           FPL("aa") },
162*635a8641SAndroid Build Coastguard Worker     { FPL("/"),             FPL("/") },
163*635a8641SAndroid Build Coastguard Worker     { FPL("//"),            FPL("//") },
164*635a8641SAndroid Build Coastguard Worker     { FPL("///"),           FPL("/") },
165*635a8641SAndroid Build Coastguard Worker     { FPL("aa/"),           FPL("aa") },
166*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb"),         FPL("bb") },
167*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb/"),        FPL("bb") },
168*635a8641SAndroid Build Coastguard Worker     { FPL("aa/bb//"),       FPL("bb") },
169*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb//"),      FPL("bb") },
170*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb/"),       FPL("bb") },
171*635a8641SAndroid Build Coastguard Worker     { FPL("aa//bb"),        FPL("bb") },
172*635a8641SAndroid Build Coastguard Worker     { FPL("//aa/bb"),       FPL("bb") },
173*635a8641SAndroid Build Coastguard Worker     { FPL("//aa/"),         FPL("aa") },
174*635a8641SAndroid Build Coastguard Worker     { FPL("//aa"),          FPL("aa") },
175*635a8641SAndroid Build Coastguard Worker     { FPL("0:"),            FPL("0:") },
176*635a8641SAndroid Build Coastguard Worker     { FPL("@:"),            FPL("@:") },
177*635a8641SAndroid Build Coastguard Worker     { FPL("[:"),            FPL("[:") },
178*635a8641SAndroid Build Coastguard Worker     { FPL("`:"),            FPL("`:") },
179*635a8641SAndroid Build Coastguard Worker     { FPL("{:"),            FPL("{:") },
180*635a8641SAndroid Build Coastguard Worker     { FPL("\xB3:"),         FPL("\xB3:") },
181*635a8641SAndroid Build Coastguard Worker     { FPL("\xC5:"),         FPL("\xC5:") },
182*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
183*635a8641SAndroid Build Coastguard Worker     { FPL("\x0143:"),       FPL("\x0143:") },
184*635a8641SAndroid Build Coastguard Worker #endif  // OS_WIN
185*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
186*635a8641SAndroid Build Coastguard Worker     { FPL("c:"),            FPL("") },
187*635a8641SAndroid Build Coastguard Worker     { FPL("C:"),            FPL("") },
188*635a8641SAndroid Build Coastguard Worker     { FPL("A:"),            FPL("") },
189*635a8641SAndroid Build Coastguard Worker     { FPL("Z:"),            FPL("") },
190*635a8641SAndroid Build Coastguard Worker     { FPL("a:"),            FPL("") },
191*635a8641SAndroid Build Coastguard Worker     { FPL("z:"),            FPL("") },
192*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa"),          FPL("aa") },
193*635a8641SAndroid Build Coastguard Worker     { FPL("c:/"),           FPL("/") },
194*635a8641SAndroid Build Coastguard Worker     { FPL("c://"),          FPL("//") },
195*635a8641SAndroid Build Coastguard Worker     { FPL("c:///"),         FPL("/") },
196*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa"),         FPL("aa") },
197*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa/"),        FPL("aa") },
198*635a8641SAndroid Build Coastguard Worker     { FPL("c:/aa/bb"),      FPL("bb") },
199*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa/bb"),       FPL("bb") },
200*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
201*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
202*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb"),      FPL("bb") },
203*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\"),    FPL("bb") },
204*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\\\"),  FPL("bb") },
205*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa\\bb\\ccc"), FPL("ccc") },
206*635a8641SAndroid Build Coastguard Worker     { FPL("\\aa"),          FPL("aa") },
207*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),            FPL("\\") },
208*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\"),          FPL("\\\\") },
209*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\\\"),        FPL("\\") },
210*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\"),          FPL("aa") },
211*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb"),        FPL("bb") },
212*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb\\"),      FPL("bb") },
213*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\bb\\\\"),    FPL("bb") },
214*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb\\\\"),  FPL("bb") },
215*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb\\"),    FPL("bb") },
216*635a8641SAndroid Build Coastguard Worker     { FPL("aa\\\\bb"),      FPL("bb") },
217*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa\\bb"),    FPL("bb") },
218*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa\\"),      FPL("aa") },
219*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\aa"),        FPL("aa") },
220*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
221*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),          FPL("\\") },
222*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\"),        FPL("\\\\") },
223*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\\\"),      FPL("\\") },
224*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa"),        FPL("aa") },
225*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa\\"),      FPL("aa") },
226*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\aa\\bb"),    FPL("bb") },
227*635a8641SAndroid Build Coastguard Worker     { FPL("c:aa\\bb"),      FPL("bb") },
228*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
229*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
230*635a8641SAndroid Build Coastguard Worker   };
231*635a8641SAndroid Build Coastguard Worker 
232*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
233*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
234*635a8641SAndroid Build Coastguard Worker     FilePath observed = input.BaseName();
235*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
236*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
237*635a8641SAndroid Build Coastguard Worker   }
238*635a8641SAndroid Build Coastguard Worker }
239*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,Append)240*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, Append) {
241*635a8641SAndroid Build Coastguard Worker   const struct BinaryTestData cases[] = {
242*635a8641SAndroid Build Coastguard Worker     { { FPL(""),           FPL("cc") }, FPL("cc") },
243*635a8641SAndroid Build Coastguard Worker     { { FPL("."),          FPL("ff") }, FPL("ff") },
244*635a8641SAndroid Build Coastguard Worker     { { FPL("."),          FPL("") },   FPL(".") },
245*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),          FPL("cc") }, FPL("/cc") },
246*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa"),        FPL("") },   FPL("/aa") },
247*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa/"),       FPL("") },   FPL("/aa") },
248*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa"),       FPL("") },   FPL("//aa") },
249*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa/"),      FPL("") },   FPL("//aa") },
250*635a8641SAndroid Build Coastguard Worker     { { FPL("//"),         FPL("aa") }, FPL("//aa") },
251*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
252*635a8641SAndroid Build Coastguard Worker     { { FPL("c:"),         FPL("a") },  FPL("c:a") },
253*635a8641SAndroid Build Coastguard Worker     { { FPL("c:"),         FPL("") },   FPL("c:") },
254*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),        FPL("a") },  FPL("c:/a") },
255*635a8641SAndroid Build Coastguard Worker     { { FPL("c://"),       FPL("a") },  FPL("c://a") },
256*635a8641SAndroid Build Coastguard Worker     { { FPL("c:///"),      FPL("a") },  FPL("c:/a") },
257*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
258*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
259*635a8641SAndroid Build Coastguard Worker     // Append introduces the default separator character, so these test cases
260*635a8641SAndroid Build Coastguard Worker     // need to be defined with different expected results on platforms that use
261*635a8641SAndroid Build Coastguard Worker     // different default separator characters.
262*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),         FPL("cc") }, FPL("\\cc") },
263*635a8641SAndroid Build Coastguard Worker     { { FPL("\\aa"),       FPL("") },   FPL("\\aa") },
264*635a8641SAndroid Build Coastguard Worker     { { FPL("\\aa\\"),     FPL("") },   FPL("\\aa") },
265*635a8641SAndroid Build Coastguard Worker     { { FPL("\\\\aa"),     FPL("") },   FPL("\\\\aa") },
266*635a8641SAndroid Build Coastguard Worker     { { FPL("\\\\aa\\"),   FPL("") },   FPL("\\\\aa") },
267*635a8641SAndroid Build Coastguard Worker     { { FPL("\\\\"),       FPL("aa") }, FPL("\\\\aa") },
268*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa/bb"),     FPL("cc") }, FPL("/aa/bb\\cc") },
269*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa/bb/"),    FPL("cc") }, FPL("/aa/bb\\cc") },
270*635a8641SAndroid Build Coastguard Worker     { { FPL("aa/bb/"),     FPL("cc") }, FPL("aa/bb\\cc") },
271*635a8641SAndroid Build Coastguard Worker     { { FPL("aa/bb"),      FPL("cc") }, FPL("aa/bb\\cc") },
272*635a8641SAndroid Build Coastguard Worker     { { FPL("a/b"),        FPL("c") },  FPL("a/b\\c") },
273*635a8641SAndroid Build Coastguard Worker     { { FPL("a/b/"),       FPL("c") },  FPL("a/b\\c") },
274*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa"),       FPL("bb") }, FPL("//aa\\bb") },
275*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa/"),      FPL("bb") }, FPL("//aa\\bb") },
276*635a8641SAndroid Build Coastguard Worker     { { FPL("\\aa\\bb"),   FPL("cc") }, FPL("\\aa\\bb\\cc") },
277*635a8641SAndroid Build Coastguard Worker     { { FPL("\\aa\\bb\\"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
278*635a8641SAndroid Build Coastguard Worker     { { FPL("aa\\bb\\"),   FPL("cc") }, FPL("aa\\bb\\cc") },
279*635a8641SAndroid Build Coastguard Worker     { { FPL("aa\\bb"),     FPL("cc") }, FPL("aa\\bb\\cc") },
280*635a8641SAndroid Build Coastguard Worker     { { FPL("a\\b"),       FPL("c") },  FPL("a\\b\\c") },
281*635a8641SAndroid Build Coastguard Worker     { { FPL("a\\b\\"),     FPL("c") },  FPL("a\\b\\c") },
282*635a8641SAndroid Build Coastguard Worker     { { FPL("\\\\aa"),     FPL("bb") }, FPL("\\\\aa\\bb") },
283*635a8641SAndroid Build Coastguard Worker     { { FPL("\\\\aa\\"),   FPL("bb") }, FPL("\\\\aa\\bb") },
284*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
285*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\"),       FPL("a") },  FPL("c:\\a") },
286*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\\\"),     FPL("a") },  FPL("c:\\\\a") },
287*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\\\\\"),   FPL("a") },  FPL("c:\\a") },
288*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\"),       FPL("") },   FPL("c:\\") },
289*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\a"),      FPL("b") },  FPL("c:\\a\\b") },
290*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\a\\"),    FPL("b") },  FPL("c:\\a\\b") },
291*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
292*635a8641SAndroid Build Coastguard Worker #else  // FILE_PATH_USES_WIN_SEPARATORS
293*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa/bb"),     FPL("cc") }, FPL("/aa/bb/cc") },
294*635a8641SAndroid Build Coastguard Worker     { { FPL("/aa/bb/"),    FPL("cc") }, FPL("/aa/bb/cc") },
295*635a8641SAndroid Build Coastguard Worker     { { FPL("aa/bb/"),     FPL("cc") }, FPL("aa/bb/cc") },
296*635a8641SAndroid Build Coastguard Worker     { { FPL("aa/bb"),      FPL("cc") }, FPL("aa/bb/cc") },
297*635a8641SAndroid Build Coastguard Worker     { { FPL("a/b"),        FPL("c") },  FPL("a/b/c") },
298*635a8641SAndroid Build Coastguard Worker     { { FPL("a/b/"),       FPL("c") },  FPL("a/b/c") },
299*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa"),       FPL("bb") }, FPL("//aa/bb") },
300*635a8641SAndroid Build Coastguard Worker     { { FPL("//aa/"),      FPL("bb") }, FPL("//aa/bb") },
301*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
302*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),        FPL("a") },  FPL("c:/a") },
303*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),        FPL("") },   FPL("c:/") },
304*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/a"),       FPL("b") },  FPL("c:/a/b") },
305*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/a/"),      FPL("b") },  FPL("c:/a/b") },
306*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
307*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
308*635a8641SAndroid Build Coastguard Worker   };
309*635a8641SAndroid Build Coastguard Worker 
310*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
311*635a8641SAndroid Build Coastguard Worker     FilePath root(cases[i].inputs[0]);
312*635a8641SAndroid Build Coastguard Worker     FilePath::StringType leaf(cases[i].inputs[1]);
313*635a8641SAndroid Build Coastguard Worker     FilePath observed_str = root.Append(leaf);
314*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
315*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
316*635a8641SAndroid Build Coastguard Worker     FilePath observed_path = root.Append(FilePath(leaf));
317*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_path.value()) <<
318*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
319*635a8641SAndroid Build Coastguard Worker 
320*635a8641SAndroid Build Coastguard Worker     // TODO(erikkay): It would be nice to have a unicode test append value to
321*635a8641SAndroid Build Coastguard Worker     // handle the case when AppendASCII is passed UTF8
322*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
323*635a8641SAndroid Build Coastguard Worker     std::string ascii = WideToUTF8(leaf);
324*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
325*635a8641SAndroid Build Coastguard Worker     std::string ascii = leaf;
326*635a8641SAndroid Build Coastguard Worker #endif
327*635a8641SAndroid Build Coastguard Worker     observed_str = root.AppendASCII(ascii);
328*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
329*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
330*635a8641SAndroid Build Coastguard Worker   }
331*635a8641SAndroid Build Coastguard Worker }
332*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,StripTrailingSeparators)333*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, StripTrailingSeparators) {
334*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
335*635a8641SAndroid Build Coastguard Worker     { FPL(""),              FPL("") },
336*635a8641SAndroid Build Coastguard Worker     { FPL("/"),             FPL("/") },
337*635a8641SAndroid Build Coastguard Worker     { FPL("//"),            FPL("//") },
338*635a8641SAndroid Build Coastguard Worker     { FPL("///"),           FPL("/") },
339*635a8641SAndroid Build Coastguard Worker     { FPL("////"),          FPL("/") },
340*635a8641SAndroid Build Coastguard Worker     { FPL("a/"),            FPL("a") },
341*635a8641SAndroid Build Coastguard Worker     { FPL("a//"),           FPL("a") },
342*635a8641SAndroid Build Coastguard Worker     { FPL("a///"),          FPL("a") },
343*635a8641SAndroid Build Coastguard Worker     { FPL("a////"),         FPL("a") },
344*635a8641SAndroid Build Coastguard Worker     { FPL("/a"),            FPL("/a") },
345*635a8641SAndroid Build Coastguard Worker     { FPL("/a/"),           FPL("/a") },
346*635a8641SAndroid Build Coastguard Worker     { FPL("/a//"),          FPL("/a") },
347*635a8641SAndroid Build Coastguard Worker     { FPL("/a///"),         FPL("/a") },
348*635a8641SAndroid Build Coastguard Worker     { FPL("/a////"),        FPL("/a") },
349*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
350*635a8641SAndroid Build Coastguard Worker     { FPL("c:"),            FPL("c:") },
351*635a8641SAndroid Build Coastguard Worker     { FPL("c:/"),           FPL("c:/") },
352*635a8641SAndroid Build Coastguard Worker     { FPL("c://"),          FPL("c://") },
353*635a8641SAndroid Build Coastguard Worker     { FPL("c:///"),         FPL("c:/") },
354*635a8641SAndroid Build Coastguard Worker     { FPL("c:////"),        FPL("c:/") },
355*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a"),          FPL("c:/a") },
356*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a/"),         FPL("c:/a") },
357*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a//"),        FPL("c:/a") },
358*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a///"),       FPL("c:/a") },
359*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a////"),      FPL("c:/a") },
360*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
361*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
362*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),            FPL("\\") },
363*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\"),          FPL("\\\\") },
364*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\\\"),        FPL("\\") },
365*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\\\\\"),      FPL("\\") },
366*635a8641SAndroid Build Coastguard Worker     { FPL("a\\"),           FPL("a") },
367*635a8641SAndroid Build Coastguard Worker     { FPL("a\\\\"),         FPL("a") },
368*635a8641SAndroid Build Coastguard Worker     { FPL("a\\\\\\"),       FPL("a") },
369*635a8641SAndroid Build Coastguard Worker     { FPL("a\\\\\\\\"),     FPL("a") },
370*635a8641SAndroid Build Coastguard Worker     { FPL("\\a"),           FPL("\\a") },
371*635a8641SAndroid Build Coastguard Worker     { FPL("\\a\\"),         FPL("\\a") },
372*635a8641SAndroid Build Coastguard Worker     { FPL("\\a\\\\"),       FPL("\\a") },
373*635a8641SAndroid Build Coastguard Worker     { FPL("\\a\\\\\\"),     FPL("\\a") },
374*635a8641SAndroid Build Coastguard Worker     { FPL("\\a\\\\\\\\"),   FPL("\\a") },
375*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
376*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),          FPL("c:\\") },
377*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\"),        FPL("c:\\\\") },
378*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\\\"),      FPL("c:\\") },
379*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\\\\\\\"),    FPL("c:\\") },
380*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a"),         FPL("c:\\a") },
381*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a\\"),       FPL("c:\\a") },
382*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a\\\\"),     FPL("c:\\a") },
383*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a\\\\\\"),   FPL("c:\\a") },
384*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a\\\\\\\\"), FPL("c:\\a") },
385*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
386*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
387*635a8641SAndroid Build Coastguard Worker   };
388*635a8641SAndroid Build Coastguard Worker 
389*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
390*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
391*635a8641SAndroid Build Coastguard Worker     FilePath observed = input.StripTrailingSeparators();
392*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
393*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
394*635a8641SAndroid Build Coastguard Worker   }
395*635a8641SAndroid Build Coastguard Worker }
396*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,IsAbsolute)397*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, IsAbsolute) {
398*635a8641SAndroid Build Coastguard Worker   const struct UnaryBooleanTestData cases[] = {
399*635a8641SAndroid Build Coastguard Worker     { FPL(""),       false },
400*635a8641SAndroid Build Coastguard Worker     { FPL("a"),      false },
401*635a8641SAndroid Build Coastguard Worker     { FPL("c:"),     false },
402*635a8641SAndroid Build Coastguard Worker     { FPL("c:a"),    false },
403*635a8641SAndroid Build Coastguard Worker     { FPL("a/b"),    false },
404*635a8641SAndroid Build Coastguard Worker     { FPL("//"),     true },
405*635a8641SAndroid Build Coastguard Worker     { FPL("//a"),    true },
406*635a8641SAndroid Build Coastguard Worker     { FPL("c:a/b"),  false },
407*635a8641SAndroid Build Coastguard Worker     { FPL("?:/a"),   false },
408*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
409*635a8641SAndroid Build Coastguard Worker     { FPL("/"),      false },
410*635a8641SAndroid Build Coastguard Worker     { FPL("/a"),     false },
411*635a8641SAndroid Build Coastguard Worker     { FPL("/."),     false },
412*635a8641SAndroid Build Coastguard Worker     { FPL("/.."),    false },
413*635a8641SAndroid Build Coastguard Worker     { FPL("c:/"),    true },
414*635a8641SAndroid Build Coastguard Worker     { FPL("c:/a"),   true },
415*635a8641SAndroid Build Coastguard Worker     { FPL("c:/."),   true },
416*635a8641SAndroid Build Coastguard Worker     { FPL("c:/.."),  true },
417*635a8641SAndroid Build Coastguard Worker     { FPL("C:/a"),   true },
418*635a8641SAndroid Build Coastguard Worker     { FPL("d:/a"),   true },
419*635a8641SAndroid Build Coastguard Worker #else  // FILE_PATH_USES_DRIVE_LETTERS
420*635a8641SAndroid Build Coastguard Worker     { FPL("/"),      true },
421*635a8641SAndroid Build Coastguard Worker     { FPL("/a"),     true },
422*635a8641SAndroid Build Coastguard Worker     { FPL("/."),     true },
423*635a8641SAndroid Build Coastguard Worker     { FPL("/.."),    true },
424*635a8641SAndroid Build Coastguard Worker     { FPL("c:/"),    false },
425*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
426*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
427*635a8641SAndroid Build Coastguard Worker     { FPL("a\\b"),   false },
428*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\"),   true },
429*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\a"),  true },
430*635a8641SAndroid Build Coastguard Worker     { FPL("a\\b"),   false },
431*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\"),   true },
432*635a8641SAndroid Build Coastguard Worker     { FPL("//a"),    true },
433*635a8641SAndroid Build Coastguard Worker     { FPL("c:a\\b"), false },
434*635a8641SAndroid Build Coastguard Worker     { FPL("?:\\a"),  false },
435*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
436*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),     false },
437*635a8641SAndroid Build Coastguard Worker     { FPL("\\a"),    false },
438*635a8641SAndroid Build Coastguard Worker     { FPL("\\."),    false },
439*635a8641SAndroid Build Coastguard Worker     { FPL("\\.."),   false },
440*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),   true },
441*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),   true },
442*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\a"),  true },
443*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\."),  true },
444*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\.."), true },
445*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a"),  true },
446*635a8641SAndroid Build Coastguard Worker     { FPL("d:\\a"),  true },
447*635a8641SAndroid Build Coastguard Worker #else  // FILE_PATH_USES_DRIVE_LETTERS
448*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),     true },
449*635a8641SAndroid Build Coastguard Worker     { FPL("\\a"),    true },
450*635a8641SAndroid Build Coastguard Worker     { FPL("\\."),    true },
451*635a8641SAndroid Build Coastguard Worker     { FPL("\\.."),   true },
452*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\"),   false },
453*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
454*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
455*635a8641SAndroid Build Coastguard Worker   };
456*635a8641SAndroid Build Coastguard Worker 
457*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
458*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
459*635a8641SAndroid Build Coastguard Worker     bool observed = input.IsAbsolute();
460*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, observed) <<
461*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
462*635a8641SAndroid Build Coastguard Worker   }
463*635a8641SAndroid Build Coastguard Worker }
464*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,PathComponentsTest)465*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, PathComponentsTest) {
466*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
467*635a8641SAndroid Build Coastguard Worker     { FPL("//foo/bar/baz/"),          FPL("|//|foo|bar|baz")},
468*635a8641SAndroid Build Coastguard Worker     { FPL("///"),                     FPL("|/")},
469*635a8641SAndroid Build Coastguard Worker     { FPL("/foo//bar//baz/"),         FPL("|/|foo|bar|baz")},
470*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz/"),           FPL("|/|foo|bar|baz")},
471*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz//"),          FPL("|/|foo|bar|baz")},
472*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz///"),         FPL("|/|foo|bar|baz")},
473*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz"),            FPL("|/|foo|bar|baz")},
474*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar.bot/baz.txt"),    FPL("|/|foo|bar.bot|baz.txt")},
475*635a8641SAndroid Build Coastguard Worker     { FPL("//foo//bar/baz"),          FPL("|//|foo|bar|baz")},
476*635a8641SAndroid Build Coastguard Worker     { FPL("/"),                       FPL("|/")},
477*635a8641SAndroid Build Coastguard Worker     { FPL("foo"),                     FPL("|foo")},
478*635a8641SAndroid Build Coastguard Worker     { FPL(""),                        FPL("")},
479*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
480*635a8641SAndroid Build Coastguard Worker     { FPL("e:/foo"),                  FPL("|e:|/|foo")},
481*635a8641SAndroid Build Coastguard Worker     { FPL("e:/"),                     FPL("|e:|/")},
482*635a8641SAndroid Build Coastguard Worker     { FPL("e:"),                      FPL("|e:")},
483*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
484*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
485*635a8641SAndroid Build Coastguard Worker     { FPL("../foo"),                  FPL("|..|foo")},
486*635a8641SAndroid Build Coastguard Worker     { FPL("./foo"),                   FPL("|foo")},
487*635a8641SAndroid Build Coastguard Worker     { FPL("../foo/bar/"),             FPL("|..|foo|bar") },
488*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\foo\\bar\\baz\\"),     FPL("|\\\\|foo|bar|baz")},
489*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\\\"),                  FPL("|\\")},
490*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\\\bar\\\\baz\\"),   FPL("|\\|foo|bar|baz")},
491*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar\\baz\\"),       FPL("|\\|foo|bar|baz")},
492*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar\\baz\\\\"),     FPL("|\\|foo|bar|baz")},
493*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar\\baz\\\\\\"),   FPL("|\\|foo|bar|baz")},
494*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar\\baz"),         FPL("|\\|foo|bar|baz")},
495*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar/baz\\\\\\"),    FPL("|\\|foo|bar|baz")},
496*635a8641SAndroid Build Coastguard Worker     { FPL("/foo\\bar\\baz"),          FPL("|/|foo|bar|baz")},
497*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar.bot\\baz.txt"), FPL("|\\|foo|bar.bot|baz.txt")},
498*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\foo\\\\bar\\baz"),     FPL("|\\\\|foo|bar|baz")},
499*635a8641SAndroid Build Coastguard Worker     { FPL("\\"),                      FPL("|\\")},
500*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
501*635a8641SAndroid Build Coastguard Worker   };
502*635a8641SAndroid Build Coastguard Worker 
503*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
504*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
505*635a8641SAndroid Build Coastguard Worker     std::vector<FilePath::StringType> comps;
506*635a8641SAndroid Build Coastguard Worker     input.GetComponents(&comps);
507*635a8641SAndroid Build Coastguard Worker 
508*635a8641SAndroid Build Coastguard Worker     FilePath::StringType observed;
509*635a8641SAndroid Build Coastguard Worker     for (size_t j = 0; j < comps.size(); ++j) {
510*635a8641SAndroid Build Coastguard Worker       observed.append(FILE_PATH_LITERAL("|"), 1);
511*635a8641SAndroid Build Coastguard Worker       observed.append(comps[j]);
512*635a8641SAndroid Build Coastguard Worker     }
513*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed) <<
514*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
515*635a8641SAndroid Build Coastguard Worker   }
516*635a8641SAndroid Build Coastguard Worker }
517*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,IsParentTest)518*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, IsParentTest) {
519*635a8641SAndroid Build Coastguard Worker   const struct BinaryBooleanTestData cases[] = {
520*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),             FPL("/foo/bar/baz") },      true},
521*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      true},
522*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/"),     FPL("/foo/bar/baz") },      true},
523*635a8641SAndroid Build Coastguard Worker     { { FPL("//foo/bar/"),    FPL("//foo/bar/baz") },     true},
524*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo2/bar/baz") },     false},
525*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar.txt"),  FPL("/foo/bar/baz") },      false},
526*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar2/baz") },     false},
527*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar") },          false},
528*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          false},
529*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar/baz") },       true},
530*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo2/bar/baz") },      false},
531*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar2/baz") },      false},
532*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("foo") },               false},
533*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
534*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo/bar/baz") },    true},
535*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/foo/bar"),    FPL("e:/foo/bar/baz") },    true},
536*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/bar/baz") },    true},
537*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar/baz") },    false},
538*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar/baz") },    false},
539*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),           FPL("c:/foo/bar/baz") },    true},
540*635a8641SAndroid Build Coastguard Worker     { { FPL("c:"),            FPL("c:/foo/bar/baz") },    true},
541*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("d:/foo/bar/baz") },    false},
542*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("D:/foo/bar/baz") },    false},
543*635a8641SAndroid Build Coastguard Worker     { { FPL("C:/foo/bar"),    FPL("d:/foo/bar/baz") },    false},
544*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar/baz") },   false},
545*635a8641SAndroid Build Coastguard Worker     { { FPL("e:/foo/bar"),    FPL("E:/foo2/bar/baz") },   false},
546*635a8641SAndroid Build Coastguard Worker     { { FPL("F:/foo/bar"),    FPL("f:/foo2/bar/baz") },   false},
547*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo/bar2/baz") },   false},
548*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
549*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
550*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar\\baz") },   true},
551*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo\\bar\\baz") },   true},
552*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo/bar/baz") },     true},
553*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),            FPL("\\foo\\bar\\baz") },   true},
554*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("\\foo\\bar\\baz") },   false},
555*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar\\baz") },  false},
556*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2\\baz") },  false},
557*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
558*635a8641SAndroid Build Coastguard Worker   };
559*635a8641SAndroid Build Coastguard Worker 
560*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
561*635a8641SAndroid Build Coastguard Worker     FilePath parent(cases[i].inputs[0]);
562*635a8641SAndroid Build Coastguard Worker     FilePath child(cases[i].inputs[1]);
563*635a8641SAndroid Build Coastguard Worker 
564*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(parent.IsParent(child), cases[i].expected) <<
565*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", parent: " << parent.value() << ", child: " <<
566*635a8641SAndroid Build Coastguard Worker         child.value();
567*635a8641SAndroid Build Coastguard Worker   }
568*635a8641SAndroid Build Coastguard Worker }
569*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,AppendRelativePathTest)570*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, AppendRelativePathTest) {
571*635a8641SAndroid Build Coastguard Worker   const struct BinaryTestData cases[] = {
572*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
573*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),             FPL("/foo/bar/baz") },      FPL("foo\\bar\\baz")},
574*635a8641SAndroid Build Coastguard Worker #else  // FILE_PATH_USES_WIN_SEPARATORS
575*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),             FPL("/foo/bar/baz") },      FPL("foo/bar/baz")},
576*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
577*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      FPL("baz")},
578*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/"),     FPL("/foo/bar/baz") },      FPL("baz")},
579*635a8641SAndroid Build Coastguard Worker     { { FPL("//foo/bar/"),    FPL("//foo/bar/baz") },     FPL("baz")},
580*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo2/bar/baz") },     FPL("")},
581*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar.txt"),  FPL("/foo/bar/baz") },      FPL("")},
582*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar2/baz") },     FPL("")},
583*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar") },          FPL("")},
584*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          FPL("")},
585*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar/baz") },       FPL("baz")},
586*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo2/bar/baz") },      FPL("")},
587*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar2/baz") },      FPL("")},
588*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("foo") },               FPL("")},
589*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
590*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo/bar/baz") },    FPL("baz")},
591*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/foo/bar"),    FPL("e:/foo/bar/baz") },    FPL("baz")},
592*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/bar/baz") },    FPL("baz")},
593*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar/baz") },    FPL("")},
594*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar/baz") },    FPL("")},
595*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
596*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),           FPL("c:/foo/bar/baz") },    FPL("foo\\bar\\baz")},
597*635a8641SAndroid Build Coastguard Worker     // TODO(akalin): Figure out how to handle the corner case in the
598*635a8641SAndroid Build Coastguard Worker     // commented-out test case below.  Appending to an empty path gives
599*635a8641SAndroid Build Coastguard Worker     // /foo\bar\baz but appending to a nonempty path "blah" gives
600*635a8641SAndroid Build Coastguard Worker     // blah\foo\bar\baz.
601*635a8641SAndroid Build Coastguard Worker     // { { FPL("c:"),            FPL("c:/foo/bar/baz") }, FPL("foo\\bar\\baz")},
602*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
603*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("d:/foo/bar/baz") },    FPL("")},
604*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("D:/foo/bar/baz") },    FPL("")},
605*635a8641SAndroid Build Coastguard Worker     { { FPL("C:/foo/bar"),    FPL("d:/foo/bar/baz") },    FPL("")},
606*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar/baz") },   FPL("")},
607*635a8641SAndroid Build Coastguard Worker     { { FPL("e:/foo/bar"),    FPL("E:/foo2/bar/baz") },   FPL("")},
608*635a8641SAndroid Build Coastguard Worker     { { FPL("F:/foo/bar"),    FPL("f:/foo2/bar/baz") },   FPL("")},
609*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo/bar2/baz") },   FPL("")},
610*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
611*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
612*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar\\baz") },   FPL("baz")},
613*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo\\bar\\baz") },   FPL("baz")},
614*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo/bar/baz") },     FPL("baz")},
615*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),            FPL("\\foo\\bar\\baz") },   FPL("foo\\bar\\baz")},
616*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("\\foo\\bar\\baz") },   FPL("")},
617*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar\\baz") },  FPL("")},
618*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2\\baz") },  FPL("")},
619*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
620*635a8641SAndroid Build Coastguard Worker   };
621*635a8641SAndroid Build Coastguard Worker 
622*635a8641SAndroid Build Coastguard Worker   const FilePath base(FPL("blah"));
623*635a8641SAndroid Build Coastguard Worker 
624*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
625*635a8641SAndroid Build Coastguard Worker     FilePath parent(cases[i].inputs[0]);
626*635a8641SAndroid Build Coastguard Worker     FilePath child(cases[i].inputs[1]);
627*635a8641SAndroid Build Coastguard Worker     {
628*635a8641SAndroid Build Coastguard Worker       FilePath result;
629*635a8641SAndroid Build Coastguard Worker       bool success = parent.AppendRelativePath(child, &result);
630*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
631*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", parent: " << parent.value() << ", child: " <<
632*635a8641SAndroid Build Coastguard Worker         child.value();
633*635a8641SAndroid Build Coastguard Worker       EXPECT_STREQ(cases[i].expected, result.value().c_str()) <<
634*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", parent: " << parent.value() << ", child: " <<
635*635a8641SAndroid Build Coastguard Worker         child.value();
636*635a8641SAndroid Build Coastguard Worker     }
637*635a8641SAndroid Build Coastguard Worker     {
638*635a8641SAndroid Build Coastguard Worker       FilePath result(base);
639*635a8641SAndroid Build Coastguard Worker       bool success = parent.AppendRelativePath(child, &result);
640*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
641*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", parent: " << parent.value() << ", child: " <<
642*635a8641SAndroid Build Coastguard Worker         child.value();
643*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(base.Append(cases[i].expected).value(), result.value()) <<
644*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", parent: " << parent.value() << ", child: " <<
645*635a8641SAndroid Build Coastguard Worker         child.value();
646*635a8641SAndroid Build Coastguard Worker     }
647*635a8641SAndroid Build Coastguard Worker   }
648*635a8641SAndroid Build Coastguard Worker }
649*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,EqualityTest)650*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, EqualityTest) {
651*635a8641SAndroid Build Coastguard Worker   const struct BinaryBooleanTestData cases[] = {
652*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/baz"),  FPL("/foo/bar/baz") },      true},
653*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      false},
654*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          false},
655*635a8641SAndroid Build Coastguard Worker     { { FPL("//foo/bar/"),    FPL("//foo/bar/") },        true},
656*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar"),      FPL("/foo2/bar") },         false},
657*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo/bar.txt"),  FPL("/foo/bar") },          false},
658*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar") },           true},
659*635a8641SAndroid Build Coastguard Worker     { { FPL("foo/bar"),       FPL("foo/bar/baz") },       false},
660*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("foo") },               false},
661*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
662*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo/bar") },        true},
663*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/foo/bar"),    FPL("e:/foo/bar") },        true},
664*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/bar") },        true},
665*635a8641SAndroid Build Coastguard Worker     { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar") },        false},
666*635a8641SAndroid Build Coastguard Worker     { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar") },        false},
667*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/"),           FPL("c:/") },               true},
668*635a8641SAndroid Build Coastguard Worker     { { FPL("c:"),            FPL("c:") },                true},
669*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("d:/foo/bar") },        false},
670*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("D:/foo/bar") },        false},
671*635a8641SAndroid Build Coastguard Worker     { { FPL("C:/foo/bar"),    FPL("d:/foo/bar") },        false},
672*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar") },       false},
673*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
674*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
675*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar") },        true},
676*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo/bar") },         true},
677*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo/bar"),     FPL("\\foo\\bar") },        false},
678*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),            FPL("\\") },                true},
679*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),            FPL("/") },                 false},
680*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("\\") },                false},
681*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar") },       false},
682*635a8641SAndroid Build Coastguard Worker     { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2") },       false},
683*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
684*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\foo\\bar"),    FPL("c:\\foo\\bar") },    true},
685*635a8641SAndroid Build Coastguard Worker     { { FPL("E:\\foo\\bar"),    FPL("e:\\foo\\bar") },    true},
686*635a8641SAndroid Build Coastguard Worker     { { FPL("f:\\foo\\bar"),    FPL("F:\\foo/bar") },     false},
687*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
688*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_WIN_SEPARATORS
689*635a8641SAndroid Build Coastguard Worker   };
690*635a8641SAndroid Build Coastguard Worker 
691*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
692*635a8641SAndroid Build Coastguard Worker     FilePath a(cases[i].inputs[0]);
693*635a8641SAndroid Build Coastguard Worker     FilePath b(cases[i].inputs[1]);
694*635a8641SAndroid Build Coastguard Worker 
695*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(a == b, cases[i].expected) <<
696*635a8641SAndroid Build Coastguard Worker       "equality i: " << i << ", a: " << a.value() << ", b: " <<
697*635a8641SAndroid Build Coastguard Worker       b.value();
698*635a8641SAndroid Build Coastguard Worker   }
699*635a8641SAndroid Build Coastguard Worker 
700*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
701*635a8641SAndroid Build Coastguard Worker     FilePath a(cases[i].inputs[0]);
702*635a8641SAndroid Build Coastguard Worker     FilePath b(cases[i].inputs[1]);
703*635a8641SAndroid Build Coastguard Worker 
704*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(a != b, !cases[i].expected) <<
705*635a8641SAndroid Build Coastguard Worker       "inequality i: " << i << ", a: " << a.value() << ", b: " <<
706*635a8641SAndroid Build Coastguard Worker       b.value();
707*635a8641SAndroid Build Coastguard Worker   }
708*635a8641SAndroid Build Coastguard Worker }
709*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,Extension)710*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, Extension) {
711*635a8641SAndroid Build Coastguard Worker   FilePath base_dir(FILE_PATH_LITERAL("base_dir"));
712*635a8641SAndroid Build Coastguard Worker 
713*635a8641SAndroid Build Coastguard Worker   FilePath jpg = base_dir.Append(FILE_PATH_LITERAL("foo.jpg"));
714*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PATH_LITERAL(".jpg"), jpg.Extension());
715*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PATH_LITERAL(".jpg"), jpg.FinalExtension());
716*635a8641SAndroid Build Coastguard Worker 
717*635a8641SAndroid Build Coastguard Worker   FilePath base = jpg.BaseName().RemoveExtension();
718*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PATH_LITERAL("foo"), base.value());
719*635a8641SAndroid Build Coastguard Worker 
720*635a8641SAndroid Build Coastguard Worker   FilePath path_no_ext = base_dir.Append(base);
721*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(path_no_ext.value(), jpg.RemoveExtension().value());
722*635a8641SAndroid Build Coastguard Worker 
723*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(path_no_ext.value(), path_no_ext.RemoveExtension().value());
724*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PATH_LITERAL(""), path_no_ext.Extension());
725*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PATH_LITERAL(""), path_no_ext.FinalExtension());
726*635a8641SAndroid Build Coastguard Worker }
727*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,Extension2)728*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, Extension2) {
729*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
730*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
731*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b\\c.ext"),        FPL(".ext") },
732*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b\\c."),           FPL(".") },
733*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b\\c"),            FPL("") },
734*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b\\"),             FPL("") },
735*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b.\\"),            FPL(".") },
736*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\a\\b\\c.ext1.ext2"),  FPL(".ext2") },
737*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\foo.bar\\\\\\"),      FPL(".bar") },
738*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\foo.bar\\.."),        FPL("") },
739*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\foo.bar\\..\\\\"),    FPL("") },
740*635a8641SAndroid Build Coastguard Worker #endif
741*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz.ext"),       FPL(".ext") },
742*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz."),          FPL(".") },
743*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz.."),         FPL(".") },
744*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz"),           FPL("") },
745*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/"),              FPL("") },
746*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar./"),             FPL(".") },
747*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/baz.ext1.ext2"), FPL(".ext2") },
748*635a8641SAndroid Build Coastguard Worker     { FPL("/subversion-1.6.12.zip"), FPL(".zip") },
749*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.12345.gz"),          FPL(".gz") },
750*635a8641SAndroid Build Coastguard Worker     { FPL("/foo..gz"),               FPL(".gz") },
751*635a8641SAndroid Build Coastguard Worker     { FPL("."),                      FPL("") },
752*635a8641SAndroid Build Coastguard Worker     { FPL(".."),                     FPL("") },
753*635a8641SAndroid Build Coastguard Worker     { FPL("./foo"),                  FPL("") },
754*635a8641SAndroid Build Coastguard Worker     { FPL("./foo.ext"),              FPL(".ext") },
755*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.ext1/bar.ext2"),     FPL(".ext2") },
756*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.bar////"),           FPL(".bar") },
757*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.bar/.."),            FPL("") },
758*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.bar/..////"),        FPL("") },
759*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.1234.luser.js"),     FPL(".js") },
760*635a8641SAndroid Build Coastguard Worker     { FPL("/user.js"),               FPL(".js") },
761*635a8641SAndroid Build Coastguard Worker   };
762*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData double_extension_cases[] = {
763*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.gz"),            FPL(".tar.gz") },
764*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.Z"),             FPL(".tar.Z") },
765*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.bz2"),           FPL(".tar.bz2") },
766*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.1234.gz"),           FPL(".1234.gz") },
767*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.1234.tar.gz"),       FPL(".tar.gz") },
768*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.tar.gz"),        FPL(".tar.gz") },
769*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.gz.gz"),         FPL(".gz.gz") },
770*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.1234.user.js"),      FPL(".user.js") },
771*635a8641SAndroid Build Coastguard Worker     { FPL("foo.user.js"),            FPL(".user.js") },
772*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.tar.bz"),            FPL(".tar.bz") },
773*635a8641SAndroid Build Coastguard Worker   };
774*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(cases); ++i) {
775*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].input);
776*635a8641SAndroid Build Coastguard Worker     FilePath::StringType extension = path.Extension();
777*635a8641SAndroid Build Coastguard Worker     FilePath::StringType final_extension = path.FinalExtension();
778*635a8641SAndroid Build Coastguard Worker     EXPECT_STREQ(cases[i].expected, extension.c_str())
779*635a8641SAndroid Build Coastguard Worker         << "i: " << i << ", path: " << path.value();
780*635a8641SAndroid Build Coastguard Worker     EXPECT_STREQ(cases[i].expected, final_extension.c_str())
781*635a8641SAndroid Build Coastguard Worker         << "i: " << i << ", path: " << path.value();
782*635a8641SAndroid Build Coastguard Worker   }
783*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(double_extension_cases); ++i) {
784*635a8641SAndroid Build Coastguard Worker     FilePath path(double_extension_cases[i].input);
785*635a8641SAndroid Build Coastguard Worker     FilePath::StringType extension = path.Extension();
786*635a8641SAndroid Build Coastguard Worker     EXPECT_STREQ(double_extension_cases[i].expected, extension.c_str())
787*635a8641SAndroid Build Coastguard Worker         << "i: " << i << ", path: " << path.value();
788*635a8641SAndroid Build Coastguard Worker   }
789*635a8641SAndroid Build Coastguard Worker }
790*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,InsertBeforeExtension)791*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, InsertBeforeExtension) {
792*635a8641SAndroid Build Coastguard Worker   const struct BinaryTestData cases[] = {
793*635a8641SAndroid Build Coastguard Worker     { { FPL(""),                FPL("") },        FPL("") },
794*635a8641SAndroid Build Coastguard Worker     { { FPL(""),                FPL("txt") },     FPL("") },
795*635a8641SAndroid Build Coastguard Worker     { { FPL("."),               FPL("txt") },     FPL("") },
796*635a8641SAndroid Build Coastguard Worker     { { FPL(".."),              FPL("txt") },     FPL("") },
797*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),         FPL("txt") },     FPL("footxt.dll") },
798*635a8641SAndroid Build Coastguard Worker     { { FPL("."),               FPL("") },        FPL(".") },
799*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),         FPL(".txt") },    FPL("foo.txt.dll") },
800*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),             FPL("txt") },     FPL("footxt") },
801*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),             FPL(".txt") },    FPL("foo.txt") },
802*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),     FPL("txt") },     FPL("foo.baztxt.dll") },
803*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),     FPL(".txt") },    FPL("foo.baz.txt.dll") },
804*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),         FPL("") },        FPL("foo.dll") },
805*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),         FPL(".") },       FPL("foo..dll") },
806*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),             FPL("") },        FPL("foo") },
807*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),             FPL(".") },       FPL("foo.") },
808*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),     FPL("") },        FPL("foo.baz.dll") },
809*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),     FPL(".") },       FPL("foo.baz..dll") },
810*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
811*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),              FPL("") },        FPL("\\") },
812*635a8641SAndroid Build Coastguard Worker     { { FPL("\\"),              FPL("txt") },     FPL("\\txt") },
813*635a8641SAndroid Build Coastguard Worker     { { FPL("\\."),             FPL("txt") },     FPL("") },
814*635a8641SAndroid Build Coastguard Worker     { { FPL("\\.."),            FPL("txt") },     FPL("") },
815*635a8641SAndroid Build Coastguard Worker     { { FPL("\\."),             FPL("") },        FPL("\\.") },
816*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar\\foo.dll"), FPL("txt") },
817*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar\\footxt.dll") },
818*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foodll"), FPL("txt") },
819*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\foodlltxt") },
820*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foo.dll"), FPL("txt") },
821*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\footxt.dll") },
822*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("txt") },
823*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\foo.dlltxt.exe") },
824*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foo"), FPL("") },
825*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\foo") },
826*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foo.exe"), FPL("") },
827*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\foo.exe") },
828*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("") },
829*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar.baz\\foo.dll.exe") },
830*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\bar\\baz\\foo.exe"), FPL(" (1)") },
831*635a8641SAndroid Build Coastguard Worker         FPL("C:\\bar\\baz\\foo (1).exe") },
832*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.baz\\\\"), FPL(" (1)") },    FPL("C:\\foo (1).baz") },
833*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.baz\\..\\"), FPL(" (1)") },  FPL("") },
834*635a8641SAndroid Build Coastguard Worker #endif
835*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),               FPL("") },        FPL("/") },
836*635a8641SAndroid Build Coastguard Worker     { { FPL("/"),               FPL("txt") },     FPL("/txt") },
837*635a8641SAndroid Build Coastguard Worker     { { FPL("/."),              FPL("txt") },     FPL("") },
838*635a8641SAndroid Build Coastguard Worker     { { FPL("/.."),             FPL("txt") },     FPL("") },
839*635a8641SAndroid Build Coastguard Worker     { { FPL("/."),              FPL("") },        FPL("/.") },
840*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar/foo.dll"),    FPL("txt") },     FPL("/bar/footxt.dll") },
841*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foodll"), FPL("txt") },     FPL("/bar.baz/foodlltxt") },
842*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foo.dll"), FPL("txt") },    FPL("/bar.baz/footxt.dll") },
843*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foo.dll.exe"), FPL("txt") },
844*635a8641SAndroid Build Coastguard Worker         FPL("/bar.baz/foo.dlltxt.exe") },
845*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foo"),    FPL("") },        FPL("/bar.baz/foo") },
846*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foo.exe"), FPL("") },       FPL("/bar.baz/foo.exe") },
847*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar.baz/foo.dll.exe"), FPL("") },   FPL("/bar.baz/foo.dll.exe") },
848*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar/baz/foo.exe"), FPL(" (1)") },   FPL("/bar/baz/foo (1).exe") },
849*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar/baz/..////"), FPL(" (1)") },    FPL("") },
850*635a8641SAndroid Build Coastguard Worker   };
851*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(cases); ++i) {
852*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].inputs[0]);
853*635a8641SAndroid Build Coastguard Worker     FilePath result = path.InsertBeforeExtension(cases[i].inputs[1]);
854*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, result.value()) << "i: " << i <<
855*635a8641SAndroid Build Coastguard Worker         ", path: " << path.value() << ", insert: " << cases[i].inputs[1];
856*635a8641SAndroid Build Coastguard Worker   }
857*635a8641SAndroid Build Coastguard Worker }
858*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,RemoveExtension)859*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, RemoveExtension) {
860*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
861*635a8641SAndroid Build Coastguard Worker     { FPL(""),                    FPL("") },
862*635a8641SAndroid Build Coastguard Worker     { FPL("."),                   FPL(".") },
863*635a8641SAndroid Build Coastguard Worker     { FPL(".."),                  FPL("..") },
864*635a8641SAndroid Build Coastguard Worker     { FPL("foo.dll"),             FPL("foo") },
865*635a8641SAndroid Build Coastguard Worker     { FPL("./foo.dll"),           FPL("./foo") },
866*635a8641SAndroid Build Coastguard Worker     { FPL("foo..dll"),            FPL("foo.") },
867*635a8641SAndroid Build Coastguard Worker     { FPL("foo"),                 FPL("foo") },
868*635a8641SAndroid Build Coastguard Worker     { FPL("foo."),                FPL("foo") },
869*635a8641SAndroid Build Coastguard Worker     { FPL("foo.."),               FPL("foo.") },
870*635a8641SAndroid Build Coastguard Worker     { FPL("foo.baz.dll"),         FPL("foo.baz") },
871*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
872*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\foo.bar\\foo"),    FPL("C:\\foo.bar\\foo") },
873*635a8641SAndroid Build Coastguard Worker     { FPL("C:\\foo.bar\\..\\\\"), FPL("C:\\foo.bar\\..\\\\") },
874*635a8641SAndroid Build Coastguard Worker #endif
875*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.bar/foo"),        FPL("/foo.bar/foo") },
876*635a8641SAndroid Build Coastguard Worker     { FPL("/foo.bar/..////"),     FPL("/foo.bar/..////") },
877*635a8641SAndroid Build Coastguard Worker   };
878*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(cases); ++i) {
879*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].input);
880*635a8641SAndroid Build Coastguard Worker     FilePath removed = path.RemoveExtension();
881*635a8641SAndroid Build Coastguard Worker     FilePath removed_final = path.RemoveFinalExtension();
882*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, removed.value()) << "i: " << i <<
883*635a8641SAndroid Build Coastguard Worker         ", path: " << path.value();
884*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, removed_final.value()) << "i: " << i <<
885*635a8641SAndroid Build Coastguard Worker         ", path: " << path.value();
886*635a8641SAndroid Build Coastguard Worker   }
887*635a8641SAndroid Build Coastguard Worker   {
888*635a8641SAndroid Build Coastguard Worker     FilePath path(FPL("foo.tar.gz"));
889*635a8641SAndroid Build Coastguard Worker     FilePath removed = path.RemoveExtension();
890*635a8641SAndroid Build Coastguard Worker     FilePath removed_final = path.RemoveFinalExtension();
891*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FPL("foo"), removed.value()) << ", path: " << path.value();
892*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FPL("foo.tar"), removed_final.value()) << ", path: "
893*635a8641SAndroid Build Coastguard Worker                                                      << path.value();
894*635a8641SAndroid Build Coastguard Worker   }
895*635a8641SAndroid Build Coastguard Worker }
896*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,ReplaceExtension)897*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, ReplaceExtension) {
898*635a8641SAndroid Build Coastguard Worker   const struct BinaryTestData cases[] = {
899*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("") },      FPL("") },
900*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("txt") },   FPL("") },
901*635a8641SAndroid Build Coastguard Worker     { { FPL("."),             FPL("txt") },   FPL("") },
902*635a8641SAndroid Build Coastguard Worker     { { FPL(".."),            FPL("txt") },   FPL("") },
903*635a8641SAndroid Build Coastguard Worker     { { FPL("."),             FPL("") },      FPL("") },
904*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL("txt") },   FPL("foo.txt") },
905*635a8641SAndroid Build Coastguard Worker     { { FPL("./foo.dll"),     FPL("txt") },   FPL("./foo.txt") },
906*635a8641SAndroid Build Coastguard Worker     { { FPL("foo..dll"),      FPL("txt") },   FPL("foo..txt") },
907*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL(".txt") },  FPL("foo.txt") },
908*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL("txt") },   FPL("foo.txt") },
909*635a8641SAndroid Build Coastguard Worker     { { FPL("foo."),          FPL("txt") },   FPL("foo.txt") },
910*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.."),         FPL("txt") },   FPL("foo..txt") },
911*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL(".txt") },  FPL("foo.txt") },
912*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL("txt") },   FPL("foo.baz.txt") },
913*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL(".txt") },  FPL("foo.baz.txt") },
914*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL("") },      FPL("foo") },
915*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL(".") },     FPL("foo") },
916*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL("") },      FPL("foo") },
917*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL(".") },     FPL("foo") },
918*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL("") },      FPL("foo.baz") },
919*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL(".") },     FPL("foo.baz") },
920*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
921*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.bar\\foo"),    FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
922*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
923*635a8641SAndroid Build Coastguard Worker #endif
924*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
925*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
926*635a8641SAndroid Build Coastguard Worker   };
927*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(cases); ++i) {
928*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].inputs[0]);
929*635a8641SAndroid Build Coastguard Worker     FilePath replaced = path.ReplaceExtension(cases[i].inputs[1]);
930*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, replaced.value()) << "i: " << i <<
931*635a8641SAndroid Build Coastguard Worker         ", path: " << path.value() << ", replace: " << cases[i].inputs[1];
932*635a8641SAndroid Build Coastguard Worker   }
933*635a8641SAndroid Build Coastguard Worker }
934*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,AddExtension)935*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, AddExtension) {
936*635a8641SAndroid Build Coastguard Worker   const struct BinaryTestData cases[] = {
937*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("") },      FPL("") },
938*635a8641SAndroid Build Coastguard Worker     { { FPL(""),              FPL("txt") },   FPL("") },
939*635a8641SAndroid Build Coastguard Worker     { { FPL("."),             FPL("txt") },   FPL("") },
940*635a8641SAndroid Build Coastguard Worker     { { FPL(".."),            FPL("txt") },   FPL("") },
941*635a8641SAndroid Build Coastguard Worker     { { FPL("."),             FPL("") },      FPL("") },
942*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL("txt") },   FPL("foo.dll.txt") },
943*635a8641SAndroid Build Coastguard Worker     { { FPL("./foo.dll"),     FPL("txt") },   FPL("./foo.dll.txt") },
944*635a8641SAndroid Build Coastguard Worker     { { FPL("foo..dll"),      FPL("txt") },   FPL("foo..dll.txt") },
945*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL(".txt") },  FPL("foo.dll.txt") },
946*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL("txt") },   FPL("foo.txt") },
947*635a8641SAndroid Build Coastguard Worker     { { FPL("foo."),          FPL("txt") },   FPL("foo.txt") },
948*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.."),         FPL("txt") },   FPL("foo..txt") },
949*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL(".txt") },  FPL("foo.txt") },
950*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL("txt") },   FPL("foo.baz.dll.txt") },
951*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL(".txt") },  FPL("foo.baz.dll.txt") },
952*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL("") },      FPL("foo.dll") },
953*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.dll"),       FPL(".") },     FPL("foo.dll") },
954*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL("") },      FPL("foo") },
955*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),           FPL(".") },     FPL("foo") },
956*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL("") },      FPL("foo.baz.dll") },
957*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.baz.dll"),   FPL(".") },     FPL("foo.baz.dll") },
958*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
959*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.bar\\foo"),    FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
960*635a8641SAndroid Build Coastguard Worker     { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
961*635a8641SAndroid Build Coastguard Worker #endif
962*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
963*635a8641SAndroid Build Coastguard Worker     { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
964*635a8641SAndroid Build Coastguard Worker   };
965*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(cases); ++i) {
966*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].inputs[0]);
967*635a8641SAndroid Build Coastguard Worker     FilePath added = path.AddExtension(cases[i].inputs[1]);
968*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, added.value()) << "i: " << i <<
969*635a8641SAndroid Build Coastguard Worker         ", path: " << path.value() << ", add: " << cases[i].inputs[1];
970*635a8641SAndroid Build Coastguard Worker   }
971*635a8641SAndroid Build Coastguard Worker }
972*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,MatchesExtension)973*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, MatchesExtension) {
974*635a8641SAndroid Build Coastguard Worker   const struct BinaryBooleanTestData cases[] = {
975*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                     FPL("") },                    true},
976*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                     FPL(".") },                   false},
977*635a8641SAndroid Build Coastguard Worker     { { FPL("foo."),                    FPL("") },                    false},
978*635a8641SAndroid Build Coastguard Worker     { { FPL("foo."),                    FPL(".") },                   true},
979*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt"),                 FPL(".dll") },                false},
980*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt"),                 FPL(".txt") },                true},
981*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt.dll"),             FPL(".txt") },                false},
982*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt.dll"),             FPL(".dll") },                true},
983*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.TXT"),                 FPL(".txt") },                true},
984*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt"),                 FPL(".TXT") },                true},
985*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.tXt"),                 FPL(".txt") },                true},
986*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.txt"),                 FPL(".tXt") },                true},
987*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.tXt"),                 FPL(".TXT") },                true},
988*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.tXt"),                 FPL(".tXt") },                true},
989*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_DRIVE_LETTERS)
990*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo.txt.dll"),          FPL(".txt") },                false},
991*635a8641SAndroid Build Coastguard Worker     { { FPL("c:/foo.txt"),              FPL(".txt") },                true},
992*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
993*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
994*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\bar\\foo.txt.dll"),    FPL(".txt") },                false},
995*635a8641SAndroid Build Coastguard Worker     { { FPL("c:\\bar\\foo.txt"),        FPL(".txt") },                true},
996*635a8641SAndroid Build Coastguard Worker #endif  // FILE_PATH_USES_DRIVE_LETTERS
997*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar/foo.txt.dll"),        FPL(".txt") },                false},
998*635a8641SAndroid Build Coastguard Worker     { { FPL("/bar/foo.txt"),            FPL(".txt") },                true},
999*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) || defined(OS_MACOSX)
1000*635a8641SAndroid Build Coastguard Worker     // Umlauts A, O, U: direct comparison, and upper case vs. lower case
1001*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.\u00E4\u00F6\u00FC"),  FPL(".\u00E4\u00F6\u00FC") }, true},
1002*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.\u00C4\u00D6\u00DC"),  FPL(".\u00E4\u00F6\u00FC") }, true},
1003*635a8641SAndroid Build Coastguard Worker     // C with circumflex: direct comparison, and upper case vs. lower case
1004*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.\u0109"),              FPL(".\u0109") },             true},
1005*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.\u0108"),              FPL(".\u0109") },             true},
1006*635a8641SAndroid Build Coastguard Worker #endif
1007*635a8641SAndroid Build Coastguard Worker   };
1008*635a8641SAndroid Build Coastguard Worker 
1009*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1010*635a8641SAndroid Build Coastguard Worker     FilePath path(cases[i].inputs[0]);
1011*635a8641SAndroid Build Coastguard Worker     FilePath::StringType ext(cases[i].inputs[1]);
1012*635a8641SAndroid Build Coastguard Worker 
1013*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, path.MatchesExtension(ext)) <<
1014*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", path: " << path.value() << ", ext: " << ext;
1015*635a8641SAndroid Build Coastguard Worker   }
1016*635a8641SAndroid Build Coastguard Worker }
1017*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,CompareIgnoreCase)1018*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, CompareIgnoreCase) {
1019*635a8641SAndroid Build Coastguard Worker   const struct BinaryIntTestData cases[] = {
1020*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                          FPL("foo") },                  0},
1021*635a8641SAndroid Build Coastguard Worker     { { FPL("FOO"),                          FPL("foo") },                  0},
1022*635a8641SAndroid Build Coastguard Worker     { { FPL("foo.ext"),                      FPL("foo.ext") },              0},
1023*635a8641SAndroid Build Coastguard Worker     { { FPL("FOO.EXT"),                      FPL("foo.ext") },              0},
1024*635a8641SAndroid Build Coastguard Worker     { { FPL("Foo.Ext"),                      FPL("foo.ext") },              0},
1025*635a8641SAndroid Build Coastguard Worker     { { FPL("foO"),                          FPL("foo") },                  0},
1026*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                          FPL("foO") },                  0},
1027*635a8641SAndroid Build Coastguard Worker     { { FPL("fOo"),                          FPL("foo") },                  0},
1028*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                          FPL("fOo") },                  0},
1029*635a8641SAndroid Build Coastguard Worker     { { FPL("bar"),                          FPL("foo") },                 -1},
1030*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                          FPL("bar") },                  1},
1031*635a8641SAndroid Build Coastguard Worker     { { FPL("BAR"),                          FPL("foo") },                 -1},
1032*635a8641SAndroid Build Coastguard Worker     { { FPL("FOO"),                          FPL("bar") },                  1},
1033*635a8641SAndroid Build Coastguard Worker     { { FPL("bar"),                          FPL("FOO") },                 -1},
1034*635a8641SAndroid Build Coastguard Worker     { { FPL("foo"),                          FPL("BAR") },                  1},
1035*635a8641SAndroid Build Coastguard Worker     { { FPL("BAR"),                          FPL("FOO") },                 -1},
1036*635a8641SAndroid Build Coastguard Worker     { { FPL("FOO"),                          FPL("BAR") },                  1},
1037*635a8641SAndroid Build Coastguard Worker     // German "Eszett" (lower case and the new-fangled upper case)
1038*635a8641SAndroid Build Coastguard Worker     // Note that uc(<lowercase eszett>) => "SS", NOT <uppercase eszett>!
1039*635a8641SAndroid Build Coastguard Worker     // However, neither Windows nor Mac OSX converts these.
1040*635a8641SAndroid Build Coastguard Worker     // (or even have glyphs for <uppercase eszett>)
1041*635a8641SAndroid Build Coastguard Worker     { { FPL("\u00DF"),                       FPL("\u00DF") },               0},
1042*635a8641SAndroid Build Coastguard Worker     { { FPL("\u1E9E"),                       FPL("\u1E9E") },               0},
1043*635a8641SAndroid Build Coastguard Worker     { { FPL("\u00DF"),                       FPL("\u1E9E") },              -1},
1044*635a8641SAndroid Build Coastguard Worker     { { FPL("SS"),                           FPL("\u00DF") },              -1},
1045*635a8641SAndroid Build Coastguard Worker     { { FPL("SS"),                           FPL("\u1E9E") },              -1},
1046*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) || defined(OS_MACOSX)
1047*635a8641SAndroid Build Coastguard Worker     // Umlauts A, O, U: direct comparison, and upper case vs. lower case
1048*635a8641SAndroid Build Coastguard Worker     { { FPL("\u00E4\u00F6\u00FC"),           FPL("\u00E4\u00F6\u00FC") },   0},
1049*635a8641SAndroid Build Coastguard Worker     { { FPL("\u00C4\u00D6\u00DC"),           FPL("\u00E4\u00F6\u00FC") },   0},
1050*635a8641SAndroid Build Coastguard Worker     // C with circumflex: direct comparison, and upper case vs. lower case
1051*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0109"),                       FPL("\u0109") },               0},
1052*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0108"),                       FPL("\u0109") },               0},
1053*635a8641SAndroid Build Coastguard Worker     // Cyrillic letter SHA: direct comparison, and upper case vs. lower case
1054*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0428"),                       FPL("\u0428") },               0},
1055*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0428"),                       FPL("\u0448") },               0},
1056*635a8641SAndroid Build Coastguard Worker     // Greek letter DELTA: direct comparison, and upper case vs. lower case
1057*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0394"),                       FPL("\u0394") },               0},
1058*635a8641SAndroid Build Coastguard Worker     { { FPL("\u0394"),                       FPL("\u03B4") },               0},
1059*635a8641SAndroid Build Coastguard Worker     // Japanese full-width A: direct comparison, and upper case vs. lower case
1060*635a8641SAndroid Build Coastguard Worker     // Note that full-width and standard characters are considered different.
1061*635a8641SAndroid Build Coastguard Worker     { { FPL("\uFF21"),                       FPL("\uFF21") },               0},
1062*635a8641SAndroid Build Coastguard Worker     { { FPL("\uFF21"),                       FPL("\uFF41") },               0},
1063*635a8641SAndroid Build Coastguard Worker     { { FPL("A"),                            FPL("\uFF21") },              -1},
1064*635a8641SAndroid Build Coastguard Worker     { { FPL("A"),                            FPL("\uFF41") },              -1},
1065*635a8641SAndroid Build Coastguard Worker     { { FPL("a"),                            FPL("\uFF21") },              -1},
1066*635a8641SAndroid Build Coastguard Worker     { { FPL("a"),                            FPL("\uFF41") },              -1},
1067*635a8641SAndroid Build Coastguard Worker #endif
1068*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1069*635a8641SAndroid Build Coastguard Worker     // Codepoints > 0x1000
1070*635a8641SAndroid Build Coastguard Worker     // Georgian letter DON: direct comparison, and upper case vs. lower case
1071*635a8641SAndroid Build Coastguard Worker     { { FPL("\u10A3"),                       FPL("\u10A3") },               0},
1072*635a8641SAndroid Build Coastguard Worker     { { FPL("\u10A3"),                       FPL("\u10D3") },               0},
1073*635a8641SAndroid Build Coastguard Worker     // Combining characters vs. pre-composed characters, upper and lower case
1074*635a8641SAndroid Build Coastguard Worker     { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("\u1E31\u1E77\u1E53n") },  0},
1075*635a8641SAndroid Build Coastguard Worker     { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("kuon") },                 1},
1076*635a8641SAndroid Build Coastguard Worker     { { FPL("kuon"), FPL("k\u0301u\u032Do\u0304\u0301n") },                -1},
1077*635a8641SAndroid Build Coastguard Worker     { { FPL("K\u0301U\u032DO\u0304\u0301N"), FPL("KUON") },                 1},
1078*635a8641SAndroid Build Coastguard Worker     { { FPL("KUON"), FPL("K\u0301U\u032DO\u0304\u0301N") },                -1},
1079*635a8641SAndroid Build Coastguard Worker     { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("KUON") },                 1},
1080*635a8641SAndroid Build Coastguard Worker     { { FPL("K\u0301U\u032DO\u0304\u0301N"), FPL("\u1E31\u1E77\u1E53n") },  0},
1081*635a8641SAndroid Build Coastguard Worker     { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("\u1E30\u1E76\u1E52n") },  0},
1082*635a8641SAndroid Build Coastguard Worker     { { FPL("k\u0301u\u032Do\u0304\u0302n"), FPL("\u1E30\u1E76\u1E52n") },  1},
1083*635a8641SAndroid Build Coastguard Worker #endif
1084*635a8641SAndroid Build Coastguard Worker   };
1085*635a8641SAndroid Build Coastguard Worker 
1086*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1087*635a8641SAndroid Build Coastguard Worker     FilePath::StringType s1(cases[i].inputs[0]);
1088*635a8641SAndroid Build Coastguard Worker     FilePath::StringType s2(cases[i].inputs[1]);
1089*635a8641SAndroid Build Coastguard Worker     int result = FilePath::CompareIgnoreCase(s1, s2);
1090*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, result) <<
1091*635a8641SAndroid Build Coastguard Worker         "i: " << i << ", s1: " << s1 << ", s2: " << s2;
1092*635a8641SAndroid Build Coastguard Worker   }
1093*635a8641SAndroid Build Coastguard Worker }
1094*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,ReferencesParent)1095*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, ReferencesParent) {
1096*635a8641SAndroid Build Coastguard Worker   const struct UnaryBooleanTestData cases[] = {
1097*635a8641SAndroid Build Coastguard Worker     { FPL("."),        false },
1098*635a8641SAndroid Build Coastguard Worker     { FPL(".."),       true },
1099*635a8641SAndroid Build Coastguard Worker     { FPL(".. "),      true },
1100*635a8641SAndroid Build Coastguard Worker     { FPL(" .."),      true },
1101*635a8641SAndroid Build Coastguard Worker     { FPL("..."),      true },
1102*635a8641SAndroid Build Coastguard Worker     { FPL("a.."),      false },
1103*635a8641SAndroid Build Coastguard Worker     { FPL("..a"),      false },
1104*635a8641SAndroid Build Coastguard Worker     { FPL("../"),      true },
1105*635a8641SAndroid Build Coastguard Worker     { FPL("/.."),      true },
1106*635a8641SAndroid Build Coastguard Worker     { FPL("/../"),     true },
1107*635a8641SAndroid Build Coastguard Worker     { FPL("/a../"),    false },
1108*635a8641SAndroid Build Coastguard Worker     { FPL("/..a/"),    false },
1109*635a8641SAndroid Build Coastguard Worker     { FPL("//.."),     true },
1110*635a8641SAndroid Build Coastguard Worker     { FPL("..//"),     true },
1111*635a8641SAndroid Build Coastguard Worker     { FPL("//..//"),   true },
1112*635a8641SAndroid Build Coastguard Worker     { FPL("a//..//c"), true },
1113*635a8641SAndroid Build Coastguard Worker     { FPL("../b/c"),   true },
1114*635a8641SAndroid Build Coastguard Worker     { FPL("/../b/c"),  true },
1115*635a8641SAndroid Build Coastguard Worker     { FPL("a/b/.."),   true },
1116*635a8641SAndroid Build Coastguard Worker     { FPL("a/b/../"),  true },
1117*635a8641SAndroid Build Coastguard Worker     { FPL("a/../c"),   true },
1118*635a8641SAndroid Build Coastguard Worker     { FPL("a/b/c"),    false },
1119*635a8641SAndroid Build Coastguard Worker   };
1120*635a8641SAndroid Build Coastguard Worker 
1121*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1122*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
1123*635a8641SAndroid Build Coastguard Worker     bool observed = input.ReferencesParent();
1124*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, observed) <<
1125*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
1126*635a8641SAndroid Build Coastguard Worker   }
1127*635a8641SAndroid Build Coastguard Worker }
1128*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,FromUTF8Unsafe_And_AsUTF8Unsafe)1129*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, FromUTF8Unsafe_And_AsUTF8Unsafe) {
1130*635a8641SAndroid Build Coastguard Worker   const struct UTF8TestData cases[] = {
1131*635a8641SAndroid Build Coastguard Worker     { FPL("foo.txt"), "foo.txt" },
1132*635a8641SAndroid Build Coastguard Worker     // "aeo" with accents. Use http://0xcc.net/jsescape/ to decode them.
1133*635a8641SAndroid Build Coastguard Worker     { FPL("\u00E0\u00E8\u00F2.txt"), "\xC3\xA0\xC3\xA8\xC3\xB2.txt" },
1134*635a8641SAndroid Build Coastguard Worker     // Full-width "ABC".
1135*635a8641SAndroid Build Coastguard Worker     { FPL("\uFF21\uFF22\uFF23.txt"),
1136*635a8641SAndroid Build Coastguard Worker       "\xEF\xBC\xA1\xEF\xBC\xA2\xEF\xBC\xA3.txt" },
1137*635a8641SAndroid Build Coastguard Worker   };
1138*635a8641SAndroid Build Coastguard Worker 
1139*635a8641SAndroid Build Coastguard Worker #if !defined(SYSTEM_NATIVE_UTF8) && defined(OS_LINUX)
1140*635a8641SAndroid Build Coastguard Worker   ScopedLocale locale("en_US.UTF-8");
1141*635a8641SAndroid Build Coastguard Worker #endif
1142*635a8641SAndroid Build Coastguard Worker 
1143*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1144*635a8641SAndroid Build Coastguard Worker     // Test FromUTF8Unsafe() works.
1145*635a8641SAndroid Build Coastguard Worker     FilePath from_utf8 = FilePath::FromUTF8Unsafe(cases[i].utf8);
1146*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].native, from_utf8.value())
1147*635a8641SAndroid Build Coastguard Worker         << "i: " << i << ", input: " << cases[i].native;
1148*635a8641SAndroid Build Coastguard Worker     // Test AsUTF8Unsafe() works.
1149*635a8641SAndroid Build Coastguard Worker     FilePath from_native = FilePath(cases[i].native);
1150*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].utf8, from_native.AsUTF8Unsafe())
1151*635a8641SAndroid Build Coastguard Worker         << "i: " << i << ", input: " << cases[i].native;
1152*635a8641SAndroid Build Coastguard Worker     // Test the two file paths are identical.
1153*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(from_utf8.value(), from_native.value());
1154*635a8641SAndroid Build Coastguard Worker   }
1155*635a8641SAndroid Build Coastguard Worker }
1156*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,ConstructWithNUL)1157*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, ConstructWithNUL) {
1158*635a8641SAndroid Build Coastguard Worker   // Assert FPS() works.
1159*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(3U, FPS("a\0b").length());
1160*635a8641SAndroid Build Coastguard Worker 
1161*635a8641SAndroid Build Coastguard Worker   // Test constructor strips '\0'
1162*635a8641SAndroid Build Coastguard Worker   FilePath path(FPS("a\0b"));
1163*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1U, path.value().length());
1164*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL("a"), path.value());
1165*635a8641SAndroid Build Coastguard Worker }
1166*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,AppendWithNUL)1167*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, AppendWithNUL) {
1168*635a8641SAndroid Build Coastguard Worker   // Assert FPS() works.
1169*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(3U, FPS("b\0b").length());
1170*635a8641SAndroid Build Coastguard Worker 
1171*635a8641SAndroid Build Coastguard Worker   // Test Append() strips '\0'
1172*635a8641SAndroid Build Coastguard Worker   FilePath path(FPL("a"));
1173*635a8641SAndroid Build Coastguard Worker   path = path.Append(FPS("b\0b"));
1174*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3U, path.value().length());
1175*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
1176*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL("a\\b"), path.value());
1177*635a8641SAndroid Build Coastguard Worker #else
1178*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL("a/b"), path.value());
1179*635a8641SAndroid Build Coastguard Worker #endif
1180*635a8641SAndroid Build Coastguard Worker }
1181*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,ReferencesParentWithNUL)1182*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, ReferencesParentWithNUL) {
1183*635a8641SAndroid Build Coastguard Worker   // Assert FPS() works.
1184*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(3U, FPS("..\0").length());
1185*635a8641SAndroid Build Coastguard Worker 
1186*635a8641SAndroid Build Coastguard Worker   // Test ReferencesParent() doesn't break with "..\0"
1187*635a8641SAndroid Build Coastguard Worker   FilePath path(FPS("..\0"));
1188*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(path.ReferencesParent());
1189*635a8641SAndroid Build Coastguard Worker }
1190*635a8641SAndroid Build Coastguard Worker 
1191*635a8641SAndroid Build Coastguard Worker #if defined(FILE_PATH_USES_WIN_SEPARATORS)
TEST_F(FilePathTest,NormalizePathSeparators)1192*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, NormalizePathSeparators) {
1193*635a8641SAndroid Build Coastguard Worker   const struct UnaryTestData cases[] = {
1194*635a8641SAndroid Build Coastguard Worker     { FPL("foo/bar"), FPL("foo\\bar") },
1195*635a8641SAndroid Build Coastguard Worker     { FPL("foo/bar\\betz"), FPL("foo\\bar\\betz") },
1196*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\bar"), FPL("foo\\bar") },
1197*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\bar/betz"), FPL("foo\\bar\\betz") },
1198*635a8641SAndroid Build Coastguard Worker     { FPL("foo"), FPL("foo") },
1199*635a8641SAndroid Build Coastguard Worker     // Trailing slashes don't automatically get stripped.  That's what
1200*635a8641SAndroid Build Coastguard Worker     // StripTrailingSeparators() is for.
1201*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\"), FPL("foo\\") },
1202*635a8641SAndroid Build Coastguard Worker     { FPL("foo/"), FPL("foo\\") },
1203*635a8641SAndroid Build Coastguard Worker     { FPL("foo/bar\\"), FPL("foo\\bar\\") },
1204*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\bar/"), FPL("foo\\bar\\") },
1205*635a8641SAndroid Build Coastguard Worker     { FPL("foo/bar/"), FPL("foo\\bar\\") },
1206*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\bar\\"), FPL("foo\\bar\\") },
1207*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo/bar"), FPL("\\foo\\bar") },
1208*635a8641SAndroid Build Coastguard Worker     { FPL("/foo\\bar"), FPL("\\foo\\bar") },
1209*635a8641SAndroid Build Coastguard Worker     { FPL("c:/foo/bar/"), FPL("c:\\foo\\bar\\") },
1210*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar/"), FPL("\\foo\\bar\\") },
1211*635a8641SAndroid Build Coastguard Worker     { FPL("\\foo\\bar\\"), FPL("\\foo\\bar\\") },
1212*635a8641SAndroid Build Coastguard Worker     { FPL("c:\\foo/bar"), FPL("c:\\foo\\bar") },
1213*635a8641SAndroid Build Coastguard Worker     { FPL("//foo\\bar\\"), FPL("\\\\foo\\bar\\") },
1214*635a8641SAndroid Build Coastguard Worker     { FPL("\\\\foo\\bar\\"), FPL("\\\\foo\\bar\\") },
1215*635a8641SAndroid Build Coastguard Worker     { FPL("//foo\\bar\\"), FPL("\\\\foo\\bar\\") },
1216*635a8641SAndroid Build Coastguard Worker     // This method does not normalize the number of path separators.
1217*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\\\bar"), FPL("foo\\\\bar") },
1218*635a8641SAndroid Build Coastguard Worker     { FPL("foo//bar"), FPL("foo\\\\bar") },
1219*635a8641SAndroid Build Coastguard Worker     { FPL("foo/\\bar"), FPL("foo\\\\bar") },
1220*635a8641SAndroid Build Coastguard Worker     { FPL("foo\\/bar"), FPL("foo\\\\bar") },
1221*635a8641SAndroid Build Coastguard Worker     { FPL("///foo\\\\bar"), FPL("\\\\\\foo\\\\bar") },
1222*635a8641SAndroid Build Coastguard Worker     { FPL("foo//bar///"), FPL("foo\\\\bar\\\\\\") },
1223*635a8641SAndroid Build Coastguard Worker     { FPL("foo/\\bar/\\"), FPL("foo\\\\bar\\\\") },
1224*635a8641SAndroid Build Coastguard Worker     { FPL("/\\foo\\/bar"), FPL("\\\\foo\\\\bar") },
1225*635a8641SAndroid Build Coastguard Worker   };
1226*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1227*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
1228*635a8641SAndroid Build Coastguard Worker     FilePath observed = input.NormalizePathSeparators();
1229*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
1230*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
1231*635a8641SAndroid Build Coastguard Worker   }
1232*635a8641SAndroid Build Coastguard Worker }
1233*635a8641SAndroid Build Coastguard Worker #endif
1234*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,EndsWithSeparator)1235*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, EndsWithSeparator) {
1236*635a8641SAndroid Build Coastguard Worker   const UnaryBooleanTestData cases[] = {
1237*635a8641SAndroid Build Coastguard Worker     { FPL(""), false },
1238*635a8641SAndroid Build Coastguard Worker     { FPL("/"), true },
1239*635a8641SAndroid Build Coastguard Worker     { FPL("foo/"), true },
1240*635a8641SAndroid Build Coastguard Worker     { FPL("bar"), false },
1241*635a8641SAndroid Build Coastguard Worker     { FPL("/foo/bar"), false },
1242*635a8641SAndroid Build Coastguard Worker   };
1243*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1244*635a8641SAndroid Build Coastguard Worker     FilePath input = FilePath(cases[i].input).NormalizePathSeparators();
1245*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, input.EndsWithSeparator());
1246*635a8641SAndroid Build Coastguard Worker   }
1247*635a8641SAndroid Build Coastguard Worker }
1248*635a8641SAndroid Build Coastguard Worker 
TEST_F(FilePathTest,AsEndingWithSeparator)1249*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, AsEndingWithSeparator) {
1250*635a8641SAndroid Build Coastguard Worker   const UnaryTestData cases[] = {
1251*635a8641SAndroid Build Coastguard Worker     { FPL(""), FPL("") },
1252*635a8641SAndroid Build Coastguard Worker     { FPL("/"), FPL("/") },
1253*635a8641SAndroid Build Coastguard Worker     { FPL("foo"), FPL("foo/") },
1254*635a8641SAndroid Build Coastguard Worker     { FPL("foo/"), FPL("foo/") }
1255*635a8641SAndroid Build Coastguard Worker   };
1256*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1257*635a8641SAndroid Build Coastguard Worker     FilePath input = FilePath(cases[i].input).NormalizePathSeparators();
1258*635a8641SAndroid Build Coastguard Worker     FilePath expected = FilePath(cases[i].expected).NormalizePathSeparators();
1259*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(expected.value(), input.AsEndingWithSeparator().value());
1260*635a8641SAndroid Build Coastguard Worker   }
1261*635a8641SAndroid Build Coastguard Worker }
1262*635a8641SAndroid Build Coastguard Worker 
1263*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
TEST_F(FilePathTest,ContentUriTest)1264*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, ContentUriTest) {
1265*635a8641SAndroid Build Coastguard Worker   const struct UnaryBooleanTestData cases[] = {
1266*635a8641SAndroid Build Coastguard Worker     { FPL("content://foo.bar"),    true },
1267*635a8641SAndroid Build Coastguard Worker     { FPL("content://foo.bar/"),   true },
1268*635a8641SAndroid Build Coastguard Worker     { FPL("content://foo/bar"),    true },
1269*635a8641SAndroid Build Coastguard Worker     { FPL("CoNTenT://foo.bar"),    true },
1270*635a8641SAndroid Build Coastguard Worker     { FPL("content://"),           true },
1271*635a8641SAndroid Build Coastguard Worker     { FPL("content:///foo.bar"),   true },
1272*635a8641SAndroid Build Coastguard Worker     { FPL("content://3foo/bar"),   true },
1273*635a8641SAndroid Build Coastguard Worker     { FPL("content://_foo/bar"),   true },
1274*635a8641SAndroid Build Coastguard Worker     { FPL(".. "),                  false },
1275*635a8641SAndroid Build Coastguard Worker     { FPL("foo.bar"),              false },
1276*635a8641SAndroid Build Coastguard Worker     { FPL("content:foo.bar"),      false },
1277*635a8641SAndroid Build Coastguard Worker     { FPL("content:/foo.ba"),      false },
1278*635a8641SAndroid Build Coastguard Worker     { FPL("content:/dir/foo.bar"), false },
1279*635a8641SAndroid Build Coastguard Worker     { FPL("content: //foo.bar"),   false },
1280*635a8641SAndroid Build Coastguard Worker     { FPL("content%2a%2f%2f"),     false },
1281*635a8641SAndroid Build Coastguard Worker   };
1282*635a8641SAndroid Build Coastguard Worker 
1283*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(cases); ++i) {
1284*635a8641SAndroid Build Coastguard Worker     FilePath input(cases[i].input);
1285*635a8641SAndroid Build Coastguard Worker     bool observed = input.IsContentUri();
1286*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(cases[i].expected, observed) <<
1287*635a8641SAndroid Build Coastguard Worker               "i: " << i << ", input: " << input.value();
1288*635a8641SAndroid Build Coastguard Worker   }
1289*635a8641SAndroid Build Coastguard Worker }
1290*635a8641SAndroid Build Coastguard Worker #endif
1291*635a8641SAndroid Build Coastguard Worker 
1292*635a8641SAndroid Build Coastguard Worker // Test the operator<<(ostream, FilePath).
TEST_F(FilePathTest,PrintToOstream)1293*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, PrintToOstream) {
1294*635a8641SAndroid Build Coastguard Worker   std::stringstream ss;
1295*635a8641SAndroid Build Coastguard Worker   FilePath fp(FPL("foo"));
1296*635a8641SAndroid Build Coastguard Worker   ss << fp;
1297*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("foo", ss.str());
1298*635a8641SAndroid Build Coastguard Worker }
1299*635a8641SAndroid Build Coastguard Worker 
1300*635a8641SAndroid Build Coastguard Worker // Test GetHFSDecomposedForm should return empty result for invalid UTF-8
1301*635a8641SAndroid Build Coastguard Worker // strings.
1302*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
TEST_F(FilePathTest,GetHFSDecomposedFormWithInvalidInput)1303*635a8641SAndroid Build Coastguard Worker TEST_F(FilePathTest, GetHFSDecomposedFormWithInvalidInput) {
1304*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType* cases[] = {
1305*635a8641SAndroid Build Coastguard Worker     FPL("\xc3\x28"),
1306*635a8641SAndroid Build Coastguard Worker     FPL("\xe2\x82\x28"),
1307*635a8641SAndroid Build Coastguard Worker     FPL("\xe2\x28\xa1"),
1308*635a8641SAndroid Build Coastguard Worker     FPL("\xf0\x28\x8c\xbc"),
1309*635a8641SAndroid Build Coastguard Worker     FPL("\xf0\x28\x8c\x28"),
1310*635a8641SAndroid Build Coastguard Worker   };
1311*635a8641SAndroid Build Coastguard Worker   for (auto* invalid_input : cases) {
1312*635a8641SAndroid Build Coastguard Worker     FilePath::StringType observed = FilePath::GetHFSDecomposedForm(
1313*635a8641SAndroid Build Coastguard Worker         invalid_input);
1314*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(observed.empty());
1315*635a8641SAndroid Build Coastguard Worker   }
1316*635a8641SAndroid Build Coastguard Worker }
1317*635a8641SAndroid Build Coastguard Worker #endif
1318*635a8641SAndroid Build Coastguard Worker 
1319*635a8641SAndroid Build Coastguard Worker }  // namespace base
1320