summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt5
-rw-r--r--test/src/test-arabica-namespaces.cpp6
-rw-r--r--test/src/test-lifecycle.cpp129
-rw-r--r--test/src/test-predicates.cpp38
4 files changed, 156 insertions, 22 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 18dfc03..49169fc 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -62,6 +62,11 @@ target_link_libraries(test-arabica-namespaces uscxml)
add_test(test-arabica-namespaces ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-arabica-namespaces ${CMAKE_SOURCE_DIR}/test)
set_target_properties(test-arabica-namespaces PROPERTIES FOLDER "Tests")
+add_executable(test-lifecycle src/test-lifecycle.cpp)
+target_link_libraries(test-lifecycle uscxml)
+add_test(test-lifecycle ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-arabica-namespaces)
+set_target_properties(test-lifecycle PROPERTIES FOLDER "Tests")
+
if (NOT WIN32)
add_executable(test-arabica-events src/test-arabica-events.cpp)
target_link_libraries(test-arabica-events uscxml)
diff --git a/test/src/test-arabica-namespaces.cpp b/test/src/test-arabica-namespaces.cpp
index ae529c9..aa7a5b4 100644
--- a/test/src/test-arabica-namespaces.cpp
+++ b/test/src/test-arabica-namespaces.cpp
@@ -97,7 +97,7 @@ static void validateRootFoo(std::pair<Document<std::string>, NameSpaceInfo>& par
assert(TAGNAME(root) == nsInfo.xmlNSPrefix + "root");
assert(LOCALNAME(root) == "root");
- NodeSet<std::string> foosFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "foo", root);
+ NodeSet<std::string> foosFiltered = InterpreterImpl::filterChildElements(nsInfo.xmlNSPrefix + "foo", root);
assert(foosFiltered.size() == 3);
NodeSet<std::string> foosXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "foo", root).asNodeSet();
assert(foosXPath.size() == 3);
@@ -119,7 +119,7 @@ static void validateRootFooBar(std::pair<Document<std::string>, NameSpaceInfo>&
Node<std::string> root = document.getDocumentElement();
_xpath.setNamespaceContext(*nsInfo.getNSContext());
- NodeSet<std::string> barsFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "bar", root);
+ NodeSet<std::string> barsFiltered = InterpreterImpl::filterChildElements(nsInfo.xmlNSPrefix + "bar", root);
assert(barsFiltered.size() == 3);
NodeSet<std::string> barsXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "bar", root).asNodeSet();
assert(barsXPath.size() == 3);
@@ -144,7 +144,7 @@ static void validateRootFooBarBaz(std::pair<Document<std::string>, NameSpaceInfo
assert(TAGNAME(root) == nsInfo.xmlNSPrefix + "root");
assert(LOCALNAME(root) == "root");
- NodeSet<std::string> bazsFiltered = Interpreter::filterChildElements(nsInfo.xmlNSPrefix + "baz", root);
+ NodeSet<std::string> bazsFiltered = InterpreterImpl::filterChildElements(nsInfo.xmlNSPrefix + "baz", root);
assert(bazsFiltered.size() == 3);
NodeSet<std::string> bazsXPath = _xpath.evaluate("//" + nsInfo.xpathPrefix + "baz", root).asNodeSet();
assert(bazsXPath.size() == 3);
diff --git a/test/src/test-lifecycle.cpp b/test/src/test-lifecycle.cpp
new file mode 100644
index 0000000..682e796
--- /dev/null
+++ b/test/src/test-lifecycle.cpp
@@ -0,0 +1,129 @@
+#include "uscxml/config.h"
+#include "uscxml/Interpreter.h"
+#include <glog/logging.h>
+
+#include "uscxml/plugins/invoker/filesystem/dirmon/DirMonInvoker.h"
+#include <boost/algorithm/string.hpp>
+
+#ifdef HAS_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAS_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+#ifdef HAS_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#ifdef _WIN32
+#include "XGetopt.h"
+#endif
+
+int startedAt;
+int lastTransitionAt;
+
+#ifdef HAS_EXECINFO_H
+void printBacktrace(void** array, int size) {
+ char** messages = backtrace_symbols(array, size);
+ for (int i = 0; i < size && messages != NULL; ++i) {
+ std::cerr << "\t" << messages[i] << std::endl;
+ }
+ std::cerr << std::endl;
+ free(messages);
+}
+
+#ifdef HAS_DLFCN_H
+// see https://gist.github.com/nkuln/2020860
+typedef void (*cxa_throw_type)(void *, void *, void (*) (void *));
+cxa_throw_type orig_cxa_throw = 0;
+
+void load_orig_throw_code() {
+ orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw");
+}
+
+extern "C"
+void __cxa_throw (void *thrown_exception, void *pvtinfo, void (*dest)(void *)) {
+ std::cerr << __FUNCTION__ << " will throw exception from " << std::endl;
+ if (orig_cxa_throw == 0)
+ load_orig_throw_code();
+
+ void *array[50];
+ size_t size = backtrace(array, 50);
+ printBacktrace(array, size);
+ orig_cxa_throw(thrown_exception, pvtinfo, dest);
+}
+#endif
+#endif
+
+
+// see http://stackoverflow.com/questions/2443135/how-do-i-find-where-an-exception-was-thrown-in-c
+void customTerminate() {
+ static bool tried_throw = false;
+ try {
+ // try once to re-throw currently active exception
+ if (!tried_throw) {
+ throw;
+ tried_throw = true;
+ } else {
+ tried_throw = false;
+ };
+ } catch (const std::exception &e) {
+ std::cerr << __FUNCTION__ << " caught unhandled exception. what(): "
+ << e.what() << std::endl;
+ } catch (const uscxml::Event &e) {
+ std::cerr << __FUNCTION__ << " caught unhandled exception. Event: "
+ << e << std::endl;
+ } catch (...) {
+ std::cerr << __FUNCTION__ << " caught unknown/unhandled exception."
+ << std::endl;
+ }
+
+#ifdef HAS_EXECINFO_H
+ void * array[50];
+ int size = backtrace(array, 50);
+
+ printBacktrace(array, size);
+#endif
+ abort();
+}
+int main(int argc, char** argv) {
+ using namespace uscxml;
+
+ std::set_terminate(customTerminate);
+
+#if defined(HAS_SIGNAL_H) && !defined(WIN32)
+ signal(SIGPIPE, SIG_IGN);
+#endif
+
+ google::InitGoogleLogging(argv[0]);
+ google::LogToStderr();
+
+ Interpreter interpreter = Interpreter::fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/w3c/ecma/test530.scxml");
+ InterpreterState state;
+ do {
+ state = interpreter.step(true);
+ switch (state) {
+ case uscxml::FINISHED:
+ std::cout << "FINISHED" << std::endl;
+ break;
+ case uscxml::INIT_FAILED:
+ std::cout << "INIT_FAILED" << std::endl;
+ break;
+ case uscxml::NOTHING_TODO:
+ std::cout << "NOTHING_TODO" << std::endl;
+ break;
+ case uscxml::INTERRUPTED:
+ std::cout << "INTERRUPTED" << std::endl;
+ break;
+ case uscxml::PROCESSED:
+ std::cout << "PROCESSED" << std::endl;
+ break;
+ default:
+ break;
+ }
+ } while(state != FINISHED);
+
+ return EXIT_SUCCESS;
+} \ No newline at end of file
diff --git a/test/src/test-predicates.cpp b/test/src/test-predicates.cpp
index ed155b4..00be408 100644
--- a/test/src/test-predicates.cpp
+++ b/test/src/test-predicates.cpp
@@ -16,24 +16,24 @@ int main(int argc, char** argv) {
assert(interpreter);
Node<std::string> atomicState = interpreter.getState("atomic");
- assert(Interpreter::isAtomic(atomicState));
- assert(!Interpreter::isParallel(atomicState));
- assert(!Interpreter::isCompound(atomicState));
+ assert(InterpreterImpl::isAtomic(atomicState));
+ assert(!InterpreterImpl::isParallel(atomicState));
+ assert(!InterpreterImpl::isCompound(atomicState));
Node<std::string> compoundState = interpreter.getState("compound");
- assert(!Interpreter::isAtomic(compoundState));
- assert(!Interpreter::isParallel(compoundState));
- assert(Interpreter::isCompound(compoundState));
+ assert(!InterpreterImpl::isAtomic(compoundState));
+ assert(!InterpreterImpl::isParallel(compoundState));
+ assert(InterpreterImpl::isCompound(compoundState));
Node<std::string> parallelState = interpreter.getState("parallel");
- assert(!Interpreter::isAtomic(parallelState));
- assert(Interpreter::isParallel(parallelState));
- assert(!Interpreter::isCompound(parallelState)); // parallel states are not compound!
+ assert(!InterpreterImpl::isAtomic(parallelState));
+ assert(InterpreterImpl::isParallel(parallelState));
+ assert(!InterpreterImpl::isCompound(parallelState)); // parallel states are not compound!
- NodeSet<std::string> initialState = interpreter.getInitialStates();
+ NodeSet<std::string> initialState = interpreter.getImpl()->getInitialStates();
assert(initialState[0] == atomicState);
- NodeSet<std::string> childs = interpreter.getChildStates(compoundState);
+ NodeSet<std::string> childs = interpreter.getImpl()->getChildStates(compoundState);
Node<std::string> compoundChild1 = interpreter.getState("compoundChild1");
Node<std::string> compoundChild2 = interpreter.getState("compoundChild2");
assert(childs.size() > 0);
@@ -41,39 +41,39 @@ int main(int argc, char** argv) {
assert(Interpreter::isMember(compoundChild2, childs));
assert(!Interpreter::isMember(compoundState, childs));
- assert(Interpreter::isDescendant(compoundChild1, compoundState));
+ assert(InterpreterImpl::isDescendant(compoundChild1, compoundState));
{
std::string idrefs("id1");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 1);
assert(tokenizedIdrefs.front().compare("id1") == 0);
}
{
std::string idrefs(" id1");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 1);
assert(tokenizedIdrefs.front().compare("id1") == 0);
}
{
std::string idrefs(" id1 ");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 1);
assert(tokenizedIdrefs.front().compare("id1") == 0);
}
{
std::string idrefs(" \tid1\n ");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 1);
assert(tokenizedIdrefs.front().compare("id1") == 0);
}
{
std::string idrefs("id1 id2 id3");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 3);
assert(tokenizedIdrefs.front().compare("id1") == 0);
tokenizedIdrefs.pop_front();
@@ -84,7 +84,7 @@ int main(int argc, char** argv) {
{
std::string idrefs("\t id1 \nid2\n\n id3\t");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 3);
assert(tokenizedIdrefs.front().compare("id1") == 0);
tokenizedIdrefs.pop_front();
@@ -95,7 +95,7 @@ int main(int argc, char** argv) {
{
std::string idrefs("id1 \nid2 \tid3");
- std::list<std::string> tokenizedIdrefs = Interpreter::tokenizeIdRefs(idrefs);
+ std::list<std::string> tokenizedIdrefs = InterpreterImpl::tokenizeIdRefs(idrefs);
assert(tokenizedIdrefs.size() == 3);
assert(tokenizedIdrefs.front().compare("id1") == 0);
tokenizedIdrefs.pop_front();