1.3.49
 
Loading...
Searching...
No Matches
selfTest.cpp
1#include "Visualizer.h"
2
3#define DOCTEST_CONFIG_IMPLEMENT
4#include "doctest.h"
5#include "doctest_utils.h"
6
7using namespace helios;
8
9TEST_CASE("Visualizer::disableMessages") {
10 Visualizer visualizer(1000, 800, 16, false, true);
11
12 DOCTEST_CHECK_NOTHROW(visualizer.disableMessages());
13
14 capture_cerr cerr_buffer;
15 visualizer.setColorbarRange(20, 10);
16
17 DOCTEST_CHECK(!cerr_buffer.has_output());
18}
19
20TEST_CASE("Visualizer::enableMessages") {
21 Visualizer visualizer(1000, 800, 16, true, true);
22
23 DOCTEST_CHECK_NOTHROW(visualizer.enableMessages());
24
25 capture_cerr cerr_buffer;
26 visualizer.setColorbarRange(20, 10);
27
28 DOCTEST_CHECK(cerr_buffer.has_output());
29}
30
31TEST_CASE("Visualizer::setCameraPosition") {
32 Visualizer visualizer(1000, 800, 16, true, true);
33 helios::vec3 initial_position = make_vec3(1, 1, 1);
34 helios::vec3 initial_lookat = make_vec3(0, 0, 0);
35 visualizer.setCameraPosition(initial_position, initial_lookat);
36
37 // Verify that the transformation matrix updates correctly
38 std::vector<helios::vec3> positions = visualizer.getCameraPosition();
39 DOCTEST_CHECK(positions.size() == 2);
40 DOCTEST_CHECK(positions.at(1) == initial_position);
41 DOCTEST_CHECK(positions.at(0) == initial_lookat);
42}
43
44TEST_CASE("Visualizer::setLightingModel") {
45 Visualizer visualizer(1000, 800, 16, true, true);
46
47 DOCTEST_CHECK_NOTHROW(visualizer.setLightingModel(Visualizer::LIGHTING_NONE));
48 DOCTEST_CHECK_NOTHROW(visualizer.setLightingModel(Visualizer::LIGHTING_PHONG));
49 DOCTEST_CHECK_NOTHROW(visualizer.setLightingModel(Visualizer::LIGHTING_PHONG_SHADOWED));
50}
51
52TEST_CASE("Visualizer::setBackgroundColor and Visualizer::getBackgroundColor") {
53 Visualizer visualizer(1000, 800, 16, true, true);
54 helios::RGBcolor bgcolor = RGB::white;
55 visualizer.setBackgroundColor(bgcolor);
56 DOCTEST_CHECK(visualizer.getBackgroundColor() == bgcolor);
57}
58
59TEST_CASE("Visualizer::setLightIntensityFactor") {
60 Visualizer visualizer(1000, 800, 16, true, true);
61 DOCTEST_CHECK_NOTHROW(visualizer.setLightIntensityFactor(0.75f));
62}
63
64TEST_CASE("Visualizer::enableColorbar and Visualizer::disableColorbar") {
65 Visualizer visualizer(1000, 800, 16, true, true);
66 DOCTEST_CHECK_NOTHROW(visualizer.enableColorbar());
67 DOCTEST_CHECK_NOTHROW(visualizer.disableColorbar());
68}
69
70TEST_CASE("Visualizer::setColorbarPosition") {
71 Visualizer visualizer(1000, 800, 16, true, true);
72 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarPosition(make_vec3(0.5f, 0.5f, 0.f)));
73 capture_cerr cerr_buffer;
74 DOCTEST_CHECK_THROWS_AS(visualizer.setColorbarPosition(make_vec3(-0.1f, 0.f, 0.f)), std::runtime_error);
75}
76
77TEST_CASE("Visualizer::setColorbarSize") {
78 Visualizer visualizer(1000, 800, 16, true, true);
79 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarSize(make_vec2(0.1f, 0.05f)));
80 capture_cerr cerr_buffer;
81 DOCTEST_CHECK_THROWS_AS(visualizer.setColorbarSize(make_vec2(1.5f, 0.f)), std::runtime_error);
82}
83
84TEST_CASE("Visualizer::setColorbarRange") {
85 Visualizer visualizer(1000, 800, 16, true, true);
86 visualizer.enableMessages();
87 visualizer.setColorbarRange(0.f, 1.f);
88 capture_cerr cerr_buffer;
89 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarRange(20.f, 10.f));
90 DOCTEST_CHECK(cerr_buffer.has_output());
91}
92
93TEST_CASE("Visualizer::setColorbarTicks") {
94 Visualizer visualizer(1000, 800, 16, true, true);
95 visualizer.setColorbarRange(0.f, 1.f);
96 std::vector<float> ticks{0.f, 0.5f, 1.f};
97 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarTicks(ticks));
98 capture_cerr cerr_buffer;
99 DOCTEST_CHECK_THROWS_AS(visualizer.setColorbarTicks({}), std::runtime_error);
100 DOCTEST_CHECK_THROWS_AS(visualizer.setColorbarTicks({0.f, 0.5f, 0.4f}), std::runtime_error);
101}
102
103TEST_CASE("Visualizer colorbar text attributes") {
104 Visualizer visualizer(1000, 800, 16, true, true);
105 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarTitle("MyBar"));
106 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarFontColor(RGB::yellow));
107 DOCTEST_CHECK_NOTHROW(visualizer.setColorbarFontSize(14));
108 capture_cerr cerr_buffer;
109 DOCTEST_CHECK_THROWS_AS(visualizer.setColorbarFontSize(0), std::runtime_error);
110}
111
112TEST_CASE("Visualizer::setColormap") {
113 Visualizer visualizer(1000, 800, 16, true, true);
114 DOCTEST_CHECK_NOTHROW(visualizer.setColormap(Visualizer::COLORMAP_COOL));
115 capture_cerr cerr_buffer;
116 DOCTEST_CHECK_THROWS_AS(visualizer.setColormap(Visualizer::COLORMAP_CUSTOM), std::runtime_error);
117 DOCTEST_CHECK_THROWS_AS(visualizer.setColormap(std::vector<RGBcolor>{RGB::red}, std::vector<float>{0.f, 1.f}), std::runtime_error);
118}
119
120TEST_CASE("Visualizer::PNG texture integration via primitives") {
121 Visualizer visualizer(1000, 800, 16, true, true);
122 const char *png_filename = "plugins/visualizer/textures/AlmondLeaf.png";
123
124 // Verify file exists before testing
125 DOCTEST_CHECK(std::filesystem::exists(png_filename));
126
127 // Test PNG texture loading through textured rectangle - internally calls read_png_file -> helios::readPNG
128 std::vector<helios::vec3> verts = {make_vec3(0, 0, 0), make_vec3(1, 0, 0), make_vec3(1, 1, 0), make_vec3(0, 1, 0)};
129 size_t UUID1;
130 DOCTEST_CHECK_NOTHROW(UUID1 = visualizer.addRectangleByVertices(verts, png_filename, Visualizer::COORDINATES_CARTESIAN));
131 DOCTEST_CHECK(UUID1 != 0);
132
133 // Test PNG texture loading through textured triangle
134 size_t UUID2;
135 DOCTEST_CHECK_NOTHROW(UUID2 = visualizer.addTriangle(make_vec3(0, 0, 0), make_vec3(1, 0, 0), make_vec3(0, 1, 0), png_filename, make_vec2(0, 0), make_vec2(1, 0), make_vec2(0, 1), Visualizer::COORDINATES_CARTESIAN));
136 DOCTEST_CHECK(UUID2 != 0);
137 DOCTEST_CHECK(UUID2 != UUID1); // Should be different primitives
138}
139
140TEST_CASE("Visualizer::JPEG texture integration via primitives") {
141 Visualizer visualizer(1000, 800, 16, true, true);
142 const char *jpeg_filename = "plugins/visualizer/textures/SkyDome_clouds.jpg";
143
144 // Verify file exists before testing
145 DOCTEST_CHECK(std::filesystem::exists(jpeg_filename));
146
147 // Test JPEG texture loading through sky dome - internally calls read_JPEG_file -> helios::readJPEG
148 uint N = 3;
149 std::vector<size_t> UUIDs;
150 DOCTEST_CHECK_NOTHROW(UUIDs = visualizer.addSkyDomeByCenter(5.0f, make_vec3(0, 0, 0), N, jpeg_filename));
151 DOCTEST_CHECK(UUIDs.size() == (N - 1) * (2 * (N - 1) + 1));
152
153 // Test JPEG texture on rectangle using addRectangleByVertices which accepts texture files
154 std::vector<helios::vec3> verts = {make_vec3(1, 1, 1), make_vec3(3, 1, 1), make_vec3(3, 3, 1), make_vec3(1, 3, 1)};
155 size_t rect_UUID;
156 DOCTEST_CHECK_NOTHROW(rect_UUID = visualizer.addRectangleByVertices(verts, jpeg_filename, Visualizer::COORDINATES_CARTESIAN));
157 DOCTEST_CHECK(rect_UUID != 0);
158}
159
160TEST_CASE("Visualizer::Visualizer") {
161 DOCTEST_CHECK_NOTHROW(Visualizer v1(800, 600, true));
162 DOCTEST_CHECK_NOTHROW(Visualizer v2(1024, 768, 4, false, true));
163 DOCTEST_CHECK_NOTHROW(Visualizer v3(1280, 720, 8, false, true));
164}
165
166TEST_CASE("Visualizer texture copy") {
167 DOCTEST_CHECK(std::filesystem::exists("plugins/visualizer/textures/AlmondLeaf.png"));
168 DOCTEST_CHECK(std::filesystem::exists("plugins/visualizer/textures/Helios_watermark.png"));
169 DOCTEST_CHECK(std::filesystem::exists("plugins/visualizer/textures/SkyDome_clouds.jpg"));
170}
171
172TEST_CASE("Visualizer::addRectangleByCenter") {
173 Visualizer visualizer(1000, 800, 16, true, true);
174 size_t UUID;
175 DOCTEST_CHECK_NOTHROW(UUID = visualizer.addRectangleByCenter(make_vec3(0, 0, 0), make_vec2(1, 1), make_SphericalCoord(0, 0), RGB::red, Visualizer::COORDINATES_CARTESIAN));
176 DOCTEST_CHECK(UUID != 0);
177}
178
179TEST_CASE("Visualizer::addRectangleByCenter extreme") {
180 Visualizer visualizer(1000, 800, 16, true, true);
181 size_t UUID;
182 DOCTEST_CHECK_NOTHROW(UUID = visualizer.addRectangleByCenter(make_vec3(1e6, 1e6, 1e6), make_vec2(1e6, 1e6), make_SphericalCoord(0, 0), RGB::red, Visualizer::COORDINATES_CARTESIAN));
183 DOCTEST_CHECK(UUID != 0);
184}
185
186TEST_CASE("Visualizer::addRectangleByVertices variations") {
187 Visualizer visualizer(1000, 800, 16, true, true);
188 std::vector<helios::vec3> verts = {make_vec3(0, 0, 0), make_vec3(1, 0, 0), make_vec3(1, 1, 0), make_vec3(0, 1, 0)};
189 size_t UUID1;
190 DOCTEST_CHECK_NOTHROW(UUID1 = visualizer.addRectangleByVertices(verts, RGB::blue, Visualizer::COORDINATES_CARTESIAN));
191 DOCTEST_CHECK(UUID1 != 0);
192 size_t UUID2;
193 DOCTEST_CHECK_NOTHROW(UUID2 = visualizer.addRectangleByVertices(verts, "plugins/visualizer/textures/AlmondLeaf.png", Visualizer::COORDINATES_CARTESIAN));
194 DOCTEST_CHECK(UUID2 != 0);
195}
196
197TEST_CASE("Visualizer::addTriangle") {
198 Visualizer visualizer(1000, 800, 16, true, true);
199 size_t UUID;
200 DOCTEST_CHECK_NOTHROW(UUID = visualizer.addTriangle(make_vec3(0, 0, 0), make_vec3(1, 0, 0), make_vec3(0, 1, 0), RGB::blue, Visualizer::COORDINATES_CARTESIAN));
201 DOCTEST_CHECK(UUID != 0);
202}
203
204TEST_CASE("Visualizer::addTriangle textured") {
205 Visualizer visualizer(1000, 800, 16, true, true);
206 size_t UUID;
207 DOCTEST_CHECK_NOTHROW(UUID = visualizer.addTriangle(make_vec3(0, 0, 0), make_vec3(1, 0, 0), make_vec3(0, 1, 0), "plugins/visualizer/textures/AlmondLeaf.png", make_vec2(0, 0), make_vec2(1, 0), make_vec2(0, 1), Visualizer::COORDINATES_CARTESIAN));
208 DOCTEST_CHECK(UUID != 0);
209}
210
211TEST_CASE("Visualizer::addVoxelByCenter") {
212 Visualizer visualizer(1000, 800, 16, true, true);
213 std::vector<size_t> UUIDs;
214 DOCTEST_CHECK_NOTHROW(UUIDs = visualizer.addVoxelByCenter(make_vec3(0, 0, 0), make_vec3(1, 1, 1), make_SphericalCoord(0, 0), RGB::green, Visualizer::COORDINATES_CARTESIAN));
215 DOCTEST_CHECK(UUIDs.size() == 6);
216}
217
218TEST_CASE("Visualizer::addSphereByCenter") {
219 Visualizer visualizer(1000, 800, 16, true, true);
220 uint N = 3;
221 std::vector<size_t> UUIDs;
222 DOCTEST_CHECK_NOTHROW(UUIDs = visualizer.addSphereByCenter(1.0f, make_vec3(0, 0, 0), N, RGB::blue, Visualizer::COORDINATES_CARTESIAN));
223 DOCTEST_CHECK(UUIDs.size() == 2 * N * (N - 1));
224}
225
226TEST_CASE("Visualizer::addSkyDomeByCenter") {
227 Visualizer visualizer(1000, 800, 16, true, true);
228 uint N = 3;
229 std::vector<size_t> UUIDs;
230 DOCTEST_CHECK_NOTHROW(UUIDs = visualizer.addSkyDomeByCenter(5.0f, make_vec3(0, 0, 0), N, "plugins/visualizer/textures/SkyDome_clouds.jpg"));
231 DOCTEST_CHECK(UUIDs.size() == (N - 1) * (2 * (N - 1) + 1));
232}
233
234TEST_CASE("Visualizer::addCoordinateAxes") {
235 Visualizer visualizer(1000, 800, 16, true, true);
236 DOCTEST_CHECK_NOTHROW(visualizer.addCoordinateAxes(make_vec3(0, 0, 0), make_vec3(1, 1, 1), "XYZ"));
237}
238
239TEST_CASE("Visualizer::addLine") {
240 Visualizer visualizer(1000, 800, 16, true, true);
241 DOCTEST_CHECK(visualizer.addLine(make_vec3(-1, 3, 0), make_vec3(0, 4, 0), RGB::red, Visualizer::COORDINATES_CARTESIAN) != 0);
242}
243
244TEST_CASE("Visualizer::addLine with line width") {
245 Visualizer visualizer(1000, 800, 16, true, true);
246
247 // Test RGB line with custom width
248 size_t UUID1;
249 DOCTEST_CHECK_NOTHROW(UUID1 = visualizer.addLine(make_vec3(0, 0, 0), make_vec3(1, 1, 1), RGB::blue, 2.0f, Visualizer::COORDINATES_CARTESIAN));
250 DOCTEST_CHECK(UUID1 != 0);
251
252 // Test RGBA line with custom width
253 size_t UUID2;
254 DOCTEST_CHECK_NOTHROW(UUID2 = visualizer.addLine(make_vec3(2, 0, 0), make_vec3(3, 1, 1), make_RGBAcolor(1.0f, 0.0f, 0.0f, 0.5f), 5.0f, Visualizer::COORDINATES_CARTESIAN));
255 DOCTEST_CHECK(UUID2 != 0);
256 DOCTEST_CHECK(UUID2 != UUID1);
257
258 // Test with small width (should work without throwing)
259 size_t UUID3;
260 DOCTEST_CHECK_NOTHROW(UUID3 = visualizer.addLine(make_vec3(-1, 0, 0), make_vec3(-2, 1, 1), RGB::green, 0.5f, Visualizer::COORDINATES_CARTESIAN));
261 DOCTEST_CHECK(UUID3 != 0);
262
263 // Test with large width (should work without throwing)
264 size_t UUID4;
265 DOCTEST_CHECK_NOTHROW(UUID4 = visualizer.addLine(make_vec3(4, 0, 0), make_vec3(5, 1, 1), RGB::yellow, 10.0f, Visualizer::COORDINATES_CARTESIAN));
266 DOCTEST_CHECK(UUID4 != 0);
267}
268
269TEST_CASE("Visualizer::validateTextureFile") {
270 DOCTEST_CHECK(validateTextureFile("plugins/visualizer/textures/AlmondLeaf.png"));
271 DOCTEST_CHECK(!validateTextureFile("missing.png"));
272 DOCTEST_CHECK(!validateTextureFile("plugins/visualizer/textures/SkyDome_clouds.jpg", true));
273}
274
275TEST_CASE("Visualizer::point culling configuration simple") {
276 Visualizer visualizer(800, 600, true); // Headless mode
277
278 // Test that the new configuration methods exist and don't crash
279 DOCTEST_CHECK_NOTHROW(visualizer.setPointCullingEnabled(true));
280 DOCTEST_CHECK_NOTHROW(visualizer.setPointCullingEnabled(false));
281}
282
283TEST_CASE("Visualizer::addPoint basic functionality") {
284 Visualizer visualizer(800, 600, true); // Headless mode
285
286 // Test adding a single point
287 size_t point_uuid = visualizer.addPoint(make_vec3(0, 0, 0), RGB::red, 1.0f, Visualizer::COORDINATES_CARTESIAN);
288 DOCTEST_CHECK(point_uuid != 0);
289}
290
291TEST_CASE("Visualizer::addPoint with different sizes") {
292 Visualizer visualizer(800, 600, true); // Headless mode
293
294 // Test adding points with different sizes
295 size_t point1 = visualizer.addPoint(make_vec3(0, 0, 0), RGB::red, 1.0f, Visualizer::COORDINATES_CARTESIAN);
296 size_t point2 = visualizer.addPoint(make_vec3(1, 0, 0), RGB::green, 2.5f, Visualizer::COORDINATES_CARTESIAN);
297 size_t point3 = visualizer.addPoint(make_vec3(2, 0, 0), RGB::blue, 5.0f, Visualizer::COORDINATES_CARTESIAN);
298
299 // Test point with size outside supported range (should trigger warning)
300 capture_cerr cerr_buffer;
301 size_t point4 = visualizer.addPoint(make_vec3(3, 0, 0), RGB::yellow, 0.5f, Visualizer::COORDINATES_CARTESIAN);
302 DOCTEST_CHECK(cerr_buffer.has_output()); // Should capture warning about point size clamping
303
304 // Verify unique UUIDs were returned
305 DOCTEST_CHECK(point1 != 0);
306 DOCTEST_CHECK(point2 != 0);
307 DOCTEST_CHECK(point3 != 0);
308 DOCTEST_CHECK(point4 != 0);
309 DOCTEST_CHECK(point1 != point2);
310 DOCTEST_CHECK(point2 != point3);
311 DOCTEST_CHECK(point3 != point4);
312}
313
314TEST_CASE("Visualizer::addPoint RGBA with sizes") {
315 Visualizer visualizer(800, 600, true); // Headless mode
316
317 // Test adding RGBA points with different sizes
318 size_t point1 = visualizer.addPoint(make_vec3(0, 0, 0), make_RGBAcolor(1.0f, 0.0f, 0.0f, 0.8f), 1.5f, Visualizer::COORDINATES_CARTESIAN);
319 size_t point2 = visualizer.addPoint(make_vec3(1, 1, 1), make_RGBAcolor(0.0f, 1.0f, 0.0f, 0.6f), 3.0f, Visualizer::COORDINATES_CARTESIAN);
320
321 DOCTEST_CHECK(point1 != 0);
322 DOCTEST_CHECK(point2 != 0);
323 DOCTEST_CHECK(point1 != point2);
324}
325
326TEST_CASE("Visualizer::point culling metrics functionality") {
327 Visualizer visualizer(800, 600, true); // Headless mode
328
329 // Test that metrics can be retrieved
330 size_t total, rendered;
331 float time;
332 DOCTEST_CHECK_NOTHROW(visualizer.getPointRenderingMetrics(total, rendered, time));
333
334 // Add some points
335 for (int i = 0; i < 5; ++i) {
336 size_t uuid = visualizer.addPoint(make_vec3(i, 0, 0), RGB::orange, 1.0f, Visualizer::COORDINATES_CARTESIAN);
337 DOCTEST_CHECK(uuid != 0);
338 }
339
340 // Test metrics after adding points
341 DOCTEST_CHECK_NOTHROW(visualizer.getPointRenderingMetrics(total, rendered, time));
342
343 // Note: plotUpdate disabled in headless mode for testing - would require full OpenGL context
344}
345
346TEST_CASE("Visualizer::point size edge cases") {
347 Visualizer visualizer(800, 600, true); // Headless mode
348
349 // Test with very small point size (should trigger warning and not crash in headless mode)
350 capture_cerr cerr_buffer1;
351 size_t point1 = visualizer.addPoint(make_vec3(0, 0, 0), RGB::white, 0.001f, Visualizer::COORDINATES_CARTESIAN);
352 DOCTEST_CHECK(point1 != 0);
353 DOCTEST_CHECK(cerr_buffer1.has_output()); // Should capture warning about point size clamping
354
355 // Test with very large point size (should trigger warning and not crash in headless mode)
356 capture_cerr cerr_buffer2;
357 size_t point2 = visualizer.addPoint(make_vec3(1, 0, 0), RGB::white, 1000.0f, Visualizer::COORDINATES_CARTESIAN);
358 DOCTEST_CHECK(point2 != 0);
359 DOCTEST_CHECK(cerr_buffer2.has_output()); // Should capture warning about point size clamping
360
361 // Test with valid point size (should not trigger warning)
362 capture_cerr cerr_buffer3;
363 size_t point3 = visualizer.addPoint(make_vec3(2, 0, 0), RGB::white, 2.0f, Visualizer::COORDINATES_CARTESIAN);
364 DOCTEST_CHECK(point3 != 0);
365 DOCTEST_CHECK(!cerr_buffer3.has_output()); // Should not capture any warning
366
367 // Verify UUIDs are unique
368 DOCTEST_CHECK(point1 != point2);
369 DOCTEST_CHECK(point2 != point3);
370 DOCTEST_CHECK(point1 != point3);
371}
372
373int Visualizer::selfTest(int argc, char **argv) {
374 return helios::runDoctestWithValidation(argc, argv);
375}