blob: b80d9fc8f71e90bfdcdea6daa1daf785c98d7747 [file] [log] [blame]
mark@chromium.org6380e262008-10-04 03:21:47 +09001// Copyright (c) 2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
mark@chromium.org6380e262008-10-04 03:21:47 +09005#include "base/basictypes.h"
aa@chromium.org76e5c632008-12-18 17:38:16 +09006#include "base/file_path.h"
7#include "base/file_util.h"
erikkay@google.comc51bf5f2009-01-22 07:15:57 +09008#include "base/string_util.h"
mark@chromium.orge3e1ce72008-10-04 04:05:46 +09009#include "testing/gtest/include/gtest/gtest.h"
aa@chromium.org76e5c632008-12-18 17:38:16 +090010#include "testing/platform_test.h"
mark@chromium.org6380e262008-10-04 03:21:47 +090011
12// This macro helps avoid wrapped lines in the test structs.
13#define FPL(x) FILE_PATH_LITERAL(x)
14
15struct UnaryTestData {
16 const FilePath::CharType* input;
17 const FilePath::CharType* expected;
18};
19
20struct UnaryBooleanTestData {
21 const FilePath::CharType* input;
22 bool expected;
23};
24
25struct BinaryTestData {
26 const FilePath::CharType* inputs[2];
27 const FilePath::CharType* expected;
28};
29
rafaelw@chromium.org465facc2009-06-25 06:28:30 +090030struct BinaryBooleanTestData {
31 const FilePath::CharType* inputs[2];
32 bool expected;
33};
34
aa@chromium.org76e5c632008-12-18 17:38:16 +090035// file_util winds up using autoreleased objects on the Mac, so this needs
36// to be a PlatformTest
37class FilePathTest : public PlatformTest {
38 protected:
39 virtual void SetUp() {
40 PlatformTest::SetUp();
41 }
42 virtual void TearDown() {
43 PlatformTest::TearDown();
44 }
45};
46
47TEST_F(FilePathTest, DirName) {
mark@chromium.org6380e262008-10-04 03:21:47 +090048 const struct UnaryTestData cases[] = {
49 { FPL(""), FPL(".") },
50 { FPL("aa"), FPL(".") },
51 { FPL("/aa/bb"), FPL("/aa") },
52 { FPL("/aa/bb/"), FPL("/aa") },
53 { FPL("/aa/bb//"), FPL("/aa") },
54 { FPL("/aa/bb/ccc"), FPL("/aa/bb") },
55 { FPL("/aa"), FPL("/") },
56 { FPL("/aa/"), FPL("/") },
57 { FPL("/"), FPL("/") },
58 { FPL("//"), FPL("//") },
59 { FPL("///"), FPL("/") },
60 { FPL("aa/"), FPL(".") },
61 { FPL("aa/bb"), FPL("aa") },
62 { FPL("aa/bb/"), FPL("aa") },
63 { FPL("aa/bb//"), FPL("aa") },
64 { FPL("aa//bb//"), FPL("aa") },
65 { FPL("aa//bb/"), FPL("aa") },
66 { FPL("aa//bb"), FPL("aa") },
67 { FPL("//aa/bb"), FPL("//aa") },
68 { FPL("//aa/"), FPL("//") },
69 { FPL("//aa"), FPL("//") },
70 { FPL("0:"), FPL(".") },
71 { FPL("@:"), FPL(".") },
72 { FPL("[:"), FPL(".") },
73 { FPL("`:"), FPL(".") },
74 { FPL("{:"), FPL(".") },
75 { FPL("\xB3:"), FPL(".") },
76 { FPL("\xC5:"), FPL(".") },
77#if defined(OS_WIN)
78 { FPL("\x0143:"), FPL(".") },
79#endif // OS_WIN
80#if defined(FILE_PATH_USES_DRIVE_LETTERS)
81 { FPL("c:"), FPL("c:") },
82 { FPL("C:"), FPL("C:") },
83 { FPL("A:"), FPL("A:") },
84 { FPL("Z:"), FPL("Z:") },
85 { FPL("a:"), FPL("a:") },
86 { FPL("z:"), FPL("z:") },
87 { FPL("c:aa"), FPL("c:") },
88 { FPL("c:/"), FPL("c:/") },
89 { FPL("c://"), FPL("c://") },
90 { FPL("c:///"), FPL("c:/") },
91 { FPL("c:/aa"), FPL("c:/") },
92 { FPL("c:/aa/"), FPL("c:/") },
93 { FPL("c:/aa/bb"), FPL("c:/aa") },
94 { FPL("c:aa/bb"), FPL("c:aa") },
95#endif // FILE_PATH_USES_DRIVE_LETTERS
96#if defined(FILE_PATH_USES_WIN_SEPARATORS)
97 { FPL("\\aa\\bb"), FPL("\\aa") },
98 { FPL("\\aa\\bb\\"), FPL("\\aa") },
99 { FPL("\\aa\\bb\\\\"), FPL("\\aa") },
100 { FPL("\\aa\\bb\\ccc"), FPL("\\aa\\bb") },
101 { FPL("\\aa"), FPL("\\") },
102 { FPL("\\aa\\"), FPL("\\") },
103 { FPL("\\"), FPL("\\") },
104 { FPL("\\\\"), FPL("\\\\") },
105 { FPL("\\\\\\"), FPL("\\") },
106 { FPL("aa\\"), FPL(".") },
107 { FPL("aa\\bb"), FPL("aa") },
108 { FPL("aa\\bb\\"), FPL("aa") },
109 { FPL("aa\\bb\\\\"), FPL("aa") },
110 { FPL("aa\\\\bb\\\\"), FPL("aa") },
111 { FPL("aa\\\\bb\\"), FPL("aa") },
112 { FPL("aa\\\\bb"), FPL("aa") },
113 { FPL("\\\\aa\\bb"), FPL("\\\\aa") },
114 { FPL("\\\\aa\\"), FPL("\\\\") },
115 { FPL("\\\\aa"), FPL("\\\\") },
116#if defined(FILE_PATH_USES_DRIVE_LETTERS)
117 { FPL("c:\\"), FPL("c:\\") },
118 { FPL("c:\\\\"), FPL("c:\\\\") },
119 { FPL("c:\\\\\\"), FPL("c:\\") },
120 { FPL("c:\\aa"), FPL("c:\\") },
121 { FPL("c:\\aa\\"), FPL("c:\\") },
122 { FPL("c:\\aa\\bb"), FPL("c:\\aa") },
123 { FPL("c:aa\\bb"), FPL("c:aa") },
124#endif // FILE_PATH_USES_DRIVE_LETTERS
125#endif // FILE_PATH_USES_WIN_SEPARATORS
126 };
127
128 for (size_t i = 0; i < arraysize(cases); ++i) {
129 FilePath input(cases[i].input);
130 FilePath observed = input.DirName();
131 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
132 "i: " << i << ", input: " << input.value();
133 }
134}
135
aa@chromium.org76e5c632008-12-18 17:38:16 +0900136TEST_F(FilePathTest, BaseName) {
mark@chromium.org6380e262008-10-04 03:21:47 +0900137 const struct UnaryTestData cases[] = {
138 { FPL(""), FPL("") },
139 { FPL("aa"), FPL("aa") },
140 { FPL("/aa/bb"), FPL("bb") },
141 { FPL("/aa/bb/"), FPL("bb") },
142 { FPL("/aa/bb//"), FPL("bb") },
143 { FPL("/aa/bb/ccc"), FPL("ccc") },
144 { FPL("/aa"), FPL("aa") },
145 { FPL("/"), FPL("/") },
146 { FPL("//"), FPL("//") },
147 { FPL("///"), FPL("/") },
148 { FPL("aa/"), FPL("aa") },
149 { FPL("aa/bb"), FPL("bb") },
150 { FPL("aa/bb/"), FPL("bb") },
151 { FPL("aa/bb//"), FPL("bb") },
152 { FPL("aa//bb//"), FPL("bb") },
153 { FPL("aa//bb/"), FPL("bb") },
154 { FPL("aa//bb"), FPL("bb") },
155 { FPL("//aa/bb"), FPL("bb") },
156 { FPL("//aa/"), FPL("aa") },
157 { FPL("//aa"), FPL("aa") },
158 { FPL("0:"), FPL("0:") },
159 { FPL("@:"), FPL("@:") },
160 { FPL("[:"), FPL("[:") },
161 { FPL("`:"), FPL("`:") },
162 { FPL("{:"), FPL("{:") },
163 { FPL("\xB3:"), FPL("\xB3:") },
164 { FPL("\xC5:"), FPL("\xC5:") },
165#if defined(OS_WIN)
166 { FPL("\x0143:"), FPL("\x0143:") },
167#endif // OS_WIN
168#if defined(FILE_PATH_USES_DRIVE_LETTERS)
169 { FPL("c:"), FPL("") },
170 { FPL("C:"), FPL("") },
171 { FPL("A:"), FPL("") },
172 { FPL("Z:"), FPL("") },
173 { FPL("a:"), FPL("") },
174 { FPL("z:"), FPL("") },
175 { FPL("c:aa"), FPL("aa") },
176 { FPL("c:/"), FPL("/") },
177 { FPL("c://"), FPL("//") },
178 { FPL("c:///"), FPL("/") },
179 { FPL("c:/aa"), FPL("aa") },
180 { FPL("c:/aa/"), FPL("aa") },
181 { FPL("c:/aa/bb"), FPL("bb") },
182 { FPL("c:aa/bb"), FPL("bb") },
183#endif // FILE_PATH_USES_DRIVE_LETTERS
184#if defined(FILE_PATH_USES_WIN_SEPARATORS)
185 { FPL("\\aa\\bb"), FPL("bb") },
186 { FPL("\\aa\\bb\\"), FPL("bb") },
187 { FPL("\\aa\\bb\\\\"), FPL("bb") },
188 { FPL("\\aa\\bb\\ccc"), FPL("ccc") },
189 { FPL("\\aa"), FPL("aa") },
190 { FPL("\\"), FPL("\\") },
191 { FPL("\\\\"), FPL("\\\\") },
192 { FPL("\\\\\\"), FPL("\\") },
193 { FPL("aa\\"), FPL("aa") },
194 { FPL("aa\\bb"), FPL("bb") },
195 { FPL("aa\\bb\\"), FPL("bb") },
196 { FPL("aa\\bb\\\\"), FPL("bb") },
197 { FPL("aa\\\\bb\\\\"), FPL("bb") },
198 { FPL("aa\\\\bb\\"), FPL("bb") },
199 { FPL("aa\\\\bb"), FPL("bb") },
200 { FPL("\\\\aa\\bb"), FPL("bb") },
201 { FPL("\\\\aa\\"), FPL("aa") },
202 { FPL("\\\\aa"), FPL("aa") },
203#if defined(FILE_PATH_USES_DRIVE_LETTERS)
204 { FPL("c:\\"), FPL("\\") },
205 { FPL("c:\\\\"), FPL("\\\\") },
206 { FPL("c:\\\\\\"), FPL("\\") },
207 { FPL("c:\\aa"), FPL("aa") },
208 { FPL("c:\\aa\\"), FPL("aa") },
209 { FPL("c:\\aa\\bb"), FPL("bb") },
210 { FPL("c:aa\\bb"), FPL("bb") },
211#endif // FILE_PATH_USES_DRIVE_LETTERS
212#endif // FILE_PATH_USES_WIN_SEPARATORS
213 };
214
215 for (size_t i = 0; i < arraysize(cases); ++i) {
216 FilePath input(cases[i].input);
estade@chromium.orgd872d682009-01-06 08:59:36 +0900217 FilePath observed = input.BaseName();
218 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
mark@chromium.org6380e262008-10-04 03:21:47 +0900219 "i: " << i << ", input: " << input.value();
220 }
221}
222
aa@chromium.org76e5c632008-12-18 17:38:16 +0900223TEST_F(FilePathTest, Append) {
mark@chromium.org6380e262008-10-04 03:21:47 +0900224 const struct BinaryTestData cases[] = {
225 { { FPL(""), FPL("cc") }, FPL("cc") },
226 { { FPL("."), FPL("ff") }, FPL("ff") },
227 { { FPL("/"), FPL("cc") }, FPL("/cc") },
228 { { FPL("/aa"), FPL("") }, FPL("/aa") },
229 { { FPL("/aa/"), FPL("") }, FPL("/aa") },
230 { { FPL("//aa"), FPL("") }, FPL("//aa") },
231 { { FPL("//aa/"), FPL("") }, FPL("//aa") },
232 { { FPL("//"), FPL("aa") }, FPL("//aa") },
233#if defined(FILE_PATH_USES_DRIVE_LETTERS)
234 { { FPL("c:"), FPL("a") }, FPL("c:a") },
235 { { FPL("c:"), FPL("") }, FPL("c:") },
236 { { FPL("c:/"), FPL("a") }, FPL("c:/a") },
237 { { FPL("c://"), FPL("a") }, FPL("c://a") },
238 { { FPL("c:///"), FPL("a") }, FPL("c:/a") },
239#endif // FILE_PATH_USES_DRIVE_LETTERS
240#if defined(FILE_PATH_USES_WIN_SEPARATORS)
241 // Append introduces the default separator character, so these test cases
242 // need to be defined with different expected results on platforms that use
243 // different default separator characters.
244 { { FPL("\\"), FPL("cc") }, FPL("\\cc") },
245 { { FPL("\\aa"), FPL("") }, FPL("\\aa") },
246 { { FPL("\\aa\\"), FPL("") }, FPL("\\aa") },
247 { { FPL("\\\\aa"), FPL("") }, FPL("\\\\aa") },
248 { { FPL("\\\\aa\\"), FPL("") }, FPL("\\\\aa") },
249 { { FPL("\\\\"), FPL("aa") }, FPL("\\\\aa") },
250 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb\\cc") },
251 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb\\cc") },
252 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb\\cc") },
253 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb\\cc") },
254 { { FPL("a/b"), FPL("c") }, FPL("a/b\\c") },
255 { { FPL("a/b/"), FPL("c") }, FPL("a/b\\c") },
256 { { FPL("//aa"), FPL("bb") }, FPL("//aa\\bb") },
257 { { FPL("//aa/"), FPL("bb") }, FPL("//aa\\bb") },
258 { { FPL("\\aa\\bb"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
259 { { FPL("\\aa\\bb\\"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
260 { { FPL("aa\\bb\\"), FPL("cc") }, FPL("aa\\bb\\cc") },
261 { { FPL("aa\\bb"), FPL("cc") }, FPL("aa\\bb\\cc") },
262 { { FPL("a\\b"), FPL("c") }, FPL("a\\b\\c") },
263 { { FPL("a\\b\\"), FPL("c") }, FPL("a\\b\\c") },
264 { { FPL("\\\\aa"), FPL("bb") }, FPL("\\\\aa\\bb") },
265 { { FPL("\\\\aa\\"), FPL("bb") }, FPL("\\\\aa\\bb") },
266#if defined(FILE_PATH_USES_DRIVE_LETTERS)
267 { { FPL("c:\\"), FPL("a") }, FPL("c:\\a") },
268 { { FPL("c:\\\\"), FPL("a") }, FPL("c:\\\\a") },
269 { { FPL("c:\\\\\\"), FPL("a") }, FPL("c:\\a") },
270 { { FPL("c:\\"), FPL("") }, FPL("c:\\") },
271 { { FPL("c:\\a"), FPL("b") }, FPL("c:\\a\\b") },
272 { { FPL("c:\\a\\"), FPL("b") }, FPL("c:\\a\\b") },
273#endif // FILE_PATH_USES_DRIVE_LETTERS
274#else // FILE_PATH_USES_WIN_SEPARATORS
275 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb/cc") },
276 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb/cc") },
277 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb/cc") },
278 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb/cc") },
279 { { FPL("a/b"), FPL("c") }, FPL("a/b/c") },
280 { { FPL("a/b/"), FPL("c") }, FPL("a/b/c") },
281 { { FPL("//aa"), FPL("bb") }, FPL("//aa/bb") },
282 { { FPL("//aa/"), FPL("bb") }, FPL("//aa/bb") },
283#if defined(FILE_PATH_USES_DRIVE_LETTERS)
284 { { FPL("c:/"), FPL("a") }, FPL("c:/a") },
285 { { FPL("c:/"), FPL("") }, FPL("c:/") },
286 { { FPL("c:/a"), FPL("b") }, FPL("c:/a/b") },
287 { { FPL("c:/a/"), FPL("b") }, FPL("c:/a/b") },
288#endif // FILE_PATH_USES_DRIVE_LETTERS
289#endif // FILE_PATH_USES_WIN_SEPARATORS
290 };
291
292 for (size_t i = 0; i < arraysize(cases); ++i) {
293 FilePath root(cases[i].inputs[0]);
294 FilePath::StringType leaf(cases[i].inputs[1]);
mark@chromium.orgfac7b262008-12-09 01:49:08 +0900295 FilePath observed_str = root.Append(leaf);
296 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
297 "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
298 FilePath observed_path = root.Append(FilePath(leaf));
299 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_path.value()) <<
mark@chromium.org6380e262008-10-04 03:21:47 +0900300 "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
erikkay@google.comc51bf5f2009-01-22 07:15:57 +0900301
302 // TODO(erikkay): It would be nice to have a unicode test append value to
303 // handle the case when AppendASCII is passed UTF8
304#if defined(OS_WIN)
305 std::string ascii = WideToASCII(leaf);
306#elif defined(OS_POSIX)
307 std::string ascii = leaf;
308#endif
309 observed_str = root.AppendASCII(ascii);
310 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
311 "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
mark@chromium.org6380e262008-10-04 03:21:47 +0900312 }
313}
314
mark@chromium.org778d9cf2009-10-14 02:31:39 +0900315TEST_F(FilePathTest, StripTrailingSeparators) {
316 const struct UnaryTestData cases[] = {
317 { FPL(""), FPL("") },
318 { FPL("/"), FPL("/") },
319 { FPL("//"), FPL("//") },
320 { FPL("///"), FPL("/") },
321 { FPL("////"), FPL("/") },
322 { FPL("a/"), FPL("a") },
323 { FPL("a//"), FPL("a") },
324 { FPL("a///"), FPL("a") },
325 { FPL("a////"), FPL("a") },
326 { FPL("/a"), FPL("/a") },
327 { FPL("/a/"), FPL("/a") },
328 { FPL("/a//"), FPL("/a") },
329 { FPL("/a///"), FPL("/a") },
330 { FPL("/a////"), FPL("/a") },
331#if defined(FILE_PATH_USES_DRIVE_LETTERS)
332 { FPL("c:"), FPL("c:") },
333 { FPL("c:/"), FPL("c:/") },
334 { FPL("c://"), FPL("c://") },
335 { FPL("c:///"), FPL("c:/") },
336 { FPL("c:////"), FPL("c:/") },
337 { FPL("c:/a"), FPL("c:/a") },
338 { FPL("c:/a/"), FPL("c:/a") },
339 { FPL("c:/a//"), FPL("c:/a") },
340 { FPL("c:/a///"), FPL("c:/a") },
341 { FPL("c:/a////"), FPL("c:/a") },
342#endif // FILE_PATH_USES_DRIVE_LETTERS
343#if defined(FILE_PATH_USES_WIN_SEPARATORS)
344 { FPL("\\"), FPL("\\") },
345 { FPL("\\\\"), FPL("\\\\") },
346 { FPL("\\\\\\"), FPL("\\") },
347 { FPL("\\\\\\\\"), FPL("\\") },
348 { FPL("a\\"), FPL("a") },
349 { FPL("a\\\\"), FPL("a") },
350 { FPL("a\\\\\\"), FPL("a") },
351 { FPL("a\\\\\\\\"), FPL("a") },
352 { FPL("\\a"), FPL("\\a") },
353 { FPL("\\a\\"), FPL("\\a") },
354 { FPL("\\a\\\\"), FPL("\\a") },
355 { FPL("\\a\\\\\\"), FPL("\\a") },
356 { FPL("\\a\\\\\\\\"), FPL("\\a") },
357#if defined(FILE_PATH_USES_DRIVE_LETTERS)
358 { FPL("c:\\"), FPL("c:\\") },
359 { FPL("c:\\\\"), FPL("c:\\\\") },
360 { FPL("c:\\\\\\"), FPL("c:\\") },
361 { FPL("c:\\\\\\\\"), FPL("c:\\") },
362 { FPL("c:\\a"), FPL("c:\\a") },
363 { FPL("c:\\a\\"), FPL("c:\\a") },
364 { FPL("c:\\a\\\\"), FPL("c:\\a") },
365 { FPL("c:\\a\\\\\\"), FPL("c:\\a") },
366 { FPL("c:\\a\\\\\\\\"), FPL("c:\\a") },
367#endif // FILE_PATH_USES_DRIVE_LETTERS
368#endif // FILE_PATH_USES_WIN_SEPARATORS
369 };
370
371 for (size_t i = 0; i < arraysize(cases); ++i) {
372 FilePath input(cases[i].input);
373 FilePath observed = input.StripTrailingSeparators();
374 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
375 "i: " << i << ", input: " << input.value();
376 }
377}
378
aa@chromium.org76e5c632008-12-18 17:38:16 +0900379TEST_F(FilePathTest, IsAbsolute) {
mark@chromium.org6380e262008-10-04 03:21:47 +0900380 const struct UnaryBooleanTestData cases[] = {
381 { FPL(""), false },
382 { FPL("a"), false },
383 { FPL("c:"), false },
384 { FPL("c:a"), false },
385 { FPL("a/b"), false },
386 { FPL("//"), true },
387 { FPL("//a"), true },
388 { FPL("c:a/b"), false },
389 { FPL("?:/a"), false },
390#if defined(FILE_PATH_USES_DRIVE_LETTERS)
391 { FPL("/"), false },
392 { FPL("/a"), false },
393 { FPL("/."), false },
394 { FPL("/.."), false },
395 { FPL("c:/"), true },
396 { FPL("c:/a"), true },
397 { FPL("c:/."), true },
398 { FPL("c:/.."), true },
399 { FPL("C:/a"), true },
400 { FPL("d:/a"), true },
401#else // FILE_PATH_USES_DRIVE_LETTERS
402 { FPL("/"), true },
403 { FPL("/a"), true },
404 { FPL("/."), true },
405 { FPL("/.."), true },
406 { FPL("c:/"), false },
407#endif // FILE_PATH_USES_DRIVE_LETTERS
408#if defined(FILE_PATH_USES_WIN_SEPARATORS)
409 { FPL("a\\b"), false },
410 { FPL("\\\\"), true },
411 { FPL("\\\\a"), true },
412 { FPL("a\\b"), false },
413 { FPL("\\\\"), true },
414 { FPL("//a"), true },
415 { FPL("c:a\\b"), false },
416 { FPL("?:\\a"), false },
417#if defined(FILE_PATH_USES_DRIVE_LETTERS)
418 { FPL("\\"), false },
419 { FPL("\\a"), false },
420 { FPL("\\."), false },
421 { FPL("\\.."), false },
422 { FPL("c:\\"), true },
423 { FPL("c:\\"), true },
424 { FPL("c:\\a"), true },
425 { FPL("c:\\."), true },
426 { FPL("c:\\.."), true },
427 { FPL("C:\\a"), true },
428 { FPL("d:\\a"), true },
429#else // FILE_PATH_USES_DRIVE_LETTERS
430 { FPL("\\"), true },
431 { FPL("\\a"), true },
432 { FPL("\\."), true },
433 { FPL("\\.."), true },
434 { FPL("c:\\"), false },
435#endif // FILE_PATH_USES_DRIVE_LETTERS
436#endif // FILE_PATH_USES_WIN_SEPARATORS
437 };
438
439 for (size_t i = 0; i < arraysize(cases); ++i) {
440 FilePath input(cases[i].input);
441 bool observed = input.IsAbsolute();
442 EXPECT_EQ(cases[i].expected, observed) <<
443 "i: " << i << ", input: " << input.value();
444 }
445}
aa@chromium.org76e5c632008-12-18 17:38:16 +0900446
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900447TEST_F(FilePathTest, PathComponentsTest) {
448 const struct UnaryTestData cases[] = {
449 { FPL("//foo/bar/baz/"), FPL("|//|foo|bar|baz")},
450 { FPL("///"), FPL("|/")},
451 { FPL("/foo//bar//baz/"), FPL("|/|foo|bar|baz")},
452 { FPL("/foo/bar/baz/"), FPL("|/|foo|bar|baz")},
453 { FPL("/foo/bar/baz//"), FPL("|/|foo|bar|baz")},
454 { FPL("/foo/bar/baz///"), FPL("|/|foo|bar|baz")},
455 { FPL("/foo/bar/baz"), FPL("|/|foo|bar|baz")},
456 { FPL("/foo/bar.bot/baz.txt"), FPL("|/|foo|bar.bot|baz.txt")},
457 { FPL("//foo//bar/baz"), FPL("|//|foo|bar|baz")},
458 { FPL("/"), FPL("|/")},
459 { FPL("foo"), FPL("|foo")},
460 { FPL(""), FPL("")},
461#if defined(FILE_PATH_USES_DRIVE_LETTERS)
462 { FPL("e:/foo"), FPL("|e:|/|foo")},
463 { FPL("e:/"), FPL("|e:|/")},
464 { FPL("e:"), FPL("|e:")},
465#endif // FILE_PATH_USES_DRIVE_LETTERS
466#if defined(FILE_PATH_USES_WIN_SEPARATORS)
467 { FPL("../foo"), FPL("|..|foo")},
468 { FPL("./foo"), FPL("|foo")},
469 { FPL("../foo/bar/"), FPL("|..|foo|bar") },
470 { FPL("\\\\foo\\bar\\baz\\"), FPL("|\\\\|foo|bar|baz")},
471 { FPL("\\\\\\"), FPL("|\\")},
472 { FPL("\\foo\\\\bar\\\\baz\\"), FPL("|\\|foo|bar|baz")},
473 { FPL("\\foo\\bar\\baz\\"), FPL("|\\|foo|bar|baz")},
474 { FPL("\\foo\\bar\\baz\\\\"), FPL("|\\|foo|bar|baz")},
475 { FPL("\\foo\\bar\\baz\\\\\\"), FPL("|\\|foo|bar|baz")},
476 { FPL("\\foo\\bar\\baz"), FPL("|\\|foo|bar|baz")},
477 { FPL("\\foo\\bar/baz\\\\\\"), FPL("|\\|foo|bar|baz")},
478 { FPL("/foo\\bar\\baz"), FPL("|/|foo|bar|baz")},
479 { FPL("\\foo\\bar.bot\\baz.txt"), FPL("|\\|foo|bar.bot|baz.txt")},
480 { FPL("\\\\foo\\\\bar\\baz"), FPL("|\\\\|foo|bar|baz")},
481 { FPL("\\"), FPL("|\\")},
482#endif // FILE_PATH_USES_WIN_SEPARATORS
483 };
484
485 for (size_t i = 0; i < arraysize(cases); ++i) {
486 FilePath input(cases[i].input);
487 std::vector<FilePath::StringType> comps;
488 input.GetComponents(&comps);
489
490 FilePath::StringType observed;
491 for (size_t j = 0; j < comps.size(); ++j) {
492 observed.append(FILE_PATH_LITERAL("|"), 1);
493 observed.append(comps[j]);
494 }
495 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed) <<
496 "i: " << i << ", input: " << input.value();
497 }
498}
499
500TEST_F(FilePathTest, IsParentTest) {
501 const struct BinaryBooleanTestData cases[] = {
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900502 { { FPL("/"), FPL("/foo/bar/baz") }, true},
503 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, true},
504 { { FPL("/foo/bar/"), FPL("/foo/bar/baz") }, true},
505 { { FPL("//foo/bar/"), FPL("//foo/bar/baz") }, true},
506 { { FPL("/foo/bar"), FPL("/foo2/bar/baz") }, false},
507 { { FPL("/foo/bar.txt"), FPL("/foo/bar/baz") }, false},
508 { { FPL("/foo/bar"), FPL("/foo/bar2/baz") }, false},
509 { { FPL("/foo/bar"), FPL("/foo/bar") }, false},
510 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, false},
511 { { FPL("foo/bar"), FPL("foo/bar/baz") }, true},
512 { { FPL("foo/bar"), FPL("foo2/bar/baz") }, false},
513 { { FPL("foo/bar"), FPL("foo/bar2/baz") }, false},
514 { { FPL(""), FPL("foo") }, false},
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900515#if defined(FILE_PATH_USES_DRIVE_LETTERS)
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900516 { { FPL("c:/foo/bar"), FPL("c:/foo/bar/baz") }, true},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900517 { { FPL("E:/foo/bar"), FPL("e:/foo/bar/baz") }, true},
518 { { FPL("f:/foo/bar"), FPL("F:/foo/bar/baz") }, true},
519 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar/baz") }, false},
520 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900521 { { FPL("c:/"), FPL("c:/foo/bar/baz") }, true},
522 { { FPL("c:"), FPL("c:/foo/bar/baz") }, true},
523 { { FPL("c:/foo/bar"), FPL("d:/foo/bar/baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900524 { { FPL("c:/foo/bar"), FPL("D:/foo/bar/baz") }, false},
525 { { FPL("C:/foo/bar"), FPL("d:/foo/bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900526 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar/baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900527 { { FPL("e:/foo/bar"), FPL("E:/foo2/bar/baz") }, false},
528 { { FPL("F:/foo/bar"), FPL("f:/foo2/bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900529 { { FPL("c:/foo/bar"), FPL("c:/foo/bar2/baz") }, false},
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900530#endif // FILE_PATH_USES_DRIVE_LETTERS
531#if defined(FILE_PATH_USES_WIN_SEPARATORS)
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900532 { { FPL("\\foo\\bar"), FPL("\\foo\\bar\\baz") }, true},
533 { { FPL("\\foo/bar"), FPL("\\foo\\bar\\baz") }, true},
534 { { FPL("\\foo/bar"), FPL("\\foo/bar/baz") }, true},
535 { { FPL("\\"), FPL("\\foo\\bar\\baz") }, true},
536 { { FPL(""), FPL("\\foo\\bar\\baz") }, false},
537 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar\\baz") }, false},
538 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2\\baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900539#endif // FILE_PATH_USES_WIN_SEPARATORS
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900540 };
541
542 for (size_t i = 0; i < arraysize(cases); ++i) {
543 FilePath parent(cases[i].inputs[0]);
544 FilePath child(cases[i].inputs[1]);
545
546 EXPECT_EQ(parent.IsParent(child), cases[i].expected) <<
547 "i: " << i << ", parent: " << parent.value() << ", child: " <<
548 child.value();
549 }
550}
551
mark@chromium.org752010c2009-09-24 05:32:41 +0900552TEST_F(FilePathTest, AppendRelativePathTest) {
mark@chromium.orgaf9f62a2009-09-17 06:03:44 +0900553 const struct BinaryTestData cases[] = {
mark@chromium.org752010c2009-09-24 05:32:41 +0900554#if defined(FILE_PATH_USES_WIN_SEPARATORS)
555 { { FPL("/"), FPL("/foo/bar/baz") }, FPL("foo\\bar\\baz")},
556#else // FILE_PATH_USES_WIN_SEPARATORS
mark@chromium.orgaf9f62a2009-09-17 06:03:44 +0900557 { { FPL("/"), FPL("/foo/bar/baz") }, FPL("foo/bar/baz")},
mark@chromium.org752010c2009-09-24 05:32:41 +0900558#endif // FILE_PATH_USES_WIN_SEPARATORS
mark@chromium.orgaf9f62a2009-09-17 06:03:44 +0900559 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, FPL("baz")},
560 { { FPL("/foo/bar/"), FPL("/foo/bar/baz") }, FPL("baz")},
561 { { FPL("//foo/bar/"), FPL("//foo/bar/baz") }, FPL("baz")},
562 { { FPL("/foo/bar"), FPL("/foo2/bar/baz") }, FPL("")},
563 { { FPL("/foo/bar.txt"), FPL("/foo/bar/baz") }, FPL("")},
564 { { FPL("/foo/bar"), FPL("/foo/bar2/baz") }, FPL("")},
565 { { FPL("/foo/bar"), FPL("/foo/bar") }, FPL("")},
566 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, FPL("")},
567 { { FPL("foo/bar"), FPL("foo/bar/baz") }, FPL("baz")},
568 { { FPL("foo/bar"), FPL("foo2/bar/baz") }, FPL("")},
569 { { FPL("foo/bar"), FPL("foo/bar2/baz") }, FPL("")},
570 { { FPL(""), FPL("foo") }, FPL("")},
571#if defined(FILE_PATH_USES_DRIVE_LETTERS)
572 { { FPL("c:/foo/bar"), FPL("c:/foo/bar/baz") }, FPL("baz")},
573 { { FPL("E:/foo/bar"), FPL("e:/foo/bar/baz") }, FPL("baz")},
574 { { FPL("f:/foo/bar"), FPL("F:/foo/bar/baz") }, FPL("baz")},
575 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar/baz") }, FPL("")},
576 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar/baz") }, FPL("")},
mark@chromium.org752010c2009-09-24 05:32:41 +0900577#if defined(FILE_PATH_USES_WIN_SEPARATORS)
578 { { FPL("c:/"), FPL("c:/foo/bar/baz") }, FPL("foo\\bar\\baz")},
579 // TODO(akalin): Figure out how to handle the corner case in the
580 // commented-out test case below. Appending to an empty path gives
581 // /foo\bar\baz but appending to a nonempty path "blah" gives
582 // blah\foo\bar\baz.
583 // { { FPL("c:"), FPL("c:/foo/bar/baz") }, FPL("foo\\bar\\baz")},
584#endif // FILE_PATH_USES_WIN_SEPARATORS
mark@chromium.orgaf9f62a2009-09-17 06:03:44 +0900585 { { FPL("c:/foo/bar"), FPL("d:/foo/bar/baz") }, FPL("")},
586 { { FPL("c:/foo/bar"), FPL("D:/foo/bar/baz") }, FPL("")},
587 { { FPL("C:/foo/bar"), FPL("d:/foo/bar/baz") }, FPL("")},
588 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar/baz") }, FPL("")},
589 { { FPL("e:/foo/bar"), FPL("E:/foo2/bar/baz") }, FPL("")},
590 { { FPL("F:/foo/bar"), FPL("f:/foo2/bar/baz") }, FPL("")},
591 { { FPL("c:/foo/bar"), FPL("c:/foo/bar2/baz") }, FPL("")},
592#endif // FILE_PATH_USES_DRIVE_LETTERS
593#if defined(FILE_PATH_USES_WIN_SEPARATORS)
594 { { FPL("\\foo\\bar"), FPL("\\foo\\bar\\baz") }, FPL("baz")},
595 { { FPL("\\foo/bar"), FPL("\\foo\\bar\\baz") }, FPL("baz")},
596 { { FPL("\\foo/bar"), FPL("\\foo/bar/baz") }, FPL("baz")},
597 { { FPL("\\"), FPL("\\foo\\bar\\baz") }, FPL("foo\\bar\\baz")},
598 { { FPL(""), FPL("\\foo\\bar\\baz") }, FPL("")},
599 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar\\baz") }, FPL("")},
600 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2\\baz") }, FPL("")},
601#endif // FILE_PATH_USES_WIN_SEPARATORS
602 };
603
604 const FilePath base(FPL("blah"));
605
606 for (size_t i = 0; i < arraysize(cases); ++i) {
607 FilePath parent(cases[i].inputs[0]);
608 FilePath child(cases[i].inputs[1]);
609 {
610 FilePath result;
611 bool success = parent.AppendRelativePath(child, &result);
612 EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
613 "i: " << i << ", parent: " << parent.value() << ", child: " <<
614 child.value();
615 EXPECT_STREQ(cases[i].expected, result.value().c_str()) <<
616 "i: " << i << ", parent: " << parent.value() << ", child: " <<
617 child.value();
618 }
619 {
620 FilePath result(base);
621 bool success = parent.AppendRelativePath(child, &result);
622 EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
623 "i: " << i << ", parent: " << parent.value() << ", child: " <<
624 child.value();
625 EXPECT_EQ(base.Append(cases[i].expected).value(), result.value()) <<
626 "i: " << i << ", parent: " << parent.value() << ", child: " <<
627 child.value();
628 }
629 }
630}
631
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900632TEST_F(FilePathTest, EqualityTest) {
633 const struct BinaryBooleanTestData cases[] = {
634 { { FPL("/foo/bar/baz"), FPL("/foo/bar/baz") }, true},
635 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, false},
636 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, false},
637 { { FPL("//foo/bar/"), FPL("//foo/bar/") }, true},
638 { { FPL("/foo/bar"), FPL("/foo2/bar") }, false},
639 { { FPL("/foo/bar.txt"), FPL("/foo/bar") }, false},
640 { { FPL("foo/bar"), FPL("foo/bar") }, true},
641 { { FPL("foo/bar"), FPL("foo/bar/baz") }, false},
642 { { FPL(""), FPL("foo") }, false},
643#if defined(FILE_PATH_USES_DRIVE_LETTERS)
644 { { FPL("c:/foo/bar"), FPL("c:/foo/bar") }, true},
645 { { FPL("E:/foo/bar"), FPL("e:/foo/bar") }, true},
646 { { FPL("f:/foo/bar"), FPL("F:/foo/bar") }, true},
647 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar") }, false},
648 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar") }, false},
649 { { FPL("c:/"), FPL("c:/") }, true},
650 { { FPL("c:"), FPL("c:") }, true},
651 { { FPL("c:/foo/bar"), FPL("d:/foo/bar") }, false},
652 { { FPL("c:/foo/bar"), FPL("D:/foo/bar") }, false},
653 { { FPL("C:/foo/bar"), FPL("d:/foo/bar") }, false},
654 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar") }, false},
655#endif // FILE_PATH_USES_DRIVE_LETTERS
656#if defined(FILE_PATH_USES_WIN_SEPARATORS)
657 { { FPL("\\foo\\bar"), FPL("\\foo\\bar") }, true},
658 { { FPL("\\foo/bar"), FPL("\\foo/bar") }, true},
659 { { FPL("\\foo/bar"), FPL("\\foo\bar") }, false},
660 { { FPL("\\"), FPL("\\") }, true},
661 { { FPL("\\"), FPL("/") }, false},
662 { { FPL(""), FPL("\\") }, false},
663 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar") }, false},
664 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2") }, false},
665#if defined(FILE_PATH_USES_DRIVE_LETTERS)
666 { { FPL("c:\\foo\\bar"), FPL("c:\\foo\\bar") }, true},
667 { { FPL("E:\\foo\\bar"), FPL("e:\\foo\\bar") }, true},
668 { { FPL("f:\\foo\\bar"), FPL("F:\\foo/bar") }, false},
669#endif // FILE_PATH_USES_DRIVE_LETTERS
670#endif // FILE_PATH_USES_WIN_SEPARATORS
671 };
672
673 for (size_t i = 0; i < arraysize(cases); ++i) {
674 FilePath a(cases[i].inputs[0]);
675 FilePath b(cases[i].inputs[1]);
676
677 EXPECT_EQ(a == b, cases[i].expected) <<
678 "equality i: " << i << ", a: " << a.value() << ", b: " <<
679 b.value();
680 }
681
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900682 for (size_t i = 0; i < arraysize(cases); ++i) {
683 FilePath a(cases[i].inputs[0]);
684 FilePath b(cases[i].inputs[1]);
685
686 EXPECT_EQ(a != b, !cases[i].expected) <<
687 "inequality i: " << i << ", a: " << a.value() << ", b: " <<
688 b.value();
689 }
690}
691
erikkay@google.com985d4202009-01-10 03:26:19 +0900692TEST_F(FilePathTest, Extension) {
693 FilePath base_dir(FILE_PATH_LITERAL("base_dir"));
694
695 FilePath jpg = base_dir.Append(FILE_PATH_LITERAL("foo.jpg"));
696 EXPECT_EQ(jpg.Extension(), FILE_PATH_LITERAL(".jpg"));
697
698 FilePath base = jpg.BaseName().RemoveExtension();
699 EXPECT_EQ(base.value(), FILE_PATH_LITERAL("foo"));
700
701 FilePath path_no_ext = base_dir.Append(base);
702 EXPECT_EQ(jpg.RemoveExtension().value(), path_no_ext.value());
703
704 EXPECT_EQ(path_no_ext.value(), path_no_ext.RemoveExtension().value());
705 EXPECT_EQ(path_no_ext.Extension(), FILE_PATH_LITERAL(""));
706}
707
708TEST_F(FilePathTest, Extension2) {
709 const struct UnaryTestData cases[] = {
710#if defined(FILE_PATH_USES_WIN_SEPARATORS)
711 { FPL("C:\\a\\b\\c.ext"), FPL(".ext") },
712 { FPL("C:\\a\\b\\c."), FPL(".") },
713 { FPL("C:\\a\\b\\c"), FPL("") },
714 { FPL("C:\\a\\b\\"), FPL("") },
715 { FPL("C:\\a\\b.\\"), FPL(".") },
716 { FPL("C:\\a\\b\\c.ext1.ext2"), FPL(".ext2") },
717 { FPL("C:\\foo.bar\\\\\\"), FPL(".bar") },
718 { FPL("C:\\foo.bar\\.."), FPL("") },
719 { FPL("C:\\foo.bar\\..\\\\"), FPL("") },
720#endif
721 { FPL("/foo/bar/baz.ext"), FPL(".ext") },
722 { FPL("/foo/bar/baz."), FPL(".") },
723 { FPL("/foo/bar/baz.."), FPL(".") },
724 { FPL("/foo/bar/baz"), FPL("") },
725 { FPL("/foo/bar/"), FPL("") },
726 { FPL("/foo/bar./"), FPL(".") },
727 { FPL("/foo/bar/baz.ext1.ext2"), FPL(".ext2") },
728 { FPL("."), FPL("") },
729 { FPL(".."), FPL("") },
730 { FPL("./foo"), FPL("") },
731 { FPL("./foo.ext"), FPL(".ext") },
732 { FPL("/foo.ext1/bar.ext2"), FPL(".ext2") },
733 { FPL("/foo.bar////"), FPL(".bar") },
734 { FPL("/foo.bar/.."), FPL("") },
735 { FPL("/foo.bar/..////"), FPL("") },
736 };
737 for (unsigned int i = 0; i < arraysize(cases); ++i) {
738 FilePath path(cases[i].input);
739 FilePath::StringType extension = path.Extension();
740 EXPECT_STREQ(cases[i].expected, extension.c_str()) << "i: " << i <<
741 ", path: " << path.value();
742 }
743}
744
745TEST_F(FilePathTest, InsertBeforeExtension) {
746 const struct BinaryTestData cases[] = {
747 { { FPL(""), FPL("") }, FPL("") },
748 { { FPL(""), FPL("txt") }, FPL("") },
749 { { FPL("."), FPL("txt") }, FPL("") },
750 { { FPL(".."), FPL("txt") }, FPL("") },
751 { { FPL("foo.dll"), FPL("txt") }, FPL("footxt.dll") },
752 { { FPL("."), FPL("") }, FPL(".") },
753 { { FPL("foo.dll"), FPL(".txt") }, FPL("foo.txt.dll") },
754 { { FPL("foo"), FPL("txt") }, FPL("footxt") },
755 { { FPL("foo"), FPL(".txt") }, FPL("foo.txt") },
756 { { FPL("foo.baz.dll"), FPL("txt") }, FPL("foo.baztxt.dll") },
757 { { FPL("foo.baz.dll"), FPL(".txt") }, FPL("foo.baz.txt.dll") },
758 { { FPL("foo.dll"), FPL("") }, FPL("foo.dll") },
759 { { FPL("foo.dll"), FPL(".") }, FPL("foo..dll") },
760 { { FPL("foo"), FPL("") }, FPL("foo") },
761 { { FPL("foo"), FPL(".") }, FPL("foo.") },
762 { { FPL("foo.baz.dll"), FPL("") }, FPL("foo.baz.dll") },
763 { { FPL("foo.baz.dll"), FPL(".") }, FPL("foo.baz..dll") },
764#if defined(FILE_PATH_USES_WIN_SEPARATORS)
765 { { FPL("\\"), FPL("") }, FPL("\\") },
766 { { FPL("\\"), FPL("txt") }, FPL("\\txt") },
767 { { FPL("\\."), FPL("txt") }, FPL("") },
768 { { FPL("\\.."), FPL("txt") }, FPL("") },
769 { { FPL("\\."), FPL("") }, FPL("\\.") },
770 { { FPL("C:\\bar\\foo.dll"), FPL("txt") },
771 FPL("C:\\bar\\footxt.dll") },
772 { { FPL("C:\\bar.baz\\foodll"), FPL("txt") },
773 FPL("C:\\bar.baz\\foodlltxt") },
774 { { FPL("C:\\bar.baz\\foo.dll"), FPL("txt") },
775 FPL("C:\\bar.baz\\footxt.dll") },
776 { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("txt") },
777 FPL("C:\\bar.baz\\foo.dlltxt.exe") },
778 { { FPL("C:\\bar.baz\\foo"), FPL("") },
779 FPL("C:\\bar.baz\\foo") },
780 { { FPL("C:\\bar.baz\\foo.exe"), FPL("") },
781 FPL("C:\\bar.baz\\foo.exe") },
782 { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("") },
783 FPL("C:\\bar.baz\\foo.dll.exe") },
784 { { FPL("C:\\bar\\baz\\foo.exe"), FPL(" (1)") },
785 FPL("C:\\bar\\baz\\foo (1).exe") },
786 { { FPL("C:\\foo.baz\\\\"), FPL(" (1)") }, FPL("C:\\foo (1).baz") },
787 { { FPL("C:\\foo.baz\\..\\"), FPL(" (1)") }, FPL("") },
788#endif
789 { { FPL("/"), FPL("") }, FPL("/") },
790 { { FPL("/"), FPL("txt") }, FPL("/txt") },
791 { { FPL("/."), FPL("txt") }, FPL("") },
792 { { FPL("/.."), FPL("txt") }, FPL("") },
793 { { FPL("/."), FPL("") }, FPL("/.") },
794 { { FPL("/bar/foo.dll"), FPL("txt") }, FPL("/bar/footxt.dll") },
795 { { FPL("/bar.baz/foodll"), FPL("txt") }, FPL("/bar.baz/foodlltxt") },
796 { { FPL("/bar.baz/foo.dll"), FPL("txt") }, FPL("/bar.baz/footxt.dll") },
797 { { FPL("/bar.baz/foo.dll.exe"), FPL("txt") },
798 FPL("/bar.baz/foo.dlltxt.exe") },
799 { { FPL("/bar.baz/foo"), FPL("") }, FPL("/bar.baz/foo") },
800 { { FPL("/bar.baz/foo.exe"), FPL("") }, FPL("/bar.baz/foo.exe") },
801 { { FPL("/bar.baz/foo.dll.exe"), FPL("") }, FPL("/bar.baz/foo.dll.exe") },
802 { { FPL("/bar/baz/foo.exe"), FPL(" (1)") }, FPL("/bar/baz/foo (1).exe") },
803 { { FPL("/bar/baz/..////"), FPL(" (1)") }, FPL("") },
804 };
805 for (unsigned int i = 0; i < arraysize(cases); ++i) {
806 FilePath path(cases[i].inputs[0]);
807 FilePath result = path.InsertBeforeExtension(cases[i].inputs[1]);
808 EXPECT_EQ(cases[i].expected, result.value()) << "i: " << i <<
809 ", path: " << path.value() << ", insert: " << cases[i].inputs[1];
810 }
811}
812
813TEST_F(FilePathTest, ReplaceExtension) {
814 const struct BinaryTestData cases[] = {
815 { { FPL(""), FPL("") }, FPL("") },
816 { { FPL(""), FPL("txt") }, FPL("") },
817 { { FPL("."), FPL("txt") }, FPL("") },
818 { { FPL(".."), FPL("txt") }, FPL("") },
819 { { FPL("."), FPL("") }, FPL("") },
820 { { FPL("foo.dll"), FPL("txt") }, FPL("foo.txt") },
821 { { FPL("foo..dll"), FPL("txt") }, FPL("foo..txt") },
822 { { FPL("foo.dll"), FPL(".txt") }, FPL("foo.txt") },
823 { { FPL("foo"), FPL("txt") }, FPL("foo.txt") },
824 { { FPL("foo."), FPL("txt") }, FPL("foo.txt") },
825 { { FPL("foo.."), FPL("txt") }, FPL("foo..txt") },
826 { { FPL("foo"), FPL(".txt") }, FPL("foo.txt") },
827 { { FPL("foo.baz.dll"), FPL("txt") }, FPL("foo.baz.txt") },
828 { { FPL("foo.baz.dll"), FPL(".txt") }, FPL("foo.baz.txt") },
829 { { FPL("foo.dll"), FPL("") }, FPL("foo") },
830 { { FPL("foo.dll"), FPL(".") }, FPL("foo") },
831 { { FPL("foo"), FPL("") }, FPL("foo") },
832 { { FPL("foo"), FPL(".") }, FPL("foo") },
833 { { FPL("foo.baz.dll"), FPL("") }, FPL("foo.baz") },
834 { { FPL("foo.baz.dll"), FPL(".") }, FPL("foo.baz") },
835#if defined(FILE_PATH_USES_WIN_SEPARATORS)
836 { { FPL("C:\\foo.bar\\foo"), FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
837 { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
838#endif
839 { { FPL("/foo.bar/foo"), FPL("baz") }, FPL("/foo.bar/foo.baz") },
840 { { FPL("/foo.bar/..////"), FPL("baz") }, FPL("") },
841 };
842 for (unsigned int i = 0; i < arraysize(cases); ++i) {
843 FilePath path(cases[i].inputs[0]);
844 FilePath replaced = path.ReplaceExtension(cases[i].inputs[1]);
845 EXPECT_EQ(cases[i].expected, replaced.value()) << "i: " << i <<
846 ", path: " << path.value() << ", replace: " << cases[i].inputs[1];
847 }
848}
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900849
850TEST_F(FilePathTest, MatchesExtension) {
851 const struct BinaryBooleanTestData cases[] = {
852 { { FPL("foo"), FPL("") }, true},
853 { { FPL("foo"), FPL(".") }, false},
854 { { FPL("foo."), FPL("") }, false},
855 { { FPL("foo."), FPL(".") }, true},
856 { { FPL("foo.txt"), FPL(".dll") }, false},
857 { { FPL("foo.txt"), FPL(".txt") }, true},
858 { { FPL("foo.txt.dll"), FPL(".txt") }, false},
859 { { FPL("foo.txt.dll"), FPL(".dll") }, true},
860#if defined(FILE_PATH_USES_DRIVE_LETTERS)
861 { { FPL("c:/foo.txt.dll"), FPL(".txt") }, false},
862 { { FPL("c:/foo.txt"), FPL(".txt") }, true},
863#endif // FILE_PATH_USES_DRIVE_LETTERS
864#if defined(FILE_PATH_USES_WIN_SEPARATORS)
865 { { FPL("c:\\bar\\foo.txt.dll"), FPL(".txt") }, false},
866 { { FPL("c:\\bar\\foo.txt"), FPL(".txt") }, true},
867#endif // FILE_PATH_USES_DRIVE_LETTERS
868 { { FPL("/bar/foo.txt.dll"), FPL(".txt") }, false},
869 { { FPL("/bar/foo.txt"), FPL(".txt") }, true},
870 };
871
872 for (size_t i = 0; i < arraysize(cases); ++i) {
873 FilePath path(cases[i].inputs[0]);
874 FilePath::StringType ext(cases[i].inputs[1]);
875
876 EXPECT_EQ(cases[i].expected, path.MatchesExtension(ext)) <<
877 "i: " << i << ", path: " << path.value() << ", ext: " << ext;
878 }
879}
cevans@chromium.org48dc54c2009-08-16 06:44:31 +0900880
881TEST_F(FilePathTest, ReferencesParent) {
882 const struct UnaryBooleanTestData cases[] = {
883 { FPL("."), false },
884 { FPL(".."), true },
885 { FPL("a.."), false },
886 { FPL("..a"), false },
887 { FPL("../"), true },
888 { FPL("/.."), true },
889 { FPL("/../"), true },
890 { FPL("/a../"), false },
891 { FPL("/..a/"), false },
892 { FPL("//.."), true },
893 { FPL("..//"), true },
894 { FPL("//..//"), true },
895 { FPL("a//..//c"), true },
896 { FPL("../b/c"), true },
897 { FPL("/../b/c"), true },
898 { FPL("a/b/.."), true },
899 { FPL("a/b/../"), true },
900 { FPL("a/../c"), true },
901 { FPL("a/b/c"), false },
902 };
903
904 for (size_t i = 0; i < arraysize(cases); ++i) {
905 FilePath input(cases[i].input);
906 bool observed = input.ReferencesParent();
907 EXPECT_EQ(cases[i].expected, observed) <<
908 "i: " << i << ", input: " << input.value();
909 }
910}