Home | History | Annotate | Download | only in directory_iterator.members
      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