brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · f7f1bd6 Raw
174 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// bool recursion_pending() 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 29static void initial_value_test()30{31    static_test_env static_env;32    recursive_directory_iterator it(static_env.Dir);33    assert(it.recursion_pending() == true);34}35 36static void value_after_copy_construction_and_assignment_test()37{38    static_test_env static_env;39    recursive_directory_iterator rec_pending_it(static_env.Dir);40    recursive_directory_iterator no_rec_pending_it(static_env.Dir);41    no_rec_pending_it.disable_recursion_pending();42 43    { // copy construction44        recursive_directory_iterator it(rec_pending_it);45        assert(it.recursion_pending() == true);46        it.disable_recursion_pending();47        assert(rec_pending_it.recursion_pending() == true);48 49        recursive_directory_iterator it2(no_rec_pending_it);50        assert(it2.recursion_pending() == false);51    }52    { // copy assignment53        recursive_directory_iterator it(static_env.Dir);54        it.disable_recursion_pending();55        it = rec_pending_it;56        assert(it.recursion_pending() == true);57        it.disable_recursion_pending();58        assert(rec_pending_it.recursion_pending() == true);59 60        recursive_directory_iterator it2(static_env.Dir);61        it2 = no_rec_pending_it;62        assert(it2.recursion_pending() == false);63    }64    assert(rec_pending_it.recursion_pending() == true);65    assert(no_rec_pending_it.recursion_pending() == false);66}67 68 69static void value_after_move_construction_and_assignment_test()70{71    static_test_env static_env;72    recursive_directory_iterator rec_pending_it(static_env.Dir);73    recursive_directory_iterator no_rec_pending_it(static_env.Dir);74    no_rec_pending_it.disable_recursion_pending();75 76    { // move construction77        recursive_directory_iterator it_cp(rec_pending_it);78        recursive_directory_iterator it(std::move(it_cp));79        assert(it.recursion_pending() == true);80 81        recursive_directory_iterator it_cp2(no_rec_pending_it);82        recursive_directory_iterator it2(std::move(it_cp2));83        assert(it2.recursion_pending() == false);84    }85    { // copy assignment86        recursive_directory_iterator it(static_env.Dir);87        it.disable_recursion_pending();88        recursive_directory_iterator it_cp(rec_pending_it);89        it = std::move(it_cp);90        assert(it.recursion_pending() == true);91 92        recursive_directory_iterator it2(static_env.Dir);93        recursive_directory_iterator it_cp2(no_rec_pending_it);94        it2 = std::move(it_cp2);95        assert(it2.recursion_pending() == false);96    }97    assert(rec_pending_it.recursion_pending() == true);98    assert(no_rec_pending_it.recursion_pending() == false);99}100 101static void increment_resets_value()102{103    static_test_env static_env;104    const recursive_directory_iterator endIt;105    {106        recursive_directory_iterator it(static_env.Dir);107        it.disable_recursion_pending();108        assert(it.recursion_pending() == false);109        ++it;110        assert(it.recursion_pending() == true);111        assert(it.depth() == 0);112    }113    {114        recursive_directory_iterator it(static_env.Dir);115        it.disable_recursion_pending();116        assert(it.recursion_pending() == false);117        it++;118        assert(it.recursion_pending() == true);119        assert(it.depth() == 0);120    }121    {122        recursive_directory_iterator it(static_env.Dir);123        it.disable_recursion_pending();124        assert(it.recursion_pending() == false);125        std::error_code ec;126        it.increment(ec);127        assert(it.recursion_pending() == true);128        assert(it.depth() == 0);129    }130}131 132static void pop_does_not_reset_value()133{134    static_test_env static_env;135    const recursive_directory_iterator endIt;136 137    auto& DE0 = static_env.DirIterationList;138    std::set<path> notSeenDepth0(DE0.begin(), DE0.end());139 140    recursive_directory_iterator it(static_env.Dir);141    assert(it != endIt);142 143    while (it.depth() == 0) {144        notSeenDepth0.erase(it->path());145        ++it;146        assert(it != endIt);147    }148    assert(it.depth() == 1);149    it.disable_recursion_pending();150    it.pop();151    // Since the order of iteration is unspecified the pop() could result152    // in the end iterator. When this is the case it is undefined behavior153    // to call recursion_pending().154    if (it == endIt) {155        assert(notSeenDepth0.empty());156#if defined(_LIBCPP_VERSION)157        assert(it.recursion_pending() == false);158#endif159    } else {160        assert(! notSeenDepth0.empty());161        assert(it.recursion_pending() == false);162    }163}164 165int main(int, char**) {166    initial_value_test();167    value_after_copy_construction_and_assignment_test();168    value_after_move_construction_and_assignment_test();169    increment_resets_value();170    pop_does_not_reset_value();171 172    return 0;173}174