preCICE v3.2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AlgorithmTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
2#include <algorithm>
3#include <array>
4#include <boost/test/unit_test_suite.hpp>
5#include <functional>
6#include <ostream>
7#include <string>
8#include <utility>
9#include <vector>
10#include "math/constants.hpp"
12#include "testing/Testing.hpp"
13#include "utils/String.hpp"
14#include "utils/algorithm.hpp"
15
16using namespace precice;
17namespace pu = precice::utils;
18
19BOOST_AUTO_TEST_SUITE(UtilsTests)
20BOOST_AUTO_TEST_SUITE(AlgorithmTests)
21
24{
26 auto a = pu::make_array(1, 2, 3);
27 BOOST_TEST(a.size() == 3);
28 BOOST_TEST(a.at(0) == 1);
29 BOOST_TEST(a.at(1) == 2);
30 BOOST_TEST(a.at(2) == 3);
31}
32
34BOOST_AUTO_TEST_CASE(UniqueElements)
35{
37 std::vector<int> y{1, 2, 3, 4, 5, 6, 7, 8, 9};
38 BOOST_TEST(pu::unique_elements(y));
39 BOOST_TEST(pu::unique_elements(y, [](int l, int r) { return l == r; }));
40
41 std::vector<int> n1{1, 2, 3, 4, 5, 6, 7, 8, 9, 9};
42 BOOST_TEST(!pu::unique_elements(n1));
43 BOOST_TEST(!pu::unique_elements(n1, [](int l, int r) { return l == r; }));
44
45 std::vector<int> n2{1, 1, 3, 4, 5, 6, 7, 8, 9};
46 BOOST_TEST(!pu::unique_elements(n2));
47 BOOST_TEST(!pu::unique_elements(n2, [](int l, int r) { return l == r; }));
48
50 BOOST_TEST(pu::unique_elements(e));
51 BOOST_TEST(pu::unique_elements(e, [](int l, int r) { return l == r; }));
52}
53
55BOOST_AUTO_TEST_CASE(UniqueEigenElements)
56{
58 Eigen::VectorXd v1(3);
59 v1 << 1.0, 0.1, 0.2;
60 Eigen::VectorXd v2(3);
61 v2 << 0.1, 1.0, 0.2;
62 Eigen::VectorXd v3(3);
63 v3 << 0.1, 0.2, 1.0;
64
66 BOOST_TEST(pu::unique_elements(case1));
67
69 BOOST_TEST(pu::unique_elements(case2));
70
71 std::vector<Eigen::VectorXd> case3{v1, v2};
72 BOOST_TEST(pu::unique_elements(case3));
73
74 std::vector<Eigen::VectorXd> case4{v1, v2, v1};
75 BOOST_TEST(!pu::unique_elements(case4));
76
77 std::vector<Eigen::VectorXd> case5{v1, v2, v3};
78 BOOST_TEST(pu::unique_elements(case5));
79
80 std::vector<Eigen::VectorXd> case6{v1, v2, v3, v1};
81 BOOST_TEST(!pu::unique_elements(case6));
82}
83
86{
88 std::vector<int> a{1, 2, 3, 4, 5, 6, 7, 8, 9};
89 std::vector<int> b{1, 2, 3, 4, 5, 0, 9};
90
91 auto aa = pu::mismatch(
92 a.begin(), a.end(),
93 a.begin(), a.end());
94 BOOST_TEST((aa.first == aa.second));
95 BOOST_TEST((aa.first == a.end()));
96
97 auto ab = pu::mismatch(
98 a.begin(), a.end(),
99 b.begin(), b.end());
100 BOOST_TEST((ab.first != a.end()));
101 BOOST_TEST(*ab.first == 6);
102 BOOST_TEST(*ab.second == 0);
103}
104
105BOOST_AUTO_TEST_SUITE(RangePreview)
106
107PRECICE_TEST_SETUP(1_rank)
108BOOST_AUTO_TEST_CASE(NormalRangePreview)
109{
110 PRECICE_TEST();
111 std::vector<int> a{1, 2, 3, 4, 5, 6, 0};
113 oss << pu::previewRange(2, a);
114 std::string str{oss.str()};
115 BOOST_TEST(str == "[1, 2, ... , 6, 0] min:0 max:6");
116}
117
118PRECICE_TEST_SETUP(1_rank)
119BOOST_AUTO_TEST_CASE(PrintNoElements)
120{
121 PRECICE_TEST();
122 std::vector<int> a{1, 2, 3, 4, 5, 6, 0};
124 oss << pu::previewRange(0, a);
125 std::string str{oss.str()};
126 BOOST_TEST(str == "[ ... ] min:0 max:6");
127}
128
129PRECICE_TEST_SETUP(1_rank)
131{
132 PRECICE_TEST();
135 oss << pu::previewRange(3, a);
136 std::string str{oss.str()};
137 BOOST_TEST(str == "<Empty Range>");
138}
139
141
142BOOST_AUTO_TEST_SUITE(ReorderArray)
143
144PRECICE_TEST_SETUP(1_rank)
146{
147 PRECICE_TEST();
148 std::array<int, 1> input{1};
149 std::array<int, 1> order{0};
150 std::array<int, 1> expected{1};
151
152 auto reordered = utils::reorder_array(order, input);
153 BOOST_TEST(reordered == expected);
154}
155
156PRECICE_TEST_SETUP(1_rank)
158{
159 PRECICE_TEST();
160 std::array<int, 3> input{3, 4, 5};
161 std::array<int, 3> order{0, 1, 2};
162 std::array<int, 3> expected{3, 4, 5};
163
164 auto reordered = utils::reorder_array(order, input);
165 BOOST_TEST(reordered == expected);
166}
167
168PRECICE_TEST_SETUP(1_rank)
170{
171 PRECICE_TEST();
172 std::array<int, 3> input{3, 4, 5};
173 std::array<int, 3> order{2, 1, 0};
174 std::array<int, 3> expected{5, 4, 3};
175
176 auto reordered = utils::reorder_array(order, input);
177 BOOST_TEST(reordered == expected);
178}
179
180PRECICE_TEST_SETUP(1_rank)
182{
183 PRECICE_TEST();
184 std::array<int, 3> input{3, 4, 5};
185 std::array<int, 3> order{2, 0, 1};
186 std::array<int, 3> expected{5, 3, 4};
187
188 auto reordered = utils::reorder_array(order, input);
189 BOOST_TEST(reordered == expected);
190}
191
192PRECICE_TEST_SETUP(1_rank)
193BOOST_AUTO_TEST_CASE(ScramblePointer)
194{
195 PRECICE_TEST();
196 int a = 1, b = 2;
197
198 std::array<int *, 3> input{&a, &b, nullptr};
199 std::array<int, 3> order{2, 0, 1};
200 std::array<int *, 3> expected{nullptr, &a, &b};
201
202 auto reordered = utils::reorder_array(order, input);
203 BOOST_TEST(reordered == expected);
204}
205
206BOOST_AUTO_TEST_SUITE_END() // ReorderArray
207
208BOOST_AUTO_TEST_SUITE(FindFirstRange)
209
210PRECICE_TEST_SETUP(1_rank)
212{
213 PRECICE_TEST();
214 std::vector v{0, 1, 2, 3};
215
216 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return false; });
217 BOOST_TEST((first == v.end()));
218 BOOST_TEST((last == v.end()));
219}
220
221PRECICE_TEST_SETUP(1_rank)
223{
224 PRECICE_TEST();
225 std::vector v{0, 1, 2, 3};
226
227 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return true; });
228 BOOST_TEST((first == v.begin()));
229 BOOST_TEST((last == v.end() - 1));
230}
231
232PRECICE_TEST_SETUP(1_rank)
234{
235 PRECICE_TEST();
236 std::vector v{0, 1, 2, 3};
237
238 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 0; });
239 BOOST_TEST((first == v.begin()));
240 BOOST_TEST((last == v.begin()));
241}
242
243PRECICE_TEST_SETUP(1_rank)
245{
246 PRECICE_TEST();
247 std::vector v{0, 0, 2, 3};
248
249 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 0; });
250 BOOST_TEST((first == v.begin()));
251 BOOST_TEST((last == v.begin() + 1));
252}
253
254PRECICE_TEST_SETUP(1_rank)
256{
257 PRECICE_TEST();
258 std::vector v{0, 1, 2, 3};
259
260 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 3; });
261 BOOST_TEST((first == v.end() - 1));
262 BOOST_TEST((last == first));
263}
264
265PRECICE_TEST_SETUP(1_rank)
267{
268 PRECICE_TEST();
269 std::vector v{1, 2, 3, 3};
270
271 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 3; });
272 BOOST_TEST((first == v.end() - 2));
273 BOOST_TEST((last == v.end() - 1));
274}
275
276PRECICE_TEST_SETUP(1_rank)
278{
279 PRECICE_TEST();
280 std::vector v{1, 2, 3, 4};
281
282 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 2; });
283 BOOST_TEST((first == v.begin() + 1));
284 BOOST_TEST((last == first));
285}
286
287PRECICE_TEST_SETUP(1_rank)
288BOOST_AUTO_TEST_CASE(MiddleMultiple)
289{
290 PRECICE_TEST();
291 std::vector v{1, 2, 2, 3};
292
293 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 2; });
294 BOOST_TEST((first == v.begin() + 1));
295 BOOST_TEST((last == v.begin() + 2));
296}
297
298PRECICE_TEST_SETUP(1_rank)
299BOOST_AUTO_TEST_CASE(MultipleRangesSingleMatch)
300{
301 PRECICE_TEST();
302 std::vector v{1, 2, 3, 4, 5, 3};
303
304 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 3; });
305 BOOST_TEST((first == v.begin() + 2));
306 BOOST_TEST((last == first));
307}
308
309PRECICE_TEST_SETUP(1_rank)
310BOOST_AUTO_TEST_CASE(MultipleRangesMultipleMatches)
311{
312 PRECICE_TEST();
313 std::vector v{1, 2, 2, 4, 2, 2};
314
315 auto [first, last] = utils::find_first_range(v.begin(), v.end(), [](int i) { return i == 2; });
316 BOOST_TEST((first == v.begin() + 1));
317 BOOST_TEST((last == v.begin() + 2));
318}
319
320BOOST_AUTO_TEST_SUITE_END() // FindRange
321
322BOOST_AUTO_TEST_SUITE_END() // Algorithm
323
BOOST_AUTO_TEST_CASE(MakeArray)
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
#define PRECICE_TEST()
Definition Testing.hpp:39
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Definition Testing.hpp:29
contains precice-related utilities.
auto reorder_array(const std::array< Index, n > &order, const std::array< T, n > &elements) -> std::array< T, n >
Reorders an array given an array of unique indices.
std::pair< InputIt, InputIt > find_first_range(InputIt first, InputIt last, Predicate p)
Finds the first range in [first, last[ that fulfills a predicate.
const RangePreview< Iter > previewRange(Size n, const Range &range)
bool unique_elements(const Container &c, BinaryPredicate p={})
Definition algorithm.hpp:63
auto make_array(Elements &&...elements) -> std::array< typename std::common_type< Elements... >::type, sizeof...(Elements)>
Function that generates an array from given elements.
Definition algorithm.hpp:50
std::pair< InputIt1, InputIt2 > mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Main namespace of the precice library.
T str(T... args)