Blender  V3.3
object_identifier_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2019 Blender Foundation. All rights reserved. */
4 
5 #include "testing/testing.h"
6 
7 #include "BLI_utildefines.h"
8 
9 #include <climits>
10 
11 namespace blender::io {
12 
13 namespace {
14 
15 /* Return object pointer for use in tests. This makes it possible to reliably test for
16  * order/equality functions while using hard-coded values for simplicity. */
17 Object *fake_pointer(int value)
18 {
19  return static_cast<Object *>(POINTER_FROM_INT(value));
20 }
21 
22 /* PersistentID subclass for use in tests, making it easier to construct test values. */
23 class TestPersistentID : public PersistentID {
24  public:
25  TestPersistentID(int value0,
26  int value1,
27  int value2,
28  int value3,
29  int value4,
30  int value5,
31  int value6,
32  int value7)
33  {
34  persistent_id_[0] = value0;
35  persistent_id_[1] = value1;
36  persistent_id_[2] = value2;
37  persistent_id_[3] = value3;
38  persistent_id_[4] = value4;
39  persistent_id_[5] = value5;
40  persistent_id_[6] = value6;
41  persistent_id_[7] = value7;
42  }
43  TestPersistentID(int value0, int value1, int value2)
44  : TestPersistentID(value0, value1, value2, INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX)
45  {
46  }
47  TestPersistentID(int value0, int value1) : TestPersistentID(value0, value1, INT_MAX)
48  {
49  }
50  explicit TestPersistentID(int value0) : TestPersistentID(value0, INT_MAX)
51  {
52  }
53 };
54 
55 /* ObjectIdentifier subclass for use in tests, making it easier to construct test values. */
56 class TestObjectIdentifier : public ObjectIdentifier {
57  public:
58  TestObjectIdentifier(Object *object, Object *duplicated_by, const PersistentID &persistent_id)
59  : ObjectIdentifier(object, duplicated_by, persistent_id)
60  {
61  }
62 };
63 
64 } // namespace
65 
66 class ObjectIdentifierOrderTest : public testing::Test {
67 };
68 
70 {
73  EXPECT_TRUE(id_root_1 == id_root_2);
74  EXPECT_FALSE(id_root_1 < id_root_2);
75  EXPECT_FALSE(id_root_2 < id_root_1);
76 
78  EXPECT_FALSE(id_root_1 == id_a);
79  EXPECT_TRUE(id_root_1 < id_a);
80  EXPECT_FALSE(id_a < id_root_1);
81 
82  ObjectIdentifier id_accidental_root = ObjectIdentifier::for_real_object(nullptr);
83  EXPECT_TRUE(id_root_1 == id_accidental_root);
84  EXPECT_FALSE(id_root_1 < id_accidental_root);
85  EXPECT_FALSE(id_accidental_root < id_root_1);
86 }
87 
89 {
92  EXPECT_FALSE(id_a == id_b);
93  EXPECT_TRUE(id_a < id_b);
94 }
95 
96 TEST_F(ObjectIdentifierOrderTest, duplicated_objects)
97 {
98  ObjectIdentifier id_real_a = ObjectIdentifier::for_real_object(fake_pointer(1));
99  TestObjectIdentifier id_dupli_a(fake_pointer(1), fake_pointer(2), TestPersistentID(0));
100  TestObjectIdentifier id_dupli_b(fake_pointer(1), fake_pointer(3), TestPersistentID(0));
101  TestObjectIdentifier id_different_dupli_b(fake_pointer(1), fake_pointer(3), TestPersistentID(1));
102 
103  EXPECT_FALSE(id_real_a == id_dupli_a);
104  EXPECT_FALSE(id_dupli_a == id_dupli_b);
105  EXPECT_TRUE(id_real_a < id_dupli_a);
106  EXPECT_TRUE(id_real_a < id_dupli_b);
107  EXPECT_TRUE(id_dupli_a < id_dupli_b);
108  EXPECT_TRUE(id_dupli_a < id_different_dupli_b);
109 
110  EXPECT_FALSE(id_dupli_b == id_different_dupli_b);
111  EXPECT_FALSE(id_dupli_a == id_different_dupli_b);
112  EXPECT_TRUE(id_dupli_b < id_different_dupli_b);
113  EXPECT_FALSE(id_different_dupli_b < id_dupli_b);
114 }
115 
116 TEST_F(ObjectIdentifierOrderTest, behavior_as_map_keys)
117 {
120  ObjectIdentifier id_real_a = ObjectIdentifier::for_real_object(fake_pointer(1));
121  TestObjectIdentifier id_dupli_a(fake_pointer(1), fake_pointer(2), TestPersistentID(0));
122  TestObjectIdentifier id_dupli_b(fake_pointer(1), fake_pointer(3), TestPersistentID(0));
124 
125  /* This inserts the keys with default values. */
126  graph[id_root];
127  graph[id_real_a];
128  graph[id_dupli_a];
129  graph[id_dupli_b];
130  graph[id_another_root];
131 
132  EXPECT_EQ(4, graph.size());
133 
134  graph.erase(id_another_root);
135  EXPECT_EQ(3, graph.size());
136 
137  TestObjectIdentifier id_another_dupli_b(fake_pointer(1), fake_pointer(3), TestPersistentID(0));
138  graph.erase(id_another_dupli_b);
139  EXPECT_EQ(2, graph.size());
140 }
141 
142 TEST_F(ObjectIdentifierOrderTest, map_copy_and_update)
143 {
145  ObjectIdentifier id_real_a = ObjectIdentifier::for_real_object(fake_pointer(1));
146  TestObjectIdentifier id_dupli_a(fake_pointer(1), fake_pointer(2), TestPersistentID(0));
147  TestObjectIdentifier id_dupli_b(fake_pointer(1), fake_pointer(3), TestPersistentID(0));
148  TestObjectIdentifier id_dupli_c(fake_pointer(1), fake_pointer(3), TestPersistentID(1));
150 
151  /* This inserts the keys with default values. */
152  graph[id_root];
153  graph[id_real_a];
154  graph[id_dupli_a];
155  graph[id_dupli_b];
156  graph[id_dupli_c];
157  EXPECT_EQ(5, graph.size());
158 
160  EXPECT_EQ(5, graph_copy.size());
161 
162  /* Updating a value in a copy should not update the original. */
163  HierarchyContext ctx1;
164  HierarchyContext ctx2;
165  ctx1.object = fake_pointer(1);
166  ctx2.object = fake_pointer(2);
167 
168  graph_copy[id_root].insert(&ctx1);
169  EXPECT_EQ(0, graph[id_root].size());
170 
171  /* Deleting a key in the copy should not update the original. */
172  graph_copy.erase(id_dupli_c);
173  EXPECT_EQ(4, graph_copy.size());
174  EXPECT_EQ(5, graph.size());
175 }
176 
177 class PersistentIDTest : public testing::Test {
178 };
179 
180 TEST_F(PersistentIDTest, is_from_same_instancer)
181 {
182  PersistentID child_id_a = TestPersistentID(42, 327);
183  PersistentID child_id_b = TestPersistentID(17, 327);
184  PersistentID child_id_c = TestPersistentID(17);
185 
186  EXPECT_TRUE(child_id_a.is_from_same_instancer_as(child_id_b));
187  EXPECT_FALSE(child_id_a.is_from_same_instancer_as(child_id_c));
188 }
189 
190 TEST_F(PersistentIDTest, instancer_id)
191 {
192  PersistentID child_id = TestPersistentID(42, 327);
193 
194  PersistentID expect_instancer_id = TestPersistentID(327);
195  EXPECT_EQ(expect_instancer_id, child_id.instancer_pid());
196 
197  PersistentID empty_id;
198  EXPECT_EQ(empty_id, child_id.instancer_pid().instancer_pid());
199 
200  EXPECT_LT(child_id, expect_instancer_id);
201  EXPECT_LT(expect_instancer_id, empty_id);
202 }
203 
204 TEST_F(PersistentIDTest, as_object_name_suffix)
205 {
206  EXPECT_EQ("", PersistentID().as_object_name_suffix());
207  EXPECT_EQ("47", TestPersistentID(47).as_object_name_suffix());
208  EXPECT_EQ("327-47", TestPersistentID(47, 327).as_object_name_suffix());
209  EXPECT_EQ("42-327-47", TestPersistentID(47, 327, 42).as_object_name_suffix());
210 
211  EXPECT_EQ("7-6-5-4-3-2-1-0", TestPersistentID(0, 1, 2, 3, 4, 5, 6, 7).as_object_name_suffix());
212 
213  EXPECT_EQ("0-0-0", TestPersistentID(0, 0, 0).as_object_name_suffix());
214  EXPECT_EQ("0-0", TestPersistentID(0, 0).as_object_name_suffix());
215  EXPECT_EQ("-3--2--1", TestPersistentID(-1, -2, -3).as_object_name_suffix());
216 }
217 
218 } // namespace blender::io
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define POINTER_FROM_INT(i)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
std::map< ObjectIdentifier, ExportChildren > ExportGraph
static ObjectIdentifier for_graph_root()
static ObjectIdentifier for_real_object(Object *object)
PersistentID instancer_pid() const
bool is_from_same_instancer_as(const PersistentID &other) const
Depsgraph * graph
TEST_F(AbstractHierarchyIteratorTest, ExportHierarchyTest)