From 994181cbf97614e6d8ac8a4d78703987e53a6ff3 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 3 Aug 2016 17:31:28 +0200 Subject: [PATCH] Improve utilities for testing tageditor CLI --- conversion/stringconversion.cpp | 2 +- conversion/stringconversion.h | 49 +++++++++++++++++++++++++++++++++ tests/conversiontests.cpp | 18 +++++++----- tests/testutils.cpp | 5 ++++ 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/conversion/stringconversion.cpp b/conversion/stringconversion.cpp index 587d3c1..0511093 100644 --- a/conversion/stringconversion.cpp +++ b/conversion/stringconversion.cpp @@ -85,7 +85,7 @@ public: break; } } - return make_pair(unique_ptr(outputBuffer), currentOutputOffset - outputBuffer); + return StringData(outputBuffer, currentOutputOffset - outputBuffer); } private: diff --git a/conversion/stringconversion.h b/conversion/stringconversion.h index 5c45842..97db76e 100644 --- a/conversion/stringconversion.h +++ b/conversion/stringconversion.h @@ -5,6 +5,7 @@ #include "./binaryconversion.h" #include +#include #include #include #include @@ -35,6 +36,7 @@ struct LIB_EXPORT StringDataDeleter { * \brief Type used to return string encoding conversion result. */ typedef std::pair, std::size_t> StringData; +//typedef std::pair, std::size_t> StringData; // might work too LIB_EXPORT StringData convertString(const char *fromCharset, const char *toCharset, const char *inputBuffer, std::size_t inputBufferSize, float outputBufferSizeFactor = 1.0f); LIB_EXPORT StringData convertUtf8ToUtf16LE(const char *inputBuffer, std::size_t inputBufferSize); @@ -163,6 +165,53 @@ template LIB_EXPORT bool startsWith(const StringType &str, return false; } +/*! + * \brief Returns whether \a str starts with \a phrase. + */ +template LIB_EXPORT bool startsWith(const StringType &str, const typename StringType::value_type *phrase) +{ + for(auto stri = str.cbegin(), strend = str.cend(); stri != strend; ++stri, ++phrase) { + if(!*phrase) { + return true; + } else if(*stri != *phrase) { + return false; + } + } + return false; +} + +/*! + * \brief Returns whether \a str contains the specified \a substrings. + * \remarks The \a substrings must occur in the specified order. + */ +template LIB_EXPORT bool containsSubstrings(const StringType &str, std::initializer_list substrings) +{ + typename StringType::size_type currentPos = 0; + for(const auto &substr : substrings) { + if((currentPos = str.find(substr, currentPos)) == StringType::npos) { + return false; + } + currentPos += substr.size(); + } + return true; +} + +/*! + * \brief Returns whether \a str contains the specified \a substrings. + * \remarks The \a substrings must occur in the specified order. + */ +template LIB_EXPORT bool containsSubstrings(const StringType &str, std::initializer_list substrings) +{ + typename StringType::size_type currentPos = 0; + for(const auto *substr : substrings) { + if((currentPos = str.find(substr, currentPos)) == StringType::npos) { + return false; + } + currentPos += std::strlen(substr); + } + return true; +} + /*! * \brief Replaces all occurences of \a find with \a relpace in the specified \a str. */ diff --git a/tests/conversiontests.cpp b/tests/conversiontests.cpp index 77a6e31..4a97863 100644 --- a/tests/conversiontests.cpp +++ b/tests/conversiontests.cpp @@ -163,7 +163,7 @@ void ConversionTests::testSwapOrderFunctions() /*! * \brief Internally used for string encoding tests to check results. */ -void assertEqual(const char *message, const byte *expectedValues, size_t expectedSize, const pair, size_t> &actualValues) +void assertEqual(const char *message, const byte *expectedValues, size_t expectedSize, const StringData &actualValues) { // check whether number of elements matches CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expectedSize, actualValues.second); @@ -228,7 +228,7 @@ void ConversionTests::testStringEncodingConversions() */ void ConversionTests::testStringConversions() { - // test stringToNumber() / numberToString() with random numbers + // stringToNumber() / numberToString() with random numbers uniform_int_distribution randomDistSigned(numeric_limits::min()); uniform_int_distribution randomDistUnsigned(0); for(byte b = 1; b < 100; ++b) { @@ -248,10 +248,10 @@ void ConversionTests::testStringConversions() } } - // test interpretIntegerAsString() + // interpretIntegerAsString() CPPUNIT_ASSERT(interpretIntegerAsString(0x54455354) == "TEST"); - // test splitString() / joinStrings() + // splitString() / joinStrings() auto splitJoinTest = joinStrings(splitString >(",a,,ab,ABC,s", ",", EmptyPartsTreat::Keep), " ", false, "(", ")"); CPPUNIT_ASSERT(splitJoinTest == "() (a) () (ab) (ABC) (s)"); splitJoinTest = joinStrings(splitString >(",a,,ab,ABC,s", ",", EmptyPartsTreat::Keep), " ", true, "(", ")"); @@ -261,16 +261,20 @@ void ConversionTests::testStringConversions() splitJoinTest = joinStrings(splitString >(",a,,ab,ABC,s", ",", EmptyPartsTreat::Merge), " ", false, "(", ")"); CPPUNIT_ASSERT(splitJoinTest == "(a,ab) (ABC) (s)"); - // test findAndReplace() + // findAndReplace() string findReplaceTest("findAndReplace()"); findAndReplace(findReplaceTest, "And", "Or"); CPPUNIT_ASSERT(findReplaceTest == "findOrReplace()"); - // test startsWith() + // startsWith() CPPUNIT_ASSERT(!startsWith(findReplaceTest, "findAnd")); CPPUNIT_ASSERT(startsWith(findReplaceTest, "findOr")); - // test encodeBase64() / decodeBase64() with random data + // containsSubstrings() + CPPUNIT_ASSERT(containsSubstrings("this string contains foo and bar", {"foo", "bar"})); + CPPUNIT_ASSERT(!containsSubstrings("this string contains foo and bar", {"bar", "foo"})); + + // encodeBase64() / decodeBase64() with random data uniform_int_distribution randomDistChar; byte originalBase64Data[4047]; for(byte &c : originalBase64Data) { diff --git a/tests/testutils.cpp b/tests/testutils.cpp index 1aafd84..95cb8c6 100644 --- a/tests/testutils.cpp +++ b/tests/testutils.cpp @@ -237,6 +237,11 @@ int TestApplication::execApp(const char *const *args, string &stdout, string &st if(int child = fork()) { // parent process: read stdout and stderr from child close(writeCoutPipe), close(writeCerrPipe); + if(child == -1) { + close(readCoutPipe), close(readCerrPipe); + throw runtime_error("Unable to create fork"); + } + // TODO: use select instead of threads thread readCoutThread([readCoutPipe, &stdout] { char buffer[512]; ssize_t count;