source: mainline/uspace/lib/cpp/src/__bits/test/deque.cpp@ b57ba05

Last change on this file since b57ba05 was b57ba05, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Update headers in C++ files

  • Property mode set to 100644
File size: 6.9 KB
Line 
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
12namespace 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}
Note: See TracBrowser for help on using the repository browser.