Method configure takes const xmlNode pointer. Added testfilter2_2 which
authorAdam Dickmeiss <adam@indexdata.dk>
Mon, 24 Oct 2005 09:53:06 +0000 (09:53 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Mon, 24 Oct 2005 09:53:06 +0000 (09:53 +0000)
tests this facility.

src/filter.hpp
src/test_filter2.cpp

index 45846f8..8f053b5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: filter.hpp,v 1.5 2005-10-16 16:05:44 adam Exp $
+/* $Id: filter.hpp,v 1.6 2005-10-24 09:53:06 adam Exp $
    Copyright (c) 2005, Index Data.
 
 %LICENSE%
@@ -8,6 +8,7 @@
 #define FILTER_HPP
 
 #include <stdexcept>
+#include <libxml/tree.h>
 
 namespace yp2 {
 
@@ -21,7 +22,7 @@ namespace yp2 {
             ///sends Package off to next Filter, returns altered Package
             virtual void process(Package & package) const = 0;
 
-            virtual void configure(){};
+            virtual void configure(const xmlNode * ptr = 0) { } ;
             
             /// get function - right val in assignment
             std::string name() const {
index 4b70368..3313d54 100644 (file)
@@ -1,9 +1,11 @@
-/* $Id: test_filter2.cpp,v 1.9 2005-10-15 14:09:09 adam Exp $
+/* $Id: test_filter2.cpp,v 1.10 2005-10-24 09:53:06 adam Exp $
    Copyright (c) 2005, Index Data.
 
 %LICENSE%
  */
 
+#include <libxml/parser.h>
+#include <libxml/tree.h>
 
 #include "config.hpp"
 #include "filter.hpp"
@@ -24,9 +26,81 @@ public:
        package.data() = 1234;
        package.move();
     };
+    void configure(const xmlNode* ptr = 0) {
+        m_ptr = ptr;
+
+        BOOST_CHECK_EQUAL (ptr->type, XML_ELEMENT_NODE);
+        BOOST_CHECK_EQUAL(std::string((const char *) ptr->name), "filter");
+
+        const struct _xmlAttr *attr;
+
+        for (attr = ptr->properties; attr; attr = attr->next)
+        {
+            BOOST_CHECK_EQUAL( std::string((const char *)attr->name), "type");
+            const xmlNode *val = attr->children;
+            BOOST_CHECK_EQUAL(val->type, XML_TEXT_NODE);
+            BOOST_CHECK_EQUAL(std::string((const char *)val->content), "constant");
+        }
+        const xmlNode *p = ptr->children;
+        for (; p; p = p->next)
+        {
+            if (p->type != XML_ELEMENT_NODE)
+                continue;
+
+            BOOST_CHECK_EQUAL (p->type, XML_ELEMENT_NODE);
+            BOOST_CHECK_EQUAL(std::string((const char *) p->name), "value");
+
+            const xmlNode *val = p->children;
+            BOOST_CHECK(val);
+            if (!val)
+                continue;
+
+            BOOST_CHECK_EQUAL(val->type, XML_TEXT_NODE);
+            BOOST_CHECK_EQUAL(std::string((const char *)val->content), "2");
+        }
+    }
+private:
+    bool parse_xml_text(const xmlNode *xml_ptr, bool &val);
+    bool parse_xml_text(const xmlNode *xml_ptr, std::string &val);
+private:
+    const xmlNode *m_ptr;
 };
 
 
+bool FilterConstant::parse_xml_text(const xmlNode  *xml_ptr, bool &val)
+{
+    std::string v;
+    if (!parse_xml_text(xml_ptr, v))
+        return false;
+    if (v.length() == 1 && v[0] == '1')
+        val = true;
+    else
+        val = false;
+    return true;
+}
+
+bool FilterConstant::parse_xml_text(const xmlNode *xml_ptr, std::string &val)
+{
+    xmlNodePtr ptr = (xmlNodePtr) xml_ptr;
+    bool found = false;
+    std::string v;
+    for(ptr = ptr->children; ptr; ptr = ptr->next)
+        if (ptr->type == XML_TEXT_NODE)
+        {
+            xmlChar *t = ptr->content;
+            if (t)
+            {
+                v += (const char *) t;
+                found = true;
+            }
+        }
+    if (found)
+        val = v;
+    return found;
+}
+
+// This filter dose not have a configure function
+    
 class FilterDouble: public yp2::filter::Base {
 public:
     void process(yp2::Package & package) const {
@@ -34,9 +108,9 @@ public:
        package.move();
     };
 };
+
     
-    
-BOOST_AUTO_TEST_CASE( testfilter2 ) 
+BOOST_AUTO_TEST_CASE( testfilter2_1 ) 
 {
     try {
        FilterConstant fc;
@@ -89,6 +163,42 @@ BOOST_AUTO_TEST_CASE( testfilter2 )
 
 }
 
+
+BOOST_AUTO_TEST_CASE( testfilter2_2 ) 
+{
+    try {
+       FilterConstant fc;
+
+        std::string some_xml = "<?xml version=\"1.0\"?>\n"
+            "<filter type=\"constant\">\n"
+            " <value>2</value>\n"
+            "</filter>";
+        
+        std::cout << some_xml  << std::endl;
+
+        xmlDocPtr doc = xmlParseMemory(some_xml.c_str(), some_xml.size());
+
+        BOOST_CHECK(doc);
+
+        if (doc)
+        {
+            xmlNodePtr root_element = xmlDocGetRootElement(doc);
+            
+            fc.configure(root_element);
+            
+            FilterDouble fd;
+        }
+    }
+    catch (std::exception &e) {
+        std::cout << e.what() << "\n";
+        BOOST_CHECK (false);
+    }
+    catch ( ...) {
+        BOOST_CHECK (false);
+    }
+
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4