7TEST_CASE(
"XMLoad functions") {
8 pugi::xml_document doc;
9 pugi::xml_node node = doc.append_child(
"node");
10 node.append_child(
"float").text().set(
"1.23");
11 node.append_child(
"int").text().set(
"123");
12 node.append_child(
"string").text().set(
"hello");
13 node.append_child(
"vec2").text().set(
"1.1 2.2");
14 node.append_child(
"vec3").text().set(
"1.1 2.2 3.3");
15 node.append_child(
"vec4").text().set(
"1.1 2.2 3.3 4.4");
16 node.append_child(
"int2").text().set(
"1 2");
17 node.append_child(
"int3").text().set(
"1 2 3");
18 node.append_child(
"int4").text().set(
"1 2 3 4");
19 node.append_child(
"rgb").text().set(
"0.1 0.2 0.3");
20 node.append_child(
"rgba").text().set(
"0.1 0.2 0.3 0.4");
22 SUBCASE(
"XMLloadfloat") {
24 DOCTEST_CHECK(f == doctest::Approx(1.23f));
26 SUBCASE(
"XMLloadint") {
28 DOCTEST_CHECK(i == 123);
30 SUBCASE(
"XMLloadstring") {
32 DOCTEST_CHECK(s ==
"hello");
34 SUBCASE(
"XMLloadvec2") {
36 DOCTEST_CHECK(v == vec2(1.1f, 2.2f));
38 SUBCASE(
"XMLloadvec3") {
40 DOCTEST_CHECK(v == vec3(1.1f, 2.2f, 3.3f));
42 SUBCASE(
"XMLloadvec4") {
44 DOCTEST_CHECK(v == vec4(1.1f, 2.2f, 3.3f, 4.4f));
46 SUBCASE(
"XMLloadint2") {
48 DOCTEST_CHECK(i == int2(1, 2));
50 SUBCASE(
"XMLloadint3") {
52 DOCTEST_CHECK(i == int3(1, 2, 3));
54 SUBCASE(
"XMLloadint4") {
56 DOCTEST_CHECK(i == int4(1, 2, 3, 4));
58 SUBCASE(
"XMLoad* for missing nodes") {
59 pugi::xml_document doc;
60 pugi::xml_node node = doc.append_child(
"node");
62 capture_cerr cerr_buffer;
63 DOCTEST_CHECK(
XMLloadfloat(node,
"non_existent") == 99999);
64 DOCTEST_CHECK(
XMLloadint(node,
"non_existent") == 99999);
65 DOCTEST_CHECK(
XMLloadstring(node,
"non_existent") ==
"99999");
66 DOCTEST_CHECK(
XMLloadvec2(node,
"non_existent") == vec2(99999, 99999));
67 DOCTEST_CHECK(
XMLloadvec3(node,
"non_existent") == vec3(99999, 99999, 99999));
68 DOCTEST_CHECK(
XMLloadvec4(node,
"non_existent") == vec4(99999, 99999, 99999, 99999));
69 DOCTEST_CHECK(
XMLloadint2(node,
"non_existent") == int2(99999, 99999));
70 DOCTEST_CHECK(
XMLloadint3(node,
"non_existent") == int3(99999, 99999, 99999));
71 DOCTEST_CHECK(
XMLloadint4(node,
"non_existent") == int4(99999, 99999, 99999, 99999));
72 DOCTEST_CHECK(
XMLloadrgb(node,
"non_existent") == RGBcolor(99999, 99999, 99999));
73 DOCTEST_CHECK(
XMLloadrgba(node,
"non_existent") == RGBAcolor(99999, 99999, 99999, 99999));
75 SUBCASE(
"XMLoad* for missing fields") {
76 pugi::xml_document doc;
77 pugi::xml_node node = doc.append_child(
"tag");
78 DOCTEST_CHECK(
XMLloadfloat(node,
"non_existent") == 99999);
79 DOCTEST_CHECK(
XMLloadint(node,
"non_existent") == 99999);
80 DOCTEST_CHECK(
XMLloadstring(node,
"non_existent") ==
"99999");
85 SUBCASE(
"parse_xml_tag_*") {
86 pugi::xml_document doc;
87 pugi::xml_node node = doc.append_child(
"tag");
88 node.text().set(
" 123 ");
90 DOCTEST_CHECK(i == 123);
91 node.text().set(
" 1.23 ");
93 DOCTEST_CHECK(f == doctest::Approx(1.23f));
94 node.text().set(
" 1.1 2.2 ");
96 DOCTEST_CHECK(v2 == vec2(1.1f, 2.2f));
97 node.text().set(
" 1.1 2.2 3.3 ");
99 DOCTEST_CHECK(v3 == vec3(1.1f, 2.2f, 3.3f));
100 node.text().set(
" hello ");
102 DOCTEST_CHECK(s ==
"hello");
104 capture_cerr cerr_buffer;
105 node.text().set(
"abc");
116 SUBCASE(
"open_xml_file") {
117 pugi::xml_document doc;
118 std::string error_string;
119 DOCTEST_CHECK(!
open_xml_file(
"non_existent.xml", doc, error_string));
120 DOCTEST_CHECK(!error_string.empty());
123 std::ofstream outfile(
"invalid.xml");
124 outfile <<
"<helios><data>blah</helios>";
126 DOCTEST_CHECK(!
open_xml_file(
"invalid.xml", doc, error_string));
129 outfile.open(
"valid.xml");
130 outfile <<
"<helios><data>blah</data></helios>";
132 DOCTEST_CHECK(
open_xml_file(
"valid.xml", doc, error_string));
133 std::remove(
"invalid.xml");
134 std::remove(
"valid.xml");
138TEST_CASE(
"Context XML I/O Functions") {
139 SUBCASE(
"writeXML and loadXML") {
148 ctx.setPrimitiveData(patch,
"test_data", 42.0f);
149 ctx.setObjectData(box,
"object_data",
"test_string");
150 ctx.setGlobalData(
"global_test", 123);
153 const char *test_file =
"helios_test.xml";
154 DOCTEST_CHECK_NOTHROW(ctx.writeXML(test_file,
true));
158 std::vector<uint> loaded_uuids;
159 DOCTEST_CHECK_NOTHROW(loaded_uuids = ctx2.loadXML(test_file,
true));
160 DOCTEST_CHECK(loaded_uuids.size() >= 2);
163 DOCTEST_CHECK(ctx2.getPrimitiveCount() >= 2);
164 DOCTEST_CHECK(ctx2.getObjectCount() >= 1);
167 bool found_data =
false;
168 for (
uint uuid: loaded_uuids) {
169 if (ctx2.doesPrimitiveDataExist(uuid,
"test_data")) {
171 ctx2.getPrimitiveData(uuid,
"test_data", data);
172 DOCTEST_CHECK(data == doctest::Approx(42.0f));
177 DOCTEST_CHECK(found_data);
181 ctx2.getGlobalData(
"global_test", global_val);
182 DOCTEST_CHECK(global_val == 123);
185 std::remove(test_file);
188 SUBCASE(
"writeXML_byobject") {
193 std::vector<uint> selected_objects = {box1};
194 const char *test_file =
"helios_partial_test.xml";
197 DOCTEST_CHECK_NOTHROW(ctx.writeXML_byobject(test_file, selected_objects,
true));
200 std::vector<uint> loaded_uuids = ctx2.loadXML(test_file,
true);
203 DOCTEST_CHECK(loaded_uuids.size() == 6);
204 DOCTEST_CHECK(ctx2.getObjectCount() == 1);
206 std::remove(test_file);
209 SUBCASE(
"writeXML with specific UUIDs") {
215 std::vector<uint> selected_uuids = {p1, p3};
216 const char *test_file =
"helios_uuid_test.xml";
219 DOCTEST_CHECK_NOTHROW(ctx.writeXML(test_file, selected_uuids,
true));
222 std::vector<uint> loaded_uuids = ctx2.loadXML(test_file,
true);
224 DOCTEST_CHECK(loaded_uuids.size() == 2);
226 std::remove(test_file);
229 SUBCASE(
"getLoadedXMLFiles") {
233 std::vector<std::string> files = ctx.getLoadedXMLFiles();
234 size_t initial_count = files.size();
237 uint patch = ctx.addPatch();
238 std::string test_file =
"helios_loaded_files_test.xml";
240 ctx.writeXML(test_file.c_str(),
true);
243 ctx2.loadXML(test_file.c_str(),
true);
245 std::vector<std::string> loaded_files = ctx2.getLoadedXMLFiles();
246 DOCTEST_CHECK(loaded_files.size() == initial_count + 1);
250 std::string resolved_test_file_str = resolved_test_file.string();
251 DOCTEST_CHECK(std::find(loaded_files.begin(), loaded_files.end(), resolved_test_file_str) != loaded_files.end());
253 std::remove(test_file.c_str());
256 SUBCASE(
"XML I/O quiet parameter") {
259 const char *test_file =
"helios_quiet_test.xml";
263 capture_cout cout_buffer;
264 ctx.writeXML(test_file,
false);
265 DOCTEST_CHECK(cout_buffer.get_captured_output().find(
"Writing XML file") != std::string::npos);
271 capture_cout cout_buffer;
272 ctx2.loadXML(test_file,
false);
273 DOCTEST_CHECK(cout_buffer.get_captured_output().find(
"Loading XML file") != std::string::npos);
278 capture_cout cout_buffer;
279 ctx.writeXML(test_file,
true);
280 DOCTEST_CHECK(cout_buffer.get_captured_output().find(
"Writing XML file") == std::string::npos);
286 capture_cout cout_buffer;
287 ctx3.loadXML(test_file,
true);
288 DOCTEST_CHECK(cout_buffer.get_captured_output().find(
"Loading XML file") == std::string::npos);
291 std::remove(test_file);