/* ****************************************************************************** Project: OWA EPANET Version: 2.2 Module: test_node.cpp Description: Tests EPANET toolkit api functions Authors: see AUTHORS Copyright: see AUTHORS License: see LICENSE Last Updated: 03/21/2019 ****************************************************************************** */ #include #include "test_toolkit.hpp" BOOST_AUTO_TEST_SUITE (test_node) BOOST_FIXTURE_TEST_CASE(test_adddelete_node, FixtureInitClose) { int index; error = EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index); BOOST_REQUIRE(error == 0); error = EN_addnode(ph, (char *)"N4", EN_TANK, &index); BOOST_REQUIRE(error == 0); error = EN_addnode(ph, (char *)"N3", EN_RESERVOIR, &index); BOOST_REQUIRE(error == 0); error = EN_addnode(ph, (char *)"N1", EN_JUNCTION, &index); BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"N1", &index); BOOST_REQUIRE(error == 0); BOOST_REQUIRE(index == 2); error = EN_getnodeindex(ph, (char *)"N2", &index); BOOST_REQUIRE(error == 0); error = EN_deletenode(ph, index, EN_UNCONDITIONAL); BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"N4", &index); BOOST_REQUIRE(error == 0); error = EN_deletenode(ph, index, EN_UNCONDITIONAL); BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"N3", &index); BOOST_REQUIRE(error == 0); error = EN_deletenode(ph, index, EN_UNCONDITIONAL); BOOST_REQUIRE(error == 0); } BOOST_FIXTURE_TEST_CASE(test_node_validate_id, FixtureInitClose) { int index; error = EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index); BOOST_REQUIRE(error == 0); error = EN_addnode(ph, (char *)"N 3", EN_JUNCTION, &index); BOOST_REQUIRE(error == 252); error = EN_addnode(ph, (char *)"\"N3", EN_JUNCTION, &index); BOOST_REQUIRE(error == 252); error = EN_addnode(ph, (char *)"N;3", EN_JUNCTION, &index); BOOST_REQUIRE(error == 252); EN_getnodeindex(ph, (char *)"N2", &index); error = EN_setnodeid(ph, index, (char *)"N;2"); BOOST_REQUIRE(error = 252); } BOOST_FIXTURE_TEST_CASE(test_junc_props, FixtureOpenClose) { int index; const auto props = { EN_ELEVATION, EN_BASEDEMAND, EN_PATTERN, EN_EMITTER, EN_INITQUAL, }; const size_t num_props = 5; std::vector test (num_props); double *value = test.data(); error = EN_getnodeindex(ph, (char *)"11", &index); std::vector ref = {710.0, 150.0, 0.0, 0.0, 0.5}; // Ranged for loop iterates over property set for (EN_NodeProperty p : props) { error = EN_getnodevalue(ph, index, p, value++); BOOST_REQUIRE(error == 0); } BOOST_CHECK(check_cdd_double(test, ref, 3)); } BOOST_FIXTURE_TEST_CASE(test_tank_props, FixtureOpenClose) { int index; const auto props = { EN_ELEVATION, EN_TANKLEVEL, EN_MINLEVEL, EN_MAXLEVEL, EN_TANKDIAM, EN_MINVOLUME }; const size_t num_props = 6; std::vector test (num_props); double *value = test.data(); error = EN_getnodeindex(ph, (char *)"2", &index); std::vector ref = {850.0, 120.0, 100.0, 150.0, 50.5, 200296.167}; // Ranged for loop iterates over property set for (EN_NodeProperty p : props) { error = EN_getnodevalue(ph, index, p, value++); BOOST_REQUIRE(error == 0); } BOOST_CHECK(check_cdd_double(test, ref, 3)); } BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(node_props_after_step) BOOST_FIXTURE_TEST_CASE(test_junc_props, FixtureAfterStep) { int index; const auto props = { EN_DEMAND, EN_HEAD, EN_PRESSURE, EN_QUALITY }; const size_t num_props = 4; std::vector test (num_props); double *value = test.data(); error = EN_getnodeindex(ph, (char *)"11", &index); std::vector ref = {179.999, 991.574, 122.006, 0.857}; // Ranged for loop iterates over property set for (EN_NodeProperty p : props) { error = EN_getnodevalue(ph, index, p, value++); BOOST_REQUIRE(error == 0); } BOOST_CHECK(check_cdd_double(test, ref, 3)); } BOOST_FIXTURE_TEST_CASE(test_tank_props, FixtureAfterStep) { int index; const auto props = { EN_DEMAND, EN_HEAD, EN_PRESSURE, EN_QUALITY }; const size_t num_props = 4; std::vector test (num_props); double *value = test.data(); error = EN_getnodeindex(ph, (char *)"2", &index); std::vector ref = {505.383, 978.138, 55.522, 0.911}; // Ranged for loop iterates over property set for (EN_NodeProperty p : props) { error = EN_getnodevalue(ph, index, p, value++); BOOST_REQUIRE(error == 0); } BOOST_CHECK(check_cdd_double(test, ref, 3)); } BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(setid_save_reopen) BOOST_AUTO_TEST_CASE(test_setid_save) { int error = 0; EN_Project ph = NULL; EN_createproject(&ph); error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, ""); BOOST_REQUIRE(error == 0); // Test of illegal node name change char newid_1[] = "Illegal; node name"; error = EN_setnodeid(ph, 3, newid_1); BOOST_REQUIRE(error > 0); // Test of legal node name change char newid_2[] = "Node3"; error = EN_setnodeid(ph, 3, newid_2); BOOST_REQUIRE(error == 0); // Save the project error = EN_saveinpfile(ph, "net1_setid.inp"); BOOST_REQUIRE(error == 0); error = EN_close(ph); BOOST_REQUIRE(error == 0); EN_deleteproject(ph); } BOOST_AUTO_TEST_CASE(test_setid_reopen, * boost::unit_test::depends_on("setid_save_reopen/test_setid_save")) { int error = 0; int index; EN_Project ph = NULL; // Re-open the saved project EN_createproject(&ph); error = EN_open(ph, "net1_setid.inp", DATA_PATH_RPT, ""); BOOST_REQUIRE(error == 0); // Check that 3rd node has its new name error = EN_getnodeindex(ph, (char *)"Node3", &index); BOOST_REQUIRE(error == 0); BOOST_REQUIRE(index == 3); error = EN_close(ph); BOOST_REQUIRE(error == 0); EN_deleteproject(ph); } BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(node_comments) BOOST_FIXTURE_TEST_CASE(test_node_comments, FixtureOpenClose) { int index; char comment[EN_MAXMSG + 1]; // Add comments to selected objects error = EN_getnodeindex(ph, (char *)"11", &index); BOOST_REQUIRE(error == 0); error = EN_setcomment(ph, EN_NODE, index, (char *)"J11"); BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"23", &index); BOOST_REQUIRE(error == 0); error = EN_setcomment(ph, EN_NODE, index, (char *)"Junc23"); BOOST_REQUIRE(error == 0); // Check comments error = EN_getnodeindex(ph, (char *)"11", &index); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"J11")); error = EN_getnodeindex(ph, (char *)"23", &index); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"Junc23")); } BOOST_FIXTURE_TEST_CASE(test_replace_comment, FixtureOpenClose) { int index; char comment[EN_MAXMSG + 1]; // Replace short comment with longer one and vice versa error = EN_getnodeindex(ph, (char *)"11", &index); BOOST_REQUIRE(error == 0); error = EN_setcomment(ph, EN_NODE, index, (char *)"Junction11"); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"Junction11")); error = EN_setcomment(ph, EN_NODE, index, (char *)"J11"); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"J11")); } BOOST_FIXTURE_TEST_CASE(test_save_comment, FixtureOpenClose) { int index; // Add comments to selected objects error = EN_getnodeindex(ph, (char *)"11", &index); BOOST_REQUIRE(error == 0); error = EN_setcomment(ph, EN_NODE, index, (char *)"J11"); BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"23", &index); BOOST_REQUIRE(error == 0); error = EN_setcomment(ph, EN_NODE, index, (char *)"Junc23"); BOOST_REQUIRE(error == 0); error = EN_saveinpfile(ph, DATA_PATH_TMP); BOOST_REQUIRE(error == 0); } BOOST_AUTO_TEST_CASE(test_reopen_comment, * boost::unit_test::depends_on("node_comments/test_save_comment")) { int error, index; char comment[EN_MAXMSG + 1]; // Create & load a project EN_Project ph = NULL; EN_createproject(&ph); error = EN_open(ph, DATA_PATH_TMP, DATA_PATH_RPT, ""); BOOST_REQUIRE(error == 0); // Check that comments were saved & read correctly // Check comments error = EN_getnodeindex(ph, (char *)"11", &index); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"J11")); error = EN_getnodeindex(ph, (char *)"23", &index); BOOST_REQUIRE(error == 0); error = EN_getcomment(ph, EN_NODE, index, comment); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(comment, (char *)"Junc23")); // Close project EN_close(ph); EN_deleteproject(ph); } BOOST_AUTO_TEST_SUITE_END()