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=(directory_iterator const&);
17
18#include <experimental/filesystem>
19#include <type_traits>
20#include <set>
21#include <cassert>
22
23#include "test_macros.h"
24#include "rapid-cxx-test.hpp"
25#include "filesystem_test_helper.hpp"
26
27// The filesystem specification explicitly allows for self-move on
28// the directory iterators. Turn off this warning so we can test it.
29#if defined(__clang__)
30#pragma clang diagnostic ignored "-Wself-move"
31#endif
32
33using namespace std::experimental::filesystem;
34
35TEST_SUITE(directory_iterator_move_assign_tests)
36
37TEST_CASE(test_assignment_signature)
38{
39    using D = directory_iterator;
40    static_assert(std::is_nothrow_move_assignable<D>::value, "");
41}
42
43TEST_CASE(test_move_to_end_iterator)
44{
45    const path testDir = StaticEnv::Dir;
46
47    directory_iterator from(testDir);
48    TEST_REQUIRE(from != directory_iterator{});
49    const path entry = *from;
50
51    directory_iterator to{};
52    to = std::move(from);
53    TEST_REQUIRE(to != directory_iterator{});
54    TEST_CHECK(*to == entry);
55}
56
57
58TEST_CASE(test_move_from_end_iterator)
59{
60    const path testDir = StaticEnv::Dir;
61
62    directory_iterator from{};
63
64    directory_iterator to(testDir);
65    TEST_REQUIRE(to != from);
66
67    to = std::move(from);
68    TEST_REQUIRE(to == directory_iterator{});
69    TEST_REQUIRE(from == directory_iterator{});
70}
71
72TEST_CASE(test_move_valid_iterator)
73{
74    const path testDir = StaticEnv::Dir;
75    const directory_iterator endIt{};
76
77    directory_iterator it(testDir);
78    TEST_REQUIRE(it != endIt);
79    ++it;
80    TEST_REQUIRE(it != endIt);
81    const path entry = *it;
82
83    directory_iterator it2(testDir);
84    TEST_REQUIRE(it2 != it);
85    const path entry2 = *it2;
86    TEST_CHECK(entry2 != entry);
87
88    it2 = std::move(it);
89    TEST_REQUIRE(it2 != directory_iterator{});
90    TEST_CHECK(*it2 == entry);
91}
92
93TEST_CASE(test_returns_reference_to_self)
94{
95    directory_iterator it;
96    directory_iterator it2;
97    directory_iterator& ref = (it2 = it);
98    TEST_CHECK(&ref == &it2);
99}
100
101
102TEST_CASE(test_self_move)
103{
104    // Create two non-equal iterators that have exactly the same state.
105    directory_iterator it(StaticEnv::Dir);
106    directory_iterator it2(StaticEnv::Dir);
107    ++it; ++it2;
108    TEST_CHECK(it != it2);
109    TEST_CHECK(*it2 == *it);
110
111    it = std::move(it);
112    TEST_CHECK(*it2 == *it);
113}
114
115
116TEST_SUITE_END()
117