Lines Matching full:path

1 //===- llvm/unittest/Support/Path.cpp - Path tests ------------------------===//
9 #include "llvm/Support/Path.h"
69 void checkSeparators(StringRef Path) {
71 char UndesiredSeparator = sys::path::get_separator()[0] == '/' ? '\\' : '/';
72 ASSERT_EQ(Path.find(UndesiredSeparator), StringRef::npos);
83 using namespace llvm::sys::path;
103 EXPECT_TRUE(path::is_separator('/'));
104 EXPECT_FALSE(path::is_separator('\0'));
105 EXPECT_FALSE(path::is_separator('-'));
106 EXPECT_FALSE(path::is_separator(' '));
108 EXPECT_TRUE(path::is_separator('\\', path::Style::windows));
109 EXPECT_TRUE(path::is_separator('\\', path::Style::windows_slash));
110 EXPECT_FALSE(path::is_separator('\\', path::Style::posix));
112 EXPECT_EQ(path::is_style_windows(path::Style::native),
113 path::is_separator('\\'));
117 EXPECT_EQ(path::get_separator(path::Style::posix), "/");
118 EXPECT_EQ(path::get_separator(path::Style::windows_backslash), "\\");
119 EXPECT_EQ(path::get_separator(path::Style::windows_slash), "/");
123 // Test tuple <Path, ExpectedPosixValue, ExpectedWindowsValue>.
139 for (const auto &Path : Paths) {
140 EXPECT_EQ(path::is_absolute_gnu(std::get<0>(Path), path::Style::posix),
141 std::get<1>(Path));
142 EXPECT_EQ(path::is_absolute_gnu(std::get<0>(Path), path::Style::windows),
143 std::get<2>(Path));
145 constexpr int Native = is_style_posix(path::Style::native) ? 1 : 2;
146 EXPECT_EQ(path::is_absolute_gnu(std::get<0>(Path), path::Style::native),
147 std::get<Native>(Path));
151 TEST(Support, Path) {
202 for (sys::path::const_iterator ci = sys::path::begin(*i),
203 ce = sys::path::end(*i);
211 for (sys::path::reverse_iterator ci = sys::path::rbegin(*i),
212 ce = sys::path::rend(*i);
223 (void)path::has_root_path(*i);
224 (void)path::root_path(*i);
225 (void)path::has_root_name(*i);
226 (void)path::root_name(*i);
227 (void)path::has_root_directory(*i);
228 (void)path::root_directory(*i);
229 (void)path::has_parent_path(*i);
230 (void)path::parent_path(*i);
231 (void)path::has_filename(*i);
232 (void)path::filename(*i);
233 (void)path::has_stem(*i);
234 (void)path::stem(*i);
235 (void)path::has_extension(*i);
236 (void)path::extension(*i);
237 (void)path::is_absolute(*i);
238 (void)path::is_absolute_gnu(*i);
239 (void)path::is_relative(*i);
245 path::remove_filename(temp_store);
248 path::replace_extension(temp_store, "ext");
250 stem = path::stem(filename);
251 ext = path::extension(filename);
252 EXPECT_EQ(*sys::path::rbegin(filename), (stem + ext).str());
254 path::native(*i, temp_store);
273 ASSERT_EQ(path::root_name("//net/hello", path::Style::posix).str(), "//net");
274 ASSERT_EQ(path::root_name("c:/hello", path::Style::posix).str(), "");
275 ASSERT_EQ(path::root_name("c:/hello", path::Style::windows).str(), "c:");
276 ASSERT_EQ(path::root_name("/hello", path::Style::posix).str(), "");
278 ASSERT_EQ(path::root_directory("/goo/hello", path::Style::posix).str(), "/");
279 ASSERT_EQ(path::root_directory("c:/hello", path::Style::windows).str(), "/");
280 ASSERT_EQ(path::root_directory("d/file.txt", path::Style::posix).str(), "");
281 ASSERT_EQ(path::root_directory("d/file.txt", path::Style::windows).str(), "");
328 path::root_name(p, path::Style::posix).str() + path::root_directory(p, path::Style::posix).str(),
329 path::root_path(p, path::Style::posix).str());
332 path::root_name(p, path::Style::windows).str() + path::root_directory(p, path::Style::windows).str(),
333 path::root_path(p, path::Style::windows).str());
338 EXPECT_EQ("/", path::filename("/"));
339 EXPECT_EQ("", path::parent_path("/"));
341 EXPECT_EQ("\\", path::filename("c:\\", path::Style::windows));
342 EXPECT_EQ("c:", path::parent_path("c:\\", path::Style::windows));
344 EXPECT_EQ("/", path::filename("///"));
345 EXPECT_EQ("", path::parent_path("///"));
347 EXPECT_EQ("\\", path::filename("c:\\\\", path::Style::windows));
348 EXPECT_EQ("c:", path::parent_path("c:\\\\", path::Style::windows));
350 EXPECT_EQ("bar", path::filename("/foo/bar"));
351 EXPECT_EQ("/foo", path::parent_path("/foo/bar"));
353 EXPECT_EQ("foo", path::filename("/foo"));
354 EXPECT_EQ("/", path::parent_path("/foo"));
356 EXPECT_EQ("foo", path::filename("foo"));
357 EXPECT_EQ("", path::parent_path("foo"));
359 EXPECT_EQ(".", path::filename("foo/"));
360 EXPECT_EQ("foo", path::parent_path("foo/"));
362 EXPECT_EQ("//net", path::filename("//net"));
363 EXPECT_EQ("", path::parent_path("//net"));
365 EXPECT_EQ("/", path::filename("//net/"));
366 EXPECT_EQ("//net", path::parent_path("//net/"));
368 EXPECT_EQ("foo", path::filename("//net/foo"));
369 EXPECT_EQ("//net/", path::parent_path("//net/foo"));
375 EXPECT_EQ("/", path::filename("//"));
376 EXPECT_EQ("", path::parent_path("//"));
378 EXPECT_EQ("\\", path::filename("\\\\", path::Style::windows));
379 EXPECT_EQ("", path::parent_path("\\\\", path::Style::windows));
381 EXPECT_EQ("\\", path::filename("\\\\\\", path::Style::windows));
382 EXPECT_EQ("", path::parent_path("\\\\\\", path::Style::windows));
386 GetComponents(StringRef Path, path::Style S = path::Style::native) {
387 return {path::begin(Path, S), path::end(Path)};
403 EXPECT_THAT(GetComponents("c:\\c\\e\\foo.txt", path::Style::windows),
405 EXPECT_THAT(GetComponents("c:\\c\\e\\foo.txt", path::Style::windows_slash),
413 // Trailing slashes are converted to '.' unless they are part of the root path.
414 SmallVector<std::pair<StringRef, path::Style>, 4> Paths;
415 Paths.emplace_back("/foo/", path::Style::native);
416 Paths.emplace_back("/foo//", path::Style::native);
417 Paths.emplace_back("//net/foo/", path::Style::native);
418 Paths.emplace_back("c:\\foo\\", path::Style::windows);
420 for (auto &Path : Paths) {
421 SCOPED_TRACE(Path.first);
422 StringRef LastComponent = *path::rbegin(Path.first, Path.second);
426 SmallVector<std::pair<StringRef, path::Style>, 3> RootPaths;
427 RootPaths.emplace_back("/", path::Style::native);
428 RootPaths.emplace_back("//net/", path::Style::native);
429 RootPaths.emplace_back("c:\\", path::Style::windows);
430 RootPaths.emplace_back("//net//", path::Style::native);
431 RootPaths.emplace_back("c:\\\\", path::Style::windows);
433 for (auto &Path : RootPaths) {
434 SCOPED_TRACE(Path.first);
435 StringRef LastComponent = *path::rbegin(Path.first, Path.second);
437 EXPECT_TRUE(path::is_separator(LastComponent[0], Path.second));
444 if (wchar_t const *path = ::_wgetenv(Var)) {
445 auto pathLen = ::wcslen(path);
446 ArrayRef<char> ref{reinterpret_cast<char const *>(path),
450 path::make_preferred(Buf);
484 if (char const *path = ::getenv("HOME"))
485 expected = path;
492 auto status = path::home_directory(HomeDir);
509 EXPECT_TRUE(path::home_directory(HomeDir));
517 EXPECT_TRUE(path::user_config_directory(ConfigDir));
525 ASSERT_TRUE(path::home_directory(Fallback));
526 path::append(Fallback, ".config");
529 EXPECT_TRUE(path::user_config_directory(CacheDir));
537 EXPECT_TRUE(path::cache_directory(CacheDir));
545 ASSERT_TRUE(path::home_directory(Fallback));
546 path::append(Fallback, ".cache");
549 EXPECT_TRUE(path::cache_directory(CacheDir));
557 ASSERT_TRUE(path::home_directory(Fallback));
558 path::append(Fallback, "Library/Preferences");
561 EXPECT_TRUE(path::user_config_directory(ConfigDir));
573 EXPECT_TRUE(path::user_config_directory(CacheDir));
583 EXPECT_TRUE(path::cache_directory(CacheDir));
590 path::system_temp_directory(false, TempDir);
593 path::system_temp_directory(true, TempDir);
598 static std::string path2regex(std::string Path) {
600 bool Forward = path::get_separator()[0] == '/';
601 while ((Pos = Path.find('\\', Pos)) != std::string::npos) {
603 Path.replace(Pos, 1, "/");
606 Path.replace(Pos, 1, "\\\\");
610 return Path;
619 path::system_temp_directory(true, TempDir); \
630 EXPECT_TEMP_DIR(_wputenv_s(L"TMP", L"C:/Unix/Path/Separators"),
631 "C:\\Unix\\Path\\Separators");
632 EXPECT_TEMP_DIR(_wputenv_s(L"TMP", L"Local Path"), ".+\\Local Path$");
642 _wputenv_s(L"TEMP", L"C:\\Valid\\Path");
644 "C:\\Valid\\Path");
655 // Test evn var / path with 260 chars.
681 sys::path::append(NonExistantFile, "1B28B495C16344CB9822E588CD4C3EF0");
755 // on the concatenated path will differ in the TestDirectory portion from
760 path::native(Twine(RealBase) + "/test1/test2", Expected);
771 bool Result = llvm::sys::path::home_directory(HomeDir);
791 bool Result = llvm::sys::path::home_directory(HomeDir);
941 // Path name > 260 chars should get an error.
950 // Relative path < 247 chars, no problem.
967 path::append(Model, "%.tmp");
968 SmallString<128> Path;
1031 // Generate a directory path guaranteed to fall into that range.
1048 ThisDir = path::parent_path(ThisDir);
1112 if (path::filename(i->path()) == "p1") {
1117 if (path::filename(i->path()) == "dontlookhere")
1119 visited.push_back(std::string(path::filename(i->path())));
1131 // Make sure that each path was visited correctly.
1214 VisitedBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1217 VisitedNonBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1231 VisitedBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1234 VisitedNonBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1250 VisitedBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1253 VisitedNonBrokenSymlinks.push_back(std::string(path::filename(i->path())));
1270 // input UTF-8. The UTF-16 equivalent of the input path can be shorter in
1275 // path is likely to be longer than the input.
1288 StringRef DirName = path::filename(I->path());
1340 path::append(FilePathname, "test");
1496 path::native(Win, path::Style::windows);
1497 path::native(Posix, path::Style::posix);
1498 path::native(WinSlash, path::Style::windows_slash);
1508 path::make_preferred(WinBackslash, path::Style::windows_backslash);
1509 path::make_preferred(Posix, path::Style::posix);
1510 path::make_preferred(WinSlash, path::Style::windows_slash);
1518 path::home_directory(PathHome);
1522 path::native(Path7, path::Style::windows_backslash);
1527 path::native(Path7, path::Style::windows_slash);
1534 path::native(Path8);
1539 path::native(Path9);
1544 path::native(Path10, path::Style::windows_backslash);
1553 Path1 = path::remove_leading_dotslash(Path1);
1555 Path2 = path::remove_leading_dotslash(Path2);
1559 static std::string remove_dots(StringRef path, bool remove_dot_dot,
1560 path::Style style) {
1561 SmallString<256> buffer(path);
1562 path::remove_dots(buffer, remove_dot_dot, style);
1568 remove_dots(".\\.\\\\foolz\\wat", false, path::Style::windows));
1569 EXPECT_EQ("", remove_dots(".\\\\\\\\\\", false, path::Style::windows));
1572 remove_dots(".\\a\\..\\b\\c", false, path::Style::windows));
1573 EXPECT_EQ("b\\c", remove_dots(".\\a\\..\\b\\c", true, path::Style::windows));
1574 EXPECT_EQ("c", remove_dots(".\\.\\c", true, path::Style::windows));
1576 remove_dots("..\\a\\b\\..\\c", true, path::Style::windows));
1578 remove_dots("..\\..\\a\\b\\..\\c", true, path::Style::windows));
1580 path::Style::windows));
1583 remove_dots("C:/foo/../bar", true, path::Style::windows));
1585 remove_dots("C:/foo/bar", true, path::Style::windows));
1587 remove_dots("C:/foo\\bar", true, path::Style::windows));
1588 EXPECT_EQ("\\", remove_dots("/", true, path::Style::windows));
1589 EXPECT_EQ("C:\\", remove_dots("C:/", true, path::Style::windows));
1595 remove_dots("C:\\foo\\bar\\", true, path::Style::windows));
1597 remove_dots("/foo/bar/", true, path::Style::posix));
1601 remove_dots("C:/foo//bar", true, path::Style::windows));
1604 EXPECT_TRUE(path::remove_dots(Path1, true, path::Style::windows));
1608 remove_dots("././/foolz/wat", false, path::Style::posix));
1609 EXPECT_EQ("", remove_dots("./////", false, path::Style::posix));
1611 EXPECT_EQ("a/../b/c", remove_dots("./a/../b/c", false, path::Style::posix));
1612 EXPECT_EQ("b/c", remove_dots("./a/../b/c", true, path::Style::posix));
1613 EXPECT_EQ("c", remove_dots("././c", true, path::Style::posix));
1614 EXPECT_EQ("../a/c", remove_dots("../a/b/../c", true, path::Style::posix));
1616 remove_dots("../../a/b/../c", true, path::Style::posix));
1617 EXPECT_EQ("/a/c", remove_dots("/../../a/c", true, path::Style::posix));
1619 remove_dots("/../a/b//../././/c", true, path::Style::posix));
1620 EXPECT_EQ("/", remove_dots("/", true, path::Style::posix));
1624 remove_dots("//foo/bar/", true, path::Style::posix));
1627 EXPECT_TRUE(path::remove_dots(Path2, true, path::Style::posix));
1644 SmallString<64> Path = Path1;
1645 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix);
1647 EXPECT_EQ(Path, "/foo");
1648 Path = Path2;
1649 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix);
1651 EXPECT_EQ(Path, "/new/foo");
1652 Path = Path2;
1653 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix2);
1655 EXPECT_EQ(Path, "/longernew/foo");
1656 Path = Path1;
1657 Found = path::replace_path_prefix(Path, EmptyPrefix, NewPrefix);
1659 EXPECT_EQ(Path, "/new/foo");
1660 Path = Path2;
1661 Found = path::replace_path_prefix(Path, OldPrefix, EmptyPrefix);
1663 EXPECT_EQ(Path, "/foo");
1664 Path = Path2;
1665 Found = path::replace_path_prefix(Path, OldPrefixSep, EmptyPrefix);
1667 EXPECT_EQ(Path, "foo");
1668 Path = Path3;
1669 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix);
1671 EXPECT_EQ(Path, "/newnew/foo");
1672 Path = Path3;
1673 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix2);
1675 EXPECT_EQ(Path, "/longernewnew/foo");
1676 Path = Path1;
1677 Found = path::replace_path_prefix(Path, EmptyPrefix, NewPrefix);
1679 EXPECT_EQ(Path, "/new/foo");
1680 Path = OldPrefix;
1681 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix);
1683 EXPECT_EQ(Path, "/new");
1684 Path = OldPrefixSep;
1685 Found = path::replace_path_prefix(Path, OldPrefix, NewPrefix);
1687 EXPECT_EQ(Path, "/new/");
1688 Path = OldPrefix;
1689 Found = path::replace_path_prefix(Path, OldPrefixSep, NewPrefix);
1691 EXPECT_EQ(Path, "/old");
1692 Path = Path4;
1693 Found = path::replace_path_prefix(Path, OldPrefixWin, NewPrefix,
1694 path::Style::windows);
1696 EXPECT_EQ(Path, "/newoo\\bar");
1697 Path = Path4;
1698 Found = path::replace_path_prefix(Path, OldPrefixWin, NewPrefix,
1699 path::Style::posix);
1701 EXPECT_EQ(Path, "C:\\old/foo\\bar");
1786 static void createFileWithData(const Twine &Path, bool ShouldExistBefore,
1789 ASSERT_EQ(ShouldExistBefore, fs::exists(Path));
1790 ASSERT_NO_ERROR(fs::openFileForWrite(Path, FD, Disp));
1792 ASSERT_TRUE(fs::exists(Path));
1797 static void verifyFileContents(const Twine &Path, StringRef Contents) {
1798 auto Buffer = MemoryBuffer::getFile(Path);
2160 SmallString<128> path;
2162 ASSERT_NO_ERROR(fs::current_path(path));
2163 ASSERT_NE(TestDirectory, path);
2166 SmallString<128> path;
2167 RestorePath(const SmallString<128> &path) : path(path) {}
2168 ~RestorePath() { fs::set_current_path(path); }
2169 } restore_path(path);
2173 ASSERT_NO_ERROR(fs::current_path(path));
2177 ASSERT_NO_ERROR(fs::getUniqueID(path, D2));
2178 ASSERT_EQ(D1, D2) << "D1: " << TestDirectory << "\nD2: " << path;
2378 // Result should not start with the long path prefix.
2393 // Pass a path with forward slashes, check that it ends up with
2394 // backslashes when widened with the long path prefix.
2396 path::make_preferred(InputForward, path::Style::windows_slash);
2400 // Pass a path which has the long path prefix prepended originally, but
2401 // which is short enough to not require the long path prefix. If such a
2402 // path is passed with forward slashes, make sure it gets normalized to
2407 path::make_preferred(PrefixedPath, path::Style::windows_slash);
2411 // A short path with an inconsistent prefix is passed through as-is; this
2428 // Result should not start with the long path prefix.
2510 Sources.emplace_back(RootTestDirectory.path());
2511 path::append(Sources.back(), "source" + Data.back() + ".txt");
2517 SmallString<128> Destination(RootTestDirectory.path());
2518 path::append(Destination, "destination");
2532 SmallString<128> Symlink(RootTestDirectory.path());
2533 path::append(Symlink, "symlink");
2534 ASSERT_NO_ERROR(fs::create_link(path::filename(Sources[2]), Symlink));