source: mainline/uspace/lib/cpp/src/__bits/test/vector.cpp@ c6f23a7

Last change on this file since c6f23a7 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: 5.3 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 <algorithm>
9#include <initializer_list>
10#include <utility>
11#include <vector>
12
13namespace std::test
14{
15 bool vector_test::run(bool report)
16 {
17 report_ = report;
18 start();
19
20 test_construction_and_assignment();
21 test_insert();
22 test_erase();
23
24 return end();
25 }
26
27 const char* vector_test::name()
28 {
29 return "vector";
30 }
31
32 void vector_test::test_construction_and_assignment()
33 {
34 auto check1 = {1, 2, 3, 4};
35 auto check2 = {4, 3, 2, 1};
36 auto check3 = {5, 5, 5, 5};
37
38 std::vector<int> vec1{};
39 vec1.push_back(1);
40 vec1.push_back(2);
41 vec1.push_back(3);
42 vec1.push_back(4);
43 test_eq(
44 "default constructor + push_back",
45 vec1.begin(), vec1.end(),
46 check1.begin(), check1.end()
47 );
48
49 std::vector<int> vec2{4, 3, 2, 1};
50 test_eq(
51 "initializer list constructor",
52 vec2.begin(), vec2.end(),
53 check2.begin(), check2.end()
54 );
55
56 std::vector<int> vec3(11);
57 test_eq("capacity constructor", 11ul, vec3.capacity());
58
59 std::vector<int> vec4(4ul, 5);
60 test_eq(
61 "replication constructor",
62 vec4.begin(), vec4.end(),
63 check3.begin(), check3.end()
64 );
65
66 // TODO: iterator constructor when implemented
67
68 std::vector<int> vec6{vec4};
69 test_eq(
70 "copy constructor",
71 vec6.begin(), vec6.end(),
72 vec4.begin(), vec4.end()
73 );
74
75 std::vector<int> vec7{std::move(vec6)};
76 test_eq(
77 "move constructor equality",
78 vec7.begin(), vec7.end(),
79 vec4.begin(), vec4.end()
80 );
81 test_eq(
82 "move constructor source empty",
83 vec6.size(), 0ul
84 );
85
86 std::vector<int> vec8{check1};
87 test_eq(
88 "explicit initializer list constructor",
89 vec8.begin(), vec8.end(),
90 check1.begin(), check1.end()
91 );
92
93 std::vector<int> vec9{};
94 vec9 = vec8;
95 test_eq(
96 "copy assignment",
97 vec9.begin(), vec9.end(),
98 vec8.begin(), vec8.end()
99 );
100
101 // TODO: move assignment when implemented
102 std::vector<int> vec10{};
103 vec10 = std::move(vec9);
104 test_eq(
105 "move assignment",
106 vec10.begin(), vec10.end(),
107 vec8.begin(), vec8.end()
108 );
109
110 test_eq("move assignment origin empty", vec9.size(), 0U);
111 }
112
113 void vector_test::test_insert()
114 {
115 auto check1 = {1, 2, 3, 99, 4, 5};
116 auto check2 = {1, 2, 3, 99, 99, 99, 99, 99, 4, 5};
117 auto check3 = {1, 2, 3, 1, 2, 3, 99, 4, 5, 4, 5};
118
119 std::vector<int> vec1{1, 2, 3, 4, 5};
120 auto it = vec1.insert(vec1.begin() + 3, 99);
121 test_eq(
122 "single element insert",
123 vec1.begin(), vec1.end(),
124 check1.begin(), check1.end()
125 );
126 test_eq(
127 "iterator returned from insert",
128 *it, 99
129 );
130
131 std::vector<int> vec2{1, 2, 3, 4, 5};
132 vec2.insert(vec2.begin() + 3, 5ul, 99);
133 test_eq(
134 "multiple element insert",
135 vec2.begin(), vec2.end(),
136 check2.begin(), check2.end()
137 );
138
139 std::vector<int> vec3{1, 2, 3, 4, 5};
140 vec3.insert(vec3.begin() + 3, vec2.begin() + 3, vec2.begin() + 8);
141 test_eq(
142 "iterator insert",
143 vec3.begin(), vec3.end(),
144 check2.begin(), check2.end()
145 );
146
147 std::vector<int> vec4{1, 2, 3, 4, 5};
148 vec4.insert(vec4.begin() + 3, check1);
149 test_eq(
150 "initializer list insert",
151 vec4.begin(), vec4.end(),
152 check3.begin(), check3.end()
153 );
154
155 std::vector<int> vec5{1, 2, 3, 4, 5};
156 vec5.insert(vec5.begin() + 3, {1, 2, 3, 99, 4, 5});
157 test_eq(
158 "implicit initializer list insert",
159 vec5.begin(), vec5.end(),
160 check3.begin(), check3.end()
161 );
162
163 std::vector<int> vec6{};
164 vec6.insert(vec6.begin(), check3);
165 test_eq(
166 "insert to empty vector",
167 vec6.begin(), vec6.end(),
168 check3.begin(), check3.end()
169 );
170 }
171
172 void vector_test::test_erase()
173 {
174 auto check1 = {1, 2, 3, 5};
175 auto check2 = {1, 5};
176 auto check3 = {1, 3, 5};
177
178 std::vector<int> vec1{1, 2, 3, 4, 5};
179 vec1.erase(vec1.begin() + 3);
180 test_eq(
181 "single element erase",
182 vec1.begin(), vec1.end(),
183 check1.begin(), check1.end()
184 );
185
186 std::vector<int> vec2{1, 2, 3, 4, 5};
187 vec2.erase(vec2.begin() + 1, vec2.begin() + 4);
188 test_eq(
189 "range erase",
190 vec2.begin(), vec2.end(),
191 check2.begin(), check2.end()
192 );
193
194 std::vector<int> vec3{1, 2, 3, 4, 5};
195 for (auto it = vec3.begin(); it != vec3.end();)
196 {
197 if (*it % 2 == 0)
198 it = vec3.erase(it);
199 else
200 ++it;
201 }
202 test_eq(
203 "erase all even numbers",
204 vec3.begin(), vec3.end(),
205 check3.begin(), check3.end()
206 );
207 }
208}
Note: See TracBrowser for help on using the repository browser.