blob: a2afa1eea139748ac053fd1d9922ada4d39a7fef [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
aa@chromium.org76e5c632008-12-18 17:38:16 +0900315TEST_F(FilePathTest, IsAbsolute) {
mark@chromium.org6380e262008-10-04 03:21:47 +0900316 const struct UnaryBooleanTestData cases[] = {
317 { FPL(""), false },
318 { FPL("a"), false },
319 { FPL("c:"), false },
320 { FPL("c:a"), false },
321 { FPL("a/b"), false },
322 { FPL("//"), true },
323 { FPL("//a"), true },
324 { FPL("c:a/b"), false },
325 { FPL("?:/a"), false },
326#if defined(FILE_PATH_USES_DRIVE_LETTERS)
327 { FPL("/"), false },
328 { FPL("/a"), false },
329 { FPL("/."), false },
330 { FPL("/.."), false },
331 { FPL("c:/"), true },
332 { FPL("c:/a"), true },
333 { FPL("c:/."), true },
334 { FPL("c:/.."), true },
335 { FPL("C:/a"), true },
336 { FPL("d:/a"), true },
337#else // FILE_PATH_USES_DRIVE_LETTERS
338 { FPL("/"), true },
339 { FPL("/a"), true },
340 { FPL("/."), true },
341 { FPL("/.."), true },
342 { FPL("c:/"), false },
343#endif // FILE_PATH_USES_DRIVE_LETTERS
344#if defined(FILE_PATH_USES_WIN_SEPARATORS)
345 { FPL("a\\b"), false },
346 { FPL("\\\\"), true },
347 { FPL("\\\\a"), true },
348 { FPL("a\\b"), false },
349 { FPL("\\\\"), true },
350 { FPL("//a"), true },
351 { FPL("c:a\\b"), false },
352 { FPL("?:\\a"), false },
353#if defined(FILE_PATH_USES_DRIVE_LETTERS)
354 { FPL("\\"), false },
355 { FPL("\\a"), false },
356 { FPL("\\."), false },
357 { FPL("\\.."), false },
358 { FPL("c:\\"), true },
359 { FPL("c:\\"), true },
360 { FPL("c:\\a"), true },
361 { FPL("c:\\."), true },
362 { FPL("c:\\.."), true },
363 { FPL("C:\\a"), true },
364 { FPL("d:\\a"), true },
365#else // FILE_PATH_USES_DRIVE_LETTERS
366 { FPL("\\"), true },
367 { FPL("\\a"), true },
368 { FPL("\\."), true },
369 { FPL("\\.."), true },
370 { FPL("c:\\"), false },
371#endif // FILE_PATH_USES_DRIVE_LETTERS
372#endif // FILE_PATH_USES_WIN_SEPARATORS
373 };
374
375 for (size_t i = 0; i < arraysize(cases); ++i) {
376 FilePath input(cases[i].input);
377 bool observed = input.IsAbsolute();
378 EXPECT_EQ(cases[i].expected, observed) <<
379 "i: " << i << ", input: " << input.value();
380 }
381}
aa@chromium.org76e5c632008-12-18 17:38:16 +0900382
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900383TEST_F(FilePathTest, PathComponentsTest) {
384 const struct UnaryTestData cases[] = {
385 { FPL("//foo/bar/baz/"), FPL("|//|foo|bar|baz")},
386 { FPL("///"), FPL("|/")},
387 { FPL("/foo//bar//baz/"), FPL("|/|foo|bar|baz")},
388 { FPL("/foo/bar/baz/"), FPL("|/|foo|bar|baz")},
389 { FPL("/foo/bar/baz//"), FPL("|/|foo|bar|baz")},
390 { FPL("/foo/bar/baz///"), FPL("|/|foo|bar|baz")},
391 { FPL("/foo/bar/baz"), FPL("|/|foo|bar|baz")},
392 { FPL("/foo/bar.bot/baz.txt"), FPL("|/|foo|bar.bot|baz.txt")},
393 { FPL("//foo//bar/baz"), FPL("|//|foo|bar|baz")},
394 { FPL("/"), FPL("|/")},
395 { FPL("foo"), FPL("|foo")},
396 { FPL(""), FPL("")},
397#if defined(FILE_PATH_USES_DRIVE_LETTERS)
398 { FPL("e:/foo"), FPL("|e:|/|foo")},
399 { FPL("e:/"), FPL("|e:|/")},
400 { FPL("e:"), FPL("|e:")},
401#endif // FILE_PATH_USES_DRIVE_LETTERS
402#if defined(FILE_PATH_USES_WIN_SEPARATORS)
403 { FPL("../foo"), FPL("|..|foo")},
404 { FPL("./foo"), FPL("|foo")},
405 { FPL("../foo/bar/"), FPL("|..|foo|bar") },
406 { FPL("\\\\foo\\bar\\baz\\"), FPL("|\\\\|foo|bar|baz")},
407 { FPL("\\\\\\"), FPL("|\\")},
408 { FPL("\\foo\\\\bar\\\\baz\\"), FPL("|\\|foo|bar|baz")},
409 { FPL("\\foo\\bar\\baz\\"), FPL("|\\|foo|bar|baz")},
410 { FPL("\\foo\\bar\\baz\\\\"), FPL("|\\|foo|bar|baz")},
411 { FPL("\\foo\\bar\\baz\\\\\\"), FPL("|\\|foo|bar|baz")},
412 { FPL("\\foo\\bar\\baz"), FPL("|\\|foo|bar|baz")},
413 { FPL("\\foo\\bar/baz\\\\\\"), FPL("|\\|foo|bar|baz")},
414 { FPL("/foo\\bar\\baz"), FPL("|/|foo|bar|baz")},
415 { FPL("\\foo\\bar.bot\\baz.txt"), FPL("|\\|foo|bar.bot|baz.txt")},
416 { FPL("\\\\foo\\\\bar\\baz"), FPL("|\\\\|foo|bar|baz")},
417 { FPL("\\"), FPL("|\\")},
418#endif // FILE_PATH_USES_WIN_SEPARATORS
419 };
420
421 for (size_t i = 0; i < arraysize(cases); ++i) {
422 FilePath input(cases[i].input);
423 std::vector<FilePath::StringType> comps;
424 input.GetComponents(&comps);
425
426 FilePath::StringType observed;
427 for (size_t j = 0; j < comps.size(); ++j) {
428 observed.append(FILE_PATH_LITERAL("|"), 1);
429 observed.append(comps[j]);
430 }
431 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed) <<
432 "i: " << i << ", input: " << input.value();
433 }
434}
435
436TEST_F(FilePathTest, IsParentTest) {
437 const struct BinaryBooleanTestData cases[] = {
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900438 { { FPL("/"), FPL("/foo/bar/baz") }, true},
439 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, true},
440 { { FPL("/foo/bar/"), FPL("/foo/bar/baz") }, true},
441 { { FPL("//foo/bar/"), FPL("//foo/bar/baz") }, true},
442 { { FPL("/foo/bar"), FPL("/foo2/bar/baz") }, false},
443 { { FPL("/foo/bar.txt"), FPL("/foo/bar/baz") }, false},
444 { { FPL("/foo/bar"), FPL("/foo/bar2/baz") }, false},
445 { { FPL("/foo/bar"), FPL("/foo/bar") }, false},
446 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, false},
447 { { FPL("foo/bar"), FPL("foo/bar/baz") }, true},
448 { { FPL("foo/bar"), FPL("foo2/bar/baz") }, false},
449 { { FPL("foo/bar"), FPL("foo/bar2/baz") }, false},
450 { { FPL(""), FPL("foo") }, false},
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900451#if defined(FILE_PATH_USES_DRIVE_LETTERS)
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900452 { { FPL("c:/foo/bar"), FPL("c:/foo/bar/baz") }, true},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900453 { { FPL("E:/foo/bar"), FPL("e:/foo/bar/baz") }, true},
454 { { FPL("f:/foo/bar"), FPL("F:/foo/bar/baz") }, true},
455 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar/baz") }, false},
456 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900457 { { FPL("c:/"), FPL("c:/foo/bar/baz") }, true},
458 { { FPL("c:"), FPL("c:/foo/bar/baz") }, true},
459 { { FPL("c:/foo/bar"), FPL("d:/foo/bar/baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900460 { { FPL("c:/foo/bar"), FPL("D:/foo/bar/baz") }, false},
461 { { FPL("C:/foo/bar"), FPL("d:/foo/bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900462 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar/baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900463 { { FPL("e:/foo/bar"), FPL("E:/foo2/bar/baz") }, false},
464 { { FPL("F:/foo/bar"), FPL("f:/foo2/bar/baz") }, false},
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900465 { { FPL("c:/foo/bar"), FPL("c:/foo/bar2/baz") }, false},
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900466#endif // FILE_PATH_USES_DRIVE_LETTERS
467#if defined(FILE_PATH_USES_WIN_SEPARATORS)
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900468 { { FPL("\\foo\\bar"), FPL("\\foo\\bar\\baz") }, true},
469 { { FPL("\\foo/bar"), FPL("\\foo\\bar\\baz") }, true},
470 { { FPL("\\foo/bar"), FPL("\\foo/bar/baz") }, true},
471 { { FPL("\\"), FPL("\\foo\\bar\\baz") }, true},
472 { { FPL(""), FPL("\\foo\\bar\\baz") }, false},
473 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar\\baz") }, false},
474 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2\\baz") }, false},
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900475#endif // FILE_PATH_USES_WIN_SEPARATORS
rafaelw@chromium.org465facc2009-06-25 06:28:30 +0900476 };
477
478 for (size_t i = 0; i < arraysize(cases); ++i) {
479 FilePath parent(cases[i].inputs[0]);
480 FilePath child(cases[i].inputs[1]);
481
482 EXPECT_EQ(parent.IsParent(child), cases[i].expected) <<
483 "i: " << i << ", parent: " << parent.value() << ", child: " <<
484 child.value();
485 }
486}
487
mark@chromium.orgaf9f62a2009-09-17 06:03:44 +0900488TEST_F(FilePathTest, AppendRelativePathTest) {
489 const struct BinaryTestData cases[] = {
490 { { FPL("/"), FPL("/foo/bar/baz") }, FPL("foo/bar/baz")},
491 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, FPL("baz")},
492 { { FPL("/foo/bar/"), FPL("/foo/bar/baz") }, FPL("baz")},
493 { { FPL("//foo/bar/"), FPL("//foo/bar/baz") }, FPL("baz")},
494 { { FPL("/foo/bar"), FPL("/foo2/bar/baz") }, FPL("")},
495 { { FPL("/foo/bar.txt"), FPL("/foo/bar/baz") }, FPL("")},
496 { { FPL("/foo/bar"), FPL("/foo/bar2/baz") }, FPL("")},
497 { { FPL("/foo/bar"), FPL("/foo/bar") }, FPL("")},
498 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, FPL("")},
499 { { FPL("foo/bar"), FPL("foo/bar/baz") }, FPL("baz")},
500 { { FPL("foo/bar"), FPL("foo2/bar/baz") }, FPL("")},
501 { { FPL("foo/bar"), FPL("foo/bar2/baz") }, FPL("")},
502 { { FPL(""), FPL("foo") }, FPL("")},
503#if defined(FILE_PATH_USES_DRIVE_LETTERS)
504 { { FPL("c:/foo/bar"), FPL("c:/foo/bar/baz") }, FPL("baz")},
505 { { FPL("E:/foo/bar"), FPL("e:/foo/bar/baz") }, FPL("baz")},
506 { { FPL("f:/foo/bar"), FPL("F:/foo/bar/baz") }, FPL("baz")},
507 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar/baz") }, FPL("")},
508 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar/baz") }, FPL("")},
509 { { FPL("c:/"), FPL("c:/foo/bar/baz") }, FPL("foo/bar/baz")},
510 { { FPL("c:"), FPL("c:/foo/bar/baz") }, FPL("foo/bar/baz")},
511 { { FPL("c:/foo/bar"), FPL("d:/foo/bar/baz") }, FPL("")},
512 { { FPL("c:/foo/bar"), FPL("D:/foo/bar/baz") }, FPL("")},
513 { { FPL("C:/foo/bar"), FPL("d:/foo/bar/baz") }, FPL("")},
514 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar/baz") }, FPL("")},
515 { { FPL("e:/foo/bar"), FPL("E:/foo2/bar/baz") }, FPL("")},
516 { { FPL("F:/foo/bar"), FPL("f:/foo2/bar/baz") }, FPL("")},
517 { { FPL("c:/foo/bar"), FPL("c:/foo/bar2/baz") }, FPL("")},
518#endif // FILE_PATH_USES_DRIVE_LETTERS
519#if defined(FILE_PATH_USES_WIN_SEPARATORS)
520 { { FPL("\\foo\\bar"), FPL("\\foo\\bar\\baz") }, FPL("baz")},
521 { { FPL("\\foo/bar"), FPL("\\foo\\bar\\baz") }, FPL("baz")},
522 { { FPL("\\foo/bar"), FPL("\\foo/bar/baz") }, FPL("baz")},
523 { { FPL("\\"), FPL("\\foo\\bar\\baz") }, FPL("foo\\bar\\baz")},
524 { { FPL(""), FPL("\\foo\\bar\\baz") }, FPL("")},
525 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar\\baz") }, FPL("")},
526 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2\\baz") }, FPL("")},
527#endif // FILE_PATH_USES_WIN_SEPARATORS
528 };
529
530 const FilePath base(FPL("blah"));
531
532 for (size_t i = 0; i < arraysize(cases); ++i) {
533 FilePath parent(cases[i].inputs[0]);
534 FilePath child(cases[i].inputs[1]);
535 {
536 FilePath result;
537 bool success = parent.AppendRelativePath(child, &result);
538 EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
539 "i: " << i << ", parent: " << parent.value() << ", child: " <<
540 child.value();
541 EXPECT_STREQ(cases[i].expected, result.value().c_str()) <<
542 "i: " << i << ", parent: " << parent.value() << ", child: " <<
543 child.value();
544 }
545 {
546 FilePath result(base);
547 bool success = parent.AppendRelativePath(child, &result);
548 EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
549 "i: " << i << ", parent: " << parent.value() << ", child: " <<
550 child.value();
551 EXPECT_EQ(base.Append(cases[i].expected).value(), result.value()) <<
552 "i: " << i << ", parent: " << parent.value() << ", child: " <<
553 child.value();
554 }
555 }
556}
557
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900558TEST_F(FilePathTest, EqualityTest) {
559 const struct BinaryBooleanTestData cases[] = {
560 { { FPL("/foo/bar/baz"), FPL("/foo/bar/baz") }, true},
561 { { FPL("/foo/bar"), FPL("/foo/bar/baz") }, false},
562 { { FPL("/foo/bar/baz"), FPL("/foo/bar") }, false},
563 { { FPL("//foo/bar/"), FPL("//foo/bar/") }, true},
564 { { FPL("/foo/bar"), FPL("/foo2/bar") }, false},
565 { { FPL("/foo/bar.txt"), FPL("/foo/bar") }, false},
566 { { FPL("foo/bar"), FPL("foo/bar") }, true},
567 { { FPL("foo/bar"), FPL("foo/bar/baz") }, false},
568 { { FPL(""), FPL("foo") }, false},
569#if defined(FILE_PATH_USES_DRIVE_LETTERS)
570 { { FPL("c:/foo/bar"), FPL("c:/foo/bar") }, true},
571 { { FPL("E:/foo/bar"), FPL("e:/foo/bar") }, true},
572 { { FPL("f:/foo/bar"), FPL("F:/foo/bar") }, true},
573 { { FPL("E:/Foo/bar"), FPL("e:/foo/bar") }, false},
574 { { FPL("f:/foo/bar"), FPL("F:/foo/Bar") }, false},
575 { { FPL("c:/"), FPL("c:/") }, true},
576 { { FPL("c:"), FPL("c:") }, true},
577 { { FPL("c:/foo/bar"), FPL("d:/foo/bar") }, false},
578 { { FPL("c:/foo/bar"), FPL("D:/foo/bar") }, false},
579 { { FPL("C:/foo/bar"), FPL("d:/foo/bar") }, false},
580 { { FPL("c:/foo/bar"), FPL("c:/foo2/bar") }, false},
581#endif // FILE_PATH_USES_DRIVE_LETTERS
582#if defined(FILE_PATH_USES_WIN_SEPARATORS)
583 { { FPL("\\foo\\bar"), FPL("\\foo\\bar") }, true},
584 { { FPL("\\foo/bar"), FPL("\\foo/bar") }, true},
585 { { FPL("\\foo/bar"), FPL("\\foo\bar") }, false},
586 { { FPL("\\"), FPL("\\") }, true},
587 { { FPL("\\"), FPL("/") }, false},
588 { { FPL(""), FPL("\\") }, false},
589 { { FPL("\\foo\\bar"), FPL("\\foo2\\bar") }, false},
590 { { FPL("\\foo\\bar"), FPL("\\foo\\bar2") }, false},
591#if defined(FILE_PATH_USES_DRIVE_LETTERS)
592 { { FPL("c:\\foo\\bar"), FPL("c:\\foo\\bar") }, true},
593 { { FPL("E:\\foo\\bar"), FPL("e:\\foo\\bar") }, true},
594 { { FPL("f:\\foo\\bar"), FPL("F:\\foo/bar") }, false},
595#endif // FILE_PATH_USES_DRIVE_LETTERS
596#endif // FILE_PATH_USES_WIN_SEPARATORS
597 };
598
599 for (size_t i = 0; i < arraysize(cases); ++i) {
600 FilePath a(cases[i].inputs[0]);
601 FilePath b(cases[i].inputs[1]);
602
603 EXPECT_EQ(a == b, cases[i].expected) <<
604 "equality i: " << i << ", a: " << a.value() << ", b: " <<
605 b.value();
606 }
607
rafaelw@chromium.org724cf542009-07-01 10:03:34 +0900608 for (size_t i = 0; i < arraysize(cases); ++i) {
609 FilePath a(cases[i].inputs[0]);
610 FilePath b(cases[i].inputs[1]);
611
612 EXPECT_EQ(a != b, !cases[i].expected) <<
613 "inequality i: " << i << ", a: " << a.value() << ", b: " <<
614 b.value();
615 }
616}
617
erikkay@google.com985d4202009-01-10 03:26:19 +0900618TEST_F(FilePathTest, Extension) {
619 FilePath base_dir(FILE_PATH_LITERAL("base_dir"));
620
621 FilePath jpg = base_dir.Append(FILE_PATH_LITERAL("foo.jpg"));
622 EXPECT_EQ(jpg.Extension(), FILE_PATH_LITERAL(".jpg"));
623
624 FilePath base = jpg.BaseName().RemoveExtension();
625 EXPECT_EQ(base.value(), FILE_PATH_LITERAL("foo"));
626
627 FilePath path_no_ext = base_dir.Append(base);
628 EXPECT_EQ(jpg.RemoveExtension().value(), path_no_ext.value());
629
630 EXPECT_EQ(path_no_ext.value(), path_no_ext.RemoveExtension().value());
631 EXPECT_EQ(path_no_ext.Extension(), FILE_PATH_LITERAL(""));
632}
633
634TEST_F(FilePathTest, Extension2) {
635 const struct UnaryTestData cases[] = {
636#if defined(FILE_PATH_USES_WIN_SEPARATORS)
637 { FPL("C:\\a\\b\\c.ext"), FPL(".ext") },
638 { FPL("C:\\a\\b\\c."), FPL(".") },
639 { FPL("C:\\a\\b\\c"), FPL("") },
640 { FPL("C:\\a\\b\\"), FPL("") },
641 { FPL("C:\\a\\b.\\"), FPL(".") },
642 { FPL("C:\\a\\b\\c.ext1.ext2"), FPL(".ext2") },
643 { FPL("C:\\foo.bar\\\\\\"), FPL(".bar") },
644 { FPL("C:\\foo.bar\\.."), FPL("") },
645 { FPL("C:\\foo.bar\\..\\\\"), FPL("") },
646#endif
647 { FPL("/foo/bar/baz.ext"), FPL(".ext") },
648 { FPL("/foo/bar/baz."), FPL(".") },
649 { FPL("/foo/bar/baz.."), FPL(".") },
650 { FPL("/foo/bar/baz"), FPL("") },
651 { FPL("/foo/bar/"), FPL("") },
652 { FPL("/foo/bar./"), FPL(".") },
653 { FPL("/foo/bar/baz.ext1.ext2"), FPL(".ext2") },
654 { FPL("."), FPL("") },
655 { FPL(".."), FPL("") },
656 { FPL("./foo"), FPL("") },
657 { FPL("./foo.ext"), FPL(".ext") },
658 { FPL("/foo.ext1/bar.ext2"), FPL(".ext2") },
659 { FPL("/foo.bar////"), FPL(".bar") },
660 { FPL("/foo.bar/.."), FPL("") },
661 { FPL("/foo.bar/..////"), FPL("") },
662 };
663 for (unsigned int i = 0; i < arraysize(cases); ++i) {
664 FilePath path(cases[i].input);
665 FilePath::StringType extension = path.Extension();
666 EXPECT_STREQ(cases[i].expected, extension.c_str()) << "i: " << i <<
667 ", path: " << path.value();
668 }
669}
670
671TEST_F(FilePathTest, InsertBeforeExtension) {
672 const struct BinaryTestData cases[] = {
673 { { FPL(""), FPL("") }, FPL("") },
674 { { FPL(""), FPL("txt") }, FPL("") },
675 { { FPL("."), FPL("txt") }, FPL("") },
676 { { FPL(".."), FPL("txt") }, FPL("") },
677 { { FPL("foo.dll"), FPL("txt") }, FPL("footxt.dll") },
678 { { FPL("."), FPL("") }, FPL(".") },
679 { { FPL("foo.dll"), FPL(".txt") }, FPL("foo.txt.dll") },
680 { { FPL("foo"), FPL("txt") }, FPL("footxt") },
681 { { FPL("foo"), FPL(".txt") }, FPL("foo.txt") },
682 { { FPL("foo.baz.dll"), FPL("txt") }, FPL("foo.baztxt.dll") },
683 { { FPL("foo.baz.dll"), FPL(".txt") }, FPL("foo.baz.txt.dll") },
684 { { FPL("foo.dll"), FPL("") }, FPL("foo.dll") },
685 { { FPL("foo.dll"), FPL(".") }, FPL("foo..dll") },
686 { { FPL("foo"), FPL("") }, FPL("foo") },
687 { { FPL("foo"), FPL(".") }, FPL("foo.") },
688 { { FPL("foo.baz.dll"), FPL("") }, FPL("foo.baz.dll") },
689 { { FPL("foo.baz.dll"), FPL(".") }, FPL("foo.baz..dll") },
690#if defined(FILE_PATH_USES_WIN_SEPARATORS)
691 { { FPL("\\"), FPL("") }, FPL("\\") },
692 { { FPL("\\"), FPL("txt") }, FPL("\\txt") },
693 { { FPL("\\."), FPL("txt") }, FPL("") },
694 { { FPL("\\.."), FPL("txt") }, FPL("") },
695 { { FPL("\\."), FPL("") }, FPL("\\.") },
696 { { FPL("C:\\bar\\foo.dll"), FPL("txt") },
697 FPL("C:\\bar\\footxt.dll") },
698 { { FPL("C:\\bar.baz\\foodll"), FPL("txt") },
699 FPL("C:\\bar.baz\\foodlltxt") },
700 { { FPL("C:\\bar.baz\\foo.dll"), FPL("txt") },
701 FPL("C:\\bar.baz\\footxt.dll") },
702 { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("txt") },
703 FPL("C:\\bar.baz\\foo.dlltxt.exe") },
704 { { FPL("C:\\bar.baz\\foo"), FPL("") },
705 FPL("C:\\bar.baz\\foo") },
706 { { FPL("C:\\bar.baz\\foo.exe"), FPL("") },
707 FPL("C:\\bar.baz\\foo.exe") },
708 { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("") },
709 FPL("C:\\bar.baz\\foo.dll.exe") },
710 { { FPL("C:\\bar\\baz\\foo.exe"), FPL(" (1)") },
711 FPL("C:\\bar\\baz\\foo (1).exe") },
712 { { FPL("C:\\foo.baz\\\\"), FPL(" (1)") }, FPL("C:\\foo (1).baz") },
713 { { FPL("C:\\foo.baz\\..\\"), FPL(" (1)") }, FPL("") },
714#endif
715 { { FPL("/"), FPL("") }, FPL("/") },
716 { { FPL("/"), FPL("txt") }, FPL("/txt") },
717 { { FPL("/."), FPL("txt") }, FPL("") },
718 { { FPL("/.."), FPL("txt") }, FPL("") },
719 { { FPL("/."), FPL("") }, FPL("/.") },
720 { { FPL("/bar/foo.dll"), FPL("txt") }, FPL("/bar/footxt.dll") },
721 { { FPL("/bar.baz/foodll"), FPL("txt") }, FPL("/bar.baz/foodlltxt") },
722 { { FPL("/bar.baz/foo.dll"), FPL("txt") }, FPL("/bar.baz/footxt.dll") },
723 { { FPL("/bar.baz/foo.dll.exe"), FPL("txt") },
724 FPL("/bar.baz/foo.dlltxt.exe") },
725 { { FPL("/bar.baz/foo"), FPL("") }, FPL("/bar.baz/foo") },
726 { { FPL("/bar.baz/foo.exe"), FPL("") }, FPL("/bar.baz/foo.exe") },
727 { { FPL("/bar.baz/foo.dll.exe"), FPL("") }, FPL("/bar.baz/foo.dll.exe") },
728 { { FPL("/bar/baz/foo.exe"), FPL(" (1)") }, FPL("/bar/baz/foo (1).exe") },
729 { { FPL("/bar/baz/..////"), FPL(" (1)") }, FPL("") },
730 };
731 for (unsigned int i = 0; i < arraysize(cases); ++i) {
732 FilePath path(cases[i].inputs[0]);
733 FilePath result = path.InsertBeforeExtension(cases[i].inputs[1]);
734 EXPECT_EQ(cases[i].expected, result.value()) << "i: " << i <<
735 ", path: " << path.value() << ", insert: " << cases[i].inputs[1];
736 }
737}
738
739TEST_F(FilePathTest, ReplaceExtension) {
740 const struct BinaryTestData cases[] = {
741 { { FPL(""), FPL("") }, FPL("") },
742 { { FPL(""), FPL("txt") }, FPL("") },
743 { { FPL("."), FPL("txt") }, FPL("") },
744 { { FPL(".."), FPL("txt") }, FPL("") },
745 { { FPL("."), FPL("") }, FPL("") },
746 { { FPL("foo.dll"), FPL("txt") }, FPL("foo.txt") },
747 { { FPL("foo..dll"), FPL("txt") }, FPL("foo..txt") },
748 { { FPL("foo.dll"), FPL(".txt") }, FPL("foo.txt") },
749 { { FPL("foo"), FPL("txt") }, FPL("foo.txt") },
750 { { FPL("foo."), FPL("txt") }, FPL("foo.txt") },
751 { { FPL("foo.."), FPL("txt") }, FPL("foo..txt") },
752 { { FPL("foo"), FPL(".txt") }, FPL("foo.txt") },
753 { { FPL("foo.baz.dll"), FPL("txt") }, FPL("foo.baz.txt") },
754 { { FPL("foo.baz.dll"), FPL(".txt") }, FPL("foo.baz.txt") },
755 { { FPL("foo.dll"), FPL("") }, FPL("foo") },
756 { { FPL("foo.dll"), FPL(".") }, FPL("foo") },
757 { { FPL("foo"), FPL("") }, FPL("foo") },
758 { { FPL("foo"), FPL(".") }, FPL("foo") },
759 { { FPL("foo.baz.dll"), FPL("") }, FPL("foo.baz") },
760 { { FPL("foo.baz.dll"), FPL(".") }, FPL("foo.baz") },
761#if defined(FILE_PATH_USES_WIN_SEPARATORS)
762 { { FPL("C:\\foo.bar\\foo"), FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
763 { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
764#endif
765 { { FPL("/foo.bar/foo"), FPL("baz") }, FPL("/foo.bar/foo.baz") },
766 { { FPL("/foo.bar/..////"), FPL("baz") }, FPL("") },
767 };
768 for (unsigned int i = 0; i < arraysize(cases); ++i) {
769 FilePath path(cases[i].inputs[0]);
770 FilePath replaced = path.ReplaceExtension(cases[i].inputs[1]);
771 EXPECT_EQ(cases[i].expected, replaced.value()) << "i: " << i <<
772 ", path: " << path.value() << ", replace: " << cases[i].inputs[1];
773 }
774}
avi@chromium.org8c3a9b32009-06-30 05:31:29 +0900775
776TEST_F(FilePathTest, MatchesExtension) {
777 const struct BinaryBooleanTestData cases[] = {
778 { { FPL("foo"), FPL("") }, true},
779 { { FPL("foo"), FPL(".") }, false},
780 { { FPL("foo."), FPL("") }, false},
781 { { FPL("foo."), FPL(".") }, true},
782 { { FPL("foo.txt"), FPL(".dll") }, false},
783 { { FPL("foo.txt"), FPL(".txt") }, true},
784 { { FPL("foo.txt.dll"), FPL(".txt") }, false},
785 { { FPL("foo.txt.dll"), FPL(".dll") }, true},
786#if defined(FILE_PATH_USES_DRIVE_LETTERS)
787 { { FPL("c:/foo.txt.dll"), FPL(".txt") }, false},
788 { { FPL("c:/foo.txt"), FPL(".txt") }, true},
789#endif // FILE_PATH_USES_DRIVE_LETTERS
790#if defined(FILE_PATH_USES_WIN_SEPARATORS)
791 { { FPL("c:\\bar\\foo.txt.dll"), FPL(".txt") }, false},
792 { { FPL("c:\\bar\\foo.txt"), FPL(".txt") }, true},
793#endif // FILE_PATH_USES_DRIVE_LETTERS
794 { { FPL("/bar/foo.txt.dll"), FPL(".txt") }, false},
795 { { FPL("/bar/foo.txt"), FPL(".txt") }, true},
796 };
797
798 for (size_t i = 0; i < arraysize(cases); ++i) {
799 FilePath path(cases[i].inputs[0]);
800 FilePath::StringType ext(cases[i].inputs[1]);
801
802 EXPECT_EQ(cases[i].expected, path.MatchesExtension(ext)) <<
803 "i: " << i << ", path: " << path.value() << ", ext: " << ext;
804 }
805}
cevans@chromium.org48dc54c2009-08-16 06:44:31 +0900806
807TEST_F(FilePathTest, ReferencesParent) {
808 const struct UnaryBooleanTestData cases[] = {
809 { FPL("."), false },
810 { FPL(".."), true },
811 { FPL("a.."), false },
812 { FPL("..a"), false },
813 { FPL("../"), true },
814 { FPL("/.."), true },
815 { FPL("/../"), true },
816 { FPL("/a../"), false },
817 { FPL("/..a/"), false },
818 { FPL("//.."), true },
819 { FPL("..//"), true },
820 { FPL("//..//"), true },
821 { FPL("a//..//c"), true },
822 { FPL("../b/c"), true },
823 { FPL("/../b/c"), true },
824 { FPL("a/b/.."), true },
825 { FPL("a/b/../"), true },
826 { FPL("a/../c"), true },
827 { FPL("a/b/c"), false },
828 };
829
830 for (size_t i = 0; i < arraysize(cases); ++i) {
831 FilePath input(cases[i].input);
832 bool observed = input.ReferencesParent();
833 EXPECT_EQ(cases[i].expected, observed) <<
834 "i: " << i << ", input: " << input.value();
835 }
836}
837