diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-04-22 14:02:03 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-04-22 14:02:03 (GMT) |
commit | 1fb6bcf30f954e426f2d3002d14887574fb941dd (patch) | |
tree | 08cff7f2b879c50efe79e3c04d255075522af862 /test/src | |
parent | 71c334bf4e35559496feac3f3cf00b72ceb88812 (diff) | |
download | uscxml-1fb6bcf30f954e426f2d3002d14887574fb941dd.zip uscxml-1fb6bcf30f954e426f2d3002d14887574fb941dd.tar.gz uscxml-1fb6bcf30f954e426f2d3002d14887574fb941dd.tar.bz2 |
Major refactoring
- Moved tests
- Changes to promela datamodel
- Implemented Trie
Diffstat (limited to 'test/src')
-rw-r--r-- | test/src/test-arabica-namespaces.cpp | 221 | ||||
-rw-r--r-- | test/src/test-promela-parser.cpp | 89 | ||||
-rw-r--r-- | test/src/test-trie.cpp | 92 | ||||
-rw-r--r-- | test/src/test-w3c.cpp | 16 |
4 files changed, 366 insertions, 52 deletions
diff --git a/test/src/test-arabica-namespaces.cpp b/test/src/test-arabica-namespaces.cpp new file mode 100644 index 0000000..baebeee --- /dev/null +++ b/test/src/test-arabica-namespaces.cpp @@ -0,0 +1,221 @@ +#include <iostream> + +#include "uscxml/config.h" +#include "uscxml/Common.h" +#include <DOM/Document.hpp> +#include <XPath/XPath.hpp> +#include <DOM/SAX2DOM/SAX2DOM.hpp> +#include <DOM/io/Stream.hpp> +#include "uscxml/Interpreter.h" +#include "uscxml/DOMUtils.h" + +using namespace Arabica::DOM; +using namespace Arabica::XPath; +using namespace uscxml; + +#define VALIDATE \ +std::pair<Document<std::string>, NameSpaceInfo> parsed = parse(xmlSS.str());\ +Document<std::string> origDoc = parsed.first;\ +NameSpaceInfo origNS = parsed.second;\ +validateRootFoo(parsed);\ +insertBar(parsed);\ +std::cout << parsed.first << std::endl;\ +validateRootFooBar(parsed);\ +parsed = cloneDocument(parsed);\ +insertBaz(parsed);\ +std::cout << parsed.first << std::endl;\ +validateRootFooBarBaz(parsed);\ +assert(Interpreter::filterChildElements(origNS.xmlNSPrefix + "bar", origDoc.getDocumentElement()).size() == 3);\ +assert(Interpreter::filterChildElements(origNS.xmlNSPrefix + "baz", origDoc.getDocumentElement()).size() == 0); + + +/** + Test DOM manipulations and document cloning with different namespace scenarios + */ + +static std::string testPath; +static Arabica::XPath::XPath<std::string> _xpath; + +std::pair<Document<std::string>, NameSpaceInfo> parse(const std::string xmlString) { + NameSpacingParser parser = NameSpacingParser::fromXML(xmlString); + if (parser.errorsReported()) + assert(false); + return std::make_pair(parser.getDocument(), parser.nameSpace); +} + +std::pair<Document<std::string>, NameSpaceInfo> cloneDocument(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Document<std::string> clonedDocument; + DOMImplementation<std::string> domFactory = Arabica::SimpleDOM::DOMImplementation<std::string>::getDOMImplementation(); + clonedDocument = domFactory.createDocument(document.getNamespaceURI(), "", 0); + + Node<std::string> child = document.getFirstChild(); + while (child) { + Node<std::string> newNode = clonedDocument.importNode(child, true); + clonedDocument.appendChild(newNode); + child = child.getNextSibling(); + } + + return std::make_pair(clonedDocument, nsInfo); +} + +void insertBar(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Node<std::string> root = document.getDocumentElement(); + for (int i = 0; i < 3; i++) { + Element<std::string> bar = document.createElementNS(nsInfo.nsURL, "bar"); +// if (nsInfo.nsToPrefix.find(nsInfo.nsURL) != nsInfo.nsToPrefix.end()) + nsInfo.setPrefix(bar); + root.appendChild(bar); + } +} + +void insertBaz(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Node<std::string> root = document.getDocumentElement(); + for (int i = 0; i < 3; i++) { + Element<std::string> baz = document.createElementNS(nsInfo.nsURL, "baz"); + nsInfo.setPrefix(baz); + root.appendChild(baz); + } +} + +static void validateRootFoo(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Node<std::string> root = document.getDocumentElement(); + _xpath.setNamespaceContext(*nsInfo.nsContext); + + assert(TAGNAME(root) == nsInfo.xmlNSPrefix + "root"); + assert(LOCALNAME(root) == "root"); + NodeSet<std::string> foosFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "foo", root); + assert(foosFiltered.size() == 3); + NodeSet<std::string> foosXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "foo", root).asNodeSet(); + assert(foosXPath.size() == 3); + + for (int i = 0; i < 3; i++) { + assert(foosFiltered[i] == foosXPath[i]); + assert(TAGNAME(foosFiltered[i]) == nsInfo.xmlNSPrefix + "foo"); + assert(LOCALNAME(foosFiltered[i]) == "foo"); + } + +} + +static void validateRootFooBar(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + validateRootFoo(parsed); + + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Node<std::string> root = document.getDocumentElement(); + _xpath.setNamespaceContext(*nsInfo.nsContext); + + NodeSet<std::string> barsFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "bar", root); + assert(barsFiltered.size() == 3); + NodeSet<std::string> barsXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "bar", root).asNodeSet(); + assert(barsXPath.size() == 3); + + for (int i = 0; i < 3; i++) { + assert(barsFiltered[i] == barsXPath[i]); + assert(TAGNAME(barsFiltered[i]) == nsInfo.xmlNSPrefix + "bar"); + assert(LOCALNAME(barsFiltered[i]) == "bar"); + } + +} + +static void validateRootFooBarBaz(std::pair<Document<std::string>, NameSpaceInfo>& parsed) { + validateRootFooBar(parsed); + + NameSpaceInfo nsInfo = parsed.second; + Document<std::string> document = parsed.first; + + Node<std::string> root = document.getDocumentElement(); + _xpath.setNamespaceContext(*nsInfo.nsContext); + + assert(TAGNAME(root) == nsInfo.xmlNSPrefix + "root"); + assert(LOCALNAME(root) == "root"); + + NodeSet<std::string> bazsFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "baz", root); + assert(bazsFiltered.size() == 3); + NodeSet<std::string> bazsXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "baz", root).asNodeSet(); + assert(bazsXPath.size() == 3); + + for (int i = 0; i < 3; i++) { + assert(bazsFiltered[i] == bazsXPath[i]); + assert(TAGNAME(bazsFiltered[i]) == nsInfo.xmlNSPrefix + "baz"); + assert(LOCALNAME(bazsFiltered[i]) == "baz"); + } + +} + +int main(int argc, char** argv) { + + if (argc < 2) { + std::cerr << "Expected path to the tests as first argument"; + exit(EXIT_FAILURE); + } + testPath = argv[1]; + + // No namespaces at all + { + std::stringstream xmlSS; + xmlSS << "<root><foo /><foo /><foo /></root>" << std::endl; + VALIDATE + } + + // default namespace + { + std::stringstream xmlSS; + xmlSS << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ + <root xmlns=\"http://www.w3.org/2005/07/scxml\">\ + <foo /><foo /><foo />\ + </root>\ + " << std::endl; + VALIDATE + } + + // explicit namespaces + { + std::stringstream xmlSS; + xmlSS << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ + <scxml:root xmlns:scxml=\"http://www.w3.org/2005/07/scxml\">\ + <scxml:foo /><scxml:foo /><scxml:foo />\ + </scxml:root>\ + " << std::endl; + VALIDATE + } + + // mixed namespaces + { + std::stringstream xmlSS; + xmlSS << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ + <scxml:root xmlns:scxml=\"http://www.w3.org/2005/07/scxml\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\ + <xhtml:foo /><xhtml:foo /><xhtml:foo />\ + <scxml:foo /><scxml:foo /><scxml:foo />\ + </scxml:root>\ + " << std::endl; + VALIDATE + } + + // mixed namespaces with different default NS + { + std::stringstream xmlSS; + xmlSS << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ + <scxml:root xmlns:scxml=\"http://www.w3.org/2005/07/scxml\" xmlns=\"http://www.w3.org/1999/xhtml\">\ + <foo /><foo /><foo />\ + <scxml:foo /><scxml:foo /><scxml:foo />\ + </scxml:root>\ + " << std::endl; + VALIDATE + } + +}
\ No newline at end of file diff --git a/test/src/test-promela-parser.cpp b/test/src/test-promela-parser.cpp index 940e55a..a2faed2 100644 --- a/test/src/test-promela-parser.cpp +++ b/test/src/test-promela-parser.cpp @@ -15,54 +15,55 @@ extern int promela_debug; int main(int argc, char** argv) { promela_debug = 0; - + std::list<std::string> expressions; /* declarations */ -// expressions.push_back("bool b1"); -// expressions.push_back("bool b1;"); -// expressions.push_back("bool b1, b2, b3"); -// expressions.push_back("bool b1, b2, b3;"); -// expressions.push_back("bool b1, b2 = 3 + 4, b3, b4, b5;"); -// expressions.push_back("bool b1; bool b2; bool b3; bool b4;"); -// expressions.push_back("bool b1; bool b2; bool b3, b4, b5;"); -// expressions.push_back("bit b = 1;"); -// expressions.push_back("byte state = 1;"); -// expressions.push_back("bool b1, b2 = 1, b3;"); -// expressions.push_back("bool busy[3];"); -// expressions.push_back("bool busy[3], us[4];"); -// expressions.push_back("mtype = {\nred, white, blue,\nabort, accept, ack, sync_ack, close, connect,\ncreate, data, eof, open, reject, sync, transfer,\nFATAL, NON_FATAL, COMPLETE\n}"); + expressions.push_back("bool b1"); + expressions.push_back("bool b1;"); + expressions.push_back("bool b1, b2, b3"); + expressions.push_back("bool b1, b2, b3;"); + expressions.push_back("bool b1, b2 = 3 + 4, b3, b4, b5;"); + expressions.push_back("bool b1; bool b2; bool b3; bool b4;"); + expressions.push_back("bool b1; bool b2; bool b3, b4, b5;"); + expressions.push_back("bit b = 1;"); + expressions.push_back("byte state = 1;"); + expressions.push_back("bool b1, b2 = 1, b3;"); + expressions.push_back("bool busy[3];"); + expressions.push_back("bool busy[3], us[4];"); + expressions.push_back("mtype = {\nred, white, blue,\nabort, accept, ack, sync_ack, close, connect,\ncreate, data, eof, open, reject, sync, transfer,\nFATAL, NON_FATAL, COMPLETE\n}"); /* expressions */ -// expressions.push_back("i+1"); -// expressions.push_back("(x == false || t == Bturn);"); -// expressions.push_back("a + (1 << b)"); -// expressions.push_back("(a + 1) << b"); -// expressions.push_back("(b < N)"); -// expressions.push_back("(mt+1)%MAX;"); -// expressions.push_back("state[0] = state[3] + 5 * state[3*2/n]"); - + expressions.push_back("i+1"); + expressions.push_back("(x == false || t == Bturn);"); + expressions.push_back("a + (1 << b)"); + expressions.push_back("(a + 1) << b"); + expressions.push_back("(b < N)"); + expressions.push_back("(mt+1)%MAX;"); + expressions.push_back("state[0] = state[3] + 5 * state[3*2/n]"); + /* statements */ -// expressions.push_back("t = Bturn;"); -// expressions.push_back("c++"); -// expressions.push_back("state = state - 1"); -// expressions.push_back("printf(\"hello world\\n\")"); -// expressions.push_back("printf(\"result %d: %d\n\", id, res, foo, bar)"); -// expressions.push_back("printf(\"x = %d\n\", x)"); -// expressions.push_back("(n <= 1)"); -// expressions.push_back("res = (a*a+b)/2*a;"); -// expressions.push_back("assert(0) /* a forced stop, (Chapter 6) */"); -// expressions.push_back("assert(count == 0 || count == 1)"); - - for (std::list<std::string>::iterator exprIter = expressions.begin(); - exprIter != expressions.end(); - exprIter++) { - try { - std::cout << std::endl << "'" << *exprIter << "':" << std::endl; - PromelaParser ast(*exprIter); - ast.dump(); - } catch (Event e) { - std::cerr << e << std::endl; - } - } + expressions.push_back("t = Bturn;"); + expressions.push_back("c++"); + expressions.push_back("state = state - 1"); + expressions.push_back("printf(\"hello world\\n\")"); + expressions.push_back("printf(\"result %d: %d\n\", id, res, foo, bar)"); + expressions.push_back("printf(\"x = %d\n\", x)"); + expressions.push_back("(n <= 1)"); + expressions.push_back("res = (a*a+b)/2*a;"); + expressions.push_back("assert(0) /* a forced stop, (Chapter 6) */"); + expressions.push_back("assert(count == 0 || count == 1)"); + expressions.push_back("busy[4 - 3] = 1;"); + while(true) + for (std::list<std::string>::iterator exprIter = expressions.begin(); + exprIter != expressions.end(); + exprIter++) { + try { + std::cout << std::endl << "'" << *exprIter << "':" << std::endl; + PromelaParser ast(*exprIter); + ast.dump(); + } catch (Event e) { + std::cerr << e << std::endl; + } + } }
\ No newline at end of file diff --git a/test/src/test-trie.cpp b/test/src/test-trie.cpp new file mode 100644 index 0000000..8c7ab15 --- /dev/null +++ b/test/src/test-trie.cpp @@ -0,0 +1,92 @@ +#include "uscxml/util/Trie.h" +#include <iostream> +#include <assert.h> + +using namespace uscxml; + +int main(int argc, char** argv) { + { + Trie trie; + int nrTokens = 0; + size_t offset = 0; + std::string word = "this is to be tokenized"; + std::string token; + while((offset = trie.getNextToken(word, offset, token)) != std::string::npos) { + std::cout << "\"" << token << "\" "; + nrTokens++; + } + std::cout << std::endl; + assert(nrTokens == word.length()); + } + + { + Trie trie(" "); + int nrTokens = 0; + size_t offset = 0; + std::string word = "this is to be tokenized"; + std::string token; + while(offset = trie.getNextToken(word, offset, token), token.length() > 0) { + std::cout << "\"" << token << "\" "; + nrTokens++; + } + std::cout << std::endl; + assert(nrTokens == 5); + } + + { + Trie trie("#"); + int nrTokens = 0; + size_t offset = 0; + std::string word = "#bb#bbbb#b#bbb#bb#b#"; + std::string token; + while(offset = trie.getNextToken(word, offset, token), token.length() > 0) { + std::cout << "\"" << token << "\" "; + nrTokens++; + } + std::cout << std::endl; + assert(nrTokens == 6); + } + + { + Trie trie(" "); + int nrTokens = 0; + size_t offset = 0; + std::string word = " this is to be tokenized"; + std::string token; + while(offset = trie.getNextToken(word, offset, token), token.length() > 0) { + std::cout << "\"" << token << "\" "; + nrTokens++; + } + std::cout << std::endl; + assert(nrTokens == 3); + } + + { + Trie trie(""); + trie.addWord("a"); + trie.addWord("b"); + + trie.dump(); + } + + { + Trie trie("."); + trie.addWord("foo.bar"); + trie.addWord("foo.foo"); + trie.addWord("foo.foo.baz"); + trie.addWord("foz.foo.baz"); + trie.addWord("foz.foo"); + + trie.dump(); + + std::list<TrieNode*> childs; + + childs = trie.getChildsWithWords(trie.root); + assert(childs.size() == 5); + + assert(trie.getNodeWithPrefix("") == trie.root); + + childs = trie.getWordsWithPrefix(""); + assert(childs.size() == 5); + } +}
\ No newline at end of file diff --git a/test/src/test-w3c.cpp b/test/src/test-w3c.cpp index 102487f..1052fda 100644 --- a/test/src/test-w3c.cpp +++ b/test/src/test-w3c.cpp @@ -90,7 +90,7 @@ void customTerminate() { } class W3CStatusMonitor : public uscxml::InterpreterMonitor { - + void beforeTakingTransition(uscxml::Interpreter interpreter, const Arabica::DOM::Element<std::string>& transition, bool moreComing) { std::cout << "Transition: " << uscxml::DOMUtils::xPathForNode(transition) << std::endl; } @@ -100,11 +100,11 @@ class W3CStatusMonitor : public uscxml::InterpreterMonitor { printNodeSet(interpreter.getConfiguration()); std::cout << "}" << std::endl; } - + void beforeProcessingEvent(uscxml::Interpreter interpreter, const uscxml::Event& event) { std::cout << "Event: " << event.name << std::endl; } - + void beforeExitingState(uscxml::Interpreter interpreter, const Arabica::DOM::Element<std::string>& state, bool moreComing) { exitingStates.push_back(state); if (!moreComing) { @@ -133,7 +133,7 @@ class W3CStatusMonitor : public uscxml::InterpreterMonitor { seperator = ", "; } } - + void beforeCompletion(uscxml::Interpreter interpreter) { Arabica::XPath::NodeSet<std::string> config = interpreter.getConfiguration(); if (config.size() == 1) { @@ -153,7 +153,7 @@ class W3CStatusMonitor : public uscxml::InterpreterMonitor { std::cout << "TEST FAILED" << std::endl; exit(EXIT_FAILURE); } - + Arabica::XPath::NodeSet<std::string> exitingStates; Arabica::XPath::NodeSet<std::string> enteringStates; }; @@ -176,8 +176,8 @@ int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); google::LogToStderr(); - - for (int i = 1; i < argc; i++) { + + for (int i = 1; i < argc; i++) { if (std::string(argv[i]) == "-f") { withFlattening = true; } else { @@ -189,7 +189,7 @@ int main(int argc, char** argv) { LOG(INFO) << "Processing " << documentURI << (withFlattening ? " FSM converted" : ""); if (withFlattening) { Interpreter flatInterpreter = Interpreter::fromURI(documentURI); - interpreter = Interpreter::fromDOM(ChartToFSM::flatten(flatInterpreter.getDocument(), flatInterpreter.getNameSpaceInfo()), flatInterpreter.getNameSpaceInfo()); + interpreter = Interpreter::fromDOM(ChartToFSM::flatten(flatInterpreter).getDocument(), flatInterpreter.getNameSpaceInfo()); interpreter.setNameSpaceInfo(interpreter.getNameSpaceInfo()); } else { interpreter = Interpreter::fromURI(documentURI); |