Blender  V3.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 
21 #include "libmv/image/array_nd.h"
22 #include "testing/testing.h"
23 
24 using libmv::Array3D;
25 using libmv::Array3Df;
26 using libmv::ArrayND;
27 
28 namespace {
29 
30 TEST(ArrayND, EmptyConstructor) {
32 
33  EXPECT_EQ(0, a.Shape(0));
34  EXPECT_EQ(0, a.Shape(1));
35 }
36 
37 TEST(ArrayND, IndexConstructor) {
38  int s[] = {1, 2, 3};
39  ArrayND<int, 3>::Index shape(s);
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 
47 TEST(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 
56 TEST(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 
70 TEST(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 
85 TEST(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 
95 TEST(ArrayND, Size) {
96  int s[] = {1, 2, 3};
97  ArrayND<int, 3>::Index shape(s);
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 
108 TEST(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 
117 TEST(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 
132 TEST(ArrayND, 1DConstructor) {
133  ArrayND<int, 1> a(3);
134 
135  EXPECT_EQ(3, a.Shape(0));
136 }
137 
138 TEST(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 
145 TEST(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 
153 TEST(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 
164 TEST(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 
175 TEST(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 
186 TEST(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 
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 
219 TEST(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 
237 TEST(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 
245 TEST(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 
258 TEST(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 
272 TEST(Array3D, Parenthesis) {
273  Array3D<int> array(1, 2, 3);
274  array(0, 1, 0) = 3;
275  EXPECT_EQ(array(0, 1), 3);
276 }
277 
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 
297 TEST(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 } // namespace
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
@ TEST
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint i1
#define C
Definition: RandGen.cpp:25
ATTR_WARN_UNUSED_RESULT const BMLoop * l
#define A
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
3D array (row, column, channel).
Definition: array_nd.h:325
A multidimensional array class.
Definition: array_nd.h:36
#define B
static unsigned c
Definition: RandGen.cpp:83
static unsigned a[3]
Definition: RandGen.cpp:78
void SplitChannels(const Array3Df &input, Array3Df *channel0, Array3Df *channel1, Array3Df *channel2)
Definition: array_nd.cc:68
Array3D< float > Array3Df
Definition: array_nd.h:366
void MultiplyElements(const AArrayType &a, const BArrayType &b, CArrayType *c)
Definition: array_nd.h:391
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)