1 // libs/filesystem/test/convenience_test.cpp -----------------------------------------//
3 // Copyright Beman Dawes, 2002
4 // Copyright Vladimir Prus, 2002
5 // Use, modification, and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // See library home page at http://www.boost.org/libs/filesystem
11 #include <boost/config/warning_disable.hpp>
13 // See deprecated_test for tests of deprecated features
14 #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
15 # define BOOST_FILESYSTEM_NO_DEPRECATED
17 #ifndef BOOST_SYSTEM_NO_DEPRECATED
18 # define BOOST_SYSTEM_NO_DEPRECATED
21 #include <boost/filesystem/convenience.hpp>
22 #include <boost/filesystem/directory.hpp>
23 #include <boost/filesystem/exception.hpp>
25 #include <boost/config.hpp>
26 # if defined( BOOST_NO_STD_WSTRING )
27 # error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
30 #include <boost/detail/lightweight_test.hpp>
31 #include <boost/detail/lightweight_main.hpp>
32 #include <boost/bind.hpp>
36 namespace fs
= boost::filesystem
;
38 namespace sys
= boost::system
;
42 template< typename F
>
43 bool throws_fs_error(F func
)
47 catch (const fs::filesystem_error
&)
54 void create_recursive_iterator(const fs::path
& ph
)
56 fs::recursive_directory_iterator
it(ph
);
60 // ------------------------------------------------------------------------------------//
62 int cpp_main(int, char*[])
65 // create_directories() tests --------------------------------------------------------//
67 BOOST_TEST(!fs::create_directories("/")); // should be harmless
69 path unique_dir
= fs::unique_path(); // unique name in case tests running in parallel
70 path unique_yy
= unique_dir
/ "yy";
71 path unique_yya
= unique_dir
/ "yya";
72 path unique_yy_zz
= unique_dir
/ "yy" / "zz";
74 fs::remove_all(unique_dir
); // make sure slate is blank
75 BOOST_TEST(!fs::exists(unique_dir
)); // reality check
77 BOOST_TEST(fs::create_directories(unique_dir
));
78 BOOST_TEST(fs::exists(unique_dir
));
79 BOOST_TEST(fs::is_directory(unique_dir
));
81 BOOST_TEST(fs::create_directories(unique_yy_zz
));
82 BOOST_TEST(fs::exists(unique_dir
));
83 BOOST_TEST(fs::exists(unique_yy
));
84 BOOST_TEST(fs::exists(unique_yy_zz
));
85 BOOST_TEST(fs::is_directory(unique_dir
));
86 BOOST_TEST(fs::is_directory(unique_yy
));
87 BOOST_TEST(fs::is_directory(unique_yy_zz
));
89 path
is_a_file(unique_dir
/ "uu");
91 std::ofstream
f(is_a_file
.string().c_str());
94 BOOST_TEST(throws_fs_error(
95 boost::bind(fs::create_directories
, is_a_file
)));
96 BOOST_TEST(throws_fs_error(
97 boost::bind(fs::create_directories
, is_a_file
/ "aa")));
99 // recursive_directory_iterator tests ----------------------------------------//
102 fs::recursive_directory_iterator
it("/no-such-path", ec
);
105 BOOST_TEST(throws_fs_error(
106 boost::bind(create_recursive_iterator
, "/no-such-path")));
108 fs::remove(unique_dir
/ "uu");
110 #ifdef BOOST_WINDOWS_API
111 // These tests depends on ordering of directory entries, and that's guaranteed
112 // on Windows but not necessarily on other operating systems
114 std::ofstream
f(unique_yya
.string().c_str());
118 for (it
= fs::recursive_directory_iterator(unique_dir
);
119 it
!= fs::recursive_directory_iterator(); ++it
)
120 { std::cout
<< it
->path() << '\n'; }
122 it
= fs::recursive_directory_iterator(unique_dir
);
123 BOOST_TEST(it
->path() == unique_yy
);
124 BOOST_TEST(it
.depth() == 0);
126 BOOST_TEST(it
->path() == unique_yy_zz
);
127 BOOST_TEST(it
.depth() == 1);
129 BOOST_TEST(it
->path() == unique_yya
);
130 BOOST_TEST(it
.depth() == 0);
132 BOOST_TEST(it
== fs::recursive_directory_iterator());
134 it
= fs::recursive_directory_iterator(unique_dir
);
135 BOOST_TEST(it
->path() == unique_yy
);
136 it
.disable_recursion_pending();
138 BOOST_TEST(it
->path() == unique_yya
);
140 BOOST_TEST(it
== fs::recursive_directory_iterator());
142 fs::remove(unique_yya
);
145 it
= fs::recursive_directory_iterator(unique_yy_zz
);
146 BOOST_TEST(it
== fs::recursive_directory_iterator());
148 it
= fs::recursive_directory_iterator(unique_dir
);
149 BOOST_TEST(it
->path() == unique_yy
);
150 BOOST_TEST(it
.depth() == 0);
152 BOOST_TEST(it
->path() == unique_yy_zz
);
153 BOOST_TEST(it
.depth() == 1);
155 BOOST_TEST(it
== fs::recursive_directory_iterator());
157 it
= fs::recursive_directory_iterator(unique_dir
);
158 BOOST_TEST(it
->path() == unique_yy
);
159 it
.disable_recursion_pending();
161 BOOST_TEST(it
== fs::recursive_directory_iterator());
163 it
= fs::recursive_directory_iterator(unique_dir
);
164 BOOST_TEST(it
->path() == unique_yy
);
167 BOOST_TEST(it
== fs::recursive_directory_iterator());
171 // check that two argument failed constructor creates the end iterator
172 BOOST_TEST(fs::recursive_directory_iterator("nosuchdir", ec
)
173 == fs::recursive_directory_iterator());
176 fs::remove_all(unique_dir
); // clean up behind ourselves
178 return ::boost::report_errors();