|
From: <got...@us...> - 2009-05-03 14:23:03
|
Revision: 241
http://scstudio.svn.sourceforge.net/scstudio/?rev=241&view=rev
Author: gotthardp
Date: 2009-05-03 13:33:40 +0000 (Sun, 03 May 2009)
Log Message:
-----------
Implemented universal check tester. Currently for Linux only.
Modified Paths:
--------------
trunk/src/check/pseudocode/communication_graph.cpp
trunk/src/data/Z120/z120_save.cpp
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/checker_test.cpp
Modified: trunk/src/check/pseudocode/communication_graph.cpp
===================================================================
--- trunk/src/check/pseudocode/communication_graph.cpp 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/src/check/pseudocode/communication_graph.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -185,4 +185,4 @@
return true;
}
-// $Id$
\ No newline at end of file
+// $Id$
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/src/data/Z120/z120_save.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -38,6 +38,9 @@
for(std::list<MscPtr>::const_iterator pos = m_printing.begin();
pos != m_printing.end(); pos++)
{
+ if(*pos == NULL)
+ continue;
+
// if not already generated
if(printed.find((*pos)->get_label()) == printed.end())
{
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/tests/CMakeLists.txt 2009-05-03 13:33:40 UTC (rev 241)
@@ -78,6 +78,26 @@
ADD_TEST(z120-01 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test00.mpr)
ADD_TEST(z120-01 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test01.mpr)
ADD_TEST(z120-02 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test02.mpr)
+
+ADD_EXECUTABLE(checker_test
+ checker_test.cpp
+)
+TARGET_LINK_LIBRARIES(checker_test
+ scZ120
+ ${CMAKE_DL_LIBS}
+)
+
+SET(CHECKER_SEQUENCE 0)
+MACRO(ADD_CHECKER_TEST LIBRARY PROPERTY FILE SATISFIED)
+ GET_TARGET_PROPERTY(LIBRARY_LOCATION ${LIBRARY} LOCATION)
+ ADD_TEST("checker-${CHECKER_SEQUENCE}-${LIBRARY}"
+ ${EXECUTABLE_OUTPUT_PATH}/checker_test ${LIBRARY_LOCATION} ${PROPERTY} ${FILE} ${SATISFIED})
+ MATH(EXPR CHECKER_SEQUENCE ${CHECKER_SEQUENCE}+1)
+ENDMACRO(ADD_CHECKER_TEST)
+
+ADD_CHECKER_TEST(scorder "FIFO" z120_test00.mpr 1)
+ADD_CHECKER_TEST(scorder "Acyclic" z120_test00.mpr 1)
+ADD_CHECKER_TEST(scrace "Race Free" z120_test00.mpr 1)
ENDIF(ANTLR_FOUND)
ADD_EXECUTABLE(decimal_test
Added: trunk/tests/checker_test.cpp
===================================================================
--- trunk/tests/checker_test.cpp (rev 0)
+++ trunk/tests/checker_test.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -0,0 +1,157 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <iostream>
+#include "data/checker.h"
+#include "data/Z120/z120.h"
+
+#include <stdexcept>
+#include <dlfcn.h>
+
+MscPtr run_check(const FInitCheckers& init_checkers,
+ const std::string& property, MscPtr msc)
+{
+ boost::shared_ptr<Checker> checker;
+
+ Checker **checkers = init_checkers();
+ for(Checker **fpos = checkers; *fpos != NULL; fpos++)
+ {
+ if((*fpos)->get_property_name() == property)
+ {
+ checker = boost::shared_ptr<Checker>(*fpos);
+ break;
+ }
+
+ delete *fpos;
+ }
+ delete[] checkers;
+
+ if(checker == NULL)
+ {
+ std::cerr << "ERROR: Checker for property " << property << " not found" << std::endl;
+ throw std::runtime_error("invalid checker");
+ }
+
+ SRChannelMapperPtr srm(new SRChannelMapper());
+
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ BMscCheckerPtr bmsc_checker = boost::dynamic_pointer_cast<BMscChecker>(checker);
+ if(bmsc_checker != NULL && bmsc != NULL)
+ {
+ return bmsc_checker->check(bmsc, srm);
+ }
+
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+ HMscCheckerPtr hmsc_checker = boost::dynamic_pointer_cast<HMscChecker>(checker);
+ if(hmsc_checker != NULL && hmsc != NULL)
+ {
+ return hmsc_checker->check(hmsc, srm);
+ }
+
+ std::cerr << "ERROR: No relevant checker for " << property << std::endl;
+ throw std::runtime_error("invalid checker");
+}
+
+int main(int argc, char** argv)
+{
+ if(argc < 5)
+ {
+ std::cerr << "Usage: " << argv[0] << " <library> <property> <msc> <satisfied>" << std::endl;
+ return 1;
+ }
+
+ void *handle = dlopen(argv[1], RTLD_LAZY);
+ if(handle == NULL)
+ {
+ std::cerr << "ERROR: Cannot open " << argv[1] << ": " << dlerror() << std::endl;
+ return 1;
+ }
+
+ FInitCheckers init_checkers = (FInitCheckers)dlsym(handle, "init_checkers");
+ if(init_checkers == NULL)
+ {
+ std::cerr << "ERROR: Initializer not found in " << argv[1] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ Z120 z120;
+
+ StreamReportPrinter printer(std::cerr);
+ z120.set_printer(&printer);
+
+ MscPtr msc = z120.load_msc(argv[3]);
+ if(msc == NULL)
+ {
+ std::cerr << "ERROR: Cannot open " << argv[3] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ int errors = 0;
+
+ char *endptr;
+ int satisfied = strtol(argv[4], &endptr, 10);
+ if(*argv[4] == '\0' || *endptr != '\0')
+ {
+ std::cerr << "ERROR: Not a boolean value: " << argv[4] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ try
+ {
+ MscPtr result = run_check(init_checkers, argv[2], msc);
+ if(result == NULL)
+ {
+ if(satisfied)
+ std::cout << argv[2] << " satisfied, should be satisfied" << std::endl;
+ else
+ {
+ std::cerr << "ERROR: " << argv[2] << " satisfied, should NOT be satisfied" << std::endl;
+ errors = 1;
+ }
+ }
+ else
+ {
+ std::cout << argv[2] << " violated" << std::endl;
+
+ if(satisfied)
+ {
+ std::cerr << "ERROR: " << argv[2] << " violated, should NOT be violated" << std::endl;
+ errors = 1;
+ }
+ else
+ std::cout << argv[2] << " violated, should be violated" << std::endl;
+
+ std::vector<MscPtr> results;
+ results.push_back(result);
+ z120.save_msc(std::cout, "counter_example", results);
+ }
+ }
+ catch(...)
+ {
+ std::cerr << "ERROR: Exception catched" << std::endl;
+ errors = 1;
+ }
+
+ dlclose(handle);
+ return errors;
+}
+
+// $Id$
Property changes on: trunk/tests/checker_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|