convenience_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // libs/filesystem/test/convenience_test.cpp -----------------------------------------//
  2. // Copyright Beman Dawes, 2002
  3. // Copyright Vladimir Prus, 2002
  4. // Use, modification, and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // See library home page at http://www.boost.org/libs/filesystem
  8. #include <boost/config/warning_disable.hpp>
  9. // See deprecated_test for tests of deprecated features
  10. #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
  11. # define BOOST_FILESYSTEM_NO_DEPRECATED
  12. #endif
  13. #ifndef BOOST_SYSTEM_NO_DEPRECATED
  14. # define BOOST_SYSTEM_NO_DEPRECATED
  15. #endif
  16. #include <boost/filesystem/convenience.hpp>
  17. #include <boost/filesystem/directory.hpp>
  18. #include <boost/filesystem/exception.hpp>
  19. #include <boost/config.hpp>
  20. # if defined( BOOST_NO_STD_WSTRING )
  21. # error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
  22. # endif
  23. #include <boost/detail/lightweight_test.hpp>
  24. #include <boost/detail/lightweight_main.hpp>
  25. #include <boost/bind.hpp>
  26. #include <fstream>
  27. #include <iostream>
  28. namespace fs = boost::filesystem;
  29. using fs::path;
  30. namespace sys = boost::system;
  31. namespace
  32. {
  33. template< typename F >
  34. bool throws_fs_error(F func)
  35. {
  36. try { func(); }
  37. catch (const fs::filesystem_error &)
  38. {
  39. return true;
  40. }
  41. return false;
  42. }
  43. void create_recursive_iterator(const fs::path & ph)
  44. {
  45. fs::recursive_directory_iterator it(ph);
  46. }
  47. }
  48. // ------------------------------------------------------------------------------------//
  49. int cpp_main(int, char*[])
  50. {
  51. // create_directories() tests --------------------------------------------------------//
  52. BOOST_TEST(!fs::create_directories("/")); // should be harmless
  53. path unique_dir = fs::unique_path(); // unique name in case tests running in parallel
  54. path unique_yy = unique_dir / "yy";
  55. path unique_yya = unique_dir / "yya";
  56. path unique_yy_zz = unique_dir / "yy" / "zz";
  57. fs::remove_all(unique_dir); // make sure slate is blank
  58. BOOST_TEST(!fs::exists(unique_dir)); // reality check
  59. BOOST_TEST(fs::create_directories(unique_dir));
  60. BOOST_TEST(fs::exists(unique_dir));
  61. BOOST_TEST(fs::is_directory(unique_dir));
  62. BOOST_TEST(fs::create_directories(unique_yy_zz));
  63. BOOST_TEST(fs::exists(unique_dir));
  64. BOOST_TEST(fs::exists(unique_yy));
  65. BOOST_TEST(fs::exists(unique_yy_zz));
  66. BOOST_TEST(fs::is_directory(unique_dir));
  67. BOOST_TEST(fs::is_directory(unique_yy));
  68. BOOST_TEST(fs::is_directory(unique_yy_zz));
  69. path is_a_file(unique_dir / "uu");
  70. {
  71. std::ofstream f(is_a_file.string().c_str());
  72. BOOST_TEST(!!f);
  73. }
  74. BOOST_TEST(throws_fs_error(
  75. boost::bind(fs::create_directories, is_a_file)));
  76. BOOST_TEST(throws_fs_error(
  77. boost::bind(fs::create_directories, is_a_file / "aa")));
  78. // recursive_directory_iterator tests ----------------------------------------//
  79. sys::error_code ec;
  80. fs::recursive_directory_iterator it("/no-such-path", ec);
  81. BOOST_TEST(ec);
  82. BOOST_TEST(throws_fs_error(
  83. boost::bind(create_recursive_iterator, "/no-such-path")));
  84. fs::remove(unique_dir / "uu");
  85. #ifdef BOOST_WINDOWS_API
  86. // These tests depends on ordering of directory entries, and that's guaranteed
  87. // on Windows but not necessarily on other operating systems
  88. {
  89. std::ofstream f(unique_yya.string().c_str());
  90. BOOST_TEST(!!f);
  91. }
  92. for (it = fs::recursive_directory_iterator(unique_dir);
  93. it != fs::recursive_directory_iterator(); ++it)
  94. { std::cout << it->path() << '\n'; }
  95. it = fs::recursive_directory_iterator(unique_dir);
  96. BOOST_TEST(it->path() == unique_yy);
  97. BOOST_TEST(it.depth() == 0);
  98. ++it;
  99. BOOST_TEST(it->path() == unique_yy_zz);
  100. BOOST_TEST(it.depth() == 1);
  101. it.pop();
  102. BOOST_TEST(it->path() == unique_yya);
  103. BOOST_TEST(it.depth() == 0);
  104. it++;
  105. BOOST_TEST(it == fs::recursive_directory_iterator());
  106. it = fs::recursive_directory_iterator(unique_dir);
  107. BOOST_TEST(it->path() == unique_yy);
  108. it.disable_recursion_pending();
  109. ++it;
  110. BOOST_TEST(it->path() == unique_yya);
  111. ++it;
  112. BOOST_TEST(it == fs::recursive_directory_iterator());
  113. fs::remove(unique_yya);
  114. #endif
  115. it = fs::recursive_directory_iterator(unique_yy_zz);
  116. BOOST_TEST(it == fs::recursive_directory_iterator());
  117. it = fs::recursive_directory_iterator(unique_dir);
  118. BOOST_TEST(it->path() == unique_yy);
  119. BOOST_TEST(it.depth() == 0);
  120. ++it;
  121. BOOST_TEST(it->path() == unique_yy_zz);
  122. BOOST_TEST(it.depth() == 1);
  123. it++;
  124. BOOST_TEST(it == fs::recursive_directory_iterator());
  125. it = fs::recursive_directory_iterator(unique_dir);
  126. BOOST_TEST(it->path() == unique_yy);
  127. it.disable_recursion_pending();
  128. ++it;
  129. BOOST_TEST(it == fs::recursive_directory_iterator());
  130. it = fs::recursive_directory_iterator(unique_dir);
  131. BOOST_TEST(it->path() == unique_yy);
  132. ++it;
  133. it.pop();
  134. BOOST_TEST(it == fs::recursive_directory_iterator());
  135. ec.clear();
  136. BOOST_TEST(!ec);
  137. // check that two argument failed constructor creates the end iterator
  138. BOOST_TEST(fs::recursive_directory_iterator("nosuchdir", ec)
  139. == fs::recursive_directory_iterator());
  140. BOOST_TEST(ec);
  141. fs::remove_all(unique_dir); // clean up behind ourselves
  142. return ::boost::report_errors();
  143. }