diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp b/Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp new file mode 100644 index 00000000..b60ad6c1 --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/test/TestToolsLib.cpp @@ -0,0 +1,309 @@ +/* + * TestToolsLib.cpp + * ---------------- + * Purpose: Unit test framework for libopenmpt. + * Notes : Currently somewhat unreadable :/ + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" +#include "TestToolsLib.h" + + +#ifdef ENABLE_TESTS +#ifndef MODPLUG_TRACKER + + +#include <exception> +#include <iostream> + +#include <cstdlib> + + +OPENMPT_NAMESPACE_BEGIN + + +namespace Test { + + + +void mpt_test_reporter::case_run(const mpt::source_location& loc) +{ + #if !MPT_OS_DJGPP + std::cout << "TEST..: " << MPT_AFORMAT("{}({}):")(loc.file_name() ? loc.file_name() : "", loc.line()) << ": " << std::endl; + #else + MPT_UNUSED(loc); + #endif +} + +void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_e) +{ + #if !MPT_OS_DJGPP + std::cout << "TEST..: " << MPT_AFORMAT("{}({}): {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e) << ": " << std::endl; + #else + MPT_UNUSED(loc); + MPT_UNUSED(text_e); + #endif +} + +void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_ex, const char* text_e) +{ + if(text_ex) + { + #if !MPT_OS_DJGPP + std::cout << "TEST..: " << MPT_AFORMAT("{}({}): {} throws {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e, text_ex) << ": " << std::endl; + #else + MPT_UNUSED(loc); + MPT_UNUSED(text_ex); + MPT_UNUSED(text_e); + #endif + } else + { + #if !MPT_OS_DJGPP + std::cout << "TEST..: " << MPT_AFORMAT("{}({}): {} throws")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e) << ": " << std::endl; + #else + MPT_UNUSED(loc); + MPT_UNUSED(text_ex); + MPT_UNUSED(text_e); + #endif + } +} + +void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_a, const char* text_cmp, const char* text_b) +{ + #if !MPT_OS_DJGPP + std::cout << "TEST..: " << MPT_AFORMAT("{}({}): {} {} {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_a, text_cmp, text_b) << ": " << std::endl; + #else + MPT_UNUSED(loc); + MPT_UNUSED(text_a); + MPT_UNUSED(text_cmp); + MPT_UNUSED(text_b); + #endif +} + +void mpt_test_reporter::case_result(const mpt::source_location& loc, const mpt::test::result& result) +{ + MPT_UNUSED(loc); + if(std::holds_alternative<mpt::test::result_success>(result.info)) + { + #if !MPT_OS_DJGPP + std::cout << "RESULT: PASS" << std::endl; + #endif + } else if(std::holds_alternative<mpt::test::result_failure>(result.info)) + { + fail_count++; + std::cout << "RESULT: FAIL" << std::endl; + std::cout.flush(); + std::cerr << "FAIL: " << "FAILURE: " << std::get<mpt::test::result_failure>(result.info).text << std::endl; + std::cerr.flush(); + } else if(std::holds_alternative<mpt::test::result_unexpected_exception>(result.info)) + { + fail_count++; + std::cout << "RESULT: FAIL" << std::endl; + std::cout.flush(); + std::cerr << "FAIL: " << "UNEXPECTED EXCEPTION: " << std::get<mpt::test::result_unexpected_exception>(result.info).text << std::endl; + std::cerr.flush(); + } else + { + fail_count++; + std::cout << "RESULT: FAIL" << std::endl; + std::cout.flush(); + std::cerr << "FAIL: " << "UNKOWN" << std::endl; + std::cerr.flush(); + } +} + + + +int fail_count = 0; + + +static std::string remove_newlines(std::string str) +{ + return mpt::replace(mpt::replace(str, std::string("\n"), std::string(" ")), std::string("\r"), std::string(" ")); +} + + +Testcase::Testcase(Fatality fatality, Verbosity verbosity, const char * const desc, const mpt::source_location &loc) + : fatality(fatality) + , verbosity(verbosity) + , desc(desc) + , loc(loc) +{ + return; +} + + +std::string Testcase::AsString() const +{ + return MPT_AFORMAT("{}({}): {}")(loc.file_name() ? loc.file_name() : "", loc.line(), remove_newlines(desc)); +} + + +void Testcase::ShowStart() const +{ + switch(verbosity) + { + case VerbosityQuiet: + break; + case VerbosityNormal: +#if !MPT_OS_DJGPP + std::cout << "TEST..: " << AsString() << ": " << std::endl; +#endif + break; + case VerbosityVerbose: +#if !MPT_OS_DJGPP + std::cout << "TEST..: " << AsString() << ": " << std::endl; +#endif + break; + } +} + + +void Testcase::ShowProgress(const char * text) const +{ + switch(verbosity) + { + case VerbosityQuiet: + break; + case VerbosityNormal: + break; + case VerbosityVerbose: +#if !MPT_OS_DJGPP + std::cout << "TEST..: " << AsString() << ": " << text << std::endl; +#else + MPT_UNUSED_VARIABLE(text); +#endif + break; + } +} + + +void Testcase::ShowPass() const +{ + switch(verbosity) + { + case VerbosityQuiet: + break; + case VerbosityNormal: +#if !MPT_OS_DJGPP + std::cout << "RESULT: PASS" << std::endl; +#endif + break; + case VerbosityVerbose: +#if !MPT_OS_DJGPP + std::cout << "PASS..: " << AsString() << std::endl; +#endif + break; + } +} + + +void Testcase::ShowFail(bool exception, const char * const text) const +{ + switch(verbosity) + { + case VerbosityQuiet: + break; + case VerbosityNormal: + std::cout << "RESULT: FAIL" << std::endl; + break; + case VerbosityVerbose: + std::cout << "FAIL..: " << AsString() << std::endl; + break; + } + std::cout.flush(); + if(!exception) + { + if(!text || (text && std::string(text).empty())) + { + std::cerr << "FAIL: " << AsString() << std::endl; + } else + { + std::cerr << "FAIL: " << AsString() << " : " << text << std::endl; + } + } else + { + if(!text || (text && std::string(text).empty())) + { + std::cerr << "FAIL: " << AsString() << " EXCEPTION!" << std::endl; + } else + { + std::cerr << "FAIL: " << AsString() << " EXCEPTION: " << text << std::endl; + } + } + std::cerr.flush(); +} + + +void Testcase::ReportPassed() +{ + ShowPass(); +} + + +void Testcase::ReportFailed() +{ + fail_count++; + ReportException(); +} + + +void Testcase::ReportException() +{ + try + { + throw; // get the exception + } catch(TestFailed & e) + { + ShowFail(false, e.values.c_str()); + if(fatality == FatalityStop) + { + throw; // rethrow + } + } catch(std::exception & e) + { + ShowFail(true, e.what()); + throw; // rethrow + } catch(...) + { + ShowFail(true); + throw; // rethrow + } +} + + +} // namespace Test + + +#if defined(MPT_ASSERT_HANDLER_NEEDED) + +MPT_NOINLINE void AssertHandler(const mpt::source_location &loc, const char *expr, const char *msg) +{ + Test::fail_count++; + if(msg) + { + mpt::log::GlobalLogger().SendLogMessage(loc, LogError, "ASSERT", + U_("ASSERTION FAILED: ") + mpt::ToUnicode(mpt::Charset::ASCII, msg) + U_(" (") + mpt::ToUnicode(mpt::Charset::ASCII, expr) + U_(")") + ); + } else + { + mpt::log::GlobalLogger().SendLogMessage(loc, LogError, "ASSERT", + U_("ASSERTION FAILED: ") + mpt::ToUnicode(mpt::Charset::ASCII, expr) + ); + } + #if defined(MPT_BUILD_FATAL_ASSERTS) + std::abort(); + #endif // MPT_BUILD_FATAL_ASSERTS +} + +#endif // MPT_ASSERT_HANDLER_NEEDED + + +OPENMPT_NAMESPACE_END + + +#endif // !MODPLUG_TRACKER +#endif // ENABLE_TESTS |