/*************************************************************************** * test_GXml.cpp - Test xml module * * ----------------------------------------------------------------------- * * copyright (C) 2010-2016 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file test_GXml.cpp * @brief Implementation of unit tests for XML module * @author Juergen Knoedlseder */ /* __ Includes ___________________________________________________________ */ #ifdef HAVE_CONFIG_H #include #endif #include "test_GXml.hpp" #include "GTools.hpp" /***********************************************************************//** * @brief Set parameters and tests **************************************************************************/ void TestGXml::set(void) { // Test name name("GXml"); // Set XML filename m_xml_file = "data/test.xml"; // Append tests append(static_cast(&TestGXml::test_GXml_attributes), "Test XML attributes"); append(static_cast(&TestGXml::test_GXml_elements), "Test XML elements"); append(static_cast(&TestGXml::test_GXml_construct), "Test XML constructors"); append(static_cast(&TestGXml::test_GXml_load), "Test XML load"); append(static_cast(&TestGXml::test_GXml_access), "Test XML access"); // Return return; } /***********************************************************************//** * @brief Clone test suite * * @return Pointer to deep copy of test suite. ***************************************************************************/ TestGXml* TestGXml::clone(void) const { // Clone test suite return new TestGXml(*this); } /***********************************************************************//** * @brief Test XML attributes **************************************************************************/ void TestGXml::test_GXml_attributes(void) { // Test attribute name-value constructors GXmlAttribute attr1("test", "1.0"); test_assert(attr1.value() == "1.0", "Test if value()= 1.0", "Unexpected attribute "+attr1.value()); GXmlAttribute attr2("test", "\"1.0\""); test_assert(attr2.value() == "1.0", "Test if value()= 1.0", "Unexpected attribute "+attr2.value()); GXmlAttribute attr3("test", "'1.0'"); test_assert(attr3.value() == "1.0", "Test if value()= 1.0", "Unexpected attribute "+attr3.value()); GXmlAttribute attr4("test", "''1.0'"); test_assert(attr4.value() == "'1.0", "Test if value()= '1.0", "Unexpected attribute "+attr4.value()); GXmlAttribute attr5("test", "'1.0"); test_assert(attr5.value() == "'1.0", "Test if value()= '1.0", "Unexpected attribute "+attr5.value()); GXmlAttribute attr6("test", "1.0'"); test_assert(attr6.value() == "1.0'", "Test if value()= 1.0'", "Unexpected attribute "+attr6.value()); GXmlAttribute attr7("test", "\"1.0"); test_assert(attr7.value() == "\"1.0", "Test if value()= \"1.0", "Unexpected attribute "+attr7.value()); GXmlAttribute attr8("test", "1.0\""); test_assert(attr8.value() == "1.0\"", "Test if value()= 1.0\"", "Unexpected attribute "+attr8.value()); GXmlAttribute attr9("test", "\"\"1.0\""); test_assert(attr9.value() == "\"1.0", "Test if value()= \"1.0", "Unexpected attribute "+attr9.value()); // Return return; } /***********************************************************************//** * @brief Test XML elements **************************************************************************/ void TestGXml::test_GXml_elements(void) { // Perform tests GXmlElement element; element.attribute("test", "1.0"); test_assert(element.attribute("test") == "1.0", "Test if element.attribute(\"test\")= 1.0", "Unexpected attribute "+element.attribute("test")); element.attribute("test", "2.0"); test_assert(element.attribute("test") == "2.0", "Test if element.attribute(\"test\")= 2.0", "Unexpected attribute "+element.attribute("test")); element.attribute("test2", "1.0"); test_assert(element.attribute("test2") == "1.0", "Test if element.attribute(\"test2\")= 1.0", "Unexpected attribute "+element.attribute("test2")); test_assert(element.attribute("test") == "2.0"&& element.attribute("test2") == "1.0", "Test if element.attribute(\"test\")= 2.0 and if element.attribute(\"test2\")= 1.0", "Unexpected attributes "+element.attribute("test")+" "+element.attribute("test2")); // Return return; } /***********************************************************************//** * @brief Test XML constructors **************************************************************************/ void TestGXml::test_GXml_construct(void) { // Test void constructor test_try("Test void constructor"); try { GXml xml; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test load constructor test_try("Test load constructor"); try { GXml xml(m_xml_file); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test copy constructor test_try("Test copy constructor"); try { GXml xml1(m_xml_file); GXml xml2 = xml1; test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test XML file creation test_try("Test XML file creation"); try { GXml xml; xml.append(GXmlComment("This is a comment.")); xml.append(GXmlElement("source_library")); GXmlElement* lib = xml.element("source_library", 0); lib->append(GXmlElement("source name=\"LMC\" type=\"DiffuseSource\"")); GXmlNode* src = lib->element("source", 0); src->append(GXmlElement("spectrum type=\"PLSuperExpCutoff\"")); GXmlNode* spec = src->element("spectrum", 0); spec->append(GXmlElement("parameter free=\"1\" max=\"1000\" min=\"1e-07\"" " name=\"Prefactor\" scale=\"1e-07\"" " value=\"0.02754520844\"")); spec->append(GXmlElement("parameter free=\"1\" max=\"5\" min=\"-5\"" " name=\"Index1\" scale=\"1\" value=\"-2.0458781\"")); GXmlElement* par = spec->element("parameter", 0); par->attribute("value", "1.01"); par->attribute("error", "3.145"); par = spec->element("parameter", 1); par->attribute("value", "-2.100"); par->attribute("error", "9.876"); src->append(GXmlElement("spatialModel file=\"LMC.fits\" type=\"SpatialMap\"")); GXmlNode* spat = src->element("spatialModel", 0); spat->append(GXmlElement("parameter free=\"0\" max=\"1000\" min=\"0.001\"" " name=\"Prefactor\" scale=\"1\" value=\"1\"")); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Return return; } /***********************************************************************//** * @brief Test XML loading/saving **************************************************************************/ void TestGXml::test_GXml_load(void) { // Test loading test_try("Test loading"); try { GXml xml; xml.load(m_xml_file); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test saving test_try("Test saving"); try { GXml xml; xml.load(m_xml_file); xml.save("test.xml"); xml.load("test.xml"); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Test loading of saved XML document test_try("Test loading of saved XML document"); try { GXml xml; xml.load("test.xml"); test_try_success(); } catch (std::exception &e) { test_try_failure(e); } // Return return; } /***********************************************************************//** * @brief Test XML element access **************************************************************************/ void TestGXml::test_GXml_access(void) { // Test root document access GXml xml; xml.load(m_xml_file); test_assert(xml.size() == 3, "Test if xml.children()==3", "Unexpected number of children in document "+ gammalib::str(xml.size())); // Test node access for (int i = 0; i < xml.size(); ++i) { GXmlNode* ptr = xml[i]; test_assert(ptr != 0, "Test node access"); } test_assert(xml.elements() == 1, "Test if xml.elements()==1", "Unexpected number of child elements in document "+ gammalib::str(xml.elements())); // Test node access for (int i = 0; i < xml.elements(); ++i) { GXmlNode* ptr = xml.element(i); test_assert(ptr != 0, "Test xml element access"); } test_assert(xml.elements("source_library") == 1, "Test if the source_library = 1", "Unexpected number of child elements in document "+ gammalib::str(xml.elements("source_library"))); // Test element access for (int i = 0; i < xml.elements("source_library"); ++i) { GXmlElement* ptr = xml.element("source_library", i); test_assert(ptr->name() == "source_library", "Test name", "Unexpected element name "+ptr->name()); } // Test hierarchy access GXmlElement* ptr = NULL; ptr = xml.element("source_library"); test_assert(ptr->name() == "source_library", "Test hierarchy access", "Unexpected element name "+ptr->name()); ptr = xml.element("source_library > source"); test_assert(ptr->name() == "source", "Test hierarchy access", "Unexpected element name "+ptr->name()); ptr = xml.element("source_library > source > spectrum"); test_assert(ptr->name() == "spectrum", "Test hierarchy access", "Unexpected element name "+ptr->name()); ptr = xml.element("source_library > source > spectrum > parameter[2]"); test_assert(ptr->name() == "parameter", "Test hierarchy access", "Unexpected element name "+ptr->name()); test_assert(ptr->attribute("name") == "Scale", "Test hierarchy access", "Unexpected element attribute "+ptr->attribute("name")); // Return return; } /*************************************************************************** * @brief Main entry point for test executable ***************************************************************************/ int main(void) { // Allocate test suit container GTestSuites testsuites("XML module"); // Initially assume that we pass all tests bool success = true; // Create a test suite TestGXml test; // Append test suite to the container testsuites.append(test); // Run the testsuites success = testsuites.run(); // Save test report testsuites.save("reports/GXml.xml"); // Return success status return (success ? 0 : 1); }