summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/filesystem/test/relative_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/filesystem/test/relative_test.cpp')
-rw-r--r--src/boost/libs/filesystem/test/relative_test.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/boost/libs/filesystem/test/relative_test.cpp b/src/boost/libs/filesystem/test/relative_test.cpp
new file mode 100644
index 00000000..9c4b7d25
--- /dev/null
+++ b/src/boost/libs/filesystem/test/relative_test.cpp
@@ -0,0 +1,118 @@
+// filesystem relative_test.cpp ---------------------------------------------------- //
+
+// Copyright Beman Dawes 2015
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+// Library home page: http://www.boost.org/libs/filesystem
+
+// ---------------------------------------------------------------------------------- //
+//
+// At least initially, development is easier if these tests are in a separate file.
+//
+// ---------------------------------------------------------------------------------- //
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/detail/lightweight_test_report.hpp>
+#include <iostream>
+
+using boost::filesystem::path;
+using std::cout;
+using std::endl;
+
+namespace
+{
+ void lexically_relative_test()
+ {
+ cout << "lexically_relative_test..." << endl;
+
+ BOOST_TEST(path("").lexically_relative("") == "");
+ BOOST_TEST(path("").lexically_relative("/foo") == "");
+ BOOST_TEST(path("/foo").lexically_relative("") == "");
+ BOOST_TEST(path("/foo").lexically_relative("/foo") == ".");
+ BOOST_TEST(path("").lexically_relative("foo") == "");
+ BOOST_TEST(path("foo").lexically_relative("") == "");
+ BOOST_TEST(path("foo").lexically_relative("foo") == ".");
+
+ BOOST_TEST(path("a/b/c").lexically_relative("a") == "b/c");
+ BOOST_TEST(path("a//b//c").lexically_relative("a") == "b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b") == "c");
+ BOOST_TEST(path("a///b//c").lexically_relative("a//b") == "c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/c") == ".");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x") == "..");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/x") == "../b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/x") == "../c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/x/y") == "../../b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/x/y") == "../../c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x/y/z") == "../../..");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/") == "b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/.") == "b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/./") == "b/c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/..") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/../") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/d/..") == "c");
+ BOOST_TEST(path("a/b/c").lexically_relative("a/b/d/../") == "c");
+
+ // paths unrelated except first element, and first element is root directory
+ BOOST_TEST(path("/a/b/c").lexically_relative("/x") == "../a/b/c");
+ BOOST_TEST(path("/a/b/c").lexically_relative("/x/y") == "../../a/b/c");
+ BOOST_TEST(path("/a/b/c").lexically_relative("/x/y/z") == "../../../a/b/c");
+
+ // paths unrelated
+ BOOST_TEST(path("a/b/c").lexically_relative("x") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("x/y") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("x/y/z") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("/x") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("/x/y") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("/x/y/z") == "");
+ BOOST_TEST(path("a/b/c").lexically_relative("/a/b/c") == "");
+
+ // TODO: add some Windows-only test cases that probe presence or absence of
+ // drive specifier-and root-directory
+
+ // Some tests from Jamie Allsop's paper
+ BOOST_TEST(path("/a/d").lexically_relative("/a/b/c") == "../../d");
+ BOOST_TEST(path("/a/b/c").lexically_relative("/a/d") == "../b/c");
+ #ifdef BOOST_WINDOWS_API
+ BOOST_TEST(path("c:\\y").lexically_relative("c:\\x") == "../y");
+ #else
+ BOOST_TEST(path("c:\\y").lexically_relative("c:\\x") == "");
+ #endif
+ BOOST_TEST(path("d:\\y").lexically_relative("c:\\x") == "");
+
+ // From issue #1976
+ BOOST_TEST(path("/foo/new").lexically_relative("/foo/bar") == "../new");
+ }
+
+ void lexically_proximate_test()
+ {
+ cout << "lexically_proximate_test..." << endl;
+ // paths unrelated
+ BOOST_TEST(path("a/b/c").lexically_proximate("x") == "a/b/c");
+ }
+} // unnamed namespace
+
+//--------------------------------------------------------------------------------------//
+// //
+// main //
+// //
+//--------------------------------------------------------------------------------------//
+
+int test_main(int, char*[])
+{
+// document state of critical macros
+#ifdef BOOST_POSIX_API
+ cout << "BOOST_POSIX_API" << endl;
+#endif
+#ifdef BOOST_WINDOWS_API
+ cout << "BOOST_WINDOWS_API" << endl;
+#endif
+
+ lexically_relative_test();
+ lexically_proximate_test();
+
+ return ::boost::report_errors();
+}