diff --git a/alib2cli/makefile.conf b/alib2cli/makefile.conf index 89e4689b2d85c2b353efe245c015daaec80d18a8..a433dc4b45edfa5a18ef4611bb1545800149a4c9 100644 --- a/alib2cli/makefile.conf +++ b/alib2cli/makefile.conf @@ -1,7 +1,7 @@ LIBRARY:=alib2cli TESTBIN:=alib2test -LINK_LIBRARIES=alib2raw alib2str alib2data alib2xml alib2common alib2abstraction alib2measure alib2std +LINK_LIBRARIES=alib2xml alib2common alib2abstraction alib2measure alib2std SYSTEM_LIBRARIES=xml2 stdc++fs SYSTEM_INCLUDE_PATHS=/usr/include/libxml2 TEST_LINK_LIBRARIES= diff --git a/alib2cli/src/registration/InputFileTypeRegistration.cpp b/alib2cli/src/registration/InputFileTypeRegistration.cpp index 1635f9e9c163123360bf36359c80656a691ef3a4..9f2a432922f3343ac2649a3450e874ead59d3894 100644 --- a/alib2cli/src/registration/InputFileTypeRegistration.cpp +++ b/alib2cli/src/registration/InputFileTypeRegistration.cpp @@ -1,10 +1,7 @@ #include "InputFileTypeRegistration.hpp" #include <registry/XmlRegistry.h> -#include <registry/StringReaderRegistry.hpp> -#include <registry/RawReaderRegistry.hpp> -#include <abstraction/ImmediateValueAbstraction.hpp> #include <abstraction/XmlTokensParserAbstraction.hpp> #include <abstraction/WrapperAbstraction.hpp> #include <abstraction/PackingAbstraction.hpp> @@ -56,53 +53,7 @@ namespace { return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ); } - std::shared_ptr < abstraction::OperationAbstraction > dummy3 ( const std::string & typehint, const ext::vector < std::string > & ) { - ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; - - ext::vector < std::string > templateParams; - ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) }; - abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; - - abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) ); - - auto stringParserAbstractionFinder = [ = ] ( const std::string & data ) { - return abstraction::StringReaderRegistry::getAbstraction ( typehint, data ); - }; - - abstractions.push_back ( std::make_shared < abstraction::WrapperAbstraction < abstraction::UnspecifiedType, std::string && > > ( stringParserAbstractionFinder ) ); - - std::shared_ptr < abstraction::PackingAbstraction < 1 > > res = std::make_shared < abstraction::PackingAbstraction < 1 > > ( std::move ( abstractions ), 1 ); - res->setInnerConnection ( 0, 1, 0, true ); - res->setOuterConnection ( 0, 0, 0 ); - - return res; - } - - std::shared_ptr < abstraction::OperationAbstraction > dummy4 ( const std::string & typehint, const ext::vector < std::string > & ) { - ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; - - ext::vector < std::string > templateParams; - ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) }; - abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; - - abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) ); - - auto rawParserAbstractionFinder = [ = ] ( const std::string & ) { - return abstraction::RawReaderRegistry::getAbstraction ( typehint ); - }; - - abstractions.push_back ( std::make_shared < abstraction::WrapperAbstraction < abstraction::UnspecifiedType, std::string && > > ( rawParserAbstractionFinder ) ); - - std::shared_ptr < abstraction::PackingAbstraction < 1 > > res = std::make_shared < abstraction::PackingAbstraction < 1 > > ( std::move ( abstractions ), 1 ); - res->setInnerConnection ( 0, 1, 0, true ); - res->setOuterConnection ( 0, 0, 0 ); - - return res; - } - auto xmlInputFileHandler = registration::InputFileRegister ( "xml", dummy ); auto fileInputFileHandler = registration::InputFileRegister ( "file", dummy2 ); -auto stringInputFileHandler = registration::InputFileRegister ( "string", dummy3 ); -auto rawInputFileHandler = registration::InputFileRegister ( "raw", dummy4 ); } diff --git a/alib2cli/src/registration/OutputFileTypeRegistration.cpp b/alib2cli/src/registration/OutputFileTypeRegistration.cpp index 92451358957b9f3670c8af41eed4f610faa1b1ca..2e4f4a4fd4ae12be5f566b055b6d52a4ca52f48d 100644 --- a/alib2cli/src/registration/OutputFileTypeRegistration.cpp +++ b/alib2cli/src/registration/OutputFileTypeRegistration.cpp @@ -3,10 +3,7 @@ #include <exception/CommonException.h> #include <registry/XmlRegistry.h> -#include <registry/StringWriterRegistry.hpp> -#include <registry/RawWriterRegistry.hpp> -#include <abstraction/ImmediateValueAbstraction.hpp> #include <abstraction/XmlTokensComposerAbstraction.hpp> #include <abstraction/PackingAbstraction.hpp> @@ -36,47 +33,7 @@ namespace { return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ); } - std::shared_ptr < abstraction::OperationAbstraction > dummy3 ( const std::string & typehint ) { - ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; - - abstractions.push_back ( abstraction::StringWriterRegistry::getAbstraction ( typehint ) ); - - ext::vector < std::string > templateParams; - ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) }; - abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; - - abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) ); - - std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 ); - res->setInnerConnection ( 0, 1, 1, true ); - res->setOuterConnection ( 0, 1, 0 ); // filename - res->setOuterConnection ( 1, 0, 0 ); // data - - return res; - } - - std::shared_ptr < abstraction::OperationAbstraction > dummy4 ( const std::string & typehint ) { - ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; - - abstractions.push_back ( abstraction::RawWriterRegistry::getAbstraction ( typehint ) ); - - ext::vector < std::string > templateParams; - ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) }; - abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; - - abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) ); - - std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 ); - res->setInnerConnection ( 0, 1, 1, true ); - res->setOuterConnection ( 0, 1, 0 ); // filename - res->setOuterConnection ( 1, 0, 0 ); // data - - return res; - } - auto xmlOutputFileHandler = registration::OutputFileRegister ( "xml", dummy ); auto fileOutputFileHandler = registration::OutputFileRegister ( "file", dummy2 ); -auto stringOutputFileHandler = registration::OutputFileRegister ( "string", dummy3 ); -auto rawOutputFileHandler = registration::OutputFileRegister ( "raw", dummy4 ); } diff --git a/alib2raw_cli_integration/Doxyfile b/alib2raw_cli_integration/Doxyfile new file mode 100644 index 0000000000000000000000000000000000000000..c8b05a1d0656822c3a5b77374ef506f8db7322c4 --- /dev/null +++ b/alib2raw_cli_integration/Doxyfile @@ -0,0 +1,9 @@ +@INCLUDE = ../Doxyfile-library + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "alib2raw" diff --git a/alib2raw_cli_integration/makefile b/alib2raw_cli_integration/makefile new file mode 100644 index 0000000000000000000000000000000000000000..0b886940386c0839f59d2d1b395d4292060b6d4e --- /dev/null +++ b/alib2raw_cli_integration/makefile @@ -0,0 +1,3 @@ +-include makefile.conf +-include ../build.conf +-include ../makefile-library diff --git a/alib2raw_cli_integration/makefile.conf b/alib2raw_cli_integration/makefile.conf new file mode 100644 index 0000000000000000000000000000000000000000..8a0672aae3853ddfaf4eb6fa9ce18a324280c4ae --- /dev/null +++ b/alib2raw_cli_integration/makefile.conf @@ -0,0 +1,9 @@ +LIBRARY:=alib2raw_cli_integration +TESTBIN:=alib2test + +LINK_LIBRARIES=alib2raw alib2data alib2cli alib2xml alib2common alib2abstraction alib2measure alib2std +SYSTEM_LIBRARIES=xml2 +SYSTEM_INCLUDE_PATHS=/usr/include/libxml2 +TEST_LINK_LIBRARIES= +TEST_SYSTEM_LIBRARIES= +TEST_SYSTEM_INCLUDE_PATHS= diff --git a/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp b/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eb9eb3cb04eee6da77cd83d5be40bde631e00fcf --- /dev/null +++ b/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp @@ -0,0 +1,34 @@ +#include <registration/InputFileTypeRegistration.hpp> + +#include <registry/RawReaderRegistry.hpp> + +#include <abstraction/WrapperAbstraction.hpp> +#include <abstraction/PackingAbstraction.hpp> + +namespace { + + std::shared_ptr < abstraction::OperationAbstraction > dummy4 ( const std::string & typehint, const ext::vector < std::string > & ) { + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; + + ext::vector < std::string > templateParams; + ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) }; + abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; + + abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) ); + + auto rawParserAbstractionFinder = [ = ] ( const std::string & ) { + return abstraction::RawReaderRegistry::getAbstraction ( typehint ); + }; + + abstractions.push_back ( std::make_shared < abstraction::WrapperAbstraction < abstraction::UnspecifiedType, std::string && > > ( rawParserAbstractionFinder ) ); + + std::shared_ptr < abstraction::PackingAbstraction < 1 > > res = std::make_shared < abstraction::PackingAbstraction < 1 > > ( std::move ( abstractions ), 1 ); + res->setInnerConnection ( 0, 1, 0, true ); + res->setOuterConnection ( 0, 0, 0 ); + + return res; + } + +auto rawInputFileHandler = registration::InputFileRegister ( "raw", dummy4 ); + +} diff --git a/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp b/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb03f39f5241a9309c28ab63775ab8dbd5481729 --- /dev/null +++ b/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp @@ -0,0 +1,32 @@ +#include <registration/OutputFileTypeRegistration.hpp> + +#include <exception/CommonException.h> + +#include <registry/RawWriterRegistry.hpp> + +#include <abstraction/PackingAbstraction.hpp> + +namespace { + + std::shared_ptr < abstraction::OperationAbstraction > dummy4 ( const std::string & typehint ) { + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; + + abstractions.push_back ( abstraction::RawWriterRegistry::getAbstraction ( typehint ) ); + + ext::vector < std::string > templateParams; + ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) }; + abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; + + abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) ); + + std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 ); + res->setInnerConnection ( 0, 1, 1, true ); + res->setOuterConnection ( 0, 1, 0 ); // filename + res->setOuterConnection ( 1, 0, 0 ); // data + + return res; + } + +auto rawOutputFileHandler = registration::OutputFileRegister ( "raw", dummy4 ); + +} diff --git a/alib2raw_cli_integration/test-src/main.cpp b/alib2raw_cli_integration/test-src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fd442ebd124cc1580de43b2e1846e5063fefde68 --- /dev/null +++ b/alib2raw_cli_integration/test-src/main.cpp @@ -0,0 +1,164 @@ +#include <tclap/CmdLine.h> + +#include <cppunit/CompilerOutputter.h> +#include <cppunit/extensions/TestFactoryRegistry.h> +#include <cppunit/ui/text/TestRunner.h> +#include <cppunit/TestResultCollector.h> +#include <cppunit/TestResult.h> +#include <cppunit/XmlOutputter.h> + +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <cppunit/portability/Stream.h> +#include <cppunit/TestListener.h> +#include <cppunit/SourceLine.h> +#include <cppunit/Exception.h> + +#include <exception/CommonException.h> + +CPPUNIT_NS_BEGIN + +class CPPUNIT_API TestProgressListener : public TestListener +{ +public: + TestProgressListener(); + + virtual ~TestProgressListener(); + + void startTest( Test *test ); + + void addFailure( const TestFailure &failure ); + + void endTest( Test *test ); + + int getResult() const; + + void printResults() const; + +private: + TestProgressListener( const TestProgressListener © ); + + void operator =( const TestProgressListener © ); + +private: + int m_Failures; + int m_Tests; + int m_Assertions; + bool m_lastTestFailed; +}; + +TestProgressListener::TestProgressListener() : m_Failures( 0 ), m_Tests(0), m_Assertions(0), m_lastTestFailed( false ) +{ +} + +TestProgressListener::~TestProgressListener() +{ +} + +void TestProgressListener::startTest( Test * test ) +{ + stdCOut() << test->getName() << ":" << "\n"; + stdCOut().flush(); + + m_lastTestFailed = false; + m_Tests++; +} + +void TestProgressListener::addFailure( const TestFailure &failure ) +{ + stdCOut() << (failure.isError() ? "error" : "assertion") << " : " << failure.failedTestName() << " : " << failure.sourceLine().lineNumber() << "\n"; + stdCOut() << "Exception " << failure.thrownException()->message().details(); + + m_lastTestFailed = true; + if(failure.isError()) m_Failures++; else m_Assertions++; +} + +void TestProgressListener::endTest( Test * test) +{ + stdCOut() << "Result (" << test->getName() << ")"; + stdCOut().flush(); + + if ( !m_lastTestFailed ) + stdCOut() << " : OK"; + else + stdCOut() << " : Fail"; + stdCOut() << "\n\n"; +} + +int TestProgressListener::getResult() const { + return m_Failures + m_Assertions; +} + +void TestProgressListener::printResults() const { + stdCOut() << "Overal result: Tests: " << m_Tests << " Assertions: " << m_Assertions << " Failures: " << m_Failures << "\n"; +} + +CPPUNIT_NS_END + +int main(int argc, char* argv[]) { + try { + TCLAP::CmdLine cmd("Main test binary.", ' ', "0.01"); + + TCLAP::MultiArg<std::string> testPathSegments("p", "path", "test path", false, "string" ); + cmd.add( testPathSegments ); + + cmd.parse(argc, argv); + + CppUnit::TestResult controller; + + CppUnit::TestResultCollector result; + controller.addListener( &result ); + + CppUnit::TestProgressListener progressListener; + controller.addListener( &progressListener ); + + CppUnit::Test *suite = NULL; + std::string testPath = ""; + if(testPathSegments.getValue().size() == 0) { + // Get the top level suite from the registry + suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); + } else if(testPathSegments.getValue().size() == 1) { + suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); + } else { + suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); + bool first = true; + for(const std::string& path : testPathSegments.getValue()) { + if(first) { + first = false; + continue; + } + testPath += path + "/"; + } + testPath.pop_back(); + } + + // Adds the test to the list of test to run + CppUnit::TextUi::TestRunner runner; + runner.addTest( suite ); + + // Change the default outputter to a compiler error format outputter + runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) ); + // Run the tests. + runner.run( controller, testPath ); + + progressListener.printResults(); + + std::ofstream xmlFileResults("CppUnitTestResults.xml"); + CppUnit::XmlOutputter xmlOut(&result, xmlFileResults); + xmlOut.write(); + + return progressListener.getResult(); + } catch(const exception::CommonException& exception) { + std::cerr << exception.getCause() << std::endl; + return 1; + } catch(const TCLAP::ArgException& exception) { + std::cerr << exception.error() << std::endl; + return 2; + } catch (const std::exception& exception) { + std::cerr << "Exception caught: " << exception.what() << std::endl; + return 3; + } catch(...) { + std::cerr << "Unknown exception caught." << std::endl; + return 127; + } +} diff --git a/alib2str_cli_integration/Doxyfile b/alib2str_cli_integration/Doxyfile new file mode 100644 index 0000000000000000000000000000000000000000..c8b05a1d0656822c3a5b77374ef506f8db7322c4 --- /dev/null +++ b/alib2str_cli_integration/Doxyfile @@ -0,0 +1,9 @@ +@INCLUDE = ../Doxyfile-library + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "alib2raw" diff --git a/alib2str_cli_integration/makefile b/alib2str_cli_integration/makefile new file mode 100644 index 0000000000000000000000000000000000000000..0b886940386c0839f59d2d1b395d4292060b6d4e --- /dev/null +++ b/alib2str_cli_integration/makefile @@ -0,0 +1,3 @@ +-include makefile.conf +-include ../build.conf +-include ../makefile-library diff --git a/alib2str_cli_integration/makefile.conf b/alib2str_cli_integration/makefile.conf new file mode 100644 index 0000000000000000000000000000000000000000..1c01f70032cca91879f1fccad161a13b74a31dce --- /dev/null +++ b/alib2str_cli_integration/makefile.conf @@ -0,0 +1,9 @@ +LIBRARY:=alib2str_cli_integration +TESTBIN:=alib2test + +LINK_LIBRARIES=alib2str alib2data alib2cli alib2xml alib2common alib2abstraction alib2measure alib2std +SYSTEM_LIBRARIES=xml2 +SYSTEM_INCLUDE_PATHS=/usr/include/libxml2 +TEST_LINK_LIBRARIES= +TEST_SYSTEM_LIBRARIES= +TEST_SYSTEM_INCLUDE_PATHS= diff --git a/alib2str_cli_integration/src/InputFileTypeRegistration.cpp b/alib2str_cli_integration/src/InputFileTypeRegistration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6748fcc71c8bd152519fa6b3672285fc50f4d856 --- /dev/null +++ b/alib2str_cli_integration/src/InputFileTypeRegistration.cpp @@ -0,0 +1,34 @@ +#include <registration/InputFileTypeRegistration.hpp> + +#include <registry/StringReaderRegistry.hpp> + +#include <abstraction/WrapperAbstraction.hpp> +#include <abstraction/PackingAbstraction.hpp> + +namespace { + + std::shared_ptr < abstraction::OperationAbstraction > dummy3 ( const std::string & typehint, const ext::vector < std::string > & ) { + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; + + ext::vector < std::string > templateParams; + ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) }; + abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; + + abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) ); + + auto stringParserAbstractionFinder = [ = ] ( const std::string & data ) { + return abstraction::StringReaderRegistry::getAbstraction ( typehint, data ); + }; + + abstractions.push_back ( std::make_shared < abstraction::WrapperAbstraction < abstraction::UnspecifiedType, std::string && > > ( stringParserAbstractionFinder ) ); + + std::shared_ptr < abstraction::PackingAbstraction < 1 > > res = std::make_shared < abstraction::PackingAbstraction < 1 > > ( std::move ( abstractions ), 1 ); + res->setInnerConnection ( 0, 1, 0, true ); + res->setOuterConnection ( 0, 0, 0 ); + + return res; + } + +auto stringInputFileHandler = registration::InputFileRegister ( "string", dummy3 ); + +} diff --git a/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp b/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dbb841e4e961bd920cc06c89877fe1fbe0c7b74b --- /dev/null +++ b/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp @@ -0,0 +1,32 @@ +#include <registration/OutputFileTypeRegistration.hpp> + +#include <exception/CommonException.h> + +#include <registry/StringWriterRegistry.hpp> + +#include <abstraction/PackingAbstraction.hpp> + +namespace { + + std::shared_ptr < abstraction::OperationAbstraction > dummy3 ( const std::string & typehint ) { + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions; + + abstractions.push_back ( abstraction::StringWriterRegistry::getAbstraction ( typehint ) ); + + ext::vector < std::string > templateParams; + ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) }; + abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE; + + abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) ); + + std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 ); + res->setInnerConnection ( 0, 1, 1, true ); + res->setOuterConnection ( 0, 1, 0 ); // filename + res->setOuterConnection ( 1, 0, 0 ); // data + + return res; + } + +auto stringOutputFileHandler = registration::OutputFileRegister ( "string", dummy3 ); + +} diff --git a/alib2str_cli_integration/test-src/main.cpp b/alib2str_cli_integration/test-src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fd442ebd124cc1580de43b2e1846e5063fefde68 --- /dev/null +++ b/alib2str_cli_integration/test-src/main.cpp @@ -0,0 +1,164 @@ +#include <tclap/CmdLine.h> + +#include <cppunit/CompilerOutputter.h> +#include <cppunit/extensions/TestFactoryRegistry.h> +#include <cppunit/ui/text/TestRunner.h> +#include <cppunit/TestResultCollector.h> +#include <cppunit/TestResult.h> +#include <cppunit/XmlOutputter.h> + +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <cppunit/portability/Stream.h> +#include <cppunit/TestListener.h> +#include <cppunit/SourceLine.h> +#include <cppunit/Exception.h> + +#include <exception/CommonException.h> + +CPPUNIT_NS_BEGIN + +class CPPUNIT_API TestProgressListener : public TestListener +{ +public: + TestProgressListener(); + + virtual ~TestProgressListener(); + + void startTest( Test *test ); + + void addFailure( const TestFailure &failure ); + + void endTest( Test *test ); + + int getResult() const; + + void printResults() const; + +private: + TestProgressListener( const TestProgressListener © ); + + void operator =( const TestProgressListener © ); + +private: + int m_Failures; + int m_Tests; + int m_Assertions; + bool m_lastTestFailed; +}; + +TestProgressListener::TestProgressListener() : m_Failures( 0 ), m_Tests(0), m_Assertions(0), m_lastTestFailed( false ) +{ +} + +TestProgressListener::~TestProgressListener() +{ +} + +void TestProgressListener::startTest( Test * test ) +{ + stdCOut() << test->getName() << ":" << "\n"; + stdCOut().flush(); + + m_lastTestFailed = false; + m_Tests++; +} + +void TestProgressListener::addFailure( const TestFailure &failure ) +{ + stdCOut() << (failure.isError() ? "error" : "assertion") << " : " << failure.failedTestName() << " : " << failure.sourceLine().lineNumber() << "\n"; + stdCOut() << "Exception " << failure.thrownException()->message().details(); + + m_lastTestFailed = true; + if(failure.isError()) m_Failures++; else m_Assertions++; +} + +void TestProgressListener::endTest( Test * test) +{ + stdCOut() << "Result (" << test->getName() << ")"; + stdCOut().flush(); + + if ( !m_lastTestFailed ) + stdCOut() << " : OK"; + else + stdCOut() << " : Fail"; + stdCOut() << "\n\n"; +} + +int TestProgressListener::getResult() const { + return m_Failures + m_Assertions; +} + +void TestProgressListener::printResults() const { + stdCOut() << "Overal result: Tests: " << m_Tests << " Assertions: " << m_Assertions << " Failures: " << m_Failures << "\n"; +} + +CPPUNIT_NS_END + +int main(int argc, char* argv[]) { + try { + TCLAP::CmdLine cmd("Main test binary.", ' ', "0.01"); + + TCLAP::MultiArg<std::string> testPathSegments("p", "path", "test path", false, "string" ); + cmd.add( testPathSegments ); + + cmd.parse(argc, argv); + + CppUnit::TestResult controller; + + CppUnit::TestResultCollector result; + controller.addListener( &result ); + + CppUnit::TestProgressListener progressListener; + controller.addListener( &progressListener ); + + CppUnit::Test *suite = NULL; + std::string testPath = ""; + if(testPathSegments.getValue().size() == 0) { + // Get the top level suite from the registry + suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); + } else if(testPathSegments.getValue().size() == 1) { + suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); + } else { + suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); + bool first = true; + for(const std::string& path : testPathSegments.getValue()) { + if(first) { + first = false; + continue; + } + testPath += path + "/"; + } + testPath.pop_back(); + } + + // Adds the test to the list of test to run + CppUnit::TextUi::TestRunner runner; + runner.addTest( suite ); + + // Change the default outputter to a compiler error format outputter + runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) ); + // Run the tests. + runner.run( controller, testPath ); + + progressListener.printResults(); + + std::ofstream xmlFileResults("CppUnitTestResults.xml"); + CppUnit::XmlOutputter xmlOut(&result, xmlFileResults); + xmlOut.write(); + + return progressListener.getResult(); + } catch(const exception::CommonException& exception) { + std::cerr << exception.getCause() << std::endl; + return 1; + } catch(const TCLAP::ArgException& exception) { + std::cerr << exception.error() << std::endl; + return 2; + } catch (const std::exception& exception) { + std::cerr << "Exception caught: " << exception.what() << std::endl; + return 3; + } catch(...) { + std::cerr << "Unknown exception caught." << std::endl; + return 127; + } +} diff --git a/aql2/makefile.conf b/aql2/makefile.conf index c2f3d9f2a5a8c710785e2d2053cadd5a8c12446d..a68ce5463e18df0bbfcebf6f2092a196db2d5269 100644 --- a/aql2/makefile.conf +++ b/aql2/makefile.conf @@ -1,4 +1,4 @@ EXECUTABLE:=aql2 -LINK_LIBRARIES=alib2cli alib2elgo alib2algo alib2aux alib2raw alib2str alib2data alib2dummy alib2xml alib2common alib2abstraction alib2measure alib2std +LINK_LIBRARIES=alib2elgo alib2algo alib2aux alib2raw_cli_integration alib2raw alib2str_cli_integration alib2str alib2data alib2dummy alib2cli alib2xml alib2common alib2abstraction alib2measure alib2std SYSTEM_LIBRARIES=xml2 readline SYSTEM_INCLUDE_PATHS=/usr/include/libxml2 diff --git a/makefile b/makefile index b6911759d850987dfdb2ec0bdc79febbde0a8c92..0a3f4e4a62315a7bd7bfeb1e707b2b238ba33fb2 100644 --- a/makefile +++ b/makefile @@ -24,16 +24,18 @@ SUBDIRS_LIBS = alib2std \ alib2abstraction \ alib2common \ alib2xml \ + alib2cli \ alib2dummy \ alib2data \ alib2data_experimental \ alib2str \ + alib2str_cli_integration \ alib2raw \ + alib2raw_cli_integration \ alib2aux \ alib2algo \ alib2algo_experimental \ alib2elgo \ - alib2cli \ SUBDIRS_BINS = aecho2 \ aarbology2 \