#ifndef XPATHIC_MATCH_TEST_HPP #define XPATHIC_MATCH_TEST_HPP #include "../CppUnit/framework/TestCase.h" #include "../CppUnit/framework/TestSuite.h" #include "../CppUnit/framework/TestCaller.h" #include #include #include template class MatchTest : public TestCase { Arabica::XPath::XPath parser; typedef string_adaptor SA; public: MatchTest(std::string name) : TestCase(name) { } // MatchTest void setUp() { } // setUp void testParse() { using namespace Arabica::XPath; assertTrue(compileThis("/")); assertTrue(compileThis("/element")); assertTrue(compileThis("//element")); assertTrue(compileThis("node()")); assertTrue(compileThis("text()")); assertTrue(compileThis("element")); assertTrue(compileThis("element/child")); assertTrue(compileThis("/element/child")); assertTrue(compileThis("//element/child")); assertTrue(compileThis("/element//child")); assertTrue(compileThis("//element//child")); assertTrue(compileThis("element/child/child")); assertTrue(compileThis("/element/child/child")); assertTrue(compileThis("//element/child/child")); assertTrue(compileThis("/element//child/child")); assertTrue(compileThis("//element//child/child")); assertTrue(compileThis("//element//child//child")); assertTrue(compileThis("element[@ref]")); assertTrue(compileThis("element[@type]|element[complexType]|attribute")); assertTrue(compileThis("node()|@*")); assertTrue(compileThis("hello")); assertTrue(compileThis("doc")); assertTrue(compileThis("@hello")); assertTrue(compileThis("child::hello")); assertTrue(compileThis("attribute::hello")); assertTrue(compileThis("hello[@ref]")); assertTrue(compileThis("@hello[../poop]")); assertTrue(compileThis("child::hello[../poop]")); assertTrue(compileThis("attribute::hello[../poop]")); assertTrue(compileThis("node()|attribute::*")); } // testParse void testParseFails() { using namespace Arabica::XPath; assertTrue(dontCompileThis("boolean(../hello)")); assertTrue(dontCompileThis("../hello")); assertTrue(dontCompileThis("following-sibling::hello")); assertTrue(dontCompileThis("descendant::hello")); assertTrue(dontCompileThis("ancestor-or-self::hello")); assertTrue(dontCompileThis("///")); assertTrue(dontCompileThis("test///test")); assertTrue(dontCompileThis("descendant-or-self::element")); assertTrue(dontCompileThis("//element/following-sibling::trousers")); } // testParseFails void testEvaluateDocMatch() { DOM::Document doc = parseXML("hello"); assertTrue(compileMatch("/")->evaluateAsBool(doc)); } // testEvaluateDocMatch void testDocElementMatch() { DOM::Document doc = parseXML("hello"); assertTrue(compileMatch("doc")->evaluateAsBool(doc.getDocumentElement())); assertTrue(compileMatch("doc[para]")->evaluateAsBool(doc.getDocumentElement())); assertTrue(compileMatch("*")->evaluateAsBool(doc.getDocumentElement())); assertTrue(compileMatch("node()")->evaluateAsBool(doc.getDocumentElement())); assertTrue(compileMatch("/doc")->evaluateAsBool(doc.getDocumentElement())); assertTrue(compileMatch("//doc")->evaluateAsBool(doc.getDocumentElement())); } // testDocElementMatch void testDocElementNotMatch() { DOM::Document doc = parseXML("hello"); assertFalse(compileMatch("para")->evaluateAsBool(doc.getDocumentElement())); assertFalse(compileMatch("text()")->evaluateAsBool(doc.getDocumentElement())); assertFalse(compileMatch("comment()")->evaluateAsBool(doc.getDocumentElement())); assertFalse(compileMatch("processing-instruction()")->evaluateAsBool(doc.getDocumentElement())); assertFalse(compileMatch("/para")->evaluateAsBool(doc.getDocumentElement())); assertFalse(compileMatch("//para")->evaluateAsBool(doc.getDocumentElement())); } // testDocElementNotMatch bool dontCompileThis(const char* path) { try { compileMatch(path); return false; } catch(const Arabica::XPath::SyntaxException& ex) { std::cerr << ex.what() << std::endl; } return true; } // dontCompileThis bool compileThis(const char* path) { try { std::cout << "\n-----\n" << path << "\n"; compileMatch(path); return true; } catch(const Arabica::XPath::UnsupportedException&) { return true; } catch(const Arabica::XPath::SyntaxException& ex) { std::cerr << ex.what() << std::endl; } return false; } // compileThis Arabica::XPath::XPathExpressionPtr compileMatch(const char* match) { return parser.compile_match(SA::construct_from_utf8(match)); } // compileMatch DOM::Document parseXML(const char* match) { std::stringstream ss; ss << match; SAX::basic_InputSource is(ss); SAX::CatchErrorHandler eh; SAX2DOM::Parser parser; parser.setErrorHandler(eh); parser.parse(is); if(eh.errorsReported()) throw std::runtime_error(eh.errors()); return parser.getDocument(); } // parse }; // class MatchTest template TestSuite* MatchTest_suite() { TestSuite *suiteOfTests = new TestSuite; suiteOfTests->addTest(new TestCaller >("testParse", &MatchTest::testParse)); suiteOfTests->addTest(new TestCaller >("testParseFail", &MatchTest::testParseFails)); suiteOfTests->addTest(new TestCaller >("testEvaluateDocMatch", &MatchTest::testEvaluateDocMatch)); suiteOfTests->addTest(new TestCaller >("testDocElementMatch", &MatchTest::testDocElementMatch)); suiteOfTests->addTest(new TestCaller >("testDocElementNotMatch", &MatchTest::testDocElementNotMatch)); return suiteOfTests; } // MatchTest_suite #endif