Commit 72d8750694598fa174a2ae8993a19494b444b07b
1 parent
62fe5380
GXmlAttribute class does no longer store the hyphens.
Hyphens are now stripped in the constructor and added back by the write() method.
Showing
9 changed files
with
145 additions
and
228 deletions
ChangeLog
| 1 | -2016-05-31 Juergen Knoedlseder <jurgen.knodlseder@irap.omp.eu> | 1 | +2016-06-02 Juergen Knoedlseder <jurgen.knodlseder@irap.omp.eu> |
| 2 | 2 | ||
| 3 | * Version 1.1.0 released | 3 | * Version 1.1.0 released |
| 4 | ========================= | 4 | ========================= |
| @@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
| 11 | Add component setting methods to GModelSky (#1770). | 11 | Add component setting methods to GModelSky (#1770). |
| 12 | Add GApplication::logFileClose() method. | 12 | Add GApplication::logFileClose() method. |
| 13 | Add GModel::read_attributes() and write_attributes() private methods (#1765). | 13 | Add GModel::read_attributes() and write_attributes() private methods (#1765). |
| 14 | + Also write test reports in case of an exception (#1746). | ||
| 14 | Add GCTAObservation filename constructor (#1744). | 15 | Add GCTAObservation filename constructor (#1744). |
| 15 | Add gammalib::number() function (#1743). | 16 | Add gammalib::number() function (#1743). |
| 16 | Add GSkyMap::shape() and ndim() methods (#1733). | 17 | Add GSkyMap::shape() and ndim() methods (#1733). |
NEWS
| @@ -2,7 +2,7 @@ New Features and Important Changes in GammaLib 1.1.0 | @@ -2,7 +2,7 @@ New Features and Important Changes in GammaLib 1.1.0 | ||
| 2 | 2 | ||
| 3 | Author(s) : Juergen Knoedlseder | 3 | Author(s) : Juergen Knoedlseder |
| 4 | 4 | ||
| 5 | -31 May 2016 | 5 | +2 June 2016 |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | 1. Introduction | 8 | 1. Introduction |
| @@ -271,7 +271,11 @@ easy creation of a CSV file, in particular from Python lists (#1773). | @@ -271,7 +271,11 @@ easy creation of a CSV file, in particular from Python lists (#1773). | ||
| 271 | 271 | ||
| 272 | 14. XML module | 272 | 14. XML module |
| 273 | -------------- | 273 | -------------- |
| 274 | -None | 274 | +The GXmlAttribute class does no longer store the hyphens of an attribute, but |
| 275 | +the hyphens are stripped upon construction, and added back when writing the | ||
| 276 | +attribute into a URL. The side effect of this new behaviour is that XML test | ||
| 277 | +reports are also written in case that an exception has occured during a unit | ||
| 278 | +test (#1746). | ||
| 275 | 279 | ||
| 276 | 280 | ||
| 277 | 15. VO module | 281 | 15. VO module |
README.md
| 1 | GammaLib information | 1 | GammaLib information |
| 2 | ==================== | 2 | ==================== |
| 3 | -* Version: 1.1.0.dev1 (30 April 2016) | 3 | +* Version: 1.1.0.dev1 (2 June 2016) |
| 4 | * Author: Juergen Knoedlseder (jurgen.knodlseder@irap.omp.eu) | 4 | * Author: Juergen Knoedlseder (jurgen.knodlseder@irap.omp.eu) |
| 5 | 5 | ||
| 6 | [](https://cta-jenkins.irap.omp.eu/job/gammalib-integrate-os/) | 6 | [](https://cta-jenkins.irap.omp.eu/job/gammalib-integrate-os/) |
include/GXmlAttribute.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GXmlAttribute.hpp - XML attribute class definition * | 2 | * GXmlAttribute.hpp - XML attribute class definition * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2015 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -48,8 +48,9 @@ | @@ -48,8 +48,9 @@ | ||
| 48 | * - @p type has a value of "singleton" | 48 | * - @p type has a value of "singleton" |
| 49 | * - @p name has a value of "gamma-ray" | 49 | * - @p name has a value of "gamma-ray" |
| 50 | * | 50 | * |
| 51 | - * The hyphens are stored together with the attribute value. Allowed hyphens | ||
| 52 | - * are " and '. | 51 | + * The hyphens are stripped from the attribute value before storing in the |
| 52 | + * name-value pair constructor. Hyphens are added when writing an attribute | ||
| 53 | + * using the write() method. Allowed hyphens are " and '. | ||
| 53 | ***************************************************************************/ | 54 | ***************************************************************************/ |
| 54 | class GXmlAttribute : public GBase { | 55 | class GXmlAttribute : public GBase { |
| 55 | 56 | ||
| @@ -68,10 +69,10 @@ public: | @@ -68,10 +69,10 @@ public: | ||
| 68 | GXmlAttribute* clone(void) const; | 69 | GXmlAttribute* clone(void) const; |
| 69 | std::string classname(void) const; | 70 | std::string classname(void) const; |
| 70 | void write(GUrl& url) const; | 71 | void write(GUrl& url) const; |
| 71 | - const std::string& name(void) const { return m_name; } | ||
| 72 | - std::string value(void) const; | ||
| 73 | - void name(const std::string& name) { m_name=name; } | ||
| 74 | - void value(std::string value); | 72 | + const std::string& name(void) const; |
| 73 | + const std::string& value(void) const; | ||
| 74 | + void name(const std::string& name); | ||
| 75 | + void value(const std::string& value); | ||
| 75 | std::string print(const GChatter& chatter = NORMAL) const; | 76 | std::string print(const GChatter& chatter = NORMAL) const; |
| 76 | 77 | ||
| 77 | protected: | 78 | protected: |
| @@ -82,7 +83,7 @@ protected: | @@ -82,7 +83,7 @@ protected: | ||
| 82 | 83 | ||
| 83 | // Protected data members | 84 | // Protected data members |
| 84 | std::string m_name; //!< Attribute name | 85 | std::string m_name; //!< Attribute name |
| 85 | - std::string m_value; //!< Attribute value including hyphens | 86 | + std::string m_value; //!< Attribute value |
| 86 | }; | 87 | }; |
| 87 | 88 | ||
| 88 | 89 | ||
| @@ -97,4 +98,53 @@ std::string GXmlAttribute::classname(void) const | @@ -97,4 +98,53 @@ std::string GXmlAttribute::classname(void) const | ||
| 97 | return ("GXmlAttribute"); | 98 | return ("GXmlAttribute"); |
| 98 | } | 99 | } |
| 99 | 100 | ||
| 101 | + | ||
| 102 | +/***********************************************************************//** | ||
| 103 | + * @brief Return attribute name | ||
| 104 | + * | ||
| 105 | + * @return Attribute name. | ||
| 106 | + ***************************************************************************/ | ||
| 107 | +inline | ||
| 108 | +const std::string& GXmlAttribute::name(void) const | ||
| 109 | +{ | ||
| 110 | + return (m_name); | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | + | ||
| 114 | +/***********************************************************************//** | ||
| 115 | + * @brief Set attribute name | ||
| 116 | + * | ||
| 117 | + * @param[in] name Attribute name. | ||
| 118 | + ***************************************************************************/ | ||
| 119 | +inline | ||
| 120 | +void GXmlAttribute::name(const std::string& name) | ||
| 121 | +{ | ||
| 122 | + m_name = name; | ||
| 123 | + return; | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | + | ||
| 127 | +/***********************************************************************//** | ||
| 128 | + * @brief Return attribute value | ||
| 129 | + * | ||
| 130 | + * @return Attribute value. | ||
| 131 | + ***************************************************************************/ | ||
| 132 | +inline | ||
| 133 | +const std::string& GXmlAttribute::value(void) const | ||
| 134 | +{ | ||
| 135 | + return (m_value); | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +/***********************************************************************//** | ||
| 139 | + * @brief Set attribute value | ||
| 140 | + * | ||
| 141 | + * @param[in] value Attribute value. | ||
| 142 | + ***************************************************************************/ | ||
| 143 | +inline | ||
| 144 | +void GXmlAttribute::value(const std::string& value) | ||
| 145 | +{ | ||
| 146 | + m_value = value; | ||
| 147 | + return; | ||
| 148 | +} | ||
| 149 | + | ||
| 100 | #endif /* GXMLATTRIBUTE_HPP */ | 150 | #endif /* GXMLATTRIBUTE_HPP */ |
include/GXmlDocument.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GXmlDocument.hpp - XML document node class definition * | 2 | * GXmlDocument.hpp - XML document node class definition * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
src/test/GTestSuite.cpp
| @@ -245,7 +245,7 @@ void GTestSuite::append(const pfunction function, const std::string& name) | @@ -245,7 +245,7 @@ void GTestSuite::append(const pfunction function, const std::string& name) | ||
| 245 | /***********************************************************************//** | 245 | /***********************************************************************//** |
| 246 | * @brief Run all tests in test suite | 246 | * @brief Run all tests in test suite |
| 247 | * | 247 | * |
| 248 | - * @return True is all tests were successful, false otherwise. | 248 | + * @return True if all tests were successful, false otherwise. |
| 249 | * | 249 | * |
| 250 | * Executes all test functions that have been appended to the test suite. | 250 | * Executes all test functions that have been appended to the test suite. |
| 251 | * For each test function a test case is added to the test suite. | 251 | * For each test function a test case is added to the test suite. |
| @@ -309,6 +309,7 @@ bool GTestSuite::run(void) | @@ -309,6 +309,7 @@ bool GTestSuite::run(void) | ||
| 309 | { | 309 | { |
| 310 | // For other exceptions | 310 | // For other exceptions |
| 311 | test->has_passed(false); | 311 | test->has_passed(false); |
| 312 | + test->message("Non-standard C++ exception thrown"); | ||
| 312 | } | 313 | } |
| 313 | 314 | ||
| 314 | // Compute elapsed time | 315 | // Compute elapsed time |
src/xml/GXmlAttribute.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GXmlAttribute.cpp - XML attribute class implementation * | 2 | * GXmlAttribute.cpp - XML attribute class implementation * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -28,12 +28,11 @@ | @@ -28,12 +28,11 @@ | ||
| 28 | #ifdef HAVE_CONFIG_H | 28 | #ifdef HAVE_CONFIG_H |
| 29 | #include <config.h> | 29 | #include <config.h> |
| 30 | #endif | 30 | #endif |
| 31 | -#include "GException.hpp" | 31 | +//#include "GException.hpp" |
| 32 | #include "GTools.hpp" | 32 | #include "GTools.hpp" |
| 33 | #include "GXmlAttribute.hpp" | 33 | #include "GXmlAttribute.hpp" |
| 34 | 34 | ||
| 35 | /* __ Method name definitions ____________________________________________ */ | 35 | /* __ Method name definitions ____________________________________________ */ |
| 36 | -#define G_VALUE "GXmlAttribute::value(std::string)" | ||
| 37 | 36 | ||
| 38 | /* __ Macros _____________________________________________________________ */ | 37 | /* __ Macros _____________________________________________________________ */ |
| 39 | 38 | ||
| @@ -85,18 +84,31 @@ GXmlAttribute::GXmlAttribute(const GXmlAttribute& attr) | @@ -85,18 +84,31 @@ GXmlAttribute::GXmlAttribute(const GXmlAttribute& attr) | ||
| 85 | * @param[in] name Attribute name. | 84 | * @param[in] name Attribute name. |
| 86 | * @param[in] value Attribute value. | 85 | * @param[in] value Attribute value. |
| 87 | * | 86 | * |
| 88 | - * Construct attribute form a p@ name and a @p value. Predefined entities | 87 | + * Construct attribute form a @p name and a @p value. Predefined entities |
| 89 | * (e.g. ") in attribute values are automatically converted into normal | 88 | * (e.g. ") in attribute values are automatically converted into normal |
| 90 | - * characters. | 89 | + * characters. The constructor strips any existing " or ' leading and |
| 90 | + * trailing hyphens from the @p value string. | ||
| 91 | ***************************************************************************/ | 91 | ***************************************************************************/ |
| 92 | GXmlAttribute::GXmlAttribute(const std::string& name, const std::string& value) | 92 | GXmlAttribute::GXmlAttribute(const std::string& name, const std::string& value) |
| 93 | { | 93 | { |
| 94 | // Initialise members | 94 | // Initialise members |
| 95 | init_members(); | 95 | init_members(); |
| 96 | 96 | ||
| 97 | + // Create working copy of attribute value | ||
| 98 | + std::string v(value); | ||
| 99 | + | ||
| 100 | + // Strip any pair of leading and trailing hyphens | ||
| 101 | + int n = v.length(); | ||
| 102 | + if (n > 2) { | ||
| 103 | + if (((v[0] == '"') && (v[n-1] == '"')) || | ||
| 104 | + ((v[0] == '\'') && (v[n-1] == '\''))) { | ||
| 105 | + v = v.substr(1, n-2); | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + | ||
| 97 | // Set attribute | 109 | // Set attribute |
| 98 | this->name(name); | 110 | this->name(name); |
| 99 | - this->value(gammalib::xml2str(value)); | 111 | + this->value(gammalib::xml2str(v)); |
| 100 | 112 | ||
| 101 | // Return | 113 | // Return |
| 102 | return; | 114 | return; |
| @@ -195,11 +207,8 @@ GXmlAttribute* GXmlAttribute::clone(void) const | @@ -195,11 +207,8 @@ GXmlAttribute* GXmlAttribute::clone(void) const | ||
| 195 | ***************************************************************************/ | 207 | ***************************************************************************/ |
| 196 | void GXmlAttribute::write(GUrl& url) const | 208 | void GXmlAttribute::write(GUrl& url) const |
| 197 | { | 209 | { |
| 198 | - // Get value without quotation marks | ||
| 199 | - std::string value = m_value.substr(1, m_value.length()-2); | ||
| 200 | - | ||
| 201 | - // Convert value to XML format | ||
| 202 | - value = "\""+gammalib::str2xml(value)+"\""; | 210 | + // Convert value into XML format and add hyphens |
| 211 | + std::string value = "\""+gammalib::str2xml(m_value)+"\""; | ||
| 203 | 212 | ||
| 204 | // Write attribute into URL | 213 | // Write attribute into URL |
| 205 | url.printf(" %s=%s", m_name.c_str(), value.c_str()); | 214 | url.printf(" %s=%s", m_name.c_str(), value.c_str()); |
| @@ -212,7 +221,7 @@ void GXmlAttribute::write(GUrl& url) const | @@ -212,7 +221,7 @@ void GXmlAttribute::write(GUrl& url) const | ||
| 212 | /***********************************************************************//** | 221 | /***********************************************************************//** |
| 213 | * @brief Print element attribute | 222 | * @brief Print element attribute |
| 214 | * | 223 | * |
| 215 | - * @param[in] chatter Chattiness (defaults to NORMAL). | 224 | + * @param[in] chatter Chattiness. |
| 216 | * @return String containing element attribute. | 225 | * @return String containing element attribute. |
| 217 | ***************************************************************************/ | 226 | ***************************************************************************/ |
| 218 | std::string GXmlAttribute::print(const GChatter& chatter) const | 227 | std::string GXmlAttribute::print(const GChatter& chatter) const |
| @@ -224,7 +233,7 @@ std::string GXmlAttribute::print(const GChatter& chatter) const | @@ -224,7 +233,7 @@ std::string GXmlAttribute::print(const GChatter& chatter) const | ||
| 224 | if (chatter != SILENT) { | 233 | if (chatter != SILENT) { |
| 225 | 234 | ||
| 226 | // Append attribute to string | 235 | // Append attribute to string |
| 227 | - result.append(" "+m_name+"="+m_value); | 236 | + result.append(" "+m_name+"=\""+m_value+"\""); |
| 228 | 237 | ||
| 229 | } // endif: chatter was not silent | 238 | } // endif: chatter was not silent |
| 230 | 239 | ||
| @@ -233,104 +242,6 @@ std::string GXmlAttribute::print(const GChatter& chatter) const | @@ -233,104 +242,6 @@ std::string GXmlAttribute::print(const GChatter& chatter) const | ||
| 233 | } | 242 | } |
| 234 | 243 | ||
| 235 | 244 | ||
| 236 | -/***********************************************************************//** | ||
| 237 | - * @brief Returns attribute value | ||
| 238 | - * | ||
| 239 | - * @return String containing the attribute value without hyphens. | ||
| 240 | - * | ||
| 241 | - * Returns the attribute value by stripping the hyphens. | ||
| 242 | - ***************************************************************************/ | ||
| 243 | -std::string GXmlAttribute::value(void) const | ||
| 244 | -{ | ||
| 245 | - // Initialise attribute value | ||
| 246 | - std::string value = ""; | ||
| 247 | - | ||
| 248 | - // Extract value by stripping hyphens | ||
| 249 | - int n = m_value.length(); | ||
| 250 | - if (n > 2) { | ||
| 251 | - value = m_value.substr(1, n-2); | ||
| 252 | - } | ||
| 253 | - | ||
| 254 | - // Return value | ||
| 255 | - return value; | ||
| 256 | -} | ||
| 257 | - | ||
| 258 | - | ||
| 259 | -/***********************************************************************//** | ||
| 260 | - * @brief Set attribute value | ||
| 261 | - * | ||
| 262 | - * @param[in] value Attribute value. | ||
| 263 | - * | ||
| 264 | - * @exception GException::xml_attribute_value | ||
| 265 | - * Invalid XML attribute value. | ||
| 266 | - * | ||
| 267 | - * Sets the value of the attribute. The method automatically adds the proper | ||
| 268 | - * hyphens to the value string if they do not exist. | ||
| 269 | - ***************************************************************************/ | ||
| 270 | -void GXmlAttribute::value(std::string value) | ||
| 271 | -{ | ||
| 272 | - // Get length of value string | ||
| 273 | - int n = value.length(); | ||
| 274 | - | ||
| 275 | - // Count hyphens and signal their presence at start/end | ||
| 276 | - int n_hyphens1 = 0; | ||
| 277 | - int n_hyphens2 = 0; | ||
| 278 | - bool has_hyphens1 = (n >= 2 && value[0] == '\'' && value[n-1] == '\''); | ||
| 279 | - bool has_hyphens2 = (n >= 2 && value[0] == '"' && value[n-1] == '"'); | ||
| 280 | - for (int i = 0; i < n; ++i) { | ||
| 281 | - if (value[i] == '\'') n_hyphens1++; | ||
| 282 | - if (value[i] == '"') n_hyphens2++; | ||
| 283 | - } | ||
| 284 | - | ||
| 285 | - // Case A: value has ' start and end hyphens. Keep value as is if no other | ||
| 286 | - // ' hyphens are found. Otherwise, if more than 2 ' but no " hyphen is found | ||
| 287 | - // then enclose the value in " hyphens. Finally, if more than 2 ' and at | ||
| 288 | - // least one " hyphen is found we have an invalid value and throw an | ||
| 289 | - // exception. | ||
| 290 | - if (has_hyphens1) { | ||
| 291 | - if (n_hyphens1 > 2 && n_hyphens2 == 0) { | ||
| 292 | - value = "\"" + value + "\""; | ||
| 293 | - } | ||
| 294 | - else if (n_hyphens1 > 2 && n_hyphens2 > 0) { | ||
| 295 | - throw GException::xml_attribute_value(G_VALUE, value); | ||
| 296 | - } | ||
| 297 | - } | ||
| 298 | - | ||
| 299 | - // Case B: value has " start and end hyphens. Keep value as is if no other | ||
| 300 | - // " hyphens are found. Otherwise, if more than 2 " but no ' hyphen is found | ||
| 301 | - // then enclose the value in ' hyphens. Finally, if more than 2 " and at | ||
| 302 | - // least one ' hyphen is found we have an invalid value and throw an | ||
| 303 | - // exception. | ||
| 304 | - else if (has_hyphens2) { | ||
| 305 | - if (n_hyphens1 == 0 && n_hyphens2 > 2) { | ||
| 306 | - value = "'" + value + "'"; | ||
| 307 | - } | ||
| 308 | - else if (n_hyphens1 > 0 && n_hyphens2 > 2) { | ||
| 309 | - throw GException::xml_attribute_value(G_VALUE, value); | ||
| 310 | - } | ||
| 311 | - } | ||
| 312 | - | ||
| 313 | - // Case C: value has no start and end hyphens. | ||
| 314 | - else { | ||
| 315 | - if (n_hyphens1 >= 0 && n_hyphens2 == 0) { | ||
| 316 | - value = "\"" + value + "\""; | ||
| 317 | - } | ||
| 318 | - else if (n_hyphens1 == 0 && n_hyphens2 > 0) { | ||
| 319 | - value = "'" + value + "'"; | ||
| 320 | - } | ||
| 321 | - else { | ||
| 322 | - throw GException::xml_attribute_value(G_VALUE, value); | ||
| 323 | - } | ||
| 324 | - } | ||
| 325 | - | ||
| 326 | - // Set value | ||
| 327 | - m_value = value; | ||
| 328 | - | ||
| 329 | - // Return | ||
| 330 | - return; | ||
| 331 | -} | ||
| 332 | - | ||
| 333 | - | ||
| 334 | /*========================================================================== | 245 | /*========================================================================== |
| 335 | = = | 246 | = = |
| 336 | = Private methods = | 247 | = Private methods = |
src/xml/GXmlDocument.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GXmlDocument.cpp - XML document node class implementation * | 2 | * GXmlDocument.cpp - XML document node class implementation * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2013 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -175,10 +175,11 @@ GXmlDocument* GXmlDocument::clone(void) const | @@ -175,10 +175,11 @@ GXmlDocument* GXmlDocument::clone(void) const | ||
| 175 | void GXmlDocument::write(GUrl& url, const int& indent) const | 175 | void GXmlDocument::write(GUrl& url, const int& indent) const |
| 176 | { | 176 | { |
| 177 | // Write document header into URL | 177 | // Write document header into URL |
| 178 | - url.printf("<?xml version=\"%s\" encoding=\"%s\" standalone=\"%s\"?>\n", | ||
| 179 | - version().c_str(), | ||
| 180 | - encoding().c_str(), | ||
| 181 | - standalone().c_str()); | 178 | + url.printf("<?xml"); |
| 179 | + m_version.write(url); | ||
| 180 | + m_encoding.write(url); | ||
| 181 | + m_standalone.write(url); | ||
| 182 | + url.printf("?>\n"); | ||
| 182 | 183 | ||
| 183 | // Write children into URL | 184 | // Write children into URL |
| 184 | for (int i = 0; i < m_nodes.size(); ++i) { | 185 | for (int i = 0; i < m_nodes.size(); ++i) { |
| @@ -211,9 +212,9 @@ std::string GXmlDocument::print(const GChatter& chatter, | @@ -211,9 +212,9 @@ std::string GXmlDocument::print(const GChatter& chatter, | ||
| 211 | 212 | ||
| 212 | // Append document to string | 213 | // Append document to string |
| 213 | result.append("GXmlDocument::"); | 214 | result.append("GXmlDocument::"); |
| 214 | - result.append("version=" + version()); | ||
| 215 | - result.append(" encoding=" + encoding()); | ||
| 216 | - result.append(" standalone=" + standalone()); | 215 | + result.append("version=\"" + version() +"\""); |
| 216 | + result.append(" encoding=\"" + encoding() +"\""); | ||
| 217 | + result.append(" standalone=\"" + standalone() +"\""); | ||
| 217 | 218 | ||
| 218 | // Append children | 219 | // Append children |
| 219 | for (int i = 0; i < m_nodes.size(); ++i) { | 220 | for (int i = 0; i < m_nodes.size(); ++i) { |
| @@ -244,10 +245,10 @@ void GXmlDocument::init_members(void) | @@ -244,10 +245,10 @@ void GXmlDocument::init_members(void) | ||
| 244 | m_standalone.clear(); | 245 | m_standalone.clear(); |
| 245 | m_version.name("version"); | 246 | m_version.name("version"); |
| 246 | m_encoding.name("encoding"); | 247 | m_encoding.name("encoding"); |
| 247 | - m_standalone.name("m_standalone"); | ||
| 248 | - m_version.value("\"1.0\""); | ||
| 249 | - m_encoding.value("\"UTF-8\""); | ||
| 250 | - m_standalone.value("\"no\""); | 248 | + m_standalone.name("standalone"); |
| 249 | + m_version.value("1.0"); | ||
| 250 | + m_encoding.value("UTF-8"); | ||
| 251 | + m_standalone.value("no"); | ||
| 251 | 252 | ||
| 252 | // Return | 253 | // Return |
| 253 | return; | 254 | return; |
test/test_GXml.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * test_GXml.cpp - Test xml module * | 2 | * test_GXml.cpp - Test xml module * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -44,11 +44,16 @@ void TestGXml::set(void) | @@ -44,11 +44,16 @@ void TestGXml::set(void) | ||
| 44 | m_xml_file = "data/test.xml"; | 44 | m_xml_file = "data/test.xml"; |
| 45 | 45 | ||
| 46 | // Append tests | 46 | // Append tests |
| 47 | - append(static_cast<pfunction>(&TestGXml::test_GXml_attributes), "Test XML attributes"); | ||
| 48 | - append(static_cast<pfunction>(&TestGXml::test_GXml_elements), "Test XML elements"); | ||
| 49 | - append(static_cast<pfunction>(&TestGXml::test_GXml_construct),"Test XML constructors"); | ||
| 50 | - append(static_cast<pfunction>(&TestGXml::test_GXml_load),"Test XML load"); | ||
| 51 | - append(static_cast<pfunction>(&TestGXml::test_GXml_access), "Test XML access"); | 47 | + append(static_cast<pfunction>(&TestGXml::test_GXml_attributes), |
| 48 | + "Test XML attributes"); | ||
| 49 | + append(static_cast<pfunction>(&TestGXml::test_GXml_elements), | ||
| 50 | + "Test XML elements"); | ||
| 51 | + append(static_cast<pfunction>(&TestGXml::test_GXml_construct), | ||
| 52 | + "Test XML constructors"); | ||
| 53 | + append(static_cast<pfunction>(&TestGXml::test_GXml_load), | ||
| 54 | + "Test XML load"); | ||
| 55 | + append(static_cast<pfunction>(&TestGXml::test_GXml_access), | ||
| 56 | + "Test XML access"); | ||
| 52 | 57 | ||
| 53 | // Return | 58 | // Return |
| 54 | return; | 59 | return; |
| @@ -68,94 +73,38 @@ TestGXml* TestGXml::clone(void) const | @@ -68,94 +73,38 @@ TestGXml* TestGXml::clone(void) const | ||
| 68 | 73 | ||
| 69 | 74 | ||
| 70 | /***********************************************************************//** | 75 | /***********************************************************************//** |
| 71 | - * @brief Test XML arrtibutes | 76 | + * @brief Test XML attributes |
| 72 | **************************************************************************/ | 77 | **************************************************************************/ |
| 73 | void TestGXml::test_GXml_attributes(void) | 78 | void TestGXml::test_GXml_attributes(void) |
| 74 | { | 79 | { |
| 75 | - // Test valid attributes | ||
| 76 | - test_try("Test valid attributes"); | ||
| 77 | - try { | ||
| 78 | - GXmlAttribute attr("test", "1.0"); | ||
| 79 | - test_assert(attr.value() == "1.0","Test if value()= 1.0","Unexpected attribute "+attr.value()); | ||
| 80 | - | ||
| 81 | - attr.value("\"1.0\""); | ||
| 82 | - test_assert(attr.value() == "1.0","Test if value()= 1.0","Unexpected attribute "+attr.value()); | ||
| 83 | - | ||
| 84 | - attr.value("'1.0'"); | ||
| 85 | - test_assert(attr.value() == "1.0","Test if value()= 1.0","Unexpected attribute "+attr.value()); | ||
| 86 | - | ||
| 87 | - attr.value("''1.0'"); | ||
| 88 | - test_assert(attr.value() == "''1.0'", | ||
| 89 | - "Test if value()= ''1.0'", | ||
| 90 | - "Unexpected attribute "+attr.value()); | ||
| 91 | - | ||
| 92 | - attr.value("'1.0"); | ||
| 93 | - test_assert(attr.value() == "'1.0", | ||
| 94 | - "Test if value()= '1.0", | ||
| 95 | - "Unexpected attribute "+attr.value()); | ||
| 96 | - | ||
| 97 | - attr.value("1.0'"); | ||
| 98 | - test_assert(attr.value() == "1.0'", | ||
| 99 | - "Test if value()= 1.0'", | ||
| 100 | - "Unexpected attribute "+attr.value()); | ||
| 101 | - | ||
| 102 | - attr.value("\"1.0"); | ||
| 103 | - test_assert(attr.value() == "\"1.0", | ||
| 104 | - "Test if value()= \"1.0", | ||
| 105 | - "Unexpected attribute "+attr.value()); | ||
| 106 | - | ||
| 107 | - | ||
| 108 | - attr.value("1.0\""); | ||
| 109 | - test_assert(attr.value() == "1.0\"", | ||
| 110 | - "Test if value()= 1.0\"", | ||
| 111 | - "Unexpected attribute "+attr.value()); | ||
| 112 | - | ||
| 113 | - attr.value("\"\"1.0\""); | ||
| 114 | - test_assert(attr.value() == "\"\"1.0\"", | ||
| 115 | - "Test if value()= \"\"1.0\"", | ||
| 116 | - "Unexpected attribute "+attr.value()); | ||
| 117 | - test_try_success(); | ||
| 118 | - } | ||
| 119 | - catch (std::exception &e) { | ||
| 120 | - test_try_failure(e); | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - // Test invalid attributes | ||
| 124 | - test_try("Test invalid attributes 1"); | ||
| 125 | - try { | ||
| 126 | - GXmlAttribute attr("test", "\"\"1.0'\""); | ||
| 127 | - test_try_failure(); | ||
| 128 | - } | ||
| 129 | - catch (GException::xml_attribute_value &e) { | ||
| 130 | - test_try_success(); | ||
| 131 | - } | ||
| 132 | - catch (std::exception &e) { | ||
| 133 | - test_try_failure(e); | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - test_try("Test invalid attributes 2"); | ||
| 137 | - try { | ||
| 138 | - GXmlAttribute attr("test", "''1.0\""); | ||
| 139 | - test_try_failure(); | ||
| 140 | - } | ||
| 141 | - catch (GException::xml_attribute_value &e) { | ||
| 142 | - test_try_success(); | ||
| 143 | - } | ||
| 144 | - catch (std::exception &e) { | ||
| 145 | - test_try_failure(e); | ||
| 146 | - } | ||
| 147 | - | ||
| 148 | - test_try("Test invalid attributes 3"); | ||
| 149 | - try { | ||
| 150 | - GXmlAttribute attr("test", "\"1.0'"); | ||
| 151 | - test_try_failure(); | ||
| 152 | - } | ||
| 153 | - catch (GException::xml_attribute_value &e) { | ||
| 154 | - test_try_success(); | ||
| 155 | - } | ||
| 156 | - catch (std::exception &e) { | ||
| 157 | - test_try_failure(e); | ||
| 158 | - } | 80 | + // Test attribute name-value constructors |
| 81 | + GXmlAttribute attr1("test", "1.0"); | ||
| 82 | + test_assert(attr1.value() == "1.0", "Test if value()= 1.0", | ||
| 83 | + "Unexpected attribute "+attr1.value()); | ||
| 84 | + GXmlAttribute attr2("test", "\"1.0\""); | ||
| 85 | + test_assert(attr2.value() == "1.0", "Test if value()= 1.0", | ||
| 86 | + "Unexpected attribute "+attr2.value()); | ||
| 87 | + GXmlAttribute attr3("test", "'1.0'"); | ||
| 88 | + test_assert(attr3.value() == "1.0", "Test if value()= 1.0", | ||
| 89 | + "Unexpected attribute "+attr3.value()); | ||
| 90 | + GXmlAttribute attr4("test", "''1.0'"); | ||
| 91 | + test_assert(attr4.value() == "'1.0", "Test if value()= '1.0", | ||
| 92 | + "Unexpected attribute "+attr4.value()); | ||
| 93 | + GXmlAttribute attr5("test", "'1.0"); | ||
| 94 | + test_assert(attr5.value() == "'1.0", "Test if value()= '1.0", | ||
| 95 | + "Unexpected attribute "+attr5.value()); | ||
| 96 | + GXmlAttribute attr6("test", "1.0'"); | ||
| 97 | + test_assert(attr6.value() == "1.0'", "Test if value()= 1.0'", | ||
| 98 | + "Unexpected attribute "+attr6.value()); | ||
| 99 | + GXmlAttribute attr7("test", "\"1.0"); | ||
| 100 | + test_assert(attr7.value() == "\"1.0", "Test if value()= \"1.0", | ||
| 101 | + "Unexpected attribute "+attr7.value()); | ||
| 102 | + GXmlAttribute attr8("test", "1.0\""); | ||
| 103 | + test_assert(attr8.value() == "1.0\"", "Test if value()= 1.0\"", | ||
| 104 | + "Unexpected attribute "+attr8.value()); | ||
| 105 | + GXmlAttribute attr9("test", "\"\"1.0\""); | ||
| 106 | + test_assert(attr9.value() == "\"1.0", "Test if value()= \"1.0", | ||
| 107 | + "Unexpected attribute "+attr9.value()); | ||
| 159 | 108 | ||
| 160 | // Return | 109 | // Return |
| 161 | return; | 110 | return; |