Blender V4.3
array_nd_test.cc
Go to the documentation of this file.
1// Copyright (c) 2007, 2008 libmv authors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to
5// deal in the Software without restriction, including without limitation the
6// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7// sell copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19// IN THE SOFTWARE.
20
22#include "testing/testing.h"
23
24using libmv::Array3D;
25using libmv::Array3Df;
26using libmv::ArrayND;
27
28namespace {
29
30TEST(ArrayND, EmptyConstructor) {
32
33 EXPECT_EQ(0, a.Shape(0));
34 EXPECT_EQ(0, a.Shape(1));
35}
36
37TEST(ArrayND, IndexConstructor) {
38 int s[] = {1, 2, 3};
40 ArrayND<int, 3> a(shape);
41
42 EXPECT_EQ(1, a.Shape(0));
43 EXPECT_EQ(2, a.Shape(1));
44 EXPECT_EQ(3, a.Shape(2));
45}
46
47TEST(ArrayND, PointerConstructor) {
48 int s[] = {1, 2, 3};
49 ArrayND<int, 3> a(s);
50
51 EXPECT_EQ(1, a.Shape(0));
52 EXPECT_EQ(2, a.Shape(1));
53 EXPECT_EQ(3, a.Shape(2));
54}
55
56TEST(ArrayND, CopyConstructor) {
57 int s[] = {1, 2, 3};
58 ArrayND<int, 3> a(s);
59 a(0, 1, 1) = 3;
60 a(0, 1, 2) = 3;
62 EXPECT_EQ(1, b.Shape(0));
63 EXPECT_EQ(2, b.Shape(1));
64 EXPECT_EQ(3, b.Shape(2));
65 EXPECT_EQ(3, b(0, 1, 1));
66 b(0, 1, 2) = 2;
67 EXPECT_EQ(3, a(0, 1, 2));
68}
69
70TEST(ArrayND, Assignation) {
71 int s[] = {1, 2, 3};
72 ArrayND<int, 3> a(s);
73 a(0, 1, 1) = 3;
74 a(0, 1, 2) = 3;
76 b = a;
77 EXPECT_EQ(1, b.Shape(0));
78 EXPECT_EQ(2, b.Shape(1));
79 EXPECT_EQ(3, b.Shape(2));
80 EXPECT_EQ(3, b(0, 1, 1));
81 b(0, 1, 2) = 2;
82 EXPECT_EQ(3, a(0, 1, 2));
83}
84
85TEST(ArrayND, Fill) {
86 int s[] = {2, 2};
87 ArrayND<int, 2> a(s);
88 a.Fill(42);
89 EXPECT_EQ(42, a(0, 0));
90 EXPECT_EQ(42, a(0, 1));
91 EXPECT_EQ(42, a(1, 0));
92 EXPECT_EQ(42, a(1, 1));
93}
94
95TEST(ArrayND, Size) {
96 int s[] = {1, 2, 3};
98 ArrayND<int, 3> a(shape);
99
100 int l[] = {0, 1, 2};
102
103 EXPECT_EQ(a.Size(), a.Offset(last) + 1);
104 EXPECT_TRUE(a.Contains(last));
105 EXPECT_FALSE(a.Contains(shape));
106}
107
108TEST(ArrayND, MemorySizeInBytes) {
109 int s[] = {2, 3};
110 ArrayND<int, 2>::Index shape(s);
111 ArrayND<int, 2> a(shape);
112
113 int size = 24 + sizeof(a);
114 EXPECT_EQ(size, a.MemorySizeInBytes());
115}
116
117TEST(ArrayND, Parenthesis) {
118 typedef ArrayND<int, 2>::Index Index;
119
120 int s[] = {3, 3};
121 ArrayND<int, 2> a(s);
122
123 *(a.Data() + 0) = 0;
124 *(a.Data() + 5) = 5;
125
126 int i1[] = {0, 0};
127 EXPECT_EQ(0, a(Index(i1)));
128 int i2[] = {1, 2};
129 EXPECT_EQ(5, a(Index(i2)));
130}
131
132TEST(ArrayND, 1DConstructor) {
133 ArrayND<int, 1> a(3);
134
135 EXPECT_EQ(3, a.Shape(0));
136}
137
138TEST(ArrayND, 2DConstructor) {
139 ArrayND<int, 2> a(1, 2);
140
141 EXPECT_EQ(1, a.Shape(0));
142 EXPECT_EQ(2, a.Shape(1));
143}
144
145TEST(ArrayND, 3DConstructor) {
146 ArrayND<int, 3> a(1, 2, 3);
147
148 EXPECT_EQ(1, a.Shape(0));
149 EXPECT_EQ(2, a.Shape(1));
150 EXPECT_EQ(3, a.Shape(2));
151}
152
153TEST(ArrayND, 1DAccessor) {
154 ArrayND<int, 1> a(3);
155 a(0) = 1;
156 a(1) = 2;
157
158 EXPECT_EQ(1, a(0));
159 EXPECT_EQ(2, a(1));
160 EXPECT_EQ(1, *(a.Data()));
161 EXPECT_EQ(2, *(a.Data() + a.Stride(0)));
162}
163
164TEST(ArrayND, 2DAccessor) {
165 ArrayND<int, 2> a(3, 3);
166 a(0, 0) = 1;
167 a(1, 1) = 2;
168
169 EXPECT_EQ(1, a(0, 0));
170 EXPECT_EQ(2, a(1, 1));
171 EXPECT_EQ(1, *(a.Data()));
172 EXPECT_EQ(2, *(a.Data() + a.Stride(0) + a.Stride(1)));
173}
174
175TEST(ArrayND, 3DAccessor) {
176 ArrayND<int, 3> a(3, 3, 3);
177 a(0, 0, 0) = 1;
178 a(1, 1, 1) = 2;
179
180 EXPECT_EQ(1, a(0, 0, 0));
181 EXPECT_EQ(2, a(1, 1, 1));
182 EXPECT_EQ(1, *(a.Data()));
183 EXPECT_EQ(2, *(a.Data() + a.Stride(0) + a.Stride(1) + a.Stride(2)));
184}
185
186TEST(ArrayND, CopyFrom) {
187 ArrayND<int, 3> a(2, 2, 1);
188 a(0, 0, 0) = 1;
189 a(0, 1, 0) = 2;
190 a(1, 0, 0) = 3;
191 a(1, 1, 0) = 4;
193 b.CopyFrom(a);
194 EXPECT_FLOAT_EQ(1.0f, b(0, 0, 0));
195 EXPECT_FLOAT_EQ(2.0f, b(0, 1, 0));
196 EXPECT_FLOAT_EQ(3.0f, b(1, 0, 0));
197 EXPECT_FLOAT_EQ(4.0f, b(1, 1, 0));
198}
199
200TEST(ArrayND, MultiplyElements) {
201 ArrayND<int, 3> a(2, 2, 1);
202 a(0, 0, 0) = 1;
203 a(0, 1, 0) = 2;
204 a(1, 0, 0) = 3;
205 a(1, 1, 0) = 4;
206 ArrayND<int, 3> b(2, 2, 1);
207 b(0, 0, 0) = 6;
208 b(0, 1, 0) = 5;
209 b(1, 0, 0) = 4;
210 b(1, 1, 0) = 3;
212 MultiplyElements(a, b, &c);
213 EXPECT_FLOAT_EQ(6, c(0, 0, 0));
214 EXPECT_FLOAT_EQ(10, c(0, 1, 0));
215 EXPECT_FLOAT_EQ(12, c(1, 0, 0));
216 EXPECT_FLOAT_EQ(12, c(1, 1, 0));
217}
218
219TEST(ArrayND, IsEqualOperator) {
220 ArrayND<int, 3> a(2, 2, 1);
221 a(0, 0, 0) = 1;
222 a(0, 1, 0) = 2;
223 a(1, 0, 0) = 3;
224 a(1, 1, 0) = 4;
225 ArrayND<int, 3> b(2, 2, 1);
226 b(0, 0, 0) = 1;
227 b(0, 1, 0) = 2;
228 b(1, 0, 0) = 3;
229 b(1, 1, 0) = 4;
230 EXPECT_TRUE(a == b);
231 EXPECT_FALSE(a != b);
232 b(1, 1, 0) = 5;
233 EXPECT_TRUE(a != b);
234 EXPECT_FALSE(a == b);
235}
236
237TEST(Array3D, Sizes) {
239 EXPECT_EQ(array.Height(), 0);
240 EXPECT_EQ(array.Width(), 0);
241 EXPECT_EQ(array.Depth(), 0);
242 EXPECT_EQ(array.Shape(0), 0);
243}
244
245TEST(Array3D, CopyConstructor) {
246 Array3D<int> array(10, 10);
247 array(0, 0) = 1;
248 array(0, 1) = 1;
250 EXPECT_EQ(copy.Height(), 10);
251 EXPECT_EQ(copy.Width(), 10);
252 EXPECT_EQ(copy.Depth(), 1);
253 EXPECT_EQ(copy(0, 0), 1);
254 copy(0, 1) = 2;
255 EXPECT_EQ(array(0, 1), 1);
256}
257
258TEST(Array3D, Assignation) {
259 Array3D<int> array(10, 10);
260 array(0, 0) = 1;
261 array(0, 1) = 1;
263 copy = array;
264 EXPECT_EQ(copy.Height(), 10);
265 EXPECT_EQ(copy.Width(), 10);
266 EXPECT_EQ(copy.Depth(), 1);
267 EXPECT_EQ(copy(0, 0), 1);
268 copy(0, 1) = 2;
269 EXPECT_EQ(array(0, 1), 1);
270}
271
272TEST(Array3D, Parenthesis) {
273 Array3D<int> array(1, 2, 3);
274 array(0, 1, 0) = 3;
275 EXPECT_EQ(array(0, 1), 3);
276}
277
278TEST(Array3Df, SplitChannels) {
279 Array3Df array(1, 2, 3);
280 array(0, 0, 0) = 1;
281 array(0, 1, 0) = 1;
282 array(0, 0, 1) = 2;
283 array(0, 1, 1) = 2;
284 array(0, 0, 2) = 3;
285 array(0, 1, 2) = 3;
286 Array3Df c0, c1, c2;
287 SplitChannels(array, &c0, &c1, &c2);
288 for (int row = 0; row < 1; ++row) {
289 for (int column = 0; column < 2; ++column) {
290 EXPECT_EQ(array(row, column, 0), c0(row, column));
291 EXPECT_EQ(array(row, column, 1), c1(row, column));
292 EXPECT_EQ(array(row, column, 2), c2(row, column));
293 }
294 }
295}
296
297TEST(ArrayND, MultiplyElementsGeneric) {
301 int shape[] = {1, 3, 5, 7, 1};
302 A.Resize(shape);
303 B.Resize(shape);
304
305 A.Fill(1.1);
306 B.Fill(2);
307 MultiplyElements(A, B, &C);
308
310 for (int d0 = 0; d0 < shape[0]; ++d0) {
311 for (int d1 = 0; d1 < shape[1]; ++d1) {
312 for (int d2 = 0; d2 < shape[2]; ++d2) {
313 for (int d3 = 0; d3 < shape[3]; ++d3) {
314 for (int d4 = 0; d4 < shape[4]; ++d4) {
315 cIndex(0) = d0;
316 cIndex(1) = d1;
317 cIndex(2) = d2;
318 cIndex(3) = d3;
319 cIndex(4) = d4;
320 EXPECT_EQ(2.2, C(cIndex));
321 }
322 }
323 }
324 }
325 }
326}
327
328} // namespace
TEST(array_store, Nop)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define C
Definition RandGen.cpp:29
ATTR_WARN_UNUSED_RESULT const BMLoop * l
#define A
3D array (row, column, channel).
Definition array_nd.h:332
A multidimensional array class.
Definition array_nd.h:36
void Resize(const Index &new_shape)
Create an array of shape s.
Definition array_nd.h:89
local_group_size(16, 16) .push_constant(Type b
#define B
void SplitChannels(const Array3Df &input, Array3Df *channel0, Array3Df *channel1, Array3Df *channel2)
Definition array_nd.cc:68
Array3D< float > Array3Df
Definition array_nd.h:373
void MultiplyElements(const AArrayType &a, const BArrayType &b, CArrayType *c)
Definition array_nd.h:398
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)