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.hpp>
11 #include <boost/gil/extension/numeric/kernel.hpp>
12
13 #include <boost/core/lightweight_test.hpp>
14
15 #include <vector>
16
17 namespace gil = boost::gil;
18
test_kernel_1d_default_constructor()19 void test_kernel_1d_default_constructor()
20 {
21 gil::kernel_1d<int> k;
22 BOOST_TEST_EQ(k.center(), 0);
23 BOOST_TEST_EQ(k.left_size(), 0);
24 BOOST_TEST_EQ(static_cast<int>(k.right_size()), -1);
25 // std::vector interface
26 BOOST_TEST_EQ(k.size(), 0);
27 }
28
test_kernel_2d_default_constructor()29 void test_kernel_2d_default_constructor()
30 {
31 gil::detail::kernel_2d<int> k;
32 BOOST_TEST_EQ(k.center_y(), 0);
33 BOOST_TEST_EQ(k.center_x(), 0);
34
35 //BOOST_TEST_EQ(k.left_size(), 0);
36 //BOOST_TEST_EQ(k.right_size(), -1);
37 BOOST_TEST_EQ(k.upper_size(), 0);
38 BOOST_TEST_EQ(static_cast<int>(k.lower_size()), -1);
39 // std::vector interface
40 BOOST_TEST_EQ(k.size(), 0);
41 }
42
test_kernel_1d_parameterized_constructor()43 void test_kernel_1d_parameterized_constructor()
44 {
45 gil::kernel_1d<int> k(9, 4);
46 BOOST_TEST_EQ(k.center(), 4);
47 BOOST_TEST_EQ(k.left_size(), 4);
48 BOOST_TEST_EQ(k.right_size(), 4);
49 // std::vector interface
50 BOOST_TEST_EQ(k.size(), 9);
51 }
52
test_kernel_2d_parameterized_constructor()53 void test_kernel_2d_parameterized_constructor()
54 {
55 gil::detail::kernel_2d<int> k(9, 4, 4);
56 BOOST_TEST_EQ(k.center_y(), 4);
57 BOOST_TEST_EQ(k.center_x(), 4);
58 BOOST_TEST_EQ(k.left_size(), 4);
59 BOOST_TEST_EQ(k.right_size(), 4);
60 BOOST_TEST_EQ(k.upper_size(), 4);
61 BOOST_TEST_EQ(k.lower_size(), 4);
62 // std::vector interface
63 BOOST_TEST_EQ(k.size(), 9);
64 }
65
test_kernel_1d_parameterized_constructor_with_iterator()66 void test_kernel_1d_parameterized_constructor_with_iterator()
67 {
68 std::vector<int> v(9);
69 gil::kernel_1d<int> k(v.cbegin(), v.size(), 4);
70 BOOST_TEST_EQ(k.center(), 4);
71 BOOST_TEST_EQ(k.left_size(), 4);
72 BOOST_TEST_EQ(k.right_size(), 4);
73 // std::vector interface
74 BOOST_TEST_EQ(k.size(), 9);
75 }
76
test_kernel_2d_parameterized_constructor_with_iterator()77 void test_kernel_2d_parameterized_constructor_with_iterator()
78 {
79 std::vector<int> v(81);
80 gil::detail::kernel_2d<int> k(v.cbegin(), v.size(), 4, 4);
81 BOOST_TEST_EQ(k.center_y(), 4);
82 BOOST_TEST_EQ(k.center_x(), 4);
83 BOOST_TEST_EQ(k.left_size(), 4);
84 BOOST_TEST_EQ(k.right_size(), 4);
85 BOOST_TEST_EQ(k.upper_size(), 4);
86 BOOST_TEST_EQ(k.lower_size(), 4);
87 // std::vector interface
88 BOOST_TEST_EQ(k.size(), 9);
89 }
90
test_kernel_1d_copy_constructor()91 void test_kernel_1d_copy_constructor()
92 {
93 gil::kernel_1d<int> d(9, 4);
94 gil::kernel_1d<int> k(d);
95 BOOST_TEST_EQ(k.center(), 4);
96 BOOST_TEST_EQ(k.center(), d.center());
97 BOOST_TEST_EQ(k.left_size(), d.left_size());
98 BOOST_TEST_EQ(k.right_size(), d.right_size());
99 // std::vector interface
100 BOOST_TEST_EQ(k.size(), d.size());
101 }
102
test_kernel_2d_copy_constructor()103 void test_kernel_2d_copy_constructor()
104 {
105 gil::detail::kernel_2d<int> d(9, 4, 4);
106 gil::detail::kernel_2d<int> k(d);
107 BOOST_TEST_EQ(k.center_y(), 4);
108 BOOST_TEST_EQ(k.center_x(), 4);
109 BOOST_TEST_EQ(k.center_y(), d.center_y());
110 BOOST_TEST_EQ(k.center_x(), d.center_x());
111 BOOST_TEST_EQ(k.left_size(), d.left_size());
112 BOOST_TEST_EQ(k.right_size(), d.right_size());
113 BOOST_TEST_EQ(k.lower_size(), d.lower_size());
114 BOOST_TEST_EQ(k.upper_size(), d.upper_size());
115 // std::vector interface
116 BOOST_TEST_EQ(k.size(), d.size());
117 }
118
test_kernel_1d_assignment_operator()119 void test_kernel_1d_assignment_operator()
120 {
121 gil::kernel_1d<int> d(9, 4);
122 gil::kernel_1d<int> k;
123 k = d;
124 BOOST_TEST_EQ(k.center(), 4);
125 BOOST_TEST_EQ(k.center(), d.center());
126 BOOST_TEST_EQ(k.left_size(), d.left_size());
127 BOOST_TEST_EQ(k.right_size(), d.right_size());
128 // std::vector interface
129 BOOST_TEST_EQ(k.size(), d.size());
130 }
131
test_kernel_2d_assignment_operator()132 void test_kernel_2d_assignment_operator()
133 {
134 gil::detail::kernel_2d<int> d(9, 4, 4);
135 gil::detail::kernel_2d<int> k;
136 k = d;
137 BOOST_TEST_EQ(k.center_y(), 4);
138 BOOST_TEST_EQ(k.center_x(), 4);
139 BOOST_TEST_EQ(k.center_y(), d.center_y());
140 BOOST_TEST_EQ(k.center_x(), d.center_x());
141 BOOST_TEST_EQ(k.left_size(), d.left_size());
142 BOOST_TEST_EQ(k.right_size(), d.right_size());
143 BOOST_TEST_EQ(k.lower_size(), d.lower_size());
144 BOOST_TEST_EQ(k.upper_size(), d.upper_size());
145 // std::vector interface
146 BOOST_TEST_EQ(k.size(), d.size());
147 }
148
test_kernel_1d_reverse_kernel()149 void test_kernel_1d_reverse_kernel()
150 {
151 gil::kernel_1d<int> d(12, 4);
152 BOOST_TEST_EQ(d.center(), 4);
153 auto k = gil::reverse_kernel(d);
154 BOOST_TEST_EQ(k.center(), d.right_size());
155 // std::vector interface
156 BOOST_TEST_EQ(k.size(), d.size());
157 }
158
test_kernel_2d_reverse_kernel()159 void test_kernel_2d_reverse_kernel()
160 {
161 std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
162 gil::detail::kernel_2d<int> d(data.begin(), data.size(), 2, 0);
163
164 BOOST_TEST_EQ(d.center_x(), 0);
165 BOOST_TEST_EQ(d.center_y(), 2);
166
167 auto k = gil::detail::reverse_kernel(d);
168
169 BOOST_TEST_EQ(k.center_x(), d.lower_size());
170 BOOST_TEST_EQ(k.center_x(), 0);
171
172 BOOST_TEST_EQ(k.center_y(), d.right_size());
173 BOOST_TEST_EQ(k.center_y(), 2);
174
175 // std::vector interface
176 BOOST_TEST_EQ(k.size(), d.size());
177
178 for (size_t i = 0; i < k.size() * k.size(); i++)
179 {
180 BOOST_TEST_EQ(d[i], k[(k.size()*k.size()) - 1 - i]);
181 }
182 }
183
main()184 int main()
185 {
186 test_kernel_1d_default_constructor();
187 test_kernel_2d_default_constructor();
188 test_kernel_1d_parameterized_constructor();
189 test_kernel_2d_parameterized_constructor();
190 test_kernel_1d_parameterized_constructor_with_iterator();
191 test_kernel_2d_parameterized_constructor_with_iterator();
192 test_kernel_1d_copy_constructor();
193 test_kernel_2d_copy_constructor();
194 test_kernel_1d_assignment_operator();
195 test_kernel_2d_assignment_operator();
196 test_kernel_1d_reverse_kernel();
197 test_kernel_2d_reverse_kernel();
198
199 return ::boost::report_errors();
200 }
201