38 EXPECT_EQ(
"foo.h", path);
42 EXPECT_EQ(
"foo.h", path);
44 path =
"./foo/./bar.h";
46 EXPECT_EQ(
"foo/bar.h", path);
48 path =
"./x/foo/../bar.h";
50 EXPECT_EQ(
"x/bar.h", path);
52 path =
"./x/foo/../../bar.h";
54 EXPECT_EQ(
"bar.h", path);
58 EXPECT_EQ(
"foo/bar", path);
60 path =
"foo//.//..///bar";
62 EXPECT_EQ(
"bar", path);
64 path =
"./x/../foo/../../bar.h";
66 EXPECT_EQ(
"../bar.h", path);
70 EXPECT_EQ(
"foo", path);
74 EXPECT_EQ(
"foo", path);
76 path =
"foo/.hidden_bar";
78 EXPECT_EQ(
"foo/.hidden_bar", path);
82 EXPECT_EQ(
"/foo", path);
87 EXPECT_EQ(
"//foo", path);
89 EXPECT_EQ(
"/foo", path);
94 EXPECT_EQ(
"..", path);
98 EXPECT_EQ(
"..", path);
102 EXPECT_EQ(
"../foo", path);
106 EXPECT_EQ(
"../foo", path);
110 EXPECT_EQ(
"../..", path);
114 EXPECT_EQ(
"../..", path);
118 EXPECT_EQ(
"..", path);
122 EXPECT_EQ(
"/..", path);
126 EXPECT_EQ(
"/..", path);
130 EXPECT_EQ(
"/../..", path);
134 EXPECT_EQ(
"/../..", path);
138 EXPECT_EQ(
"/", path);
142 EXPECT_EQ(
"/", path);
146 EXPECT_EQ(
".", path);
150 EXPECT_EQ(
".", path);
154 EXPECT_EQ(
".", path);
158 EXPECT_EQ(
"foo/.._bar", path);
170 EXPECT_EQ(
"foo.h", path);
174 EXPECT_EQ(
"foo.h", path);
176 path =
".\\foo\\.\\bar.h";
178 EXPECT_EQ(
"foo/bar.h", path);
180 path =
".\\x\\foo\\..\\bar.h";
182 EXPECT_EQ(
"x/bar.h", path);
184 path =
".\\x\\foo\\..\\..\\bar.h";
186 EXPECT_EQ(
"bar.h", path);
190 EXPECT_EQ(
"foo/bar", path);
192 path =
"foo\\\\.\\\\..\\\\\\bar";
194 EXPECT_EQ(
"bar", path);
196 path =
".\\x\\..\\foo\\..\\..\\bar.h";
198 EXPECT_EQ(
"../bar.h", path);
202 EXPECT_EQ(
"foo", path);
204 path =
"foo\\bar\\..";
206 EXPECT_EQ(
"foo", path);
208 path =
"foo\\.hidden_bar";
210 EXPECT_EQ(
"foo/.hidden_bar", path);
214 EXPECT_EQ(
"/foo", path);
218 EXPECT_EQ(
"//foo", path);
222 EXPECT_EQ(
"/", path);
231 EXPECT_EQ(
"foo.h", path);
232 EXPECT_EQ(0, slash_bits);
236 EXPECT_EQ(
"a/foo.h", path);
237 EXPECT_EQ(1, slash_bits);
239 path =
"a/bcd/efh\\foo.h";
241 EXPECT_EQ(
"a/bcd/efh/foo.h", path);
242 EXPECT_EQ(4, slash_bits);
244 path =
"a\\bcd/efh\\foo.h";
246 EXPECT_EQ(
"a/bcd/efh/foo.h", path);
247 EXPECT_EQ(5, slash_bits);
249 path =
"a\\bcd\\efh\\foo.h";
251 EXPECT_EQ(
"a/bcd/efh/foo.h", path);
252 EXPECT_EQ(7, slash_bits);
254 path =
"a/bcd/efh/foo.h";
256 EXPECT_EQ(
"a/bcd/efh/foo.h", path);
257 EXPECT_EQ(0, slash_bits);
259 path =
"a\\./efh\\foo.h";
261 EXPECT_EQ(
"a/efh/foo.h", path);
262 EXPECT_EQ(3, slash_bits);
264 path =
"a\\../efh\\foo.h";
266 EXPECT_EQ(
"efh/foo.h", path);
267 EXPECT_EQ(1, slash_bits);
269 path =
"a\\b\\c\\d\\e\\f\\g\\foo.h";
271 EXPECT_EQ(
"a/b/c/d/e/f/g/foo.h", path);
272 EXPECT_EQ(127, slash_bits);
274 path =
"a\\b\\c\\..\\..\\..\\g\\foo.h";
276 EXPECT_EQ(
"g/foo.h", path);
277 EXPECT_EQ(1, slash_bits);
279 path =
"a\\b/c\\../../..\\g\\foo.h";
281 EXPECT_EQ(
"g/foo.h", path);
282 EXPECT_EQ(1, slash_bits);
284 path =
"a\\b/c\\./../..\\g\\foo.h";
286 EXPECT_EQ(
"a/g/foo.h", path);
287 EXPECT_EQ(3, slash_bits);
289 path =
"a\\b/c\\./../..\\g/foo.h";
291 EXPECT_EQ(
"a/g/foo.h", path);
292 EXPECT_EQ(1, slash_bits);
294 path =
"a\\\\\\foo.h";
296 EXPECT_EQ(
"a/foo.h", path);
297 EXPECT_EQ(1, slash_bits);
299 path =
"a/\\\\foo.h";
301 EXPECT_EQ(
"a/foo.h", path);
302 EXPECT_EQ(0, slash_bits);
306 EXPECT_EQ(
"a/foo.h", path);
307 EXPECT_EQ(1, slash_bits);
312 char buf[] =
"foo/bar\\baz.h\\";
316 EXPECT_EQ(0, strncmp(
"foo/bar/baz.h", buf, size));
317 EXPECT_EQ(2, slash_bits);
325 path =
"a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./"
326 "a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./x.h";
328 EXPECT_EQ(slash_bits, 0x0);
332 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
333 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
334 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
335 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\x.h";
338 EXPECT_EQ(slash_bits, 0xffffffff);
341 path =
"a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./"
342 "a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./x/y.h";
344 EXPECT_EQ(slash_bits, 0x0);
348 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
349 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
350 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\"
351 "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\x\\y.h";
353 EXPECT_EQ(slash_bits,
uint64_t(0x1ffffffff));
357 path =
"a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
358 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/x/y.h";
359 EXPECT_EQ(58, std::count(path.begin(), path.end(),
'/'));
361 EXPECT_EQ(slash_bits, 0x0);
365 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
366 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
367 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
368 "a\\a\\a\\a\\a\\a\\a\\a\\a\\x\\y.h";
369 EXPECT_EQ(58, std::count(path.begin(), path.end(),
'\\'));
371 EXPECT_EQ(slash_bits,
uint64_t(0x3ffffffffffffff));
375 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
376 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
377 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
378 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
379 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
380 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
381 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
382 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
383 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
384 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
385 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
386 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
387 "a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\"
388 "a\\a\\a\\a\\a\\a\\a\\a\\a\\x\\y.h";
389 EXPECT_EQ(218, std::count(path.begin(), path.end(),
'\\'));
391 EXPECT_EQ(slash_bits, 0xffffffffffffffff);
400 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
401 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
402 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
403 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
404 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
405 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
406 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
407 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
408 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
409 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
410 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
411 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
412 "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/"
413 "a/a/a/a/a/a/a/a/a/x/y.h";
414 EXPECT_EQ(218, std::count(path.begin(), path.end(),
'/'));
416 EXPECT_EQ(slash_bits, 0x0);
422 path =
"../../foo/bar.h";
424 EXPECT_EQ(
"../../foo/bar.h", path);
426 path =
"test/../../foo/bar.h";
428 EXPECT_EQ(
"../foo/bar.h", path);
432 string path =
"/usr/include/stdio.h";
435 EXPECT_EQ(
"/usr/include/stdio.h", path);
443 path =
"foo/. bar/.";
444 len = strlen(
"foo/.");
446 EXPECT_EQ(strlen(
"foo"), len);
447 EXPECT_EQ(
"foo/. bar/.",
string(path));
451 path =
"foo/../file bar/.";
452 len = strlen(
"foo/../file");
454 EXPECT_EQ(strlen(
"file"), len);
455 EXPECT_EQ(
"file../file bar/.",
string(path));
458 TEST(PathEscaping, TortureTest) {
462 EXPECT_EQ(
"\"foo bar\\\\\\\"'$@d!st!c'\\path'\\\\\"", result);
466 EXPECT_EQ(
"'foo bar\"/'\\''$@d!st!c'\\''/path'\\'''", result);
469 TEST(PathEscaping, SensiblePathsAreNotNeedlesslyEscaped) {
470 const char* path =
"some/sensible/path/without/crazy/characters.c++";
474 EXPECT_EQ(path, result);
478 EXPECT_EQ(path, result);
481 TEST(PathEscaping, SensibleWin32PathsAreNotNeedlesslyEscaped) {
482 const char* path =
"some\\sensible\\path\\without\\crazy\\characters.c++";
486 EXPECT_EQ(path, result);
491 EXPECT_EQ(
"foo", stripped);
494 EXPECT_EQ(
"foo", stripped);
499 string input =
"\33[1maffixmgr.cxx:286:15: \33[0m\33[0;1;35mwarning: "
500 "\33[0m\33[1musing the result... [-Wparentheses]\33[0m";
502 EXPECT_EQ(
"affixmgr.cxx:286:15: warning: using the result... [-Wparentheses]",
void GetWin32EscapedString(const string &input, string *result)
void GetShellEscapedString(const string &input, string *result)
void CanonicalizePath(string *path, uint64_t *slash_bits)
string StripAnsiEscapeCodes(const string &in)
TEST(CanonicalizePath, PathSamples)
unsigned long long uint64_t