Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / gil / test / extension / numeric / kernel.cpp
1 //
2 // Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
3 // Copyright 2019 Miral Shah <miralshah2211@gmail.com>
4 //
5 // Distributed under the Boost Software License, Version 1.0
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8 //
9 #define BOOST_DISABLE_ASSERTS 1 // kernel_1d_adaptor assertions are too strict
10 #include <boost/gil/extension/numeric/kernel.hpp>
11 #include <vector>
12
13 #define BOOST_TEST_MODULE test_ext_numeric_kernel
14 #include "unit_test.hpp"
15
16 namespace gil = boost::gil;
17
18 BOOST_AUTO_TEST_CASE(kernel_1d_default_constructor)
19 {
20     gil::kernel_1d<int> k;
21     BOOST_TEST(k.center() == 0);
22     BOOST_TEST(k.left_size() == 0);
23     BOOST_TEST(k.right_size() == -1); // TODO: Why not 0?
24     // std::vector interface
25     BOOST_TEST(k.size() == 0);
26 }
27
28 BOOST_AUTO_TEST_CASE(kernel_2d_default_constructor)
29 {
30     gil::detail::kernel_2d<int> k;
31     BOOST_TEST(k.center_y() == 0);
32     BOOST_TEST(k.center_x() == 0);
33
34     //BOOST_TEST(k.left_size() == 0);
35     //BOOST_TEST(k.right_size() == -1);
36     BOOST_TEST(k.upper_size() == 0);
37     BOOST_TEST(k.lower_size() == -1);
38     // std::vector interface
39     BOOST_TEST(k.size() == 0);
40 }
41
42 BOOST_AUTO_TEST_CASE(kernel_1d_parameterized_constructor)
43 {
44     gil::kernel_1d<int> k(9, 4);
45     BOOST_TEST(k.center() == 4);
46     BOOST_TEST(k.left_size() == 4);
47     BOOST_TEST(k.right_size() == 4);
48     // std::vector interface
49     BOOST_TEST(k.size() == 9);
50 }
51
52 BOOST_AUTO_TEST_CASE(kernel_2d_parameterized_constructor)
53 {
54     gil::detail::kernel_2d<int> k(9, 4, 4);
55     BOOST_TEST(k.center_y() == 4);
56     BOOST_TEST(k.center_x() == 4);
57     BOOST_TEST(k.left_size() == 4);
58     BOOST_TEST(k.right_size() == 4);
59     BOOST_TEST(k.upper_size() == 4);
60     BOOST_TEST(k.lower_size() == 4);
61     // std::vector interface
62     BOOST_TEST(k.size() == 9);
63 }
64
65 BOOST_AUTO_TEST_CASE(kernel_1d_parameterized_constructor_with_iterator)
66 {
67     std::vector<int> v(9);
68     gil::kernel_1d<int> k(v.cbegin(), v.size(), 4);
69     BOOST_TEST(k.center() == 4);
70     BOOST_TEST(k.left_size() == 4);
71     BOOST_TEST(k.right_size() == 4);
72     // std::vector interface
73     BOOST_TEST(k.size() == 9);
74 }
75
76 BOOST_AUTO_TEST_CASE(kernel_2d_parameterized_constructor_with_iterator)
77 {
78     std::vector<int> v(81);
79     gil::detail::kernel_2d<int> k(v.cbegin(), v.size(), 4, 4);
80     BOOST_TEST(k.center_y() == 4);
81     BOOST_TEST(k.center_x() == 4);
82     BOOST_TEST(k.left_size() == 4);
83     BOOST_TEST(k.right_size() == 4);
84     BOOST_TEST(k.upper_size() == 4);
85     BOOST_TEST(k.lower_size() == 4);
86     // std::vector interface
87     BOOST_TEST(k.size() == 9);
88 }
89
90 BOOST_AUTO_TEST_CASE(kernel_1d_copy_constructor)
91 {
92     gil::kernel_1d<int> d(9, 4);
93     gil::kernel_1d<int> k(d);
94     BOOST_TEST(k.center() == 4);
95     BOOST_TEST(k.center() == d.center());
96     BOOST_TEST(k.left_size() == d.left_size());
97     BOOST_TEST(k.right_size() == d.right_size());
98     // std::vector interface
99     BOOST_TEST(k.size() == d.size());
100 }
101
102 BOOST_AUTO_TEST_CASE(kernel_2d_copy_constructor)
103 {
104     gil::detail::kernel_2d<int> d(9, 4, 4);
105     gil::detail::kernel_2d<int> k(d);
106     BOOST_TEST(k.center_y() == 4);
107     BOOST_TEST(k.center_x() == 4);
108     BOOST_TEST(k.center_y() == d.center_y());
109     BOOST_TEST(k.center_x() == d.center_x());
110     BOOST_TEST(k.left_size() == d.left_size());
111     BOOST_TEST(k.right_size() == d.right_size());
112     BOOST_TEST(k.lower_size() == d.lower_size());
113     BOOST_TEST(k.upper_size() == d.upper_size());
114     // std::vector interface
115     BOOST_TEST(k.size() == d.size());
116 }
117
118 BOOST_AUTO_TEST_CASE(kernel_1d_assignment_operator)
119 {
120     gil::kernel_1d<int> d(9, 4);
121     gil::kernel_1d<int> k;
122     k = d;
123     BOOST_TEST(k.center() == 4);
124     BOOST_TEST(k.center() == d.center());
125     BOOST_TEST(k.left_size() == d.left_size());
126     BOOST_TEST(k.right_size() == d.right_size());
127     // std::vector interface
128     BOOST_TEST(k.size() == d.size());
129 }
130
131 BOOST_AUTO_TEST_CASE(kernel_2d_assignment_operator)
132 {
133     gil::detail::kernel_2d<int> d(9, 4, 4);
134     gil::detail::kernel_2d<int> k;
135     k = d;
136     BOOST_TEST(k.center_y() == 4);
137     BOOST_TEST(k.center_x() == 4);
138     BOOST_TEST(k.center_y() == d.center_y());
139     BOOST_TEST(k.center_x() == d.center_x());
140     BOOST_TEST(k.left_size() == d.left_size());
141     BOOST_TEST(k.right_size() == d.right_size());
142     BOOST_TEST(k.lower_size() == d.lower_size());
143     BOOST_TEST(k.upper_size() == d.upper_size());
144     // std::vector interface
145     BOOST_TEST(k.size() == d.size());
146 }
147
148 BOOST_AUTO_TEST_CASE(kernel_1d_reverse_Kernel)
149 {
150     gil::kernel_1d<int> d(12, 4);
151     BOOST_TEST(d.center() == 4);
152     auto k = gil::reverse_kernel(d);
153     BOOST_TEST(k.center() == d.right_size());
154     // std::vector interface
155     BOOST_TEST(k.size() == d.size());
156 }
157
158 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_default_constructor)
159 {
160     gil::kernel_1d_fixed<int, 9> k;
161     BOOST_TEST(k.center() == 0);
162     BOOST_TEST(k.left_size() == 0);
163     BOOST_TEST(k.right_size() == 8); // TODO: Why not 0 or -1 if not set?
164     // std::array interface
165     BOOST_TEST(k.size() == 9);
166 }
167
168 BOOST_AUTO_TEST_CASE(kernel_2d_fixed_default_constructor)
169 {
170     gil::detail::kernel_2d_fixed<int, 9> k;
171     BOOST_TEST(k.center_x() == 0);
172     BOOST_TEST(k.center_y() == 0);
173     BOOST_TEST(k.left_size() == 0);
174     BOOST_TEST(k.right_size() == 8); // TODO: Why not 0 or -1 if not set?
175     BOOST_TEST(k.upper_size() == 0);
176     BOOST_TEST(k.lower_size() == 8);
177     // std::array interface
178     BOOST_TEST(k.size() == 9);
179 }
180
181 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_parameterized_constructor)
182 {
183     gil::kernel_1d_fixed<int, 9> k(4);
184     BOOST_TEST(k.center() == 4);
185     BOOST_TEST(k.left_size() == 4);
186     BOOST_TEST(k.right_size() == 4);
187     // std::vector interface
188     BOOST_TEST(k.size() == 9);
189 }
190
191 BOOST_AUTO_TEST_CASE(kernel_2d_fixed_parameterized_constructor)
192 {
193     gil::detail::kernel_2d_fixed<int, 9> k(4, 4);
194     BOOST_TEST(k.center_x() == 4);
195     BOOST_TEST(k.center_y() == 4);
196     BOOST_TEST(k.left_size() == 4);
197     BOOST_TEST(k.right_size() == 4);
198     BOOST_TEST(k.upper_size() == 4);
199     BOOST_TEST(k.lower_size() == 4);
200     // std::vector interface
201     BOOST_TEST(k.size() == 9);
202 }
203
204 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_parameterized_constructor_with_iterator)
205 {
206     // FIXME: The constructor should throw if v.size() < k.size()
207     std::vector<int> v(9);
208     gil::kernel_1d_fixed<int, 9> k(v.cbegin(), 4);
209     BOOST_TEST((gil::kernel_1d_fixed<int, 9>::static_size) == 9);
210     BOOST_TEST(k.center() == 4);
211     BOOST_TEST(k.left_size() == 4);
212     BOOST_TEST(k.right_size() == 4);
213     // std::vector interface
214     BOOST_TEST(k.size() == 9);
215 }
216
217 BOOST_AUTO_TEST_CASE(kernel_2d_fixed_parameterized_constructor_with_iterator)
218 {
219 //    // FIXME: The constructor should throw if v.size() < k.size()
220     std::array<int, 81> v;
221     gil::detail::kernel_2d_fixed<int, 9> k(v.cbegin(), 4, 4);
222     BOOST_TEST((gil::detail::kernel_2d_fixed<int, 9>::static_size) == 9);
223     BOOST_TEST(k.center_y() == 4);
224     BOOST_TEST(k.center_x() == 4);
225     BOOST_TEST(k.left_size() == 4);
226     BOOST_TEST(k.right_size() == 4);
227     BOOST_TEST(k.upper_size() == 4);
228     BOOST_TEST(k.lower_size() == 4);
229     // std::vector interface
230     BOOST_TEST(k.size() == 9);
231 }
232
233 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_copy_constructor)
234 {
235     gil::kernel_1d_fixed<int, 9> d(4);
236     gil::kernel_1d_fixed<int, 9> k(d);
237     BOOST_TEST((gil::kernel_1d_fixed<int, 9>::static_size) == 9);
238     BOOST_TEST(k.center() == 4);
239     BOOST_TEST(k.center() == d.center());
240     BOOST_TEST(k.left_size() == d.left_size());
241     BOOST_TEST(k.right_size() == d.right_size());
242     // std::vector interface
243     BOOST_TEST(k.size() == d.size());
244 }
245
246 BOOST_AUTO_TEST_CASE(kernel_2d_fixed_copy_constructor)
247 {
248     gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
249     gil::detail::kernel_2d_fixed<int, 9> k(d);
250     BOOST_TEST((gil::detail::kernel_2d_fixed<int, 9>::static_size) == 9);
251     BOOST_TEST(k.center_x() == 4);
252     BOOST_TEST(k.center_y() == 4);
253     BOOST_TEST(k.center_x() == d.center_x());
254     BOOST_TEST(k.center_y() == d.center_y());
255     BOOST_TEST(k.left_size() == d.left_size());
256     BOOST_TEST(k.right_size() == d.right_size());
257     BOOST_TEST(k.lower_size() == d.lower_size());
258     BOOST_TEST(k.upper_size() == d.upper_size());
259     // std::vector interface
260     BOOST_TEST(k.size() == d.size());
261 }
262
263 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_assignment_operator)
264 {
265     gil::kernel_1d_fixed<int, 9> d(4);
266     gil::kernel_1d_fixed<int, 9> k;
267     k = d;
268     BOOST_TEST((gil::kernel_1d_fixed<int, 9>::static_size) == 9);
269     BOOST_TEST(k.center() == 4);
270     BOOST_TEST(k.center() == d.center());
271     BOOST_TEST(k.left_size() == d.left_size());
272     BOOST_TEST(k.right_size() == d.right_size());
273     // std::vector interface
274     BOOST_TEST(k.size() == d.size());
275 }
276
277 BOOST_AUTO_TEST_CASE(kernel_2d_fixed_assignment_operator)
278 {
279     gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
280     gil::detail::kernel_2d_fixed<int, 9> k;
281     k = d;
282     BOOST_TEST((gil::detail::kernel_2d_fixed<int, 9>::static_size) == 9);
283     BOOST_TEST(k.center_x() == 4);
284     BOOST_TEST(k.center_y() == 4);
285     BOOST_TEST(k.center_x() == d.center_x());
286     BOOST_TEST(k.center_y() == d.center_y());
287     BOOST_TEST(k.left_size() == d.left_size());
288     BOOST_TEST(k.right_size() == d.right_size());
289     BOOST_TEST(k.lower_size() == d.lower_size());
290     BOOST_TEST(k.upper_size() == d.upper_size());
291     // std::vector interface
292     BOOST_TEST(k.size() == d.size());
293 }
294
295 BOOST_AUTO_TEST_CASE(kernel_1d_fixed_reverse_Kernel)
296 {
297     std::array<int, 3> values = {1, 2, 3};
298     gil::kernel_1d_fixed<int, 3> d(values.begin(), 1);
299     BOOST_TEST((gil::kernel_1d_fixed<int, 3>::static_size) == 3);
300     BOOST_TEST(d == values);
301
302     std::array<int, 3> values_rev = {3, 2, 1};
303     auto k = gil::reverse_kernel(d);
304     BOOST_TEST(k == values_rev);
305 }
306
307