//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03 // <experimental/filesystem> // class recursive_directory_iterator // bool recursion_pending() const; #include <experimental/filesystem> #include <type_traits> #include <set> #include <cassert> #include "test_macros.h" #include "rapid-cxx-test.hpp" #include "filesystem_test_helper.hpp" using namespace std::experimental::filesystem; TEST_SUITE(recursive_directory_iterator_recursion_pending_tests) TEST_CASE(initial_value_test) { recursive_directory_iterator it(StaticEnv::Dir); TEST_REQUIRE(it.recursion_pending() == true); } TEST_CASE(value_after_copy_construction_and_assignment_test) { recursive_directory_iterator rec_pending_it(StaticEnv::Dir); recursive_directory_iterator no_rec_pending_it(StaticEnv::Dir); no_rec_pending_it.disable_recursion_pending(); { // copy construction recursive_directory_iterator it(rec_pending_it); TEST_CHECK(it.recursion_pending() == true); it.disable_recursion_pending(); TEST_REQUIRE(rec_pending_it.recursion_pending() == true); recursive_directory_iterator it2(no_rec_pending_it); TEST_CHECK(it2.recursion_pending() == false); } { // copy assignment recursive_directory_iterator it(StaticEnv::Dir); it.disable_recursion_pending(); it = rec_pending_it; TEST_CHECK(it.recursion_pending() == true); it.disable_recursion_pending(); TEST_REQUIRE(rec_pending_it.recursion_pending() == true); recursive_directory_iterator it2(StaticEnv::Dir); it2 = no_rec_pending_it; TEST_CHECK(it2.recursion_pending() == false); } TEST_CHECK(rec_pending_it.recursion_pending() == true); TEST_CHECK(no_rec_pending_it.recursion_pending() == false); } TEST_CASE(value_after_move_construction_and_assignment_test) { recursive_directory_iterator rec_pending_it(StaticEnv::Dir); recursive_directory_iterator no_rec_pending_it(StaticEnv::Dir); no_rec_pending_it.disable_recursion_pending(); { // move construction recursive_directory_iterator it_cp(rec_pending_it); recursive_directory_iterator it(std::move(it_cp)); TEST_CHECK(it.recursion_pending() == true); recursive_directory_iterator it_cp2(no_rec_pending_it); recursive_directory_iterator it2(std::move(it_cp2)); TEST_CHECK(it2.recursion_pending() == false); } { // copy assignment recursive_directory_iterator it(StaticEnv::Dir); it.disable_recursion_pending(); recursive_directory_iterator it_cp(rec_pending_it); it = std::move(it_cp); TEST_CHECK(it.recursion_pending() == true); recursive_directory_iterator it2(StaticEnv::Dir); recursive_directory_iterator it_cp2(no_rec_pending_it); it2 = std::move(it_cp2); TEST_CHECK(it2.recursion_pending() == false); } TEST_CHECK(rec_pending_it.recursion_pending() == true); TEST_CHECK(no_rec_pending_it.recursion_pending() == false); } TEST_CASE(increment_resets_value) { const recursive_directory_iterator endIt; { recursive_directory_iterator it(StaticEnv::Dir); it.disable_recursion_pending(); TEST_CHECK(it.recursion_pending() == false); ++it; TEST_CHECK(it.recursion_pending() == true); TEST_CHECK(it.depth() == 0); } { recursive_directory_iterator it(StaticEnv::Dir); it.disable_recursion_pending(); TEST_CHECK(it.recursion_pending() == false); it++; TEST_CHECK(it.recursion_pending() == true); TEST_CHECK(it.depth() == 0); } { recursive_directory_iterator it(StaticEnv::Dir); it.disable_recursion_pending(); TEST_CHECK(it.recursion_pending() == false); std::error_code ec; it.increment(ec); TEST_CHECK(it.recursion_pending() == true); TEST_CHECK(it.depth() == 0); } } TEST_CASE(pop_does_not_reset_value) { const recursive_directory_iterator endIt; auto& DE0 = StaticEnv::DirIterationList; std::set<path> notSeenDepth0(std::begin(DE0), std::end(DE0)); recursive_directory_iterator it(StaticEnv::Dir); TEST_REQUIRE(it != endIt); while (it.depth() == 0) { notSeenDepth0.erase(it->path()); ++it; TEST_REQUIRE(it != endIt); } TEST_REQUIRE(it.depth() == 1); it.disable_recursion_pending(); it.pop(); // Since the order of iteration is unspecified the pop() could result // in the end iterator. When this is the case it is undefined behavior // to call recursion_pending(). if (it == endIt) { TEST_CHECK(notSeenDepth0.empty()); #if defined(_LIBCPP_VERSION) TEST_CHECK(it.recursion_pending() == false); #endif } else { TEST_CHECK(! notSeenDepth0.empty()); TEST_CHECK(it.recursion_pending() == false); } } TEST_SUITE_END()