
#include "catch.hpp"

#include <mapnik/xml_tree.hpp>
#include <mapnik/xml_loader.hpp>
#include <mapnik/attribute.hpp> // needed due to fwd declare in value_types.hpp

TEST_CASE("xml parser") {

  SECTION("trims whitespace") {

    // simple and non-valid mapnik XML reduced from the empty_parameter2.xml
    // test case. this is to check that the xml parsing routine is trimming
    // whitespace from text nodes as part of the parsing operation.
    const std::string xml("<Map>"
                          "  <Layer>"
                          "    <Datasource>"
                          "      <Parameter name=\"empty\"><![CDATA[ ]]></Parameter>"
                          "    </Datasource>"
                          "  </Layer>"
                          "</Map>");

    mapnik::xml_tree tree;
    tree.set_filename("xml_datasource_parameter_trim.cpp");
    REQUIRE_NOTHROW(read_xml_string(xml, tree.root(), ""));

    REQUIRE(tree.root().has_child("Map"));
    mapnik::xml_node const &map = tree.root().get_child("Map");

    REQUIRE(map.has_child("Layer"));
    mapnik::xml_node const &layer = map.get_child("Layer");

    REQUIRE(layer.has_child("Datasource"));
    mapnik::xml_node const &datasource = layer.get_child("Datasource");

    REQUIRE(datasource.has_child("Parameter"));
    mapnik::xml_node const &parameter = datasource.get_child("Parameter");

    // parser should call mapnik::util::trim on the text content and
    // this should result in an empty text string in the parameter.
    REQUIRE(parameter.get_text() == "");
  }
}

