170 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: can-create-symlinks10// UNSUPPORTED: c++03, c++11, c++1411// UNSUPPORTED: no-filesystem12 13// <filesystem>14 15// class recursive_directory_iterator16 17// recursive_directory_iterator& operator=(recursive_directory_iterator const&);18 19#include <filesystem>20#include <type_traits>21#include <set>22#include <cassert>23 24#include "test_macros.h"25#include "filesystem_test_helper.h"26namespace fs = std::filesystem;27using namespace fs;28 29recursive_directory_iterator createInterestingIterator(const static_test_env &static_env)30 // Create an "interesting" iterator where all fields are31 // in a non-default state. The returned 'it' is in a32 // state such that:33 // it.options() == directory_options::skip_permission_denied34 // it.depth() == 135 // it.recursion_pending() == true36{37 const path testDir = static_env.Dir;38 const recursive_directory_iterator endIt;39 recursive_directory_iterator it(testDir,40 directory_options::skip_permission_denied);41 assert(it != endIt);42 while (it.depth() != 1) {43 ++it;44 assert(it != endIt);45 }46 assert(it.depth() == 1);47 it.disable_recursion_pending();48 return it;49}50 51 52recursive_directory_iterator createDifferentInterestingIterator(const static_test_env &static_env)53 // Create an "interesting" iterator where all fields are54 // in a non-default state. The returned 'it' is in a55 // state such that:56 // it.options() == directory_options::follow_directory_symlink57 // it.depth() == 258 // it.recursion_pending() == false59{60 const path testDir = static_env.Dir;61 const recursive_directory_iterator endIt;62 recursive_directory_iterator it(testDir,63 directory_options::follow_directory_symlink);64 assert(it != endIt);65 while (it.depth() != 2) {66 ++it;67 assert(it != endIt);68 }69 assert(it.depth() == 2);70 return it;71}72 73static void test_assignment_signature() {74 using D = recursive_directory_iterator;75 static_assert(std::is_copy_assignable<D>::value, "");76}77 78static void test_copy_to_end_iterator()79{80 static_test_env static_env;81 const recursive_directory_iterator endIt;82 83 const recursive_directory_iterator from = createInterestingIterator(static_env);84 const path entry = *from;85 86 recursive_directory_iterator to;87 to = from;88 assert(to == from);89 assert(*to == entry);90 assert(to.options() == from.options());91 assert(to.depth() == from.depth());92 assert(to.recursion_pending() == from.recursion_pending());93}94 95 96static void test_copy_from_end_iterator()97{98 static_test_env static_env;99 const recursive_directory_iterator from;100 recursive_directory_iterator to = createInterestingIterator(static_env);101 102 to = from;103 assert(to == from);104 assert(to == recursive_directory_iterator{});105}106 107static void test_copy_valid_iterator()108{109 static_test_env static_env;110 const recursive_directory_iterator endIt;111 112 const recursive_directory_iterator it = createInterestingIterator(static_env);113 const path entry = *it;114 115 recursive_directory_iterator it2 = createDifferentInterestingIterator(static_env);116 assert(it2 != it);117 assert(it2.options() != it.options());118 assert(it2.depth() != it.depth());119 assert(it2.recursion_pending() != it.recursion_pending());120 assert(*it2 != entry);121 122 it2 = it;123 assert(it2 == it);124 assert(it2.options() == it.options());125 assert(it2.depth() == it.depth());126 assert(it2.recursion_pending() == it.recursion_pending());127 assert(*it2 == entry);128}129 130static void test_returns_reference_to_self()131{132 const recursive_directory_iterator it;133 recursive_directory_iterator it2;134 recursive_directory_iterator& ref = (it2 = it);135 assert(&ref == &it2);136}137 138static void test_self_copy()139{140 static_test_env static_env;141 // Create two non-equal iterators that have exactly the same state.142 recursive_directory_iterator it = createInterestingIterator(static_env);143 recursive_directory_iterator it2 = createInterestingIterator(static_env);144 assert(it != it2);145 assert(it2.options() == it.options());146 assert(it2.depth() == it.depth());147 assert(it2.recursion_pending() == it.recursion_pending());148 assert(*it2 == *it);149 150 // perform a self-copy and check that the state still matches the151 // other unmodified iterator.152 recursive_directory_iterator const& cit = it;153 it = cit;154 assert(it2.options() == it.options());155 assert(it2.depth() == it.depth());156 assert(it2.recursion_pending() == it.recursion_pending());157 assert(*it2 == *it);158}159 160int main(int, char**) {161 test_assignment_signature();162 test_copy_to_end_iterator();163 test_copy_from_end_iterator();164 test_copy_valid_iterator();165 test_returns_reference_to_self();166 test_self_copy();167 168 return 0;169}170