Blender  V2.93
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;
61  ArrayND<int, 3> b(a);
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
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate Set Z Dilate Combine Combine Color Channel Split ID Combine Luminance Directional Alpha Distance Hue Movie Ellipse Bokeh View Corner Anti Mix RGB Hue Separate TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC Boolean Random Edge Subdivision Point Object Attribute Attribute Fill
#define C
Definition: RandGen.cpp:39
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
void CopyFrom(const ArrayND< D, N > &other)
Definition: array_nd.h:143
const Index & Shape() const
Return a tuple containing the length of each axis.
Definition: array_nd.h:166
#define B
static unsigned c
Definition: RandGen.cpp:97
static unsigned a[3]
Definition: RandGen.cpp:92
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 void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)