summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2016-06-16 14:51:27 (GMT)
committerStefan Radomski <github@mintwerk.de>2016-06-16 14:51:27 (GMT)
commitfa6b4f074d4be04d913d8b7dc062920341c34ecb (patch)
tree83ae475b184a3b1bccca2a69addcefb6c12d924e
parented6aee05e2843be65c4ab445d79e70dc8dacc07b (diff)
downloaduscxml-fa6b4f074d4be04d913d8b7dc062920341c34ecb.zip
uscxml-fa6b4f074d4be04d913d8b7dc062920341c34ecb.tar.gz
uscxml-fa6b4f074d4be04d913d8b7dc062920341c34ecb.tar.bz2
Fixed issue86 and some more bug fixes
-rw-r--r--contrib/src/easylogging++.h6
-rw-r--r--src/uscxml/debug/InterpreterIssue.cpp2
-rw-r--r--src/uscxml/interpreter/BasicContentExecutor.cpp8
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.cpp11
-rw-r--r--src/uscxml/interpreter/BasicEventQueue.h4
-rw-r--r--src/uscxml/interpreter/EventQueue.cpp3
-rw-r--r--src/uscxml/interpreter/EventQueue.h1
-rw-r--r--src/uscxml/interpreter/EventQueueImpl.h1
-rw-r--r--src/uscxml/interpreter/FastMicroStep.cpp4
-rw-r--r--src/uscxml/interpreter/InterpreterImpl.h7
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp20
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp20
-rw-r--r--src/uscxml/transform/ChartToC.cpp2
-rw-r--r--src/uscxml/util/DOM.h5
-rw-r--r--src/uscxml/util/Predicates.cpp25
-rw-r--r--src/uscxml/util/Predicates.h2
-rw-r--r--test/CMakeLists.txt50
-rw-r--r--test/ctest/CTestCustom.ctest.in2
-rw-r--r--test/issues/test-issue86.scxml36
-rw-r--r--test/src/test-gen-c.cpp9
-rw-r--r--test/src/test-stress.cpp7
21 files changed, 178 insertions, 47 deletions
diff --git a/contrib/src/easylogging++.h b/contrib/src/easylogging++.h
index 7378d41..b00f074 100644
--- a/contrib/src/easylogging++.h
+++ b/contrib/src/easylogging++.h
@@ -2611,9 +2611,9 @@ public:
setGlobally(ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg"), true);
set(Level::Debug, ConfigurationType::Format, std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg"));
// INFO and WARNING are set to default by Level::Global
- set(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg"));
- set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg"));
- set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg"));
+ set(Level::Error, ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg"));
+ set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level %fbase:%line: %msg"));
+ set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel %fbase:%line: %msg"));
set(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg"));
}
diff --git a/src/uscxml/debug/InterpreterIssue.cpp b/src/uscxml/debug/InterpreterIssue.cpp
index 49d31c8..df2d125 100644
--- a/src/uscxml/debug/InterpreterIssue.cpp
+++ b/src/uscxml/debug/InterpreterIssue.cpp
@@ -384,7 +384,7 @@ std::list<InterpreterIssue> InterpreterIssue::forInterpreter(InterpreterImpl* in
}
// check whether state is reachable
- if (!DOMUtils::isMember(state, reachable) && !isInEmbeddedDocument(state)) {
+ if (!DOMUtils::isMember(state, reachable) && areFromSameMachine(state, interpreter->_scxml)) {
issues.push_back(InterpreterIssue("State with id '" + stateId + "' is unreachable", state, InterpreterIssue::USCXML_ISSUE_FATAL));
}
diff --git a/src/uscxml/interpreter/BasicContentExecutor.cpp b/src/uscxml/interpreter/BasicContentExecutor.cpp
index 366c4bd..58d3eae 100644
--- a/src/uscxml/interpreter/BasicContentExecutor.cpp
+++ b/src/uscxml/interpreter/BasicContentExecutor.cpp
@@ -404,7 +404,7 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
}
}
- // we need the invokeid to uninvoke - TODO: This is leaking!
+ // we need the invokeid to uninvoke
char* invokeId = (char*)malloc(invokeEvent.invokeid.size() + 1);
memcpy(invokeId, invokeEvent.invokeid.c_str(), invokeEvent.invokeid.size());
invokeId[invokeEvent.invokeid.size()] = 0;
@@ -469,7 +469,6 @@ void BasicContentExecutor::invoke(XERCESC_NS::DOMElement* element) {
}
void BasicContentExecutor::uninvoke(XERCESC_NS::DOMElement* invoke) {
- // TODO: DANGER This is the real danger here
char* invokeId = (char*)invoke->getUserData(X("invokeid"));
assert(invokeId != NULL);
@@ -557,13 +556,16 @@ void BasicContentExecutor::processParams(std::multimap<std::string, Data>& param
Data BasicContentExecutor::elementAsData(XERCESC_NS::DOMElement* element) {
if (HAS_ATTR(element, "expr")) {
// return _callbacks->evalAsData(ATTR(element, "expr"));
- if (LOCALNAME(element) == "content") {
+#if 0
+ if (LOCALNAME(element) == "content") {
// test 528
return _callbacks->evalAsData(ATTR(element, "expr"));
} else {
// test 326
return Data(ATTR(element, "expr"), Data::INTERPRETED);
}
+#endif
+ return _callbacks->evalAsData(ATTR(element, "expr"));
}
if (HAS_ATTR(element, "src")) {
diff --git a/src/uscxml/interpreter/BasicEventQueue.cpp b/src/uscxml/interpreter/BasicEventQueue.cpp
index d484ada..7505f46 100644
--- a/src/uscxml/interpreter/BasicEventQueue.cpp
+++ b/src/uscxml/interpreter/BasicEventQueue.cpp
@@ -74,6 +74,11 @@ void BasicEventQueue::enqueue(const Event& event) {
_cond.notify_all();
}
+void BasicEventQueue::reset() {
+ std::lock_guard<std::recursive_mutex> lock(_mutex);
+ _queue.clear();
+}
+
static void dummyCallback(evutil_socket_t fd, short what, void *arg) {
timeval tv;
tv.tv_sec = 365 * 24 * 3600;
@@ -206,4 +211,10 @@ void BasicDelayedEventQueue::stop() {
}
}
+void BasicDelayedEventQueue::reset() {
+ std::lock_guard<std::recursive_mutex> lock(_mutex);
+ cancelAllDelayed();
+ _queue.clear();
+}
+
} \ No newline at end of file
diff --git a/src/uscxml/interpreter/BasicEventQueue.h b/src/uscxml/interpreter/BasicEventQueue.h
index a6374d8..1542e30 100644
--- a/src/uscxml/interpreter/BasicEventQueue.h
+++ b/src/uscxml/interpreter/BasicEventQueue.h
@@ -43,7 +43,8 @@ public:
virtual ~BasicEventQueue();
virtual Event dequeue(size_t blockMs);
virtual void enqueue(const Event& event);
-
+ virtual void reset();
+
protected:
std::list<Event> _queue;
std::recursive_mutex _mutex;
@@ -67,6 +68,7 @@ public:
virtual void enqueue(const Event& event) {
return BasicEventQueue::enqueue(event);
}
+ virtual void reset();
protected:
struct callbackData {
diff --git a/src/uscxml/interpreter/EventQueue.cpp b/src/uscxml/interpreter/EventQueue.cpp
index c460e02..7ff0bfb 100644
--- a/src/uscxml/interpreter/EventQueue.cpp
+++ b/src/uscxml/interpreter/EventQueue.cpp
@@ -38,6 +38,9 @@ Event EventQueue::dequeue(size_t blockMs) {
void EventQueue::enqueue(const Event& event) {
return _impl->enqueue(event);
}
+void EventQueue::reset() {
+ return _impl->reset();
+}
PIMPL_OPERATORS_INHERIT_IMPL(DelayedEventQueue, EventQueue)
diff --git a/src/uscxml/interpreter/EventQueue.h b/src/uscxml/interpreter/EventQueue.h
index 1e8b018..37b90be 100644
--- a/src/uscxml/interpreter/EventQueue.h
+++ b/src/uscxml/interpreter/EventQueue.h
@@ -38,6 +38,7 @@ public:
virtual Event dequeue(size_t blockMs);
virtual void enqueue(const Event& event);
+ virtual void reset();
protected:
std::shared_ptr<EventQueueImpl> _impl;
diff --git a/src/uscxml/interpreter/EventQueueImpl.h b/src/uscxml/interpreter/EventQueueImpl.h
index 1ccd3f1..befd684 100644
--- a/src/uscxml/interpreter/EventQueueImpl.h
+++ b/src/uscxml/interpreter/EventQueueImpl.h
@@ -42,6 +42,7 @@ class USCXML_API EventQueueImpl {
public:
virtual Event dequeue(size_t blockMs) = 0;
virtual void enqueue(const Event& event) = 0;
+ virtual void reset() = 0;
};
/**
diff --git a/src/uscxml/interpreter/FastMicroStep.cpp b/src/uscxml/interpreter/FastMicroStep.cpp
index 927fbbc..ea43c5d 100644
--- a/src/uscxml/interpreter/FastMicroStep.cpp
+++ b/src/uscxml/interpreter/FastMicroStep.cpp
@@ -234,8 +234,8 @@ void FastMicroStep::init(XERCESC_NS::DOMElement* scxml) {
std::list<DOMElement*> dataModels = DOMUtils::filterChildElements(_xmlPrefix.str() + "datamodel", _states[0]->element, true);
dataModels.erase(std::remove_if(dataModels.begin(),
dataModels.end(),
- [](DOMElement* elem) {
- return isInEmbeddedDocument(elem);
+ [this](DOMElement* elem) {
+ return !areFromSameMachine(elem, _scxml);
}),
dataModels.end());
diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h
index e693bbf..be33306 100644
--- a/src/uscxml/interpreter/InterpreterImpl.h
+++ b/src/uscxml/interpreter/InterpreterImpl.h
@@ -76,11 +76,14 @@ public:
}
virtual void reset() {///< Reset state machine
- _microStepper.reset();
+ if (_microStepper)
+ _microStepper.reset();
+
_isInitialized = false;
_state = USCXML_INSTANTIATED;
// _dataModel.reset();
-// _eventQueue.reset();
+ if (_delayQueue)
+ _delayQueue.reset();
// _contentExecutor.reset();
}
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
index 35d9c4b..05d37d4 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
@@ -28,6 +28,8 @@
#include "uscxml/util/DOM.h"
#include <easylogging++.h>
+#include <boost/algorithm/string.hpp>
+
#define EVENT_STRING_OR_UNDEF(field, cond) \
JSStringRef field##Name = JSStringCreateWithUTF8CString( #field ); \
JSStringRef field##Val = JSStringCreateWithUTF8CString(event.field.c_str()); \
@@ -399,7 +401,23 @@ Data JSCDataModel::evalAsData(const std::string& content) {
Data JSCDataModel::getAsData(const std::string& content) {
// parse as JSON test 578
- return Data::fromJSON(content);
+ Data d = Data::fromJSON(content);
+ if (!d.empty())
+ return d;
+
+ std::string trimmed = boost::trim_copy(content);
+ if (trimmed.length() > 0) {
+ if (isNumeric(trimmed.c_str(), 10)) {
+ d = Data(trimmed, Data::INTERPRETED);
+ } else if (trimmed.length() >= 2 &&
+ ((trimmed[0] == '"' && trimmed[trimmed.length() - 1] == '"') ||
+ (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) {
+ d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM);
+ } else {
+ d = Data(trimmed, Data::INTERPRETED);
+ }
+ }
+ return d;
}
JSValueRef JSCDataModel::getDataAsValue(const Data& data) {
diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp
index 1db4f45..db65ebf 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp
@@ -33,6 +33,8 @@
#include "uscxml/util/DOM.h"
#include <easylogging++.h>
+#include <boost/algorithm/string.hpp>
+
using namespace XERCESC_NS;
static v8::Local<v8::Value> XMLString2JS(const XMLCh* input) {
@@ -421,7 +423,23 @@ void V8DataModel::setEvent(const Event& event) {
}
Data V8DataModel::getAsData(const std::string& content) {
- return Data::fromJSON(content);
+ Data d = Data::fromJSON(content);
+ if (!d.empty())
+ return d;
+
+ std::string trimmed = boost::trim_copy(content);
+ if (trimmed.length() > 0) {
+ if (isNumeric(trimmed.c_str(), 10)) {
+ d = Data(trimmed, Data::INTERPRETED);
+ } else if (trimmed.length() >= 2 &&
+ ((trimmed[0] == '"' && trimmed[trimmed.length() - 1] == '"') ||
+ (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) {
+ d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM);
+ } else {
+ d = Data(trimmed, Data::INTERPRETED);
+ }
+ }
+ return d;
}
Data V8DataModel::evalAsData(const std::string& content) {
diff --git a/src/uscxml/transform/ChartToC.cpp b/src/uscxml/transform/ChartToC.cpp
index b76d4da..84f325e 100644
--- a/src/uscxml/transform/ChartToC.cpp
+++ b/src/uscxml/transform/ChartToC.cpp
@@ -1726,7 +1726,7 @@ void ChartToC::writeElementInfo(std::ostream& stream) {
std::stringstream ss;
DOMNodeList* cChilds = contents.front()->getChildNodes();
for (size_t j = 0; j < cChilds->getLength(); j++) {
- ss << cChilds->item(j);
+ ss << *(cChilds->item(j));
}
stream << (ss.str().size() > 0 ? "\"" + escape(ss.str()) + "\", " : "NULL, ");
stream << (HAS_ATTR_CAST(contents.front(), "expr") ? "\"" + ATTR_CAST(contents.front(), "expr") + "\", " : "NULL, ");
diff --git a/src/uscxml/util/DOM.h b/src/uscxml/util/DOM.h
index 3ab27a3..0b35f40 100644
--- a/src/uscxml/util/DOM.h
+++ b/src/uscxml/util/DOM.h
@@ -118,6 +118,11 @@ protected:
#define XML_PREFIX(element) X(element->getPrefix() ? X(element->getPrefix()).str() + ":" : "")
#if 1
+/**
+ * @todo: More performant XercesStrings
+ * https://alfps.wordpress.com/2010/05/27/cppx-xerces-strings-simplified-by-ownership-part-i/
+ */
+
class USCXML_API X {
public :
diff --git a/src/uscxml/util/Predicates.cpp b/src/uscxml/util/Predicates.cpp
index cd41089..006e8dc 100644
--- a/src/uscxml/util/Predicates.cpp
+++ b/src/uscxml/util/Predicates.cpp
@@ -460,16 +460,25 @@ std::list<DOMElement*> getReachableStates(const DOMElement* root) {
}
-bool isInEmbeddedDocument(const DOMNode* node) {
- // a node is in an embedded document if there is a content element in its parents
- const DOMNode* parent = node;
- while(parent) {
- if(iequals(LOCALNAME(parent), "content")) {
- return true;
+bool areFromSameMachine(const DOMNode* n1, const DOMNode* n2) {
+ // we traverse each nodes parent's until we reach an scxml element or null
+ const DOMNode* p1 = n1;
+ while(p1) {
+ if(iequals(LOCALNAME(p1), "scxml")) {
+ break;
}
- parent = parent->getParentNode();
+ p1 = p1->getParentNode();
}
- return false;
+
+ const DOMNode* p2 = n2;
+ while(p2) {
+ if(iequals(LOCALNAME(p2), "scxml")) {
+ break;
+ }
+ p2 = p2->getParentNode();
+ }
+
+ return p1 == p2;
}
} \ No newline at end of file
diff --git a/src/uscxml/util/Predicates.h b/src/uscxml/util/Predicates.h
index 7bc4a9c..6204d6a 100644
--- a/src/uscxml/util/Predicates.h
+++ b/src/uscxml/util/Predicates.h
@@ -39,7 +39,7 @@ std::list<XERCESC_NS::DOMElement*> getTargetStates(const XERCESC_NS::DOMElement*
std::list<XERCESC_NS::DOMElement*> getEffectiveTargetStates(const XERCESC_NS::DOMElement* transition);
XERCESC_NS::DOMElement* getTransitionDomain(const XERCESC_NS::DOMElement* transition, const XERCESC_NS::DOMElement* root);
-bool isInEmbeddedDocument(const XERCESC_NS::DOMNode* node);
+bool areFromSameMachine(const XERCESC_NS::DOMNode* n1, const XERCESC_NS::DOMNode* n2);
std::list<XERCESC_NS::DOMElement*> getStates(const std::list<std::string>& stateIds, const XERCESC_NS::DOMElement* root);
XERCESC_NS::DOMElement* getState(const std::string& stateId, const XERCESC_NS::DOMElement* root);
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 5ef92c6..8719a41 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -28,7 +28,10 @@ USCXML_TEST_COMPILE(NAME test-url LABEL general/test-url FILES src/test-url.cpp)
USCXML_TEST_COMPILE(NAME test-lifecycle LABEL general/test-lifecycle FILES src/test-lifecycle.cpp)
USCXML_TEST_COMPILE(NAME test-validating LABEL general/test-validating FILES src/test-validating.cpp)
USCXML_TEST_COMPILE(NAME test-snippets LABEL general/test-snippets FILES src/test-snippets.cpp)
-USCXML_TEST_COMPILE(NAME test-stress LABEL general/test-stress FILES src/test-stress.cpp)
+
+# test-stress is not an automated test
+add_executable(test-stress src/test-stress.cpp)
+target_link_libraries(test-stress uscxml)
file(GLOB_RECURSE USCXML_WRAPPERS
${PROJECT_SOURCE_DIR}/src/bindings/swig/wrapped/*.cpp
@@ -140,7 +143,7 @@ if (NOT BUILD_MINIMAL)
# "perf/gen/c/ecma"
# "perf/ecma"
)
-
+
# prepare directories for test classes and copy resources over
foreach(W3C_RESOURCE ${W3C_RESOURCES} )
get_filename_component(TEST_DATAMODEL ${W3C_RESOURCE} PATH)
@@ -183,13 +186,22 @@ if (NOT BUILD_MINIMAL)
# normal IRP tests - get all scxml files within
foreach(W3C_TEST ${W3C_TESTS} )
+ set(TEST_ADDED OFF)
get_filename_component(TEST_FILE ${W3C_TEST} NAME)
set(TEST_NAME "w3c/${TEST_CLASS}/${TEST_FILE}")
- if (NOT TEST_NAME MATCHES ".*sub.*")
+ if (OFF)
+ # manual tests:
+ elseif (TEST_FILE STREQUAL "test307.scxml")
+ # scxml files, but no proper tests:
+ elseif (TEST_NAME MATCHES ".*sub.*")
+ # rest is a proper test:
+ else ()
+
if (IS_STANDARD_TEST)
add_test(${TEST_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-state-pass ${W3C_TEST})
+ set(TEST_ADDED ON)
if (TEST_NAME MATCHES ".*/test250.scxml")
set_tests_properties(${TEST_NAME} PROPERTIES FAIL_REGULAR_EXPRESSION "entering final state, invocation was not cancelled")
@@ -226,20 +238,24 @@ if (NOT BUILD_MINIMAL)
-DSCAFFOLDING_FOR_GENERATED_C:FILEPATH=${CMAKE_CURRENT_SOURCE_DIR}/src/test-gen-c.cpp
-P ${CMAKE_CURRENT_SOURCE_DIR}/ctest/scripts/run_generated_test.cmake)
set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS uscxml-transform)
+ set(TEST_ADDED ON)
endif()
elseif (TEST_TYPE MATCHES "^binding.*")
get_filename_component(TEST_LANG ${TEST_TYPE} NAME)
- add_test(NAME "${TEST_NAME}"
- COMMAND
- ${ANT_EXECUTABLE}
- -Dtest.file=${W3C_TEST}
- -Duscxml.jar=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/uscxml.jar
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/java
- )
- set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS jar)
+ if (TARGET jar AND TEST_LANG STREQUAL "java")
+ add_test(NAME "${TEST_NAME}"
+ COMMAND
+ ${ANT_EXECUTABLE}
+ -Dtest.file=${W3C_TEST}
+ -Duscxml.jar=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/uscxml.jar
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/java
+ )
+ set_tests_properties("${TEST_NAME}" PROPERTIES DEPENDS jar)
+ set(TEST_ADDED ON)
+ endif()
elseif (TEST_TYPE MATCHES "^spin.*")
@@ -257,18 +273,22 @@ if (NOT BUILD_MINIMAL)
-P ${CMAKE_CURRENT_SOURCE_DIR}/ctest/scripts/run_promela_test.cmake)
set_tests_properties("${TEST_NAME}" PROPERTIES PASS_REGULAR_EXPRESSION "depth reached [0-9]+, errors: 0")
set_tests_properties("${TEST_NAME}" PROPERTIES FAIL_REGULAR_EXPRESSION "depth reached [0-9]+, errors: [1-9]+")
+ set(TEST_ADDED ON)
elseif (TEST_TYPE MATCHES "^fsm.*")
add_test("${TEST_NAME}" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-state-pass -f ${W3C_TEST})
+ set(TEST_ADDED ON)
endif()
endif()
- set_property(TEST ${TEST_NAME} PROPERTY LABELS ${TEST_NAME})
- set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${TEST_TIMEOUT})
- if (IS_PERFORMANCE_TEST)
- set_tests_properties("${TEST_NAME}" PROPERTIES ENVIRONMENT USCXML_BENCHMARK_ITERATIONS=${TEST_BENCHMARK_ITERATIONS})
+ if(TEST_ADDED)
+ set_property(TEST ${TEST_NAME} PROPERTY LABELS ${TEST_NAME})
+ set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${TEST_TIMEOUT})
+ if (IS_PERFORMANCE_TEST)
+ set_tests_properties("${TEST_NAME}" PROPERTIES ENVIRONMENT USCXML_BENCHMARK_ITERATIONS=${TEST_BENCHMARK_ITERATIONS})
+ endif()
endif()
endif()
diff --git a/test/ctest/CTestCustom.ctest.in b/test/ctest/CTestCustom.ctest.in
index e20f00d..c5c2bd6 100644
--- a/test/ctest/CTestCustom.ctest.in
+++ b/test/ctest/CTestCustom.ctest.in
@@ -13,6 +13,8 @@
# "w3c/test415.scxml"
# "w3c/test513.txt"
+# some manual tests are removed in test/CMakeLists.txt already!
+
# null datamodel
# "test436.scxml"
diff --git a/test/issues/test-issue86.scxml b/test/issues/test-issue86.scxml
new file mode 100644
index 0000000..a978d4b
--- /dev/null
+++ b/test/issues/test-issue86.scxml
@@ -0,0 +1,36 @@
+<scxml datamodel="lua" initial="Start" name="Root" version="1.0" xmlns="http://www.w3.org/2005/07/scxml">
+ <state id="Start">
+ <invoke id="ID_DATA_ISSUE">
+ <content>
+ <scxml datamodel="lua" initial="StateShape1" name="ScxmlShape1" version="1.0" xmlns="http://www.w3.org/2005/07/scxml">
+ <datamodel>
+ <data id="Timestamp">{
+ iSec = 1
+}
+ </data>
+ </datamodel>
+ <final id="pass"/>
+ <final id="fail">
+ <onentry>
+ <send event="error.execution" target="#_parent"/>
+ </onentry>
+ </final>
+ <state id="StateShape1">
+ <onentry>
+ <script>print(Timestamp)
+print(Timestamp.iSec)
+ </script>
+ <send delayexpr="tostring(Timestamp.iSec) .. 's'" event="step_1"/>
+ </onentry>
+ <transition event="step_1" target="pass"/>
+ <transition event="error.*" target="fail"/>
+ </state>
+ </scxml>
+ </content>
+ </invoke>
+ <transition event="done.invoke.ID_DATA_ISSUE" target="pass"/>
+ <transition event="error.*" target="fail"/>
+ </state>
+ <final id="pass"/>
+ <final id="fail"/>
+</scxml> \ No newline at end of file
diff --git a/test/src/test-gen-c.cpp b/test/src/test-gen-c.cpp
index 7870578..48c99e8 100644
--- a/test/src/test-gen-c.cpp
+++ b/test/src/test-gen-c.cpp
@@ -17,7 +17,8 @@
#endif
#ifndef AUTOINCLUDE_TEST
-#include "test-c-machine.scxml.c"
+//#include "test-c-machine.scxml.c"
+#include "/Users/sradomski/Documents/TK/Code/uscxml/build/cli/test/gen/c/ecma/test329.scxml.machine.c"
#endif
#include "uscxml/util/URL.h"
@@ -127,7 +128,7 @@ public:
} else if (param->location != NULL) {
identifier = param->location;
}
- invokeData[identifier] = parentMachine->dataModel.getAsData(param->expr);
+ invokeData[identifier] = parentMachine->dataModel.evalAsData(param->expr);
param++;
}
}
@@ -146,7 +147,7 @@ public:
break;
std::string identifier = std::string(aPtr, cPtr - aPtr);
- invokeData[identifier] = parentMachine->dataModel.getAsData(identifier);
+ invokeData[identifier] = parentMachine->dataModel.evalAsData(identifier);
}
}
}
@@ -555,7 +556,7 @@ public:
// Data d = USER_DATA(ctx)->dataModel.getStringAsData(expr);
if (assign->expr != NULL) {
USER_DATA(ctx)->dataModel.assign(key,
- USER_DATA(ctx)->dataModel.evalAsData(assign->expr));
+ USER_DATA(ctx)->dataModel.getAsData(assign->expr));
} else if (assign->content != NULL) {
Data d = Data(assign->content, Data::INTERPRETED);
USER_DATA(ctx)->dataModel.assign(key, d);
diff --git a/test/src/test-stress.cpp b/test/src/test-stress.cpp
index 588e0f7..8bd2e4a 100644
--- a/test/src/test-stress.cpp
+++ b/test/src/test-stress.cpp
@@ -97,10 +97,9 @@ int main(int argc, char** argv) {
entryIter++;
// forever
- if (entryIter == entries.end()) {
- entryIter = entries.begin();
- std::this_thread::sleep_for(std::chrono::seconds(10));
- }
+// if (entryIter == entries.end()) {
+// entryIter = entries.begin();
+// }
}
delete watcher;