13#if defined(PLATFORM_UNIX) || defined(CPP_UTILITIES_BOOST_PROCESS)
14#define CPP_UTILITIES_HAS_EXEC_APP
18#if defined(__COUNTER__)
19#undef CPPUNIT_UNIQUE_COUNTER
20#define CPPUNIT_UNIQUE_COUNTER __COUNTER__
40 operator bool()
const;
43 std::string
testFilePath(
const std::string &relativeTestFilePath)
const;
44 std::string
testDirPath(
const std::string &relativeTestDirPath)
const;
46 std::string
workingCopyPathAs(
const std::string &relativeTestFilePath,
const std::string &relativeWorkingCopyPath,
48#ifdef CPP_UTILITIES_HAS_EXEC_APP
49 int execApp(
const char *
const *args, std::string &output, std::string &errors,
bool suppressLogging =
false,
int timeout = -1)
const;
53 const std::vector<std::string> &testFilePaths()
const;
54 const std::string &workingDirectory()
const;
55 const char *applicationPath();
56 bool unitsSpecified()
const;
57 const std::vector<const char *> &units()
const;
58 bool onlyListUnits()
const;
62 static const char *appPath();
65 static std::string readTestfilePathFromEnv();
66 static std::vector<std::string> readTestfilePathFromSrcRef();
75 std::vector<std::string> m_testFilesPaths;
76 std::string m_workingDir;
87inline TestApplication::operator bool()
const
97 return TestApplication::s_instance;
113 return m_testFilesPaths;
146 return m_unitsArg.
values();
194#ifdef CPP_UTILITIES_HAS_EXEC_APP
200inline CPP_UTILITIES_EXPORT int execApp(
const char *
const *args, std::string &output, std::string &errors)
206 const char *appPath,
const char *
const *args, std::string &output, std::string &errors,
bool suppressLogging =
false,
int timeout = -1);
208 const char *appName,
const char *
const *args, std::string &output, std::string &errors,
bool suppressLogging =
false,
int timeout = -1);
214template <
typename Optional, Traits::EnableIf<Traits::IsSpecializationOf<Optional, std::optional>> * =
nullptr>
215inline std::ostream &
operator<<(std::ostream &out,
const Optional &optional)
217 if (optional.has_value()) {
218 return out << *optional;
220 return out <<
"[no value]";
251 return out <<
'0' <<
'x' << std::hex << std::setfill(
'0') << std::setw(2) << unsigned(value.
value) << std::dec;
278template <
typename T, Traits::DisableIf<std::is_
integral<T>> * =
nullptr>
const T &
integralsAsHexNumber(
const T &value)
291#define TESTUTILS_ASSERT_EXEC(args) TESTUTILS_ASSERT_EXEC_EXIT_STATUS(args, 0)
301#ifdef CPP_UTILITIES_BOOST_PROCESS
302#define TESTUTILS_ASSERT_EXEC_EXIT_STATUS(args, expectedExitStatus) \
304 const auto status = execApp(args, stdout, stderr); \
305 if (status != expectedExitStatus) { \
306 CPPUNIT_FAIL(::CppUtilities::argsToString( \
307 "app exited with status ", status, " (expected ", expectedExitStatus, ")\nstdout: ", stdout, "\nstderr: ", stderr)); \
311#define TESTUTILS_ASSERT_EXEC_EXIT_STATUS(args, expectedExitStatus) \
313 const auto status = execApp(args, stdout, stderr); \
314 if (!WIFEXITED(status)) { \
315 CPPUNIT_FAIL(::CppUtilities::argsToString("app did not terminate normally\nstdout: ", stdout, "\nstderr: ", stderr)); \
317 if (const auto exitStatus = WEXITSTATUS(status); exitStatus != expectedExitStatus) { \
318 CPPUNIT_FAIL(::CppUtilities::argsToString( \
319 "app exited with status ", exitStatus, " (expected ", expectedExitStatus, ")\nstdout: ", stdout, "\nstderr: ", stderr)); \
328#define TESTUTILS_ASSERT_LIKE_FLAGS(message, expectedRegex, regexFlags, actualString) \
329 (CPPUNIT_NS::Asserter::failIf(!(std::regex_match(actualString, std::regex(expectedRegex, regexFlags))), \
330 CPPUNIT_NS::Message( \
331 CppUtilities::argsToString('\"', actualString, "\"\n not like\n\"", expectedRegex, '\"'), "Expression: " #actualString, message), \
332 CPPUNIT_SOURCELINE()))
338#define TESTUTILS_ASSERT_LIKE(message, expectedRegex, actualString) \
339 TESTUTILS_ASSERT_LIKE_FLAGS(message, expectedRegex, std::regex::ECMAScript, actualString)
344template <typename Pair, CppUtilities::Traits::EnableIf<CppUtilities::Traits::IsSpecializationOf<Pair, std::pair>> * = nullptr>
345inline std::ostream &operator<<(std::ostream &out, const Pair &pair)
347 return out << "key: " << pair.first << "; value: " << pair.second << '\n';
353template <typename Iteratable, Traits::EnableIf<Traits::IsIteratable<Iteratable>, Traits::Not<Traits::IsString<Iteratable>>> * = nullptr>
354inline std::ostream &operator<<(std::ostream &out, const Iteratable &iteratable)
357 std::size_t index = 0;
358 for (const auto &item : iteratable) {
359 out << std::setw(2) << index << ':' << ' ' << integralsAsHexNumber(item) << '\n';
373constexpr std::size_t operator"" _st(unsigned long long size)
375 return static_cast<std::size_t>(size);
382constexpr std::uint64_t operator"" _uint64(unsigned long long size)
384 return static_cast<std::uint64_t>(size);
391constexpr std::int64_t operator"" _int64(unsigned long long size)
393 return static_cast<std::int64_t>(size);
395} // namespace Literals
396} // namespace CppUtilities
The ArgumentParser class provides a means for handling command line arguments.
const char * firstValue() const
Returns the first parameter value of the first occurrence of the argument.
const std::vector< const char * > & values(std::size_t occurrence=0) const
Returns the parameter values for the specified occurrence of argument.
bool isPresent() const
Returns an indication whether the argument could be detected when parsing.
The AsHexNumber class allows printing values asserted with cppunit (or similar test framework) using ...
AsHexNumber(const T &value)
Constructs a new instance; use asHexNumber() for convenience instead.
The ConfigValueArgument class is an Argument where setCombinable() is true by default.
The OperationArgument class is an Argument where denotesOperation() is true by default.
The TestApplication class simplifies writing test applications that require opening test files.
bool onlyListUnits() const
Returns whether the test application should only list available units and not actually run any tests.
const std::vector< const char * > & units() const
Returns the specified test units.
std::string testFilePath(const std::string &relativeTestFilePath) const
Returns the full path of the test file with the specified relativeTestFilePath.
static const char * appPath()
Returns the application path or an empty string if no application path has been set.
const std::vector< std::string > & testFilePaths() const
Returns the list of directories to look for test files.
bool unitsSpecified() const
Returns whether particular units have been specified.
const char * applicationPath()
Returns the application path or an empty string if no application path has been set.
const std::string & workingDirectory() const
Returns the directory which is supposed to used for storing files created by tests.
static const TestApplication * instance()
Returns the current TestApplication instance.
std::string workingCopyPathAs(const std::string &relativeTestFilePath, const std::string &relativeWorkingCopyPath, WorkingCopyMode mode=WorkingCopyMode::CreateCopy) const
Returns the full path to a working copy of the test file with the specified relativeTestFilePath.
std::string testDirPath(const std::string &relativeTestDirPath) const
Returns the full path of the test directory with the specified relativeTestDirPath.
#define CPP_UTILITIES_EXPORT
Marks the symbol to be exported by the c++utilities library.
Contains all utilities provides by the c++utilities library.
CPP_UTILITIES_EXPORT std::string testFilePath(const std::string &relativeTestFilePath)
Convenience function to invoke TestApplication::testFilePath().
CPP_UTILITIES_EXPORT std::string workingCopyPath(const std::string &relativeTestFilePath, WorkingCopyMode mode=WorkingCopyMode::CreateCopy)
Convenience function to invoke TestApplication::workingCopyPath().
WorkingCopyMode
The WorkingCopyMode enum specifies additional options to influence behavior of TestApplication::worki...
CPP_UTILITIES_EXPORT std::string testDirPath(const std::string &relativeTestDirPath)
Convenience function to invoke TestApplication::testDirPath().
CPP_UTILITIES_EXPORT std::ostream & operator<<(std::ostream &out, Indentation indentation)
bool operator==(const AsHexNumber< T > &lhs, const AsHexNumber< T > &rhs)
Provides operator == required by CPPUNIT_ASSERT_EQUAL.
AsHexNumber< T > asHexNumber(const T &value)
Wraps a value to be printed using the hex system in the error case when asserted with cppunit (or sim...
CPP_UTILITIES_EXPORT std::string workingCopyPathAs(const std::string &relativeTestFilePath, const std::string &relativeWorkingCopyPath, WorkingCopyMode mode=WorkingCopyMode::CreateCopy)
Convenience function to invoke TestApplication::workingCopyPathAs().
AsHexNumber< T > integralsAsHexNumber(const T &value)
Wraps a value to be printed using the hex system in the error case when asserted with cppunit (or sim...