summaryrefslogtreecommitdiffstats
path: root/test/src
diff options
context:
space:
mode:
Diffstat (limited to 'test/src')
-rw-r--r--test/src/test-arabica-namespaces.cpp221
-rw-r--r--test/src/test-promela-parser.cpp89
-rw-r--r--test/src/test-trie.cpp92
-rw-r--r--test/src/test-w3c.cpp16
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);