diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-05-15 19:55:13 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-05-15 19:55:13 (GMT) |
commit | f9a620340ddce2a17fd775d1e210268cac13377b (patch) | |
tree | 58d8dad794e5a34237c2738fe77c151d0810624f /test/src | |
parent | 49127140ed2ad91bfcf532b3d2265582cb80b0db (diff) | |
download | uscxml-f9a620340ddce2a17fd775d1e210268cac13377b.zip uscxml-f9a620340ddce2a17fd775d1e210268cac13377b.tar.gz uscxml-f9a620340ddce2a17fd775d1e210268cac13377b.tar.bz2 |
Introduced interpreter.step()
Diffstat (limited to 'test/src')
-rw-r--r-- | test/src/test-arabica-namespaces.cpp | 6 | ||||
-rw-r--r-- | test/src/test-lifecycle.cpp | 129 | ||||
-rw-r--r-- | test/src/test-predicates.cpp | 38 |
3 files changed, 151 insertions, 22 deletions
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(); |