1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03 11 12 // <experimental/filesystem> 13 14 // class directory_iterator 15 16 // directory_iterator& operator++(); 17 // directory_iterator& increment(error_code& ec) noexcept; 18 19 #include <experimental/filesystem> 20 #include <type_traits> 21 #include <set> 22 #include <cassert> 23 24 #include "test_macros.h" 25 #include "rapid-cxx-test.hpp" 26 #include "filesystem_test_helper.hpp" 27 #include <iostream> 28 29 using namespace std::experimental::filesystem; 30 31 TEST_SUITE(directory_iterator_increment_tests) 32 33 TEST_CASE(test_increment_signatures) 34 { 35 using D = directory_iterator; 36 directory_iterator d; ((void)d); 37 std::error_code ec; ((void)ec); 38 39 ASSERT_SAME_TYPE(decltype(++d), directory_iterator&); 40 ASSERT_NOT_NOEXCEPT(++d); 41 42 ASSERT_SAME_TYPE(decltype(d.increment(ec)), directory_iterator&); 43 ASSERT_NOEXCEPT(d.increment(ec)); 44 } 45 46 TEST_CASE(test_prefix_increment) 47 { 48 const path testDir = StaticEnv::Dir; 49 const std::set<path> dir_contents(std::begin(StaticEnv::DirIterationList), 50 std::end( StaticEnv::DirIterationList)); 51 const directory_iterator endIt{}; 52 53 std::error_code ec; 54 directory_iterator it(testDir, ec); 55 TEST_REQUIRE(!ec); 56 57 std::set<path> unseen_entries = dir_contents; 58 while (!unseen_entries.empty()) { 59 TEST_REQUIRE(it != endIt); 60 const path entry = *it; 61 TEST_REQUIRE(unseen_entries.erase(entry) == 1); 62 directory_iterator& it_ref = ++it; 63 TEST_CHECK(&it_ref == &it); 64 } 65 66 TEST_CHECK(it == endIt); 67 } 68 69 TEST_CASE(test_postfix_increment) 70 { 71 const path testDir = StaticEnv::Dir; 72 const std::set<path> dir_contents(std::begin(StaticEnv::DirIterationList), 73 std::end( StaticEnv::DirIterationList)); 74 const directory_iterator endIt{}; 75 76 std::error_code ec; 77 directory_iterator it(testDir, ec); 78 TEST_REQUIRE(!ec); 79 80 std::set<path> unseen_entries = dir_contents; 81 while (!unseen_entries.empty()) { 82 TEST_REQUIRE(it != endIt); 83 const path entry = *it; 84 TEST_REQUIRE(unseen_entries.erase(entry) == 1); 85 const path entry2 = *it++; 86 TEST_CHECK(entry2 == entry); 87 } 88 89 TEST_CHECK(it == endIt); 90 } 91 92 93 TEST_CASE(test_increment_method) 94 { 95 const path testDir = StaticEnv::Dir; 96 const std::set<path> dir_contents(std::begin(StaticEnv::DirIterationList), 97 std::end( StaticEnv::DirIterationList)); 98 const directory_iterator endIt{}; 99 100 std::error_code ec; 101 directory_iterator it(testDir, ec); 102 TEST_REQUIRE(!ec); 103 104 std::set<path> unseen_entries = dir_contents; 105 while (!unseen_entries.empty()) { 106 TEST_REQUIRE(it != endIt); 107 const path entry = *it; 108 TEST_REQUIRE(unseen_entries.erase(entry) == 1); 109 directory_iterator& it_ref = it.increment(ec); 110 TEST_REQUIRE(!ec); 111 TEST_CHECK(&it_ref == &it); 112 } 113 114 TEST_CHECK(it == endIt); 115 } 116 117 TEST_SUITE_END() 118