relative_test.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // filesystem relative_test.cpp ---------------------------------------------------- //
  2. // Copyright Beman Dawes 2015
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // See http://www.boost.org/LICENSE_1_0.txt
  5. // Library home page: http://www.boost.org/libs/filesystem
  6. // ---------------------------------------------------------------------------------- //
  7. //
  8. // At least initially, development is easier if these tests are in a separate file.
  9. //
  10. // ---------------------------------------------------------------------------------- //
  11. #include <boost/config/warning_disable.hpp>
  12. #include <boost/filesystem/path.hpp>
  13. #include <boost/detail/lightweight_test_report.hpp>
  14. #include <iostream>
  15. using boost::filesystem::path;
  16. using std::cout;
  17. using std::endl;
  18. namespace
  19. {
  20. void lexically_relative_test()
  21. {
  22. cout << "lexically_relative_test..." << endl;
  23. BOOST_TEST(path("").lexically_relative("") == "");
  24. BOOST_TEST(path("").lexically_relative("/foo") == "");
  25. BOOST_TEST(path("/foo").lexically_relative("") == "");
  26. BOOST_TEST(path("/foo").lexically_relative("/foo") == ".");
  27. BOOST_TEST(path("").lexically_relative("foo") == "");
  28. BOOST_TEST(path("foo").lexically_relative("") == "");
  29. BOOST_TEST(path("foo").lexically_relative("foo") == ".");
  30. BOOST_TEST(path("a/b/c").lexically_relative("a") == "b/c");
  31. BOOST_TEST(path("a//b//c").lexically_relative("a") == "b/c");
  32. BOOST_TEST(path("a/b/c").lexically_relative("a/b") == "c");
  33. BOOST_TEST(path("a///b//c").lexically_relative("a//b") == "c");
  34. BOOST_TEST(path("a/b/c").lexically_relative("a/b/c") == ".");
  35. BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x") == "..");
  36. BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
  37. BOOST_TEST(path("a/b/c").lexically_relative("a/x") == "../b/c");
  38. BOOST_TEST(path("a/b/c").lexically_relative("a/b/x") == "../c");
  39. BOOST_TEST(path("a/b/c").lexically_relative("a/x/y") == "../../b/c");
  40. BOOST_TEST(path("a/b/c").lexically_relative("a/b/x/y") == "../../c");
  41. BOOST_TEST(path("a/b/c").lexically_relative("a/b/c/x/y/z") == "../../..");
  42. BOOST_TEST(path("a/b/c").lexically_relative("a/") == "b/c");
  43. BOOST_TEST(path("a/b/c").lexically_relative("a/.") == "b/c");
  44. BOOST_TEST(path("a/b/c").lexically_relative("a/./") == "b/c");
  45. BOOST_TEST(path("a/b/c").lexically_relative("a/b/..") == "");
  46. BOOST_TEST(path("a/b/c").lexically_relative("a/b/../") == "");
  47. BOOST_TEST(path("a/b/c").lexically_relative("a/b/d/..") == "c");
  48. BOOST_TEST(path("a/b/c").lexically_relative("a/b/d/../") == "c");
  49. // paths unrelated except first element, and first element is root directory
  50. BOOST_TEST(path("/a/b/c").lexically_relative("/x") == "../a/b/c");
  51. BOOST_TEST(path("/a/b/c").lexically_relative("/x/y") == "../../a/b/c");
  52. BOOST_TEST(path("/a/b/c").lexically_relative("/x/y/z") == "../../../a/b/c");
  53. // paths unrelated
  54. BOOST_TEST(path("a/b/c").lexically_relative("x") == "");
  55. BOOST_TEST(path("a/b/c").lexically_relative("x/y") == "");
  56. BOOST_TEST(path("a/b/c").lexically_relative("x/y/z") == "");
  57. BOOST_TEST(path("a/b/c").lexically_relative("/x") == "");
  58. BOOST_TEST(path("a/b/c").lexically_relative("/x/y") == "");
  59. BOOST_TEST(path("a/b/c").lexically_relative("/x/y/z") == "");
  60. BOOST_TEST(path("a/b/c").lexically_relative("/a/b/c") == "");
  61. // TODO: add some Windows-only test cases that probe presence or absence of
  62. // drive specifier-and root-directory
  63. // Some tests from Jamie Allsop's paper
  64. BOOST_TEST(path("/a/d").lexically_relative("/a/b/c") == "../../d");
  65. BOOST_TEST(path("/a/b/c").lexically_relative("/a/d") == "../b/c");
  66. #ifdef BOOST_WINDOWS_API
  67. BOOST_TEST(path("c:\\y").lexically_relative("c:\\x") == "../y");
  68. #else
  69. BOOST_TEST(path("c:\\y").lexically_relative("c:\\x") == "");
  70. #endif
  71. BOOST_TEST(path("d:\\y").lexically_relative("c:\\x") == "");
  72. // From issue #1976
  73. BOOST_TEST(path("/foo/new").lexically_relative("/foo/bar") == "../new");
  74. }
  75. void lexically_proximate_test()
  76. {
  77. cout << "lexically_proximate_test..." << endl;
  78. // paths unrelated
  79. BOOST_TEST(path("a/b/c").lexically_proximate("x") == "a/b/c");
  80. }
  81. } // unnamed namespace
  82. //--------------------------------------------------------------------------------------//
  83. // //
  84. // main //
  85. // //
  86. //--------------------------------------------------------------------------------------//
  87. int test_main(int, char*[])
  88. {
  89. // document state of critical macros
  90. #ifdef BOOST_POSIX_API
  91. cout << "BOOST_POSIX_API" << endl;
  92. #endif
  93. #ifdef BOOST_WINDOWS_API
  94. cout << "BOOST_WINDOWS_API" << endl;
  95. #endif
  96. lexically_relative_test();
  97. lexically_proximate_test();
  98. return ::boost::report_errors();
  99. }