From e4910171e893cc2e7dfe25d2e4cf038d7e99cf05 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 25 Jan 2016 23:59:52 +0100 Subject: [PATCH] added check target and first tests --- CMakeLists.txt | 18 ++++++ tests/conversiontests.cpp | 131 ++++++++++++++++++++++++++++++++++++++ tests/cppunit.cpp | 13 ++++ tests/iotests.cpp | 32 ++++++++++ 4 files changed, 194 insertions(+) create mode 100644 tests/conversiontests.cpp create mode 100644 tests/cppunit.cpp create mode 100644 tests/iotests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 51c8f80..ac5b820 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,14 @@ set(SRC_FILES math/math.cpp misc/random.cpp ) +set(TEST_HEADER_FILES + +) +set(TEST_SRC_FILES + tests/cppunit.cpp + tests/conversiontests.cpp + tests/iotests.cpp +) # meta data set(META_PROJECT_NAME c++utilities) @@ -110,6 +118,16 @@ set_target_properties(${META_PROJECT_NAME} PROPERTIES CXX_STANDARD 11 ) +# add check target +if(NOT TARGET check) + add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) +endif() +add_executable(${META_PROJECT_NAME}_tests EXCLUDE_FROM_ALL ${TEST_HEADER_FILES} ${TEST_SRC_FILES}) +target_link_libraries(${META_PROJECT_NAME}_tests c++utilities cppunit) +set_target_properties(${META_PROJECT_NAME}_tests PROPERTIES CXX_STANDARD 11) +add_test(NAME ${META_PROJECT_NAME}_tests COMMAND ${META_PROJECT_NAME}_tests) +add_dependencies(check ${META_PROJECT_NAME}_tests) + # add install target install(TARGETS ${META_PROJECT_NAME} RUNTIME DESTINATION bin diff --git a/tests/conversiontests.cpp b/tests/conversiontests.cpp new file mode 100644 index 0000000..c4817ff --- /dev/null +++ b/tests/conversiontests.cpp @@ -0,0 +1,131 @@ +#include "../conversion/binaryconversion.h" + +#include +#include + +#include +#include +#include + +using namespace std; +using namespace ConversionUtilities; + +using namespace CPPUNIT_NS; + +class ConversionTests : public TestFixture +{ + CPPUNIT_TEST_SUITE(ConversionTests); + CPPUNIT_TEST(testEndianness); + CPPUNIT_TEST(testBinaryConversions); + CPPUNIT_TEST_SUITE_END(); + +public: + ConversionTests(); + + void setUp() {} + void tearDown() {} + + void testEndianness(); + void testBinaryConversions(); + +private: + template + void testConversion(const char *message, function vice, function verca, intType min, intType max); + + char m_buff[8]; + random_device m_randomDevice; + mt19937 m_randomEngine; +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(ConversionTests); + +ConversionTests::ConversionTests() : + m_randomDevice(), + m_randomEngine(m_randomDevice()) +{} + +/*! + * \brief Tests whether macros for endianness are correct. + */ +void ConversionTests::testEndianness() +{ + union { + uint32_t integer; + char characters[4]; + } test = {0x01020304}; +#if defined(CONVERSION_UTILITIES_BYTE_ORDER_BIG_ENDIAN) + CPPUNIT_ASSERT_MESSAGE("Byte order assumption (big-endian) is wrong", test.characters[0] == 0x01); +#elif defined(CONVERSION_UTILITIES_BYTE_ORDER_LITTLE_ENDIAN) + CPPUNIT_ASSERT_MESSAGE("Byte order assumption (little-endian) is wrong", test.characters[0] == 0x04); +#else + CPPUNIT_FAIL("There is not valid byte order assumption"); +#endif +} + +template +void ConversionTests::testConversion(const char *message, function vice, function versa, intType min, intType max) +{ + const intType random = uniform_int_distribution(min, max)(m_randomEngine); + stringstream msg; + msg << message << '(' << hex << '0' << 'x' << random << ')'; + vice(random, m_buff); + const intType result = versa(m_buff); + CPPUNIT_ASSERT_MESSAGE(msg.str(), result == random); +} + +#define TEST_TYPE(endianness, function) \ + decltype(endianness::function(m_buff)) + +#define TEST_CONVERSION(function, endianness) \ + testConversion( \ + "testing " #function, \ + static_cast(&endianness::getBytes), \ + endianness::function, \ + numeric_limits::min(), \ + numeric_limits::max() \ + ) + +#define TEST_BE_CONVERSION(function) \ + TEST_CONVERSION( \ + function, BE \ + ) + +#define TEST_LE_CONVERSION(function) \ + TEST_CONVERSION( \ + function, LE \ + ) + +#define TEST_CUSTOM_CONVERSION(vice, versa, endianness, min, max) \ + testConversion( \ + "testing " #versa, \ + static_cast(&endianness::vice), \ + endianness::versa, \ + min, max \ + ) + +/*! + * \brief Tests some binary conversions. + * + * Tests toUInt16(), ... toUInt64(), toInt16(), ... toInt64() and + * the inverse getBytes() functions. + */ +void ConversionTests::testBinaryConversions() +{ + for(byte b = 0; b < 100; ++b) { + TEST_BE_CONVERSION(toUInt16); + TEST_CUSTOM_CONVERSION(getBytes24, toUInt24, BE, 0, 0xFFFFFF); + TEST_BE_CONVERSION(toUInt32); + TEST_BE_CONVERSION(toUInt64); + TEST_LE_CONVERSION(toUInt16); + TEST_CUSTOM_CONVERSION(getBytes24, toUInt24, LE, 0, 0xFFFFFF); + TEST_LE_CONVERSION(toUInt32); + TEST_LE_CONVERSION(toUInt64); + TEST_BE_CONVERSION(toInt16); + TEST_BE_CONVERSION(toInt32); + TEST_BE_CONVERSION(toInt64); + TEST_LE_CONVERSION(toInt16); + TEST_LE_CONVERSION(toInt32); + TEST_LE_CONVERSION(toInt64); + } + +} diff --git a/tests/cppunit.cpp b/tests/cppunit.cpp new file mode 100644 index 0000000..b23f727 --- /dev/null +++ b/tests/cppunit.cpp @@ -0,0 +1,13 @@ +#include +#include + +using namespace std; +using namespace CPPUNIT_NS; + +int main(int , char **) +{ + TextUi::TestRunner runner; + TestFactoryRegistry ®istry = TestFactoryRegistry::getRegistry(); + runner.addTest(registry.makeTest()); + return !runner.run(string(), false); +} diff --git a/tests/iotests.cpp b/tests/iotests.cpp new file mode 100644 index 0000000..3520494 --- /dev/null +++ b/tests/iotests.cpp @@ -0,0 +1,32 @@ +#include +#include + +using namespace std; + +using namespace CPPUNIT_NS; + +class IoTests : public TestFixture +{ + CPPUNIT_TEST_SUITE(IoTests); + CPPUNIT_TEST(testFailure); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp() {} + void tearDown() {} + + void testFailure(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(IoTests); + +/*! + * \brief Tests for GCC Bug 66145. + * \sa https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145 + */ +void IoTests::testFailure() +{ + fstream stream; + stream.exceptions(ios_base::failbit | ios_base::badbit); + CPPUNIT_ASSERT_THROW(stream.open("path/to/file/which/does/not/exist", ios_base::in), ios_base::failure); +}