1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03 10 11 // <filesystem> 12 13 // class directory_iterator 14 15 // directory_iterator& operator++(); 16 // directory_iterator& increment(error_code& ec); 17 18 #include "filesystem_include.h" 19 #include <type_traits> 20 #include <set> 21 #include <cassert> 22 23 #include "test_macros.h" 24 #include "rapid-cxx-test.h" 25 #include "filesystem_test_helper.h" 26 27 using namespace fs; 28 29 TEST_SUITE(directory_iterator_increment_tests) 30 TEST_CASE(test_increment_signatures)31TEST_CASE(test_increment_signatures) 32 { 33 directory_iterator d; ((void)d); 34 std::error_code ec; ((void)ec); 35 36 ASSERT_SAME_TYPE(decltype(++d), directory_iterator&); 37 ASSERT_NOT_NOEXCEPT(++d); 38 39 ASSERT_SAME_TYPE(decltype(d.increment(ec)), directory_iterator&); 40 ASSERT_NOT_NOEXCEPT(d.increment(ec)); 41 } 42 TEST_CASE(test_prefix_increment)43TEST_CASE(test_prefix_increment) 44 { 45 static_test_env static_env; 46 const path testDir = static_env.Dir; 47 const std::set<path> dir_contents(static_env.DirIterationList.begin(), 48 static_env.DirIterationList.end()); 49 const directory_iterator endIt{}; 50 51 std::error_code ec; 52 directory_iterator it(testDir, ec); 53 TEST_REQUIRE(!ec); 54 55 std::set<path> unseen_entries = dir_contents; 56 while (!unseen_entries.empty()) { 57 TEST_REQUIRE(it != endIt); 58 const path entry = *it; 59 TEST_REQUIRE(unseen_entries.erase(entry) == 1); 60 directory_iterator& it_ref = ++it; 61 TEST_CHECK(&it_ref == &it); 62 } 63 64 TEST_CHECK(it == endIt); 65 } 66 TEST_CASE(test_postfix_increment)67TEST_CASE(test_postfix_increment) 68 { 69 static_test_env static_env; 70 const path testDir = static_env.Dir; 71 const std::set<path> dir_contents(static_env.DirIterationList.begin(), 72 static_env.DirIterationList.end()); 73 const directory_iterator endIt{}; 74 75 std::error_code ec; 76 directory_iterator it(testDir, ec); 77 TEST_REQUIRE(!ec); 78 79 std::set<path> unseen_entries = dir_contents; 80 while (!unseen_entries.empty()) { 81 TEST_REQUIRE(it != endIt); 82 const path entry = *it; 83 TEST_REQUIRE(unseen_entries.erase(entry) == 1); 84 const path entry2 = *it++; 85 TEST_CHECK(entry2 == entry); 86 } 87 88 TEST_CHECK(it == endIt); 89 } 90 91 TEST_CASE(test_increment_method)92TEST_CASE(test_increment_method) 93 { 94 static_test_env static_env; 95 const path testDir = static_env.Dir; 96 const std::set<path> dir_contents(static_env.DirIterationList.begin(), 97 static_env.DirIterationList.end()); 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