• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   Copyright (c) Alexander Zaitsev <zamazan4ik@gmail.com>, 2017
3 
4   Distributed under the Boost Software License, Version 1.0. (See
5   accompanying file LICENSE_1_0.txt or copy at
6   http://www.boost.org/LICENSE_1_0.txt)
7 
8   See http://www.boost.org/ for latest version.
9 */
10 
11 #include <vector>
12 
13 #include <boost/algorithm/apply_permutation.hpp>
14 
15 #define BOOST_TEST_MAIN
16 
17 #include <boost/test/included/unit_test.hpp>
18 
19 namespace ba = boost::algorithm;
20 
21 
BOOST_AUTO_TEST_CASE(test_apply_permutation)22 BOOST_AUTO_TEST_CASE(test_apply_permutation)
23 {
24     //Empty
25     {
26         std::vector<int> vec, order, result;
27 
28         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
29         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
30     }
31     //1 element
32     {
33         std::vector<int> vec, order, result;
34         vec.push_back(1);
35         order.push_back(0);
36         result = vec;
37 
38         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
39         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
40     }
41     //2 elements, no changes
42     {
43         std::vector<int> vec, order, result;
44         vec.push_back(1); vec.push_back(2);
45         order.push_back(0); order.push_back(1);
46         result = vec;
47 
48         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
49         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
50     }
51     //2 elements, changed
52     {
53         std::vector<int> vec, order, result;
54         vec.push_back(1); vec.push_back(2);
55         order.push_back(1); order.push_back(0);
56         result.push_back(2); result.push_back(1);
57 
58         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
59         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
60     }
61     //Multiple elements, no changes
62     {
63         std::vector<int> vec, order, result;
64         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
65         order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
66         result = vec;
67 
68         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
69         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
70     }
71     //Multiple elements, changed
72     {
73         std::vector<int> vec, order, result;
74         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
75         order.push_back(4); order.push_back(3); order.push_back(2); order.push_back(1); order.push_back(0);
76         result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
77 
78         ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
79         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
80     }
81     //Just test range interface
82     {
83         std::vector<int> vec, order, result;
84         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
85         order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
86         result = vec;
87 
88         ba::apply_permutation(vec, order);
89         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
90     }
91 }
92 
BOOST_AUTO_TEST_CASE(test_apply_reverse_permutation)93 BOOST_AUTO_TEST_CASE(test_apply_reverse_permutation)
94 {
95     //Empty
96     {
97         std::vector<int> vec, order, result;
98 
99         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
100         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
101     }
102     //1 element
103     {
104         std::vector<int> vec, order, result;
105         vec.push_back(1);
106         order.push_back(0);
107         result = vec;
108 
109         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
110         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
111     }
112     //2 elements, no changes
113     {
114         std::vector<int> vec, order, result;
115         vec.push_back(1); vec.push_back(2);
116         order.push_back(0); order.push_back(1);
117         result = vec;
118 
119         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
120         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
121     }
122     //2 elements, changed
123     {
124         std::vector<int> vec, order, result;
125         vec.push_back(1); vec.push_back(2);
126         order.push_back(1); order.push_back(0);
127         result.push_back(2); result.push_back(1);
128 
129         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
130         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
131     }
132     //Multiple elements, no changes
133     {
134         std::vector<int> vec, order, result;
135         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
136         order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
137         result = vec;
138 
139         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
140         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
141     }
142     //Multiple elements, changed
143     {
144         std::vector<int> vec, order, result;
145         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
146         order.push_back(4); order.push_back(3); order.push_back(2); order.push_back(1); order.push_back(0);
147         result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
148 
149         ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
150         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
151     }
152     //Just test range interface
153     {
154         std::vector<int> vec, order, result;
155         vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
156         order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
157         result = vec;
158 
159         ba::apply_reverse_permutation(vec, order);
160         BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
161     }
162 }
163