7TEST_CASE(
"Global Data") {
10 SUBCASE(
"Set, Get, Exists, List, Clear") {
11 ctx.setGlobalData(
"test_int", 123);
12 ctx.setGlobalData(
"test_float", 456.789f);
13 ctx.setGlobalData(
"test_string",
"hello");
14 std::vector<double> double_vec = {1.1, 2.2, 3.3};
15 ctx.setGlobalData(
"test_double_vec", double_vec);
17 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"test_int"));
18 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"test_float"));
19 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"test_string"));
20 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"test_double_vec"));
21 DOCTEST_CHECK(!ctx.doesGlobalDataExist(
"non_existent"));
24 ctx.getGlobalData(
"test_int", i);
25 DOCTEST_CHECK(i == 123);
28 ctx.getGlobalData(
"test_float", f);
29 DOCTEST_CHECK(f == doctest::Approx(456.789f));
32 ctx.getGlobalData(
"test_string", s);
33 DOCTEST_CHECK(s ==
"hello");
35 std::vector<double> dv;
36 ctx.getGlobalData(
"test_double_vec", dv);
37 DOCTEST_CHECK(dv.size() == 3);
38 DOCTEST_CHECK(dv[1] == doctest::Approx(2.2));
40 std::vector<std::string> labels = ctx.listGlobalData();
41 DOCTEST_CHECK(labels.size() == 4);
43 ctx.clearGlobalData(
"test_int");
44 DOCTEST_CHECK(!ctx.doesGlobalDataExist(
"test_int"));
47 SUBCASE(
"Management") {
48 ctx.setGlobalData(
"g_int", 5);
49 DOCTEST_CHECK(ctx.getGlobalDataType(
"g_int") == HELIOS_TYPE_INT);
50 DOCTEST_CHECK(ctx.getGlobalDataSize(
"g_int") == 1);
52 ctx.duplicateGlobalData(
"g_int",
"g_int_copy");
53 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int_copy"));
55 ctx.renameGlobalData(
"g_int",
"g_int_new");
56 DOCTEST_CHECK(!ctx.doesGlobalDataExist(
"g_int"));
57 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int_new"));
60 SUBCASE(
"Increment") {
61 ctx.setGlobalData(
"inc_me_int", 10);
62 ctx.incrementGlobalData(
"inc_me_int", 5);
64 ctx.getGlobalData(
"inc_me_int", val_i);
65 DOCTEST_CHECK(val_i == 15);
67 ctx.setGlobalData(
"inc_me_uint", std::vector<uint>{1});
68 ctx.incrementGlobalData(
"inc_me_uint", (
uint) 1);
69 std::vector<uint> val_u;
70 ctx.getGlobalData(
"inc_me_uint", val_u);
71 DOCTEST_CHECK(val_u[0] == 2);
73 ctx.setGlobalData(
"inc_me_float", std::vector<float>{1.f});
74 ctx.incrementGlobalData(
"inc_me_float", 1.f);
75 std::vector<float> val_f;
76 ctx.getGlobalData(
"inc_me_float", val_f);
77 DOCTEST_CHECK(val_f[0] == doctest::Approx(2.f));
79 ctx.setGlobalData(
"inc_me_double", std::vector<double>{1.0});
80 ctx.incrementGlobalData(
"inc_me_double", 1.0);
81 std::vector<double> val_d;
82 ctx.getGlobalData(
"inc_me_double", val_d);
83 DOCTEST_CHECK(val_d[0] == doctest::Approx(2.0));
86 SUBCASE(
"All Vector Types") {
87 ctx.setGlobalData(
"g_uint_vec", std::vector<uint>{1});
88 ctx.setGlobalData(
"g_vec2_vec", std::vector<vec2>{
make_vec2(1, 1)});
89 ctx.setGlobalData(
"g_vec3_vec", std::vector<vec3>{
make_vec3(1, 1, 1)});
90 ctx.setGlobalData(
"g_vec4_vec", std::vector<vec4>{
make_vec4(1, 1, 1, 1)});
91 ctx.setGlobalData(
"g_int2_vec", std::vector<int2>{
make_int2(1, 1)});
92 ctx.setGlobalData(
"g_int3_vec", std::vector<int3>{
make_int3(1, 1, 1)});
93 ctx.setGlobalData(
"g_int4_vec", std::vector<int4>{
make_int4(1, 1, 1, 1)});
94 ctx.setGlobalData(
"g_string_vec", std::vector<std::string>{
"hello"});
96 ctx.duplicateGlobalData(
"g_uint_vec",
"g_uint_vec_copy");
97 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_uint_vec_copy"));
98 ctx.duplicateGlobalData(
"g_vec2_vec",
"g_vec2_vec_copy");
99 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec2_vec_copy"));
100 ctx.duplicateGlobalData(
"g_vec3_vec",
"g_vec3_vec_copy");
101 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec3_vec_copy"));
102 ctx.duplicateGlobalData(
"g_vec4_vec",
"g_vec4_vec_copy");
103 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec4_vec_copy"));
104 ctx.duplicateGlobalData(
"g_int2_vec",
"g_int2_vec_copy");
105 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int2_vec_copy"));
106 ctx.duplicateGlobalData(
"g_int3_vec",
"g_int3_vec_copy");
107 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int3_vec_copy"));
108 ctx.duplicateGlobalData(
"g_int4_vec",
"g_int4_vec_copy");
109 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int4_vec_copy"));
110 ctx.duplicateGlobalData(
"g_string_vec",
"g_string_vec_copy");
111 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_string_vec_copy"));
114 SUBCASE(
"Global data error handling and all types") {
116 capture_cerr cerr_buffer;
117 DOCTEST_CHECK_THROWS(ctx.getGlobalDataType(
"non_existent"));
118 DOCTEST_CHECK_THROWS(ctx.getGlobalDataSize(
"non_existent"));
119 DOCTEST_CHECK_THROWS(ctx.renameGlobalData(
"non_existent",
"new"));
120 DOCTEST_CHECK_THROWS(ctx.duplicateGlobalData(
"non_existent",
"new"));
121 DOCTEST_CHECK_THROWS(ctx.incrementGlobalData(
"non_existent", 1));
123 ctx.setGlobalData(
"g_uint", std::vector<uint>{1});
124 ctx.setGlobalData(
"g_float", std::vector<float>{1.f});
125 ctx.setGlobalData(
"g_double", std::vector<double>{1.0});
126 ctx.setGlobalData(
"g_vec2", std::vector<vec2>{
make_vec2(1, 1)});
127 ctx.setGlobalData(
"g_vec3", std::vector<vec3>{
make_vec3(1, 1, 1)});
128 ctx.setGlobalData(
"g_vec4", std::vector<vec4>{
make_vec4(1, 1, 1, 1)});
129 ctx.setGlobalData(
"g_int2", std::vector<int2>{
make_int2(1, 1)});
130 ctx.setGlobalData(
"g_int3", std::vector<int3>{
make_int3(1, 1, 1)});
131 ctx.setGlobalData(
"g_int4", std::vector<int4>{
make_int4(1, 1, 1, 1)});
132 ctx.setGlobalData(
"g_string", std::vector<std::string>{
"hello"});
134 ctx.duplicateGlobalData(
"g_uint",
"g_uint_copy");
135 ctx.duplicateGlobalData(
"g_float",
"g_float_copy");
136 ctx.duplicateGlobalData(
"g_double",
"g_double_copy");
137 ctx.duplicateGlobalData(
"g_vec2",
"g_vec2_copy");
138 ctx.duplicateGlobalData(
"g_vec3",
"g_vec3_copy");
139 ctx.duplicateGlobalData(
"g_vec4",
"g_vec4_copy");
140 ctx.duplicateGlobalData(
"g_int2",
"g_int2_copy");
141 ctx.duplicateGlobalData(
"g_int3",
"g_int3_copy");
142 ctx.duplicateGlobalData(
"g_int4",
"g_int4_copy");
143 ctx.duplicateGlobalData(
"g_string",
"g_string_copy");
145 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_uint_copy"));
146 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_float_copy"));
147 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_double_copy"));
148 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec2_copy"));
149 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec3_copy"));
150 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_vec4_copy"));
151 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int2_copy"));
152 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int3_copy"));
153 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_int4_copy"));
154 DOCTEST_CHECK(ctx.doesGlobalDataExist(
"g_string_copy"));
156 ctx.incrementGlobalData(
"g_uint", (
uint) 1);
157 ctx.incrementGlobalData(
"g_float", 1.f);
158 ctx.incrementGlobalData(
"g_double", 1.0);
160 std::vector<uint> g_uint;
161 ctx.getGlobalData(
"g_uint", g_uint);
162 DOCTEST_CHECK(g_uint[0] == 2);
166TEST_CASE(
"Object Data") {
171 SUBCASE(
"Set, Get, Exists, List, Clear") {
172 ctx.setObjectData(o1,
"test_uint", (
uint) 42);
174 ctx.setObjectData(o1,
"test_vec3_vec", vec_data);
176 DOCTEST_CHECK(ctx.doesObjectDataExist(o1,
"test_uint"));
177 DOCTEST_CHECK(ctx.doesObjectDataExist(o1,
"test_vec3_vec"));
178 DOCTEST_CHECK(!ctx.doesObjectDataExist(o1,
"non_existent"));
181 ctx.getObjectData(o1,
"test_uint", ui);
182 DOCTEST_CHECK(ui == 42);
184 std::vector<vec3> v_r;
185 ctx.getObjectData(o1,
"test_vec3_vec", v_r);
186 DOCTEST_CHECK(v_r.size() == 2);
187 DOCTEST_CHECK(v_r[1].y == doctest::Approx(5.0));
189 DOCTEST_CHECK(ctx.getObjectDataType(
"test_uint") == HELIOS_TYPE_UINT);
190 DOCTEST_CHECK(ctx.getObjectDataSize(o1,
"test_vec3_vec") == 2);
192 std::vector<std::string> labels = ctx.listObjectData(o1);
193 DOCTEST_CHECK(labels.size() == 2);
195 ctx.clearObjectData(o1,
"test_uint");
196 DOCTEST_CHECK(!ctx.doesObjectDataExist(o1,
"test_uint"));
199 SUBCASE(
"Management") {
200 ctx.setObjectData(o1,
"my_data", 10);
202 ctx.copyObjectData(o1, o2);
203 DOCTEST_CHECK(ctx.doesObjectDataExist(o2,
"my_data"));
205 ctx.renameObjectData(o1,
"my_data",
"new_name");
206 DOCTEST_CHECK(!ctx.doesObjectDataExist(o1,
"my_data"));
207 DOCTEST_CHECK(ctx.doesObjectDataExist(o1,
"new_name"));
209 ctx.duplicateObjectData(o2,
"my_data",
"my_data_copy");
210 DOCTEST_CHECK(ctx.doesObjectDataExist(o2,
"my_data_copy"));
212 std::vector<std::string> all_obj_labels = ctx.listAllObjectDataLabels();
213 DOCTEST_CHECK(std::find(all_obj_labels.begin(), all_obj_labels.end(),
"my_data") != all_obj_labels.end());
214 DOCTEST_CHECK(std::find(all_obj_labels.begin(), all_obj_labels.end(),
"new_name") != all_obj_labels.end());
215 DOCTEST_CHECK(std::find(all_obj_labels.begin(), all_obj_labels.end(),
"my_data_copy") != all_obj_labels.end());
218 SUBCASE(
"Object data error handling") {
220 capture_cerr cerr_buffer;
222 DOCTEST_CHECK_THROWS(ctx.getObjectDataType(
"test"));
223 DOCTEST_CHECK_THROWS(ctx.getObjectDataSize(bad_oid,
"test"));
224 DOCTEST_CHECK_THROWS(ctx.doesObjectDataExist(bad_oid,
"test"));
225 DOCTEST_CHECK_THROWS(ctx.clearObjectData(bad_oid,
"test"));
226 DOCTEST_CHECK_THROWS(ctx.copyObjectData(0, bad_oid));
227 DOCTEST_CHECK_THROWS(ctx.copyObjectData(bad_oid, 0));
228 DOCTEST_CHECK_THROWS(ctx.renameObjectData(bad_oid,
"old",
"new"));
229 DOCTEST_CHECK_THROWS(ctx.duplicateObjectData(bad_oid,
"old",
"new"));
233TEST_CASE(
"Primitive Data") {
235 uint p1 = ctx.addPatch();
236 uint p2 = ctx.addPatch();
237 std::vector<uint> uuids;
238 for (
int i = 0; i < 5; ++i) {
243 SUBCASE(
"Set and Get All Data Types") {
245 ctx.setPrimitiveData(p1,
"test_int", 1);
246 ctx.setPrimitiveData(p1,
"test_uint", 1u);
247 ctx.setPrimitiveData(p1,
"test_float", 2.f);
248 ctx.setPrimitiveData(p1,
"test_double", 2.0);
249 ctx.setPrimitiveData(p1,
"test_vec2",
make_vec2(1, 2));
250 ctx.setPrimitiveData(p1,
"test_vec3",
make_vec3(1, 2, 3));
251 ctx.setPrimitiveData(p1,
"test_vec4",
make_vec4(1, 2, 3, 4));
252 ctx.setPrimitiveData(p1,
"test_int2",
make_int2(1, 2));
253 ctx.setPrimitiveData(p1,
"test_int3",
make_int3(1, 2, 3));
254 ctx.setPrimitiveData(p1,
"test_int4",
make_int4(1, 2, 3, 4));
255 ctx.setPrimitiveData(p1,
"test_string",
"world");
258 ctx.getPrimitiveData(p1,
"test_int", r_i);
259 DOCTEST_CHECK(r_i == 1);
261 ctx.getPrimitiveData(p1,
"test_uint", r_ui);
262 DOCTEST_CHECK(r_ui == 1);
264 ctx.getPrimitiveData(p1,
"test_float", r_f);
265 DOCTEST_CHECK(r_f == doctest::Approx(2.0));
267 ctx.getPrimitiveData(p1,
"test_double", r_d);
268 DOCTEST_CHECK(r_d == doctest::Approx(2.0));
270 ctx.getPrimitiveData(p1,
"test_vec2", r_v2);
273 ctx.getPrimitiveData(p1,
"test_vec3", r_v3);
274 DOCTEST_CHECK(r_v3 ==
make_vec3(1, 2, 3));
276 ctx.getPrimitiveData(p1,
"test_vec4", r_v4);
277 DOCTEST_CHECK(r_v4 ==
make_vec4(1, 2, 3, 4));
279 ctx.getPrimitiveData(p1,
"test_int2", r_i2);
282 ctx.getPrimitiveData(p1,
"test_int3", r_i3);
283 DOCTEST_CHECK(r_i3 ==
make_int3(1, 2, 3));
285 ctx.getPrimitiveData(p1,
"test_int4", r_i4);
286 DOCTEST_CHECK(r_i4 ==
make_int4(1, 2, 3, 4));
288 ctx.getPrimitiveData(p1,
"test_string", r_s);
289 DOCTEST_CHECK(r_s ==
"world");
292 std::vector<int> v_i = {1, 2, 3};
293 ctx.setPrimitiveData(p1,
"test_v_int", v_i);
294 std::vector<int> r_v_i;
295 ctx.getPrimitiveData(p1,
"test_v_int", r_v_i);
296 DOCTEST_CHECK(r_v_i == v_i);
297 std::vector<uint> v_ui = {4, 5, 6};
298 ctx.setPrimitiveData(p1,
"test_v_uint", v_ui);
299 std::vector<uint> r_v_ui;
300 ctx.getPrimitiveData(p1,
"test_v_uint", r_v_ui);
301 DOCTEST_CHECK(r_v_ui == v_ui);
302 std::vector<float> v_f = {1.1, 2.2};
303 ctx.setPrimitiveData(p1,
"test_v_float", v_f);
304 std::vector<float> r_v_f;
305 ctx.getPrimitiveData(p1,
"test_v_float", r_v_f);
306 DOCTEST_CHECK(r_v_f == v_f);
307 std::vector<double> v_d = {1.1, 2.2};
308 ctx.setPrimitiveData(p1,
"test_v_double", v_d);
309 std::vector<double> r_v_d;
310 ctx.getPrimitiveData(p1,
"test_v_double", r_v_d);
311 DOCTEST_CHECK(r_v_d == v_d);
313 ctx.setPrimitiveData(p1,
"test_v_vec2", v_v2);
314 std::vector<vec2> r_v_v2;
315 ctx.getPrimitiveData(p1,
"test_v_vec2", r_v_v2);
316 DOCTEST_CHECK(r_v_v2 == v_v2);
318 ctx.setPrimitiveData(p1,
"test_v_vec3", v_v3);
319 std::vector<vec3> r_v_v3;
320 ctx.getPrimitiveData(p1,
"test_v_vec3", r_v_v3);
321 DOCTEST_CHECK(r_v_v3 == v_v3);
323 ctx.setPrimitiveData(p1,
"test_v_vec4", v_v4);
324 std::vector<vec4> r_v_v4;
325 ctx.getPrimitiveData(p1,
"test_v_vec4", r_v_v4);
326 DOCTEST_CHECK(r_v_v4 == v_v4);
328 ctx.setPrimitiveData(p1,
"test_v_int2", v_i2);
329 std::vector<int2> r_v_i2;
330 ctx.getPrimitiveData(p1,
"test_v_int2", r_v_i2);
331 DOCTEST_CHECK(r_v_i2 == v_i2);
333 ctx.setPrimitiveData(p1,
"test_v_int3", v_i3);
334 std::vector<int3> r_v_i3;
335 ctx.getPrimitiveData(p1,
"test_v_int3", r_v_i3);
336 DOCTEST_CHECK(r_v_i3 == v_i3);
338 ctx.setPrimitiveData(p1,
"test_v_int4", v_i4);
339 std::vector<int4> r_v_i4;
340 ctx.getPrimitiveData(p1,
"test_v_int4", r_v_i4);
341 DOCTEST_CHECK(r_v_i4 == v_i4);
342 std::vector<std::string> v_s = {
"hello",
"world"};
343 ctx.setPrimitiveData(p1,
"test_v_string", v_s);
344 std::vector<std::string> r_v_s;
345 ctx.getPrimitiveData(p1,
"test_v_string", r_v_s);
346 DOCTEST_CHECK(r_v_s == v_s);
349 SUBCASE(
"Management") {
350 ctx.setPrimitiveData(p1,
"my_data", 10);
351 ctx.copyPrimitiveData(p1, p2);
352 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p2,
"my_data"));
354 ctx.getPrimitiveData(p2,
"my_data", val);
355 DOCTEST_CHECK(val == 10);
357 ctx.renamePrimitiveData(p1,
"my_data",
"new_data_name");
358 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p1,
"my_data"));
359 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p1,
"new_data_name"));
361 ctx.duplicatePrimitiveData(p2,
"my_data",
"my_data_copy");
362 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p2,
"my_data_copy"));
363 ctx.getPrimitiveData(p2,
"my_data_copy", val);
364 DOCTEST_CHECK(val == 10);
366 ctx.setPrimitiveData(p1,
"global_copy_test", 5.5f);
367 ctx.duplicatePrimitiveData(
"global_copy_test",
"global_copy_test_new");
368 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p1,
"global_copy_test_new"));
369 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p2,
"global_copy_test_new"));
371 std::vector<std::string> all_labels = ctx.listAllPrimitiveDataLabels();
372 DOCTEST_CHECK(std::find(all_labels.begin(), all_labels.end(),
"my_data") != all_labels.end());
373 DOCTEST_CHECK(std::find(all_labels.begin(), all_labels.end(),
"my_data_copy") != all_labels.end());
374 DOCTEST_CHECK(std::find(all_labels.begin(), all_labels.end(),
"new_data_name") != all_labels.end());
376 ctx.clearPrimitiveData(p1,
"new_data_name");
377 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p1,
"new_data_name"));
378 ctx.clearPrimitiveData(uuids,
"global_copy_test");
381 SUBCASE(
"Calculations") {
382 for (
int i = 0; i < 5; ++i) {
383 ctx.setPrimitiveData(uuids[i],
"float_val", (
float) i);
384 ctx.setPrimitiveData(uuids[i],
"double_val", (
double) i);
385 ctx.setPrimitiveData(uuids[i],
"vec2_val",
make_vec2((
float) i, (
float) i));
389 ctx.calculatePrimitiveDataMean(uuids,
"float_val", float_mean);
390 DOCTEST_CHECK(float_mean == doctest::Approx(2.0f));
392 ctx.calculatePrimitiveDataMean(uuids,
"double_val", double_mean);
393 DOCTEST_CHECK(double_mean == doctest::Approx(2.0));
395 ctx.calculatePrimitiveDataMean(uuids,
"vec2_val", vec2_mean);
396 DOCTEST_CHECK(vec2_mean.x == doctest::Approx(2.0f));
399 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"float_val", awt_mean_f);
400 DOCTEST_CHECK(awt_mean_f == doctest::Approx(2.0f));
403 ctx.calculatePrimitiveDataSum(uuids,
"float_val", float_sum);
404 DOCTEST_CHECK(float_sum == doctest::Approx(10.0f));
407 ctx.calculatePrimitiveDataAreaWeightedSum(uuids,
"float_val", awt_sum_f);
408 DOCTEST_CHECK(awt_sum_f == doctest::Approx(10.0f));
410 ctx.scalePrimitiveData(uuids,
"float_val", 2.0f);
411 ctx.getPrimitiveData(uuids[2],
"float_val", float_mean);
412 DOCTEST_CHECK(float_mean == doctest::Approx(4.0f));
413 capture_cerr cerr_buffer;
414 ctx.scalePrimitiveData(
"double_val", 0.5f);
415 ctx.getPrimitiveData(uuids[4],
"double_val", double_mean);
416 DOCTEST_CHECK(double_mean == doctest::Approx(2.0));
417 DOCTEST_CHECK(cerr_buffer.has_output());
419 ctx.setPrimitiveData(uuids,
"int_val", 10);
420 ctx.incrementPrimitiveData(uuids,
"int_val", 5);
422 ctx.getPrimitiveData(uuids[0],
"int_val", int_val);
423 DOCTEST_CHECK(int_val == 15);
426 SUBCASE(
"Context::calculatePrimitiveDataMean empty list") {
428 std::vector<uint> uuids;
430 capture_cerr cerr_buffer;
431 ctx.calculatePrimitiveDataMean(uuids,
"non_existent", float_mean);
432 DOCTEST_CHECK(float_mean == 0.f);
433 DOCTEST_CHECK(cerr_buffer.has_output());
436 SUBCASE(
"Context::calculatePrimitiveDataMean vec3/vec4") {
438 uint p1 = ctx.addPatch();
439 ctx.setPrimitiveData(p1,
"v3",
make_vec3(1, 2, 3));
440 ctx.setPrimitiveData(p1,
"v4",
make_vec4(1, 2, 3, 4));
441 std::vector<uint> uuids = {p1};
444 ctx.calculatePrimitiveDataMean(uuids,
"v3", v3_mean);
445 ctx.calculatePrimitiveDataMean(uuids,
"v4", v4_mean);
446 DOCTEST_CHECK(v3_mean ==
make_vec3(1, 2, 3));
447 DOCTEST_CHECK(v4_mean ==
make_vec4(1, 2, 3, 4));
450 SUBCASE(
"Context::calculatePrimitiveDataAreaWeightedMean all types") {
453 ctx.setPrimitiveData(p,
"double", 2.5);
454 ctx.setPrimitiveData(p,
"vec2",
make_vec2(1, 2));
455 ctx.setPrimitiveData(p,
"vec3",
make_vec3(1, 2, 3));
456 ctx.setPrimitiveData(p,
"vec4",
make_vec4(1, 2, 3, 4));
457 std::vector<uint> uuids = {p};
460 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"double", d_mean);
461 DOCTEST_CHECK(d_mean == doctest::Approx(2.5));
464 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec2", v2_mean);
465 DOCTEST_CHECK(v2_mean ==
make_vec2(1, 2));
468 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec3", v3_mean);
469 DOCTEST_CHECK(v3_mean ==
make_vec3(1, 2, 3));
472 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec4", v4_mean);
473 DOCTEST_CHECK(v4_mean ==
make_vec4(1, 2, 3, 4));
476 SUBCASE(
"Context::calculatePrimitiveDataSum all types") {
478 uint p = ctx.addPatch();
479 ctx.setPrimitiveData(p,
"double", 2.5);
480 ctx.setPrimitiveData(p,
"vec2",
make_vec2(1, 2));
481 ctx.setPrimitiveData(p,
"vec3",
make_vec3(1, 2, 3));
482 ctx.setPrimitiveData(p,
"vec4",
make_vec4(1, 2, 3, 4));
483 std::vector<uint> uuids = {p};
486 ctx.calculatePrimitiveDataSum(uuids,
"double", d_sum);
487 DOCTEST_CHECK(d_sum == doctest::Approx(2.5));
490 ctx.calculatePrimitiveDataSum(uuids,
"vec2", v2_sum);
491 DOCTEST_CHECK(v2_sum ==
make_vec2(1, 2));
494 ctx.calculatePrimitiveDataSum(uuids,
"vec3", v3_sum);
495 DOCTEST_CHECK(v3_sum ==
make_vec3(1, 2, 3));
498 ctx.calculatePrimitiveDataSum(uuids,
"vec4", v4_sum);
499 DOCTEST_CHECK(v4_sum ==
make_vec4(1, 2, 3, 4));
502 SUBCASE(
"Context::incrementPrimitiveData all types") {
504 uint p = ctx.addPatch();
505 ctx.setPrimitiveData(p,
"uint", (
uint) 1);
506 ctx.setPrimitiveData(p,
"float", 1.f);
507 ctx.setPrimitiveData(p,
"double", 1.0);
508 std::vector<uint> uuids = {p};
510 ctx.incrementPrimitiveData(uuids,
"uint", (
uint) 2);
512 ctx.getPrimitiveData(p,
"uint", u_val);
513 DOCTEST_CHECK(u_val == 3);
515 ctx.incrementPrimitiveData(uuids,
"float", 2.f);
517 ctx.getPrimitiveData(p,
"float", f_val);
518 DOCTEST_CHECK(f_val == doctest::Approx(3.f));
520 ctx.incrementPrimitiveData(uuids,
"double", 2.0);
522 ctx.getPrimitiveData(p,
"double", d_val);
523 DOCTEST_CHECK(d_val == doctest::Approx(3.0));
526 SUBCASE(
"Aggregation and Filtering") {
527 std::vector<uint> agg_uuids;
528 for (
int i = 0; i < 3; ++i) {
529 uint p = ctx.addPatch();
530 ctx.setPrimitiveData(p,
"d1", (
float) i);
531 ctx.setPrimitiveData(p,
"d2", (
float) i * 2.0f);
532 ctx.setPrimitiveData(p,
"d3", (
float) i * 3.0f);
533 ctx.setPrimitiveData(p,
"filter_me", i);
534 agg_uuids.push_back(p);
537 std::vector<std::string> labels = {
"d1",
"d2",
"d3"};
538 ctx.aggregatePrimitiveDataSum(agg_uuids, labels,
"sum_data");
540 ctx.getPrimitiveData(agg_uuids[1],
"sum_data", sum_val);
541 DOCTEST_CHECK(sum_val == doctest::Approx(1.f + 2.f + 3.f));
543 ctx.aggregatePrimitiveDataProduct(agg_uuids, labels,
"prod_data");
545 ctx.getPrimitiveData(agg_uuids[2],
"prod_data", prod_val);
546 DOCTEST_CHECK(prod_val == doctest::Approx(2.f * 4.f * 6.f));
548 std::vector<uint> filtered = ctx.filterPrimitivesByData(agg_uuids,
"filter_me", 1,
">=");
549 DOCTEST_CHECK(filtered.size() == 2);
550 filtered = ctx.filterPrimitivesByData(agg_uuids,
"filter_me", 1,
"==");
551 DOCTEST_CHECK(filtered.size() == 1);
552 DOCTEST_CHECK(filtered[0] == agg_uuids[1]);
555 SUBCASE(
"Context::filterPrimitivesByData all types") {
557 uint p = ctx.addPatch();
558 ctx.setPrimitiveData(p,
"double", 1.0);
559 ctx.setPrimitiveData(p,
"uint", (
uint) 10);
560 std::vector<uint> uuids = {p};
562 auto filtered_d = ctx.filterPrimitivesByData(uuids,
"double", 0.5,
">");
563 DOCTEST_CHECK(filtered_d.size() == 1);
565 auto filtered_u = ctx.filterPrimitivesByData(uuids,
"uint", (
uint) 5,
">");
566 DOCTEST_CHECK(filtered_u.size() == 1);
569 SUBCASE(
"Error Handling") {
570 capture_cerr cerr_buffer;
572 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataType(
"test"));
573 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataSize(bad_uuid,
"test"));
574 DOCTEST_CHECK_THROWS(ctx.doesPrimitiveDataExist(bad_uuid,
"test"));
575 DOCTEST_CHECK_THROWS(ctx.clearPrimitiveData(bad_uuid,
"test"));
576 DOCTEST_CHECK_THROWS(ctx.copyPrimitiveData(p1, bad_uuid));
577 DOCTEST_CHECK_THROWS(ctx.copyPrimitiveData(bad_uuid, p1));
578 DOCTEST_CHECK_THROWS(ctx.renamePrimitiveData(bad_uuid,
"old",
"new"));
579 DOCTEST_CHECK_THROWS(ctx.duplicatePrimitiveData(bad_uuid,
"old",
"new"));
581 std::vector<uint> empty_uuids;
583 ctx.calculatePrimitiveDataMean(empty_uuids,
"non_existent", float_mean);
584 DOCTEST_CHECK(float_mean == 0.f);
585 DOCTEST_CHECK(cerr_buffer.has_output());
587 ctx.setPrimitiveData(p1,
"float_val_err", 1.f);
588 ctx.incrementPrimitiveData(std::vector<uint>{p1},
"float_val_err", 1);
589 DOCTEST_CHECK(cerr_buffer.has_output());
591 std::vector<uint> filtered_UUIDs;
592 DOCTEST_CHECK_THROWS_AS(filtered_UUIDs = ctx.filterPrimitivesByData(uuids,
"filter_me", 1,
"!!"), std::runtime_error);
595 SUBCASE(
"Primitive::getPrimitiveDataSize all types") {
597 uint p = ctx.addPatch();
598 ctx.setPrimitiveData(p,
"uint", (
uint) 1);
599 ctx.setPrimitiveData(p,
"double", 1.0);
600 ctx.setPrimitiveData(p,
"vec2",
make_vec2(1, 1));
601 ctx.setPrimitiveData(p,
"vec3",
make_vec3(1, 1, 1));
602 ctx.setPrimitiveData(p,
"vec4",
make_vec4(1, 1, 1, 1));
603 ctx.setPrimitiveData(p,
"int2",
make_int2(1, 1));
604 ctx.setPrimitiveData(p,
"int3",
make_int3(1, 1, 1));
605 ctx.setPrimitiveData(p,
"int4",
make_int4(1, 1, 1, 1));
606 ctx.setPrimitiveData(p,
"string",
"hello");
608 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"uint") == 1);
609 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"double") == 1);
610 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec2") == 1);
611 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec3") == 1);
612 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec4") == 1);
613 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"int2") == 1);
614 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"int3") == 1);
615 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"int4") == 1);
616 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"string") == 1);
619 SUBCASE(
"Primitive::clearPrimitiveData all types") {
621 uint p = ctx.addPatch();
622 ctx.setPrimitiveData(p,
"uint", (
uint) 1);
623 ctx.setPrimitiveData(p,
"double", 1.0);
624 ctx.setPrimitiveData(p,
"vec2",
make_vec2(1, 1));
625 ctx.setPrimitiveData(p,
"vec3",
make_vec3(1, 1, 1));
626 ctx.setPrimitiveData(p,
"vec4",
make_vec4(1, 1, 1, 1));
627 ctx.setPrimitiveData(p,
"int2",
make_int2(1, 1));
628 ctx.setPrimitiveData(p,
"int3",
make_int3(1, 1, 1));
629 ctx.setPrimitiveData(p,
"int4",
make_int4(1, 1, 1, 1));
630 ctx.setPrimitiveData(p,
"string",
"hello");
632 ctx.clearPrimitiveData(p,
"uint");
633 ctx.clearPrimitiveData(p,
"double");
634 ctx.clearPrimitiveData(p,
"vec2");
635 ctx.clearPrimitiveData(p,
"vec3");
636 ctx.clearPrimitiveData(p,
"vec4");
637 ctx.clearPrimitiveData(p,
"int2");
638 ctx.clearPrimitiveData(p,
"int3");
639 ctx.clearPrimitiveData(p,
"int4");
640 ctx.clearPrimitiveData(p,
"string");
642 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"uint"));
643 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"double"));
644 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"vec2"));
645 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"vec3"));
646 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"vec4"));
647 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"int2"));
648 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"int3"));
649 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"int4"));
650 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p,
"string"));
653 SUBCASE(
"Context data functions with invalid UUID") {
655 capture_cerr cerr_buffer;
657 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataType(
"test"));
658 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataSize(bad_uuid,
"test"));
659 DOCTEST_CHECK_THROWS(ctx.doesPrimitiveDataExist(bad_uuid,
"test"));
660 DOCTEST_CHECK_THROWS(ctx.clearPrimitiveData(bad_uuid,
"test"));
661 DOCTEST_CHECK_THROWS(ctx.copyPrimitiveData(0, bad_uuid));
662 DOCTEST_CHECK_THROWS(ctx.copyPrimitiveData(bad_uuid, 0));
663 DOCTEST_CHECK_THROWS(ctx.renamePrimitiveData(bad_uuid,
"old",
"new"));
664 DOCTEST_CHECK_THROWS(ctx.duplicatePrimitiveData(bad_uuid,
"old",
"new"));
667 SUBCASE(
"Context::clearPrimitiveData for multiple UUIDs") {
669 uint p1 = ctx.addPatch();
670 uint p2 = ctx.addPatch();
671 ctx.setPrimitiveData(p1,
"data", 1);
672 ctx.setPrimitiveData(p2,
"data", 2);
673 std::vector<uint> uuids = {p1, p2};
674 ctx.clearPrimitiveData(uuids,
"data");
675 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p1,
"data"));
676 DOCTEST_CHECK(!ctx.doesPrimitiveDataExist(p2,
"data"));
679 SUBCASE(
"Context::duplicatePrimitiveData all types") {
681 uint p = ctx.addPatch();
682 ctx.setPrimitiveData(p,
"uint", (
uint) 1);
683 ctx.setPrimitiveData(p,
"double", 1.0);
684 ctx.setPrimitiveData(p,
"vec2",
make_vec2(1, 1));
685 ctx.setPrimitiveData(p,
"vec3",
make_vec3(1, 1, 1));
686 ctx.setPrimitiveData(p,
"vec4",
make_vec4(1, 1, 1, 1));
687 ctx.setPrimitiveData(p,
"int2",
make_int2(1, 1));
688 ctx.setPrimitiveData(p,
"int3",
make_int3(1, 1, 1));
689 ctx.setPrimitiveData(p,
"int4",
make_int4(1, 1, 1, 1));
690 ctx.setPrimitiveData(p,
"string",
"hello");
692 ctx.duplicatePrimitiveData(p,
"uint",
"uint_copy");
693 ctx.duplicatePrimitiveData(p,
"double",
"double_copy");
694 ctx.duplicatePrimitiveData(p,
"vec2",
"vec2_copy");
695 ctx.duplicatePrimitiveData(p,
"vec3",
"vec3_copy");
696 ctx.duplicatePrimitiveData(p,
"vec4",
"vec4_copy");
697 ctx.duplicatePrimitiveData(p,
"int2",
"int2_copy");
698 ctx.duplicatePrimitiveData(p,
"int3",
"int3_copy");
699 ctx.duplicatePrimitiveData(p,
"int4",
"int4_copy");
700 ctx.duplicatePrimitiveData(p,
"string",
"string_copy");
702 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"uint_copy"));
703 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"double_copy"));
704 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"vec2_copy"));
705 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"vec3_copy"));
706 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"vec4_copy"));
707 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"int2_copy"));
708 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"int3_copy"));
709 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"int4_copy"));
710 DOCTEST_CHECK(ctx.doesPrimitiveDataExist(p,
"string_copy"));
714 SUBCASE(
"Generic Value-Level Caching System") {
718 std::vector<std::string> test_values;
719 bool threw_error =
false;
721 ctx_test.getUniquePrimitiveDataValues(
"uncached_label", test_values);
722 }
catch (
const std::runtime_error &e) {
724 DOCTEST_CHECK(std::string(e.what()).find(
"Value-level caching is not enabled") != std::string::npos);
726 DOCTEST_CHECK(threw_error);
730 ctx_test.getUniqueObjectDataValues(
"uncached_label", test_values);
731 }
catch (
const std::runtime_error &e) {
733 DOCTEST_CHECK(std::string(e.what()).find(
"Value-level caching is not enabled") != std::string::npos);
735 DOCTEST_CHECK(threw_error);
738 DOCTEST_CHECK(!ctx_test.isPrimitiveDataValueCachingEnabled(
"test_string"));
739 DOCTEST_CHECK(!ctx_test.isObjectDataValueCachingEnabled(
"test_string"));
741 ctx_test.enablePrimitiveDataValueCaching(
"test_string");
742 ctx_test.enablePrimitiveDataValueCaching(
"test_int");
743 ctx_test.enablePrimitiveDataValueCaching(
"test_uint");
744 ctx_test.enableObjectDataValueCaching(
"obj_string");
745 ctx_test.enableObjectDataValueCaching(
"obj_int");
746 ctx_test.enableObjectDataValueCaching(
"obj_uint");
748 DOCTEST_CHECK(ctx_test.isPrimitiveDataValueCachingEnabled(
"test_string"));
749 DOCTEST_CHECK(ctx_test.isPrimitiveDataValueCachingEnabled(
"test_int"));
750 DOCTEST_CHECK(ctx_test.isPrimitiveDataValueCachingEnabled(
"test_uint"));
751 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"obj_string"));
752 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"obj_int"));
753 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"obj_uint"));
763 ctx_test.setPrimitiveData(patch1,
"test_string", std::string(
"apple"));
764 ctx_test.setPrimitiveData(patch2,
"test_string", std::string(
"banana"));
765 ctx_test.setPrimitiveData(patch3,
"test_string", std::string(
"apple"));
767 std::vector<std::string> string_values;
768 ctx_test.getUniquePrimitiveDataValues(
"test_string", string_values);
769 DOCTEST_CHECK(string_values.size() == 2);
770 std::sort(string_values.begin(), string_values.end());
771 DOCTEST_CHECK(string_values[0] ==
"apple");
772 DOCTEST_CHECK(string_values[1] ==
"banana");
775 ctx_test.setPrimitiveData(patch1,
"test_int", 10);
776 ctx_test.setPrimitiveData(patch2,
"test_int", 20);
777 ctx_test.setPrimitiveData(patch3,
"test_int", 10);
779 std::vector<int> int_values;
780 ctx_test.getUniquePrimitiveDataValues(
"test_int", int_values);
781 DOCTEST_CHECK(int_values.size() == 2);
782 std::sort(int_values.begin(), int_values.end());
783 DOCTEST_CHECK(int_values[0] == 10);
784 DOCTEST_CHECK(int_values[1] == 20);
787 ctx_test.setPrimitiveData(patch1,
"test_uint", 100u);
788 ctx_test.setPrimitiveData(patch2,
"test_uint", 200u);
789 ctx_test.setPrimitiveData(patch3,
"test_uint", 100u);
791 std::vector<uint> uint_values;
792 ctx_test.getUniquePrimitiveDataValues(
"test_uint", uint_values);
793 DOCTEST_CHECK(uint_values.size() == 2);
794 std::sort(uint_values.begin(), uint_values.end());
795 DOCTEST_CHECK(uint_values[0] == 100u);
796 DOCTEST_CHECK(uint_values[1] == 200u);
799 ctx_test.setObjectData(obj1,
"obj_string", std::string(
"circle"));
800 ctx_test.setObjectData(obj2,
"obj_string", std::string(
"square"));
802 std::vector<std::string> obj_string_values;
803 ctx_test.getUniqueObjectDataValues(
"obj_string", obj_string_values);
804 DOCTEST_CHECK(obj_string_values.size() == 2);
805 std::sort(obj_string_values.begin(), obj_string_values.end());
806 DOCTEST_CHECK(obj_string_values[0] ==
"circle");
807 DOCTEST_CHECK(obj_string_values[1] ==
"square");
810 ctx_test.setObjectData(obj1,
"obj_int", 5);
811 ctx_test.setObjectData(obj2,
"obj_int", 15);
813 std::vector<int> obj_int_values;
814 ctx_test.getUniqueObjectDataValues(
"obj_int", obj_int_values);
815 DOCTEST_CHECK(obj_int_values.size() == 2);
816 std::sort(obj_int_values.begin(), obj_int_values.end());
817 DOCTEST_CHECK(obj_int_values[0] == 5);
818 DOCTEST_CHECK(obj_int_values[1] == 15);
821 ctx_test.setObjectData(obj1,
"obj_uint", 50u);
822 ctx_test.setObjectData(obj2,
"obj_uint", 150u);
824 std::vector<uint> obj_uint_values;
825 ctx_test.getUniqueObjectDataValues(
"obj_uint", obj_uint_values);
826 DOCTEST_CHECK(obj_uint_values.size() == 2);
827 std::sort(obj_uint_values.begin(), obj_uint_values.end());
828 DOCTEST_CHECK(obj_uint_values[0] == 50u);
829 DOCTEST_CHECK(obj_uint_values[1] == 150u);
832 ctx_test.setPrimitiveData(patch1,
"test_string", std::string(
"cherry"));
833 ctx_test.getUniquePrimitiveDataValues(
"test_string", string_values);
834 DOCTEST_CHECK(string_values.size() == 3);
835 std::sort(string_values.begin(), string_values.end());
836 DOCTEST_CHECK(string_values[0] ==
"apple");
837 DOCTEST_CHECK(string_values[1] ==
"banana");
838 DOCTEST_CHECK(string_values[2] ==
"cherry");
841 ctx_test.clearPrimitiveData(patch2,
"test_string");
842 ctx_test.getUniquePrimitiveDataValues(
"test_string", string_values);
843 DOCTEST_CHECK(string_values.size() == 2);
844 std::sort(string_values.begin(), string_values.end());
845 DOCTEST_CHECK(string_values[0] ==
"apple");
846 DOCTEST_CHECK(string_values[1] ==
"cherry");
848 ctx_test.clearObjectData(obj1,
"obj_string");
849 ctx_test.getUniqueObjectDataValues(
"obj_string", obj_string_values);
850 DOCTEST_CHECK(obj_string_values.size() == 1);
851 DOCTEST_CHECK(obj_string_values[0] ==
"square");
854 ctx_test.disablePrimitiveDataValueCaching(
"test_string");
855 DOCTEST_CHECK(!ctx_test.isPrimitiveDataValueCachingEnabled(
"test_string"));
859 ctx_test.getUniquePrimitiveDataValues(
"test_string", string_values);
860 }
catch (
const std::runtime_error &e) {
863 DOCTEST_CHECK(threw_error);
865 ctx_test.disableObjectDataValueCaching(
"obj_string");
866 DOCTEST_CHECK(!ctx_test.isObjectDataValueCachingEnabled(
"obj_string"));
870 ctx_test.getUniqueObjectDataValues(
"obj_string", obj_string_values);
871 }
catch (
const std::runtime_error &e) {
874 DOCTEST_CHECK(threw_error);
877 ctx_test.enablePrimitiveDataValueCaching(
"empty_label");
878 std::vector<std::string> empty_values;
879 ctx_test.getUniquePrimitiveDataValues(
"empty_label", empty_values);
880 DOCTEST_CHECK(empty_values.empty());
884TEST_CASE(
"Vector setObjectData Value Caching") {
888 ctx_test.enableObjectDataValueCaching(
"vec_string");
889 ctx_test.enableObjectDataValueCaching(
"vec_int");
890 ctx_test.enableObjectDataValueCaching(
"vec_uint");
892 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"vec_string"));
893 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"vec_int"));
894 DOCTEST_CHECK(ctx_test.isObjectDataValueCachingEnabled(
"vec_uint"));
899 uint obj3 = ctx_test.addSphereObject(1,
make_vec3(2, 0, 0), 1.0f);
902 SUBCASE(
"Vector<uint> string caching") {
904 std::vector<uint> obj_vec = {obj1, obj2};
905 ctx_test.setObjectData(obj_vec,
"vec_string", std::string(
"apple"));
908 ctx_test.setObjectData(obj3,
"vec_string", std::string(
"banana"));
910 std::vector<std::string> string_values;
911 ctx_test.getUniqueObjectDataValues(
"vec_string", string_values);
912 DOCTEST_CHECK(string_values.size() == 2);
913 std::sort(string_values.begin(), string_values.end());
914 DOCTEST_CHECK(string_values[0] ==
"apple");
915 DOCTEST_CHECK(string_values[1] ==
"banana");
918 SUBCASE(
"Vector<uint> int caching") {
920 std::vector<uint> obj_vec = {obj1, obj2, obj3};
921 ctx_test.setObjectData(obj_vec,
"vec_int", 100);
924 ctx_test.setObjectData(obj4,
"vec_int", 200);
926 std::vector<int> int_values;
927 ctx_test.getUniqueObjectDataValues(
"vec_int", int_values);
928 DOCTEST_CHECK(int_values.size() == 2);
929 std::sort(int_values.begin(), int_values.end());
930 DOCTEST_CHECK(int_values[0] == 100);
931 DOCTEST_CHECK(int_values[1] == 200);
934 SUBCASE(
"Vector<uint> uint caching") {
936 std::vector<uint> obj_vec = {obj1, obj2};
937 ctx_test.setObjectData(obj_vec,
"vec_uint", 50u);
940 std::vector<uint> obj_vec2 = {obj3};
941 ctx_test.setObjectData(obj_vec2,
"vec_uint", 50u);
944 ctx_test.setObjectData(obj4,
"vec_uint", 150u);
946 std::vector<uint> uint_values;
947 ctx_test.getUniqueObjectDataValues(
"vec_uint", uint_values);
948 DOCTEST_CHECK(uint_values.size() == 2);
949 std::sort(uint_values.begin(), uint_values.end());
950 DOCTEST_CHECK(uint_values[0] == 50u);
951 DOCTEST_CHECK(uint_values[1] == 150u);
954 SUBCASE(
"Vector<vector<uint>> caching") {
956 std::vector<std::vector<uint>> nested_vec = {{obj1, obj2}, {obj3}};
957 ctx_test.setObjectData(nested_vec,
"vec_string", std::string(
"cherry"));
960 ctx_test.setObjectData(obj4,
"vec_string", std::string(
"date"));
962 std::vector<std::string> string_values;
963 ctx_test.getUniqueObjectDataValues(
"vec_string", string_values);
964 DOCTEST_CHECK(string_values.size() == 2);
965 std::sort(string_values.begin(), string_values.end());
966 DOCTEST_CHECK(string_values[0] ==
"cherry");
967 DOCTEST_CHECK(string_values[1] ==
"date");
970 SUBCASE(
"Vector<vector<vector<uint>>> caching") {
972 std::vector<std::vector<std::vector<uint>>> triple_vec = {{{obj1}, {obj2}}, {{obj3}}};
973 ctx_test.setObjectData(triple_vec,
"vec_int", 300);
976 ctx_test.setObjectData(obj4,
"vec_int", 400);
978 std::vector<int> int_values;
979 ctx_test.getUniqueObjectDataValues(
"vec_int", int_values);
980 DOCTEST_CHECK(int_values.size() == 2);
981 std::sort(int_values.begin(), int_values.end());
982 DOCTEST_CHECK(int_values[0] == 300);
983 DOCTEST_CHECK(int_values[1] == 400);
986 SUBCASE(
"Vector cache update behavior") {
988 std::vector<uint> obj_vec = {obj1, obj2};
991 ctx_test.setObjectData(obj_vec,
"vec_string", std::string(
"old_value"));
992 ctx_test.setObjectData(obj3,
"vec_string", std::string(
"other_value"));
995 std::vector<std::string> string_values;
996 ctx_test.getUniqueObjectDataValues(
"vec_string", string_values);
997 DOCTEST_CHECK(string_values.size() == 2);
1000 ctx_test.setObjectData(obj_vec,
"vec_string", std::string(
"new_value"));
1003 ctx_test.getUniqueObjectDataValues(
"vec_string", string_values);
1004 DOCTEST_CHECK(string_values.size() == 2);
1005 std::sort(string_values.begin(), string_values.end());
1006 DOCTEST_CHECK(string_values[0] ==
"new_value");
1007 DOCTEST_CHECK(string_values[1] ==
"other_value");
1010 SUBCASE(
"Mixed single and vector operations") {
1012 ctx_test.setObjectData(obj1,
"vec_int", 10);
1014 std::vector<uint> obj_vec = {obj2, obj3};
1015 ctx_test.setObjectData(obj_vec,
"vec_int", 10);
1017 ctx_test.setObjectData(obj4,
"vec_int", 20);
1019 std::vector<int> int_values;
1020 ctx_test.getUniqueObjectDataValues(
"vec_int", int_values);
1021 DOCTEST_CHECK(int_values.size() == 2);
1022 std::sort(int_values.begin(), int_values.end());
1023 DOCTEST_CHECK(int_values[0] == 10);
1024 DOCTEST_CHECK(int_values[1] == 20);
1028TEST_CASE(
"Object Data Filtering") {
1034 SUBCASE(
"filterObjectsByData for all types") {
1036 ctx.setObjectData(o1,
"float_val", 1.5f);
1037 ctx.setObjectData(o2,
"float_val", 2.5f);
1038 ctx.setObjectData(o3,
"float_val", 0.5f);
1040 ctx.setObjectData(o1,
"double_val", 1.5);
1041 ctx.setObjectData(o2,
"double_val", 2.5);
1042 ctx.setObjectData(o3,
"double_val", 0.5);
1044 ctx.setObjectData(o1,
"int_val", 1);
1045 ctx.setObjectData(o2,
"int_val", 2);
1046 ctx.setObjectData(o3,
"int_val", 0);
1048 ctx.setObjectData(o1,
"uint_val", (
uint) 1);
1049 ctx.setObjectData(o2,
"uint_val", (
uint) 2);
1050 ctx.setObjectData(o3,
"uint_val", (
uint) 0);
1052 ctx.setObjectData(o1,
"string_val", std::string(
"apple"));
1053 ctx.setObjectData(o2,
"string_val", std::string(
"banana"));
1054 ctx.setObjectData(o3,
"string_val", std::string(
"cherry"));
1056 std::vector<uint> all_objects = {o1, o2, o3};
1059 auto filtered_f = ctx.filterObjectsByData(all_objects, std::string(
"float_val"), 1.0f, std::string(
">"));
1060 DOCTEST_CHECK(filtered_f.size() == 2);
1061 DOCTEST_CHECK(std::find(filtered_f.begin(), filtered_f.end(), o1) != filtered_f.end());
1062 DOCTEST_CHECK(std::find(filtered_f.begin(), filtered_f.end(), o2) != filtered_f.end());
1064 filtered_f = ctx.filterObjectsByData(all_objects, std::string(
"float_val"), 2.5f, std::string(
"=="));
1065 DOCTEST_CHECK(filtered_f.size() == 1);
1066 DOCTEST_CHECK(filtered_f[0] == o2);
1069 auto filtered_d = ctx.filterObjectsByData(all_objects, std::string(
"double_val"), 1.0, std::string(
">="));
1070 DOCTEST_CHECK(filtered_d.size() == 2);
1073 auto filtered_i = ctx.filterObjectsByData(all_objects, std::string(
"int_val"), 1, std::string(
"<"));
1074 DOCTEST_CHECK(filtered_i.size() == 1);
1075 DOCTEST_CHECK(filtered_i[0] == o3);
1078 auto filtered_u = ctx.filterObjectsByData(all_objects, std::string(
"uint_val"), (
uint) 0, std::string(
">"));
1079 DOCTEST_CHECK(filtered_u.size() == 2);
1085 SUBCASE(
"filterObjectsByData error handling") {
1086 std::vector<uint> objects = {o1};
1087 capture_cerr cerr_buffer;
1090 std::vector<uint> filtered_f;
1091 DOCTEST_CHECK_THROWS_AS(filtered_f = ctx.filterObjectsByData(objects, std::string(
"non_existent"), 1.0f, std::string(
"!!")), std::runtime_error);
1094 auto empty_result = ctx.filterObjectsByData(objects, std::string(
"non_existent"), 1.0f, std::string(
">"));
1095 DOCTEST_CHECK(empty_result.empty());
1099TEST_CASE(
"Surface Area Calculations") {
1102 SUBCASE(
"sumPrimitiveSurfaceArea") {
1107 std::vector<uint> patches = {p1, p2};
1108 std::vector<uint> triangles = {t1};
1109 std::vector<uint> all_prims = {p1, p2, t1};
1111 float patch_area = ctx.sumPrimitiveSurfaceArea(patches);
1112 DOCTEST_CHECK(patch_area == doctest::Approx(10.0f));
1114 float triangle_area = ctx.sumPrimitiveSurfaceArea(triangles);
1115 DOCTEST_CHECK(triangle_area == doctest::Approx(2.0f));
1117 float total_area = ctx.sumPrimitiveSurfaceArea(all_prims);
1118 DOCTEST_CHECK(total_area == doctest::Approx(12.0f));
1121 std::vector<uint> empty_list;
1122 float zero_area = ctx.sumPrimitiveSurfaceArea(empty_list);
1123 DOCTEST_CHECK(zero_area == doctest::Approx(0.0f));
1127TEST_CASE(
"Advanced Area-Weighted Calculations") {
1130 SUBCASE(
"calculatePrimitiveDataAreaWeightedMean comprehensive") {
1137 ctx.setPrimitiveData(p1,
"double_val", 10.0);
1138 ctx.setPrimitiveData(p2,
"double_val", 20.0);
1139 ctx.setPrimitiveData(p3,
"double_val", 30.0);
1141 ctx.setPrimitiveData(p1,
"vec2_val",
make_vec2(1, 2));
1142 ctx.setPrimitiveData(p2,
"vec2_val",
make_vec2(3, 4));
1143 ctx.setPrimitiveData(p3,
"vec2_val",
make_vec2(5, 6));
1145 ctx.setPrimitiveData(p1,
"vec3_val",
make_vec3(1, 2, 3));
1146 ctx.setPrimitiveData(p2,
"vec3_val",
make_vec3(4, 5, 6));
1147 ctx.setPrimitiveData(p3,
"vec3_val",
make_vec3(7, 8, 9));
1149 ctx.setPrimitiveData(p1,
"vec4_val",
make_vec4(1, 2, 3, 4));
1150 ctx.setPrimitiveData(p2,
"vec4_val",
make_vec4(5, 6, 7, 8));
1151 ctx.setPrimitiveData(p3,
"vec4_val",
make_vec4(9, 10, 11, 12));
1153 std::vector<uint> uuids = {p1, p2, p3};
1158 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"double_val", d_mean);
1159 DOCTEST_CHECK(d_mean == doctest::Approx(22.5));
1165 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec2_val", v2_mean);
1166 DOCTEST_CHECK(v2_mean.x == doctest::Approx(3.5f));
1167 DOCTEST_CHECK(v2_mean.y == doctest::Approx(4.5f));
1171 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec3_val", v3_mean);
1172 DOCTEST_CHECK(v3_mean.x == doctest::Approx(4.75f));
1173 DOCTEST_CHECK(v3_mean.y == doctest::Approx(5.75f));
1174 DOCTEST_CHECK(v3_mean.z == doctest::Approx(6.75f));
1178 ctx.calculatePrimitiveDataAreaWeightedMean(uuids,
"vec4_val", v4_mean);
1179 DOCTEST_CHECK(v4_mean.x == doctest::Approx(6.0f));
1180 DOCTEST_CHECK(v4_mean.y == doctest::Approx(7.0f));
1181 DOCTEST_CHECK(v4_mean.z == doctest::Approx(8.0f));
1182 DOCTEST_CHECK(v4_mean.w == doctest::Approx(9.0f));
1185 SUBCASE(
"calculatePrimitiveDataAreaWeightedSum comprehensive") {
1189 ctx.setPrimitiveData(p1,
"double_val", 5.0);
1190 ctx.setPrimitiveData(p2,
"double_val", 10.0);
1192 ctx.setPrimitiveData(p1,
"vec2_val",
make_vec2(1, 2));
1193 ctx.setPrimitiveData(p2,
"vec2_val",
make_vec2(3, 4));
1195 ctx.setPrimitiveData(p1,
"vec3_val",
make_vec3(1, 2, 3));
1196 ctx.setPrimitiveData(p2,
"vec3_val",
make_vec3(4, 5, 6));
1198 ctx.setPrimitiveData(p1,
"vec4_val",
make_vec4(1, 2, 3, 4));
1199 ctx.setPrimitiveData(p2,
"vec4_val",
make_vec4(5, 6, 7, 8));
1201 std::vector<uint> uuids = {p1, p2};
1205 ctx.calculatePrimitiveDataAreaWeightedSum(uuids,
"double_val", d_sum);
1206 DOCTEST_CHECK(d_sum == doctest::Approx(40.0));
1210 ctx.calculatePrimitiveDataAreaWeightedSum(uuids,
"vec2_val", v2_sum);
1211 DOCTEST_CHECK(v2_sum.x == doctest::Approx(11.0f));
1212 DOCTEST_CHECK(v2_sum.y == doctest::Approx(16.0f));
1216 ctx.calculatePrimitiveDataAreaWeightedSum(uuids,
"vec3_val", v3_sum);
1217 DOCTEST_CHECK(v3_sum.x == doctest::Approx(14.0f));
1218 DOCTEST_CHECK(v3_sum.y == doctest::Approx(19.0f));
1219 DOCTEST_CHECK(v3_sum.z == doctest::Approx(24.0f));
1223 ctx.calculatePrimitiveDataAreaWeightedSum(uuids,
"vec4_val", v4_sum);
1224 DOCTEST_CHECK(v4_sum.x == doctest::Approx(17.0f));
1225 DOCTEST_CHECK(v4_sum.y == doctest::Approx(22.0f));
1226 DOCTEST_CHECK(v4_sum.z == doctest::Approx(27.0f));
1227 DOCTEST_CHECK(v4_sum.w == doctest::Approx(32.0f));
1231TEST_CASE(
"Global Data Scaling") {
1234 SUBCASE(
"scalePrimitiveData with label") {
1235 uint p1 = ctx.addPatch();
1236 uint p2 = ctx.addPatch();
1237 uint p3 = ctx.addPatch();
1240 ctx.setPrimitiveData(p1,
"scale_me", 10.0f);
1241 ctx.setPrimitiveData(p2,
"scale_me", 20.0f);
1242 ctx.setPrimitiveData(p3,
"other_data", 5.0f);
1245 capture_cerr cerr_buffer;
1246 ctx.scalePrimitiveData(
"scale_me", 2.0f);
1249 float val1, val2, val3;
1250 ctx.getPrimitiveData(p1,
"scale_me", val1);
1251 ctx.getPrimitiveData(p2,
"scale_me", val2);
1252 ctx.getPrimitiveData(p3,
"other_data", val3);
1254 DOCTEST_CHECK(val1 == doctest::Approx(20.0f));
1255 DOCTEST_CHECK(val2 == doctest::Approx(40.0f));
1256 DOCTEST_CHECK(val3 == doctest::Approx(5.0f));
1259 ctx.scalePrimitiveData(
"non_existent", 3.0f);
1260 DOCTEST_CHECK(cerr_buffer.has_output());
1264TEST_CASE(
"Aggregate Function Edge Cases") {
1267 SUBCASE(
"aggregatePrimitiveDataProduct edge cases") {
1268 uint p1 = ctx.addPatch();
1269 uint p2 = ctx.addPatch();
1270 uint p3 = ctx.addPatch();
1273 ctx.setPrimitiveData(p1,
"zero_test", 0.0f);
1274 ctx.setPrimitiveData(p1,
"normal", 5.0f);
1275 ctx.setPrimitiveData(p2,
"zero_test", 10.0f);
1276 ctx.setPrimitiveData(p2,
"normal", 2.0f);
1278 std::vector<uint> uuids = {p1, p2};
1279 std::vector<std::string> labels = {
"zero_test",
"normal"};
1281 ctx.aggregatePrimitiveDataProduct(uuids, labels,
"product_result");
1284 ctx.getPrimitiveData(p1,
"product_result", result);
1285 DOCTEST_CHECK(result == doctest::Approx(0.0f));
1287 ctx.getPrimitiveData(p2,
"product_result", result);
1288 DOCTEST_CHECK(result == doctest::Approx(20.0f));
1291 ctx.setPrimitiveData(p1,
"neg1", -2.0f);
1292 ctx.setPrimitiveData(p1,
"neg2", -3.0f);
1293 ctx.setPrimitiveData(p2,
"neg1", 4.0f);
1294 ctx.setPrimitiveData(p2,
"neg2", -1.0f);
1296 std::vector<std::string> neg_labels = {
"neg1",
"neg2"};
1297 ctx.aggregatePrimitiveDataProduct(uuids, neg_labels,
"neg_product");
1299 ctx.getPrimitiveData(p1,
"neg_product", result);
1300 DOCTEST_CHECK(result == doctest::Approx(6.0f));
1302 ctx.getPrimitiveData(p2,
"neg_product", result);
1303 DOCTEST_CHECK(result == doctest::Approx(-4.0f));
1307TEST_CASE(
"Data Type Coverage Extensions") {
1310 SUBCASE(
"Primitive data with int2, int3, int4 vectors") {
1311 uint p = ctx.addPatch();
1318 ctx.setPrimitiveData(p,
"vec_int2", v_i2);
1319 ctx.setPrimitiveData(p,
"vec_int3", v_i3);
1320 ctx.setPrimitiveData(p,
"vec_int4", v_i4);
1322 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"vec_int2") == HELIOS_TYPE_INT2);
1323 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"vec_int3") == HELIOS_TYPE_INT3);
1324 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"vec_int4") == HELIOS_TYPE_INT4);
1326 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec_int2") == 2);
1327 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec_int3") == 2);
1328 DOCTEST_CHECK(ctx.getPrimitiveDataSize(p,
"vec_int4") == 2);
1331 std::vector<int2> r_i2;
1332 std::vector<int3> r_i3;
1333 std::vector<int4> r_i4;
1335 ctx.getPrimitiveData(p,
"vec_int2", r_i2);
1336 ctx.getPrimitiveData(p,
"vec_int3", r_i3);
1337 ctx.getPrimitiveData(p,
"vec_int4", r_i4);
1339 DOCTEST_CHECK(r_i2 == v_i2);
1340 DOCTEST_CHECK(r_i3 == v_i3);
1341 DOCTEST_CHECK(r_i4 == v_i4);
1345TEST_CASE(
"Error Handling Edge Cases") {
1348 SUBCASE(
"Data operations with mixed primitive types") {
1349 uint patch = ctx.addPatch();
1354 ctx.setPrimitiveData(patch,
"mixed_data", 1.0f);
1355 ctx.setPrimitiveData(triangle,
"mixed_data", 2.0f);
1356 ctx.setPrimitiveData(voxel,
"mixed_data", 3.0f);
1358 std::vector<uint> mixed_prims = {patch, triangle, voxel};
1362 ctx.calculatePrimitiveDataMean(mixed_prims,
"mixed_data", mean_val);
1363 DOCTEST_CHECK(mean_val == doctest::Approx(2.0f));
1366 ctx.calculatePrimitiveDataSum(mixed_prims,
"mixed_data", sum_val);
1367 DOCTEST_CHECK(sum_val == doctest::Approx(6.0f));
1370 SUBCASE(
"Large dataset stress test") {
1371 std::vector<uint> large_dataset;
1374 for (
int i = 0; i < 1000; ++i) {
1375 uint p = ctx.addPatch();
1376 ctx.setPrimitiveData(p,
"stress_data", (
float) i);
1377 large_dataset.push_back(p);
1381 float mean_val, sum_val;
1382 ctx.calculatePrimitiveDataMean(large_dataset,
"stress_data", mean_val);
1383 ctx.calculatePrimitiveDataSum(large_dataset,
"stress_data", sum_val);
1385 DOCTEST_CHECK(mean_val == doctest::Approx(499.5f));
1386 DOCTEST_CHECK(sum_val == doctest::Approx(499500.0f));
1389 auto filtered = ctx.filterPrimitivesByData(large_dataset,
"stress_data", 500.0f,
">");
1390 DOCTEST_CHECK(filtered.size() == 499);
1394TEST_CASE(
"General Error Handling") {
1397 capture_cerr cerr_buffer;
1400 DOCTEST_CHECK_THROWS_AS(center = ctx.getPatchCenter(tri), std::runtime_error);
1404 std::vector<uint> vlist{vox};
1405 DOCTEST_CHECK_THROWS_AS(ctx.rotatePrimitive(vlist,
PI_F / 4.f,
"a"), std::runtime_error);
1408TEST_CASE(
"Data Type Consistency and Caching") {
1411 SUBCASE(
"Primitive data type caching") {
1413 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataType(
"test_label"));
1420 ctx.setPrimitiveData(patch1,
"temperature", 25.5f);
1421 ctx.setPrimitiveData(patch2,
"temperature", 30.2f);
1424 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"temperature") == HELIOS_TYPE_FLOAT);
1427 ctx.setPrimitiveData(patch1,
"leaf_id", 123);
1428 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"leaf_id") == HELIOS_TYPE_INT);
1431 DOCTEST_CHECK_THROWS(ctx.getPrimitiveDataType(
"nonexistent"));
1434 SUBCASE(
"Object data type caching") {
1436 DOCTEST_CHECK_THROWS(ctx.getObjectDataType(
"test_obj_label"));
1443 ctx.setObjectData(box1,
"volume", 1.0);
1444 ctx.setObjectData(box2,
"volume", 2.5);
1447 DOCTEST_CHECK(ctx.getObjectDataType(
"volume") == HELIOS_TYPE_DOUBLE);
1450 ctx.setObjectData(box1,
"material_id",
static_cast<uint>(42));
1451 DOCTEST_CHECK(ctx.getObjectDataType(
"material_id") == HELIOS_TYPE_UINT);
1454 DOCTEST_CHECK_THROWS(ctx.getObjectDataType(
"nonexistent"));
1457 SUBCASE(
"Type consistency enforcement - compatible numeric casting") {
1461 ctx.setPrimitiveData(patch,
"value", 10.5f);
1462 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"value") == HELIOS_TYPE_FLOAT);
1468 capture_cerr cerr_buffer;
1469 ctx.setPrimitiveData(patch2,
"value", 20);
1473 ctx.getPrimitiveData(patch,
"value", val1);
1474 ctx.getPrimitiveData(patch2,
"value", val2);
1475 DOCTEST_CHECK(val1 == doctest::Approx(10.5f));
1476 DOCTEST_CHECK(val2 == doctest::Approx(20.0f));
1479 DOCTEST_CHECK(cerr_buffer.get_captured_output().find(
"WARNING") != std::string::npos);
1480 DOCTEST_CHECK(cerr_buffer.get_captured_output().find(
"Type casting") != std::string::npos);
1483 SUBCASE(
"Type consistency enforcement - incompatible types") {
1487 ctx.setObjectData(box,
"material", std::string(
"wood"));
1488 DOCTEST_CHECK(ctx.getObjectDataType(
"material") == HELIOS_TYPE_STRING);
1494 DOCTEST_CHECK_THROWS_AS(ctx.setObjectData(box2,
"material", 3.14f), std::runtime_error);
1497 SUBCASE(
"Multiple data labels per primitive/object") {
1501 ctx.setPrimitiveData(tri,
"temperature", 25.0f);
1502 ctx.setPrimitiveData(tri,
"id", 100);
1503 ctx.setPrimitiveData(tri,
"name", std::string(
"leaf1"));
1504 ctx.setPrimitiveData(tri,
"position",
make_vec3(0.5f, 0.5f, 0.0f));
1507 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"temperature") == HELIOS_TYPE_FLOAT);
1508 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"id") == HELIOS_TYPE_INT);
1509 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"name") == HELIOS_TYPE_STRING);
1510 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"position") == HELIOS_TYPE_VEC3);
1514 ctx.setPrimitiveData(tri2,
"temperature", 30.0f);
1515 ctx.setPrimitiveData(tri2,
"id", 101);
1516 ctx.setPrimitiveData(tri2,
"name", std::string(
"leaf2"));
1517 ctx.setPrimitiveData(tri2,
"position",
make_vec3(1.5f, 0.5f, 0.0f));
1525 ctx.getPrimitiveData(tri2,
"temperature", temp);
1526 ctx.getPrimitiveData(tri2,
"id",
id);
1527 ctx.getPrimitiveData(tri2,
"name", name);
1528 ctx.getPrimitiveData(tri2,
"position", pos);
1530 DOCTEST_CHECK(temp == doctest::Approx(30.0f));
1531 DOCTEST_CHECK(
id == 101);
1532 DOCTEST_CHECK(name ==
"leaf2");
1533 DOCTEST_CHECK(pos.x == doctest::Approx(1.5f));
1536 SUBCASE(
"Cross-contamination prevention") {
1539 uint sphere = ctx.addSphereObject(10,
make_vec3(0, 0, 0), 1.0f);
1542 ctx.setPrimitiveData(patch,
"value", 42);
1543 ctx.setObjectData(sphere,
"value", 3.14f);
1546 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"value") == HELIOS_TYPE_INT);
1547 DOCTEST_CHECK(ctx.getObjectDataType(
"value") == HELIOS_TYPE_FLOAT);
1550 SUBCASE(
"Vector data type consistency") {
1555 std::vector<float> temps1 = {20.0f, 25.0f, 30.0f};
1556 std::vector<float> temps2 = {22.0f, 27.0f, 32.0f};
1558 ctx.setPrimitiveData(vox1,
"temperature_profile", temps1);
1559 ctx.setPrimitiveData(vox2,
"temperature_profile", temps2);
1562 DOCTEST_CHECK(ctx.getPrimitiveDataType(
"temperature_profile") == HELIOS_TYPE_FLOAT);