| 1 | /*
|
|---|
| 2 | * SPDX-FileCopyrightText: 2018 Jaroslav Jindrak
|
|---|
| 3 | *
|
|---|
| 4 | * SPDX-License-Identifier: BSD-3-Clause
|
|---|
| 5 | */
|
|---|
| 6 |
|
|---|
| 7 | #include <__bits/test/tests.hpp>
|
|---|
| 8 | #include <deque>
|
|---|
| 9 | #include <initializer_list>
|
|---|
| 10 | #include <utility>
|
|---|
| 11 |
|
|---|
| 12 | namespace std::test
|
|---|
| 13 | {
|
|---|
| 14 | bool deque_test::run(bool report)
|
|---|
| 15 | {
|
|---|
| 16 | report_ = report;
|
|---|
| 17 | start();
|
|---|
| 18 |
|
|---|
| 19 | test_constructors_and_assignment();
|
|---|
| 20 | test_resizing();
|
|---|
| 21 | test_push_pop();
|
|---|
| 22 | test_operations();
|
|---|
| 23 |
|
|---|
| 24 | return end();
|
|---|
| 25 | }
|
|---|
| 26 |
|
|---|
| 27 | const char* deque_test::name()
|
|---|
| 28 | {
|
|---|
| 29 | return "deque";
|
|---|
| 30 | }
|
|---|
| 31 |
|
|---|
| 32 | void deque_test::test_constructors_and_assignment()
|
|---|
| 33 | {
|
|---|
| 34 | auto check1 = {0, 0, 0, 0, 0};
|
|---|
| 35 | std::deque<int> d1(5U);
|
|---|
| 36 | test_eq(
|
|---|
| 37 | "size construction",
|
|---|
| 38 | check1.begin(), check1.end(),
|
|---|
| 39 | d1.begin(), d1.end()
|
|---|
| 40 | );
|
|---|
| 41 |
|
|---|
| 42 | auto check2 = {1, 1, 1, 1, 1};
|
|---|
| 43 | std::deque<int> d2(5U, 1);
|
|---|
| 44 | test_eq(
|
|---|
| 45 | "value construction",
|
|---|
| 46 | check2.begin(), check2.end(),
|
|---|
| 47 | d2.begin(), d2.end()
|
|---|
| 48 | );
|
|---|
| 49 |
|
|---|
| 50 | auto check3 = {1, 2, 3, 4, 5};
|
|---|
| 51 | std::deque<int> d3{check3.begin(), check3.end()};
|
|---|
| 52 | test_eq(
|
|---|
| 53 | "iterator range construction",
|
|---|
| 54 | check3.begin(), check3.end(),
|
|---|
| 55 | d3.begin(), d3.end()
|
|---|
| 56 | );
|
|---|
| 57 |
|
|---|
| 58 | std::deque<int> d4{d3};
|
|---|
| 59 | test_eq(
|
|---|
| 60 | "copy construction",
|
|---|
| 61 | check3.begin(), check3.end(),
|
|---|
| 62 | d4.begin(), d4.end()
|
|---|
| 63 | );
|
|---|
| 64 |
|
|---|
| 65 | std::deque<int> d5{std::move(d4)};
|
|---|
| 66 | test_eq(
|
|---|
| 67 | "move construction",
|
|---|
| 68 | check3.begin(), check3.end(),
|
|---|
| 69 | d5.begin(), d5.end()
|
|---|
| 70 | );
|
|---|
| 71 | test_eq("move construction - origin empty", d4.empty(), true);
|
|---|
| 72 |
|
|---|
| 73 | std::deque<int> d6{check3};
|
|---|
| 74 | test_eq(
|
|---|
| 75 | "inializer list construction",
|
|---|
| 76 | check3.begin(), check3.end(),
|
|---|
| 77 | d6.begin(), d6.end()
|
|---|
| 78 | );
|
|---|
| 79 |
|
|---|
| 80 | d4 = d6;
|
|---|
| 81 | test_eq(
|
|---|
| 82 | "copy assignment",
|
|---|
| 83 | check3.begin(), check3.end(),
|
|---|
| 84 | d4.begin(), d4.end()
|
|---|
| 85 | );
|
|---|
| 86 |
|
|---|
| 87 | d6 = std::move(d4);
|
|---|
| 88 | test_eq(
|
|---|
| 89 | "move assignment",
|
|---|
| 90 | check3.begin(), check3.end(),
|
|---|
| 91 | d6.begin(), d6.end()
|
|---|
| 92 | );
|
|---|
| 93 | test_eq("move assignment - origin empty", d4.empty(), true);
|
|---|
| 94 |
|
|---|
| 95 | d4 = check3;
|
|---|
| 96 | test_eq(
|
|---|
| 97 | "initializer list assignment",
|
|---|
| 98 | check3.begin(), check3.end(),
|
|---|
| 99 | d4.begin(), d4.end()
|
|---|
| 100 | );
|
|---|
| 101 |
|
|---|
| 102 | std::deque<int> d7{};
|
|---|
| 103 | d7.assign(check3.begin(), check3.end());
|
|---|
| 104 | test_eq(
|
|---|
| 105 | "iterator range assign()",
|
|---|
| 106 | check3.begin(), check3.end(),
|
|---|
| 107 | d7.begin(), d7.end()
|
|---|
| 108 | );
|
|---|
| 109 |
|
|---|
| 110 | d7.assign(5U, 1);
|
|---|
| 111 | test_eq(
|
|---|
| 112 | "value assign()",
|
|---|
| 113 | check2.begin(), check2.end(),
|
|---|
| 114 | d7.begin(), d7.end()
|
|---|
| 115 | );
|
|---|
| 116 |
|
|---|
| 117 | d7.assign(check3);
|
|---|
| 118 | test_eq(
|
|---|
| 119 | "initializer list assign()",
|
|---|
| 120 | check3.begin(), check3.end(),
|
|---|
| 121 | d7.begin(), d7.end()
|
|---|
| 122 | );
|
|---|
| 123 | }
|
|---|
| 124 |
|
|---|
| 125 | void deque_test::test_resizing()
|
|---|
| 126 | {
|
|---|
| 127 | auto check1 = {1, 2, 3};
|
|---|
| 128 | auto check2 = {1, 2, 3, 0, 0};
|
|---|
| 129 | std::deque<int> d1{1, 2, 3, 4, 5};
|
|---|
| 130 |
|
|---|
| 131 | d1.resize(3U);
|
|---|
| 132 | test_eq(
|
|---|
| 133 | "downsize",
|
|---|
| 134 | check1.begin(), check1.end(),
|
|---|
| 135 | d1.begin(), d1.end()
|
|---|
| 136 | );
|
|---|
| 137 |
|
|---|
| 138 | d1.resize(5U);
|
|---|
| 139 | test_eq(
|
|---|
| 140 | "upsize",
|
|---|
| 141 | check2.begin(), check2.end(),
|
|---|
| 142 | d1.begin(), d1.end()
|
|---|
| 143 | );
|
|---|
| 144 |
|
|---|
| 145 | auto check3 = {1, 2, 3, 9, 9};
|
|---|
| 146 | std::deque<int> d2{1, 2, 3, 4, 5};
|
|---|
| 147 |
|
|---|
| 148 | d2.resize(3U, 9);
|
|---|
| 149 | test_eq(
|
|---|
| 150 | "downsize with default value",
|
|---|
| 151 | check1.begin(), check1.end(),
|
|---|
| 152 | d2.begin(), d2.end()
|
|---|
| 153 | );
|
|---|
| 154 |
|
|---|
| 155 | d2.resize(5U, 9);
|
|---|
| 156 | test_eq(
|
|---|
| 157 | "upsize with default value",
|
|---|
| 158 | check3.begin(), check3.end(),
|
|---|
| 159 | d2.begin(), d2.end()
|
|---|
| 160 | );
|
|---|
| 161 |
|
|---|
| 162 | d2.resize(0U);
|
|---|
| 163 | test_eq("resize to 0", d2.empty(), true);
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 | void deque_test::test_push_pop()
|
|---|
| 167 | {
|
|---|
| 168 | std::deque<int> d1{};
|
|---|
| 169 |
|
|---|
| 170 | d1.push_back(42);
|
|---|
| 171 | test_eq("push_back to empty equivalence", d1[0], 42);
|
|---|
| 172 | test_eq("push_back to empty size", d1.size(), 1U);
|
|---|
| 173 |
|
|---|
| 174 | d1.push_front(21);
|
|---|
| 175 | test_eq("push_front after push_back equivalence", d1[0], 21);
|
|---|
| 176 | test_eq("push_front after push_back size", d1.size(), 2U);
|
|---|
| 177 |
|
|---|
| 178 | for (int i = 0; i <= 100; ++i)
|
|---|
| 179 | d1.push_back(i);
|
|---|
| 180 | test_eq("back after bucket test", d1.back(), 100);
|
|---|
| 181 |
|
|---|
| 182 | d1.pop_back();
|
|---|
| 183 | test_eq("back after pop_back", d1.back(), 99);
|
|---|
| 184 | d1.pop_front();
|
|---|
| 185 | test_eq("front after pop_front", d1.back(), 99);
|
|---|
| 186 |
|
|---|
| 187 |
|
|---|
| 188 | for (int i = 0; i <= 100; ++i)
|
|---|
| 189 | d1.push_front(i);
|
|---|
| 190 | test_eq("front after bucket test", d1.front(), 100);
|
|---|
| 191 |
|
|---|
| 192 | std::deque<int> d2{};
|
|---|
| 193 |
|
|---|
| 194 | d2.push_front(42);
|
|---|
| 195 | test_eq("push_front to empty equivalence", d2[0], 42);
|
|---|
| 196 | test_eq("push_front to empty size", d2.size(), 1U);
|
|---|
| 197 |
|
|---|
| 198 | d2.push_back(21);
|
|---|
| 199 | test_eq("push_back after push_front equivalence", d2[1], 21);
|
|---|
| 200 | test_eq("push_back after push_front size", d2.size(), 2U);
|
|---|
| 201 |
|
|---|
| 202 | d2.clear();
|
|---|
| 203 | test_eq("clear() - empty()", d2.empty(), true);
|
|---|
| 204 | test_eq("clear() - iterators", d2.begin(), d2.end());
|
|---|
| 205 | }
|
|---|
| 206 |
|
|---|
| 207 | void deque_test::test_operations()
|
|---|
| 208 | {
|
|---|
| 209 | auto check1 = {
|
|---|
| 210 | 1, 2, 3, 4, 11, 22, 33, 44, 55, 66, 77, 88,
|
|---|
| 211 | 5, 6, 7, 8, 9, 10, 11, 12
|
|---|
| 212 | };
|
|---|
| 213 | auto to_insert = {11, 22, 33, 44, 55, 66, 77, 88};
|
|---|
| 214 |
|
|---|
| 215 | std::deque<int> d1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
|
|---|
| 216 | std::deque<int> d2{d1};
|
|---|
| 217 | std::deque<int> d3{d1};
|
|---|
| 218 | std::deque<int> d4{d1};
|
|---|
| 219 |
|
|---|
| 220 | d1.insert(d1.begin() + 5, to_insert.begin(), to_insert.end());
|
|---|
| 221 | test_eq(
|
|---|
| 222 | "insert iterator range",
|
|---|
| 223 | check1.begin(), check1.end(),
|
|---|
| 224 | d1.begin(), d1.end()
|
|---|
| 225 | );
|
|---|
| 226 |
|
|---|
| 227 | d2.insert(d2.begin() + 5, to_insert);
|
|---|
| 228 | test_eq(
|
|---|
| 229 | "insert initializer list",
|
|---|
| 230 | check1.begin(), check1.end(),
|
|---|
| 231 | d2.begin(), d2.end()
|
|---|
| 232 | );
|
|---|
| 233 |
|
|---|
| 234 | auto check2 = {
|
|---|
| 235 | 1, 2, 3, 4, 99, 99, 99, 99, 99, 99, 99, 99,
|
|---|
| 236 | 5, 6, 7, 8, 9, 10, 11, 12
|
|---|
| 237 | };
|
|---|
| 238 | d3.insert(d3.begin() + 5, 8U, 99);
|
|---|
| 239 | test_eq(
|
|---|
| 240 | "insert value n times",
|
|---|
| 241 | check2.begin(), check2.end(),
|
|---|
| 242 | d3.begin(), d3.end()
|
|---|
| 243 | );
|
|---|
| 244 |
|
|---|
| 245 | auto check3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
|
|---|
| 246 | d3.erase(d3.begin() + 4, d3.begin() + 12);
|
|---|
| 247 | test_eq(
|
|---|
| 248 | "erase iterator range",
|
|---|
| 249 | check3.begin(), check3.end(),
|
|---|
| 250 | d3.begin(), d3.end()
|
|---|
| 251 | );
|
|---|
| 252 |
|
|---|
| 253 | auto check4 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12};
|
|---|
| 254 | d3.erase(d3.begin() + 10);
|
|---|
| 255 | test_eq(
|
|---|
| 256 | "erase",
|
|---|
| 257 | check4.begin(), check4.end(),
|
|---|
| 258 | d3.begin(), d3.end()
|
|---|
| 259 | );
|
|---|
| 260 |
|
|---|
| 261 | d2.swap(d3);
|
|---|
| 262 | test_eq(
|
|---|
| 263 | "swap1",
|
|---|
| 264 | check1.begin(), check1.end(),
|
|---|
| 265 | d3.begin(), d3.end()
|
|---|
| 266 | );
|
|---|
| 267 | test_eq(
|
|---|
| 268 | "swap2",
|
|---|
| 269 | check4.begin(), check4.end(),
|
|---|
| 270 | d2.begin(), d2.end()
|
|---|
| 271 | );
|
|---|
| 272 | }
|
|---|
| 273 | }
|
|---|