blob: 0255a766bdb161c83f10563dd0c32f1c5a3cc980 [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
5#include "base/file_path.h"
6
7#include "base/basictypes.h"
8#include "gtest/gtest.h"
9
10// This macro helps avoid wrapped lines in the test structs.
11#define FPL(x) FILE_PATH_LITERAL(x)
12
13struct UnaryTestData {
14 const FilePath::CharType* input;
15 const FilePath::CharType* expected;
16};
17
18struct UnaryBooleanTestData {
19 const FilePath::CharType* input;
20 bool expected;
21};
22
23struct BinaryTestData {
24 const FilePath::CharType* inputs[2];
25 const FilePath::CharType* expected;
26};
27
28TEST(FilePathTest, DirName) {
29 const struct UnaryTestData cases[] = {
30 { FPL(""), FPL(".") },
31 { FPL("aa"), FPL(".") },
32 { FPL("/aa/bb"), FPL("/aa") },
33 { FPL("/aa/bb/"), FPL("/aa") },
34 { FPL("/aa/bb//"), FPL("/aa") },
35 { FPL("/aa/bb/ccc"), FPL("/aa/bb") },
36 { FPL("/aa"), FPL("/") },
37 { FPL("/aa/"), FPL("/") },
38 { FPL("/"), FPL("/") },
39 { FPL("//"), FPL("//") },
40 { FPL("///"), FPL("/") },
41 { FPL("aa/"), FPL(".") },
42 { FPL("aa/bb"), FPL("aa") },
43 { FPL("aa/bb/"), FPL("aa") },
44 { FPL("aa/bb//"), FPL("aa") },
45 { FPL("aa//bb//"), FPL("aa") },
46 { FPL("aa//bb/"), FPL("aa") },
47 { FPL("aa//bb"), FPL("aa") },
48 { FPL("//aa/bb"), FPL("//aa") },
49 { FPL("//aa/"), FPL("//") },
50 { FPL("//aa"), FPL("//") },
51 { FPL("0:"), FPL(".") },
52 { FPL("@:"), FPL(".") },
53 { FPL("[:"), FPL(".") },
54 { FPL("`:"), FPL(".") },
55 { FPL("{:"), FPL(".") },
56 { FPL("\xB3:"), FPL(".") },
57 { FPL("\xC5:"), FPL(".") },
58#if defined(OS_WIN)
59 { FPL("\x0143:"), FPL(".") },
60#endif // OS_WIN
61#if defined(FILE_PATH_USES_DRIVE_LETTERS)
62 { FPL("c:"), FPL("c:") },
63 { FPL("C:"), FPL("C:") },
64 { FPL("A:"), FPL("A:") },
65 { FPL("Z:"), FPL("Z:") },
66 { FPL("a:"), FPL("a:") },
67 { FPL("z:"), FPL("z:") },
68 { FPL("c:aa"), FPL("c:") },
69 { FPL("c:/"), FPL("c:/") },
70 { FPL("c://"), FPL("c://") },
71 { FPL("c:///"), FPL("c:/") },
72 { FPL("c:/aa"), FPL("c:/") },
73 { FPL("c:/aa/"), FPL("c:/") },
74 { FPL("c:/aa/bb"), FPL("c:/aa") },
75 { FPL("c:aa/bb"), FPL("c:aa") },
76#endif // FILE_PATH_USES_DRIVE_LETTERS
77#if defined(FILE_PATH_USES_WIN_SEPARATORS)
78 { FPL("\\aa\\bb"), FPL("\\aa") },
79 { FPL("\\aa\\bb\\"), FPL("\\aa") },
80 { FPL("\\aa\\bb\\\\"), FPL("\\aa") },
81 { FPL("\\aa\\bb\\ccc"), FPL("\\aa\\bb") },
82 { FPL("\\aa"), FPL("\\") },
83 { FPL("\\aa\\"), FPL("\\") },
84 { FPL("\\"), FPL("\\") },
85 { FPL("\\\\"), FPL("\\\\") },
86 { FPL("\\\\\\"), FPL("\\") },
87 { FPL("aa\\"), FPL(".") },
88 { FPL("aa\\bb"), FPL("aa") },
89 { FPL("aa\\bb\\"), FPL("aa") },
90 { FPL("aa\\bb\\\\"), FPL("aa") },
91 { FPL("aa\\\\bb\\\\"), FPL("aa") },
92 { FPL("aa\\\\bb\\"), FPL("aa") },
93 { FPL("aa\\\\bb"), FPL("aa") },
94 { FPL("\\\\aa\\bb"), FPL("\\\\aa") },
95 { FPL("\\\\aa\\"), FPL("\\\\") },
96 { FPL("\\\\aa"), FPL("\\\\") },
97#if defined(FILE_PATH_USES_DRIVE_LETTERS)
98 { FPL("c:\\"), FPL("c:\\") },
99 { FPL("c:\\\\"), FPL("c:\\\\") },
100 { FPL("c:\\\\\\"), FPL("c:\\") },
101 { FPL("c:\\aa"), FPL("c:\\") },
102 { FPL("c:\\aa\\"), FPL("c:\\") },
103 { FPL("c:\\aa\\bb"), FPL("c:\\aa") },
104 { FPL("c:aa\\bb"), FPL("c:aa") },
105#endif // FILE_PATH_USES_DRIVE_LETTERS
106#endif // FILE_PATH_USES_WIN_SEPARATORS
107 };
108
109 for (size_t i = 0; i < arraysize(cases); ++i) {
110 FilePath input(cases[i].input);
111 FilePath observed = input.DirName();
112 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
113 "i: " << i << ", input: " << input.value();
114 }
115}
116
117TEST(FilePathTest, BaseName) {
118 const struct UnaryTestData cases[] = {
119 { FPL(""), FPL("") },
120 { FPL("aa"), FPL("aa") },
121 { FPL("/aa/bb"), FPL("bb") },
122 { FPL("/aa/bb/"), FPL("bb") },
123 { FPL("/aa/bb//"), FPL("bb") },
124 { FPL("/aa/bb/ccc"), FPL("ccc") },
125 { FPL("/aa"), FPL("aa") },
126 { FPL("/"), FPL("/") },
127 { FPL("//"), FPL("//") },
128 { FPL("///"), FPL("/") },
129 { FPL("aa/"), FPL("aa") },
130 { FPL("aa/bb"), FPL("bb") },
131 { FPL("aa/bb/"), FPL("bb") },
132 { FPL("aa/bb//"), FPL("bb") },
133 { FPL("aa//bb//"), FPL("bb") },
134 { FPL("aa//bb/"), FPL("bb") },
135 { FPL("aa//bb"), FPL("bb") },
136 { FPL("//aa/bb"), FPL("bb") },
137 { FPL("//aa/"), FPL("aa") },
138 { FPL("//aa"), FPL("aa") },
139 { FPL("0:"), FPL("0:") },
140 { FPL("@:"), FPL("@:") },
141 { FPL("[:"), FPL("[:") },
142 { FPL("`:"), FPL("`:") },
143 { FPL("{:"), FPL("{:") },
144 { FPL("\xB3:"), FPL("\xB3:") },
145 { FPL("\xC5:"), FPL("\xC5:") },
146#if defined(OS_WIN)
147 { FPL("\x0143:"), FPL("\x0143:") },
148#endif // OS_WIN
149#if defined(FILE_PATH_USES_DRIVE_LETTERS)
150 { FPL("c:"), FPL("") },
151 { FPL("C:"), FPL("") },
152 { FPL("A:"), FPL("") },
153 { FPL("Z:"), FPL("") },
154 { FPL("a:"), FPL("") },
155 { FPL("z:"), FPL("") },
156 { FPL("c:aa"), FPL("aa") },
157 { FPL("c:/"), FPL("/") },
158 { FPL("c://"), FPL("//") },
159 { FPL("c:///"), FPL("/") },
160 { FPL("c:/aa"), FPL("aa") },
161 { FPL("c:/aa/"), FPL("aa") },
162 { FPL("c:/aa/bb"), FPL("bb") },
163 { FPL("c:aa/bb"), FPL("bb") },
164#endif // FILE_PATH_USES_DRIVE_LETTERS
165#if defined(FILE_PATH_USES_WIN_SEPARATORS)
166 { FPL("\\aa\\bb"), FPL("bb") },
167 { FPL("\\aa\\bb\\"), FPL("bb") },
168 { FPL("\\aa\\bb\\\\"), FPL("bb") },
169 { FPL("\\aa\\bb\\ccc"), FPL("ccc") },
170 { FPL("\\aa"), FPL("aa") },
171 { FPL("\\"), FPL("\\") },
172 { FPL("\\\\"), FPL("\\\\") },
173 { FPL("\\\\\\"), FPL("\\") },
174 { FPL("aa\\"), FPL("aa") },
175 { FPL("aa\\bb"), FPL("bb") },
176 { FPL("aa\\bb\\"), FPL("bb") },
177 { FPL("aa\\bb\\\\"), FPL("bb") },
178 { FPL("aa\\\\bb\\\\"), FPL("bb") },
179 { FPL("aa\\\\bb\\"), FPL("bb") },
180 { FPL("aa\\\\bb"), FPL("bb") },
181 { FPL("\\\\aa\\bb"), FPL("bb") },
182 { FPL("\\\\aa\\"), FPL("aa") },
183 { FPL("\\\\aa"), FPL("aa") },
184#if defined(FILE_PATH_USES_DRIVE_LETTERS)
185 { FPL("c:\\"), FPL("\\") },
186 { FPL("c:\\\\"), FPL("\\\\") },
187 { FPL("c:\\\\\\"), FPL("\\") },
188 { FPL("c:\\aa"), FPL("aa") },
189 { FPL("c:\\aa\\"), FPL("aa") },
190 { FPL("c:\\aa\\bb"), FPL("bb") },
191 { FPL("c:aa\\bb"), FPL("bb") },
192#endif // FILE_PATH_USES_DRIVE_LETTERS
193#endif // FILE_PATH_USES_WIN_SEPARATORS
194 };
195
196 for (size_t i = 0; i < arraysize(cases); ++i) {
197 FilePath input(cases[i].input);
198 FilePath observed = input.BaseName();
199 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
200 "i: " << i << ", input: " << input.value();
201 }
202}
203
204TEST(FilePathTest, Append) {
205 const struct BinaryTestData cases[] = {
206 { { FPL(""), FPL("cc") }, FPL("cc") },
207 { { FPL("."), FPL("ff") }, FPL("ff") },
208 { { FPL("/"), FPL("cc") }, FPL("/cc") },
209 { { FPL("/aa"), FPL("") }, FPL("/aa") },
210 { { FPL("/aa/"), FPL("") }, FPL("/aa") },
211 { { FPL("//aa"), FPL("") }, FPL("//aa") },
212 { { FPL("//aa/"), FPL("") }, FPL("//aa") },
213 { { FPL("//"), FPL("aa") }, FPL("//aa") },
214#if defined(FILE_PATH_USES_DRIVE_LETTERS)
215 { { FPL("c:"), FPL("a") }, FPL("c:a") },
216 { { FPL("c:"), FPL("") }, FPL("c:") },
217 { { FPL("c:/"), FPL("a") }, FPL("c:/a") },
218 { { FPL("c://"), FPL("a") }, FPL("c://a") },
219 { { FPL("c:///"), FPL("a") }, FPL("c:/a") },
220#endif // FILE_PATH_USES_DRIVE_LETTERS
221#if defined(FILE_PATH_USES_WIN_SEPARATORS)
222 // Append introduces the default separator character, so these test cases
223 // need to be defined with different expected results on platforms that use
224 // different default separator characters.
225 { { FPL("\\"), FPL("cc") }, FPL("\\cc") },
226 { { FPL("\\aa"), FPL("") }, FPL("\\aa") },
227 { { FPL("\\aa\\"), FPL("") }, FPL("\\aa") },
228 { { FPL("\\\\aa"), FPL("") }, FPL("\\\\aa") },
229 { { FPL("\\\\aa\\"), FPL("") }, FPL("\\\\aa") },
230 { { FPL("\\\\"), FPL("aa") }, FPL("\\\\aa") },
231 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb\\cc") },
232 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb\\cc") },
233 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb\\cc") },
234 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb\\cc") },
235 { { FPL("a/b"), FPL("c") }, FPL("a/b\\c") },
236 { { FPL("a/b/"), FPL("c") }, FPL("a/b\\c") },
237 { { FPL("//aa"), FPL("bb") }, FPL("//aa\\bb") },
238 { { FPL("//aa/"), FPL("bb") }, FPL("//aa\\bb") },
239 { { FPL("\\aa\\bb"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
240 { { FPL("\\aa\\bb\\"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
241 { { FPL("aa\\bb\\"), FPL("cc") }, FPL("aa\\bb\\cc") },
242 { { FPL("aa\\bb"), FPL("cc") }, FPL("aa\\bb\\cc") },
243 { { FPL("a\\b"), FPL("c") }, FPL("a\\b\\c") },
244 { { FPL("a\\b\\"), FPL("c") }, FPL("a\\b\\c") },
245 { { FPL("\\\\aa"), FPL("bb") }, FPL("\\\\aa\\bb") },
246 { { FPL("\\\\aa\\"), FPL("bb") }, FPL("\\\\aa\\bb") },
247#if defined(FILE_PATH_USES_DRIVE_LETTERS)
248 { { FPL("c:\\"), FPL("a") }, FPL("c:\\a") },
249 { { FPL("c:\\\\"), FPL("a") }, FPL("c:\\\\a") },
250 { { FPL("c:\\\\\\"), FPL("a") }, FPL("c:\\a") },
251 { { FPL("c:\\"), FPL("") }, FPL("c:\\") },
252 { { FPL("c:\\a"), FPL("b") }, FPL("c:\\a\\b") },
253 { { FPL("c:\\a\\"), FPL("b") }, FPL("c:\\a\\b") },
254#endif // FILE_PATH_USES_DRIVE_LETTERS
255#else // FILE_PATH_USES_WIN_SEPARATORS
256 { { FPL("/aa/bb"), FPL("cc") }, FPL("/aa/bb/cc") },
257 { { FPL("/aa/bb/"), FPL("cc") }, FPL("/aa/bb/cc") },
258 { { FPL("aa/bb/"), FPL("cc") }, FPL("aa/bb/cc") },
259 { { FPL("aa/bb"), FPL("cc") }, FPL("aa/bb/cc") },
260 { { FPL("a/b"), FPL("c") }, FPL("a/b/c") },
261 { { FPL("a/b/"), FPL("c") }, FPL("a/b/c") },
262 { { FPL("//aa"), FPL("bb") }, FPL("//aa/bb") },
263 { { FPL("//aa/"), FPL("bb") }, FPL("//aa/bb") },
264#if defined(FILE_PATH_USES_DRIVE_LETTERS)
265 { { FPL("c:/"), FPL("a") }, FPL("c:/a") },
266 { { FPL("c:/"), FPL("") }, FPL("c:/") },
267 { { FPL("c:/a"), FPL("b") }, FPL("c:/a/b") },
268 { { FPL("c:/a/"), FPL("b") }, FPL("c:/a/b") },
269#endif // FILE_PATH_USES_DRIVE_LETTERS
270#endif // FILE_PATH_USES_WIN_SEPARATORS
271 };
272
273 for (size_t i = 0; i < arraysize(cases); ++i) {
274 FilePath root(cases[i].inputs[0]);
275 FilePath::StringType leaf(cases[i].inputs[1]);
276 FilePath observed = root.Append(leaf);
277 EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
278 "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
279 }
280}
281
282TEST(FilePathTest, IsAbsolute) {
283 const struct UnaryBooleanTestData cases[] = {
284 { FPL(""), false },
285 { FPL("a"), false },
286 { FPL("c:"), false },
287 { FPL("c:a"), false },
288 { FPL("a/b"), false },
289 { FPL("//"), true },
290 { FPL("//a"), true },
291 { FPL("c:a/b"), false },
292 { FPL("?:/a"), false },
293#if defined(FILE_PATH_USES_DRIVE_LETTERS)
294 { FPL("/"), false },
295 { FPL("/a"), false },
296 { FPL("/."), false },
297 { FPL("/.."), false },
298 { FPL("c:/"), true },
299 { FPL("c:/a"), true },
300 { FPL("c:/."), true },
301 { FPL("c:/.."), true },
302 { FPL("C:/a"), true },
303 { FPL("d:/a"), true },
304#else // FILE_PATH_USES_DRIVE_LETTERS
305 { FPL("/"), true },
306 { FPL("/a"), true },
307 { FPL("/."), true },
308 { FPL("/.."), true },
309 { FPL("c:/"), false },
310#endif // FILE_PATH_USES_DRIVE_LETTERS
311#if defined(FILE_PATH_USES_WIN_SEPARATORS)
312 { FPL("a\\b"), false },
313 { FPL("\\\\"), true },
314 { FPL("\\\\a"), true },
315 { FPL("a\\b"), false },
316 { FPL("\\\\"), true },
317 { FPL("//a"), true },
318 { FPL("c:a\\b"), false },
319 { FPL("?:\\a"), false },
320#if defined(FILE_PATH_USES_DRIVE_LETTERS)
321 { FPL("\\"), false },
322 { FPL("\\a"), false },
323 { FPL("\\."), false },
324 { FPL("\\.."), false },
325 { FPL("c:\\"), true },
326 { FPL("c:\\"), true },
327 { FPL("c:\\a"), true },
328 { FPL("c:\\."), true },
329 { FPL("c:\\.."), true },
330 { FPL("C:\\a"), true },
331 { FPL("d:\\a"), true },
332#else // FILE_PATH_USES_DRIVE_LETTERS
333 { FPL("\\"), true },
334 { FPL("\\a"), true },
335 { FPL("\\."), true },
336 { FPL("\\.."), true },
337 { FPL("c:\\"), false },
338#endif // FILE_PATH_USES_DRIVE_LETTERS
339#endif // FILE_PATH_USES_WIN_SEPARATORS
340 };
341
342 for (size_t i = 0; i < arraysize(cases); ++i) {
343 FilePath input(cases[i].input);
344 bool observed = input.IsAbsolute();
345 EXPECT_EQ(cases[i].expected, observed) <<
346 "i: " << i << ", input: " << input.value();
347 }
348}