19 #include <OpenMS/OpenMSConfig.h>
20 #include <OpenMS/config.h>
26 #include <type_traits>
32 #define stdcout std::cout
48 validate(
const std::vector<std::string>& file_names);
51 std::string OPENMS_DLLAPI
55 inline bool OPENMS_DLLAPI
62 inline bool OPENMS_DLLAPI
69 inline bool OPENMS_DLLAPI
76 inline bool OPENMS_DLLAPI
83 inline bool OPENMS_DLLAPI
104 const char* number_1_stringified,
105 bool number_1_is_realtype,
Int number_1_written_digits,
106 long double number_2,
const char* number_2_stringified,
107 bool ,
Int number_2_written_digits);
122 const std::string& string_1,
123 const char* string_1_stringified,
124 const std::string& string_2,
125 const char* string_2_stringified);
130 const std::string& string_1,
131 const char* string_1_stringified,
132 const std::string& string_2,
133 const char* string_2_stringified);
142 const std::string& filename_2);
161 void OPENMS_DLLAPI
mainInit(
const char* version,
const char* class_name,
int argc,
const char* argv0);
172 void OPENMS_DLLAPI
filesEqual(
int line,
const char* filename,
const char* templatename,
const char* filename_stringified,
const char* templatename_stringified);
180 const std::string& whitelist);
189 extern OPENMS_DLLAPI
double ratio;
198 extern OPENMS_DLLAPI
double absdiff;
204 extern OPENMS_DLLAPI
int verbose;
210 extern OPENMS_DLLAPI
bool test;
225 extern OPENMS_DLLAPI std::string
test_name;
243 extern OPENMS_DLLAPI std::ifstream
infile;
267 extern OPENMS_DLLAPI
bool newline;
269 template <
typename T1,
typename T2>
271 testEqual(
const char* ,
int line,
const T1& expression_1,
272 const char* expression_1_stringified,
273 const T2& expression_2,
274 const char* expression_2_stringified)
278 this_test = bool(expression_1 == T1(expression_2)) ;
284 stdcout <<
' ' << (
this_test ?
'+' :
'-') <<
" line " << line <<
" : TEST_EQUAL(" << expression_1_stringified <<
','
285 << expression_2_stringified <<
"): got '";
286 if constexpr (std::is_enum_v<T1> && std::is_enum_v<T2>)
288 stdcout << static_cast<int>(expression_1) <<
"', expected '" <<
static_cast<int>(expression_2) <<
"'\n";
292 stdcout << expression_1 <<
"', expected '" << expression_2 <<
"'\n";
302 void testTrue(
const char* ,
int line,
const bool expression_1,
const char* expression_1_stringified)
314 stdcout <<
" + line " << line <<
": TEST_TRUE(" << expression_1_stringified <<
"): ok\n";
319 stdcout <<
" - line " << line <<
": TEST_TRUE(" << expression_1_stringified <<
"): failed\n";
325 void testFalse(
const char* ,
int line,
const bool expression_1,
const char* expression_1_stringified)
337 stdcout <<
" + line " << line <<
": TEST_FALSE(" << expression_1_stringified <<
"): ok\n";
342 stdcout <<
" - line " << line <<
": TEST_FALSE(" << expression_1_stringified <<
"): failed\n";
348 template <
typename T1,
typename T2>
351 const char* expression_1_stringified,
352 const T2& expression_2,
353 const char* expression_2_stringified)
357 this_test = !(expression_1 == T1(expression_2));
363 stdcout <<
' ' << (
this_test ?
'+' :
'-') <<
" line " << line <<
" : TEST_NOT_EQUAL(" << expression_1_stringified <<
','
364 << expression_2_stringified <<
"): got '";
365 if constexpr (std::is_enum_v<T1> && std::is_enum_v<T2>)
367 stdcout << static_cast<int>(expression_1) <<
"', forbidden is '" <<
static_cast<int>(expression_2) <<
"'\n";
369 else {
stdcout << expression_1 <<
"', expected '" << expression_2 <<
"'\n"; }
443 #define START_TEST(class_name, version) \
444 int main(int argc, char** argv) \
446 TEST::mainInit(version, #class_name, argc, argv[0]); \
465 TEST::printLastException(stdcout); \
467 return TEST::endTestPostProcess(stdcout); \
492 #define START_SECTION(name_of_test) \
494 TEST::newline = false; \
495 TEST::test_name = # name_of_test; \
496 TEST::test_count = 0; \
497 TEST::start_section_line = __LINE__; \
498 stdcout << "checking " << TEST::test_name << " ... " << std::flush; \
529 #define END_SECTION \
535 TEST::printLastException(stdcout);\
537 TEST::endSectionPostProcess(stdcout, __LINE__);
561 #define TEST_EQUAL(a, b) TEST::testEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
572 #define TEST_TRUE(a) TEST::testTrue(__FILE__, __LINE__, (a), (#a));
583 #define TEST_FALSE(a) TEST::testFalse(__FILE__, __LINE__, (a), (#a));
597 #define TEST_NOT_EQUAL(a, b) TEST::testNotEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
611 #define TEST_STRING_EQUAL(a, b) TEST::testStringEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
627 #define TEST_FILE_EQUAL(filename, templatename) \
629 TEST::filesEqual(__LINE__, filename, templatename, #filename, #templatename); \
647 #define TEST_REAL_SIMILAR(a, b) TEST::testRealSimilar(__FILE__, __LINE__, (a), (# a), TEST::isRealType(a), writtenDigits(a), (b), (# b), TEST::isRealType(b), writtenDigits(b));
664 #define TEST_STRING_SIMILAR(a, b) TEST::testStringSimilar(__FILE__, __LINE__, (a), (# a), (b), (# b));
680 #define TEST_FILE_SIMILAR(a, b) \
682 ++TEST::test_count; \
683 TEST::test_line = __LINE__; \
684 TEST::this_test = TEST::isFileSimilar((a), (b)); \
685 TEST::test = TEST::test && TEST::this_test; \
687 TEST::initialNewline(); \
688 if (TEST::this_test) \
690 if (TEST::verbose > 1) \
692 stdcout << " + line " << __LINE__ \
693 << ": TEST_FILE_SIMILAR(" # a "," # b "): absolute: " \
694 << precisionWrapper(TEST::absdiff) \
696 << precisionWrapper(TEST::absdiff_max_allowed) \
698 << precisionWrapper(TEST::ratio) \
700 << precisionWrapper(TEST::ratio_max_allowed) \
702 stdcout << "message: \n"; \
703 stdcout << TEST::fuzzy_message; \
708 stdcout << " - line " << TEST::test_line << \
709 ": TEST_FILE_SIMILAR(" # a "," # b ") ... -\n"; \
710 stdcout << "message: \n"; \
711 stdcout << TEST::fuzzy_message; \
712 TEST::failed_lines_list.push_back(TEST::test_line); \
729 #define TOLERANCE_RELATIVE(a) \
730 TEST::ratio_max_allowed = (a); \
732 TEST::initialNewline(); \
733 if (TEST::verbose > 1) \
735 stdcout << " + line " << __LINE__ << \
736 ": TOLERANCE_RELATIVE(" << TEST::ratio_max_allowed << \
737 ") (\"" # a "\")\n"; \
752 #define TOLERANCE_ABSOLUTE(a) \
753 TEST::absdiff_max_allowed = (a); \
755 TEST::initialNewline(); \
756 if (TEST::verbose > 1) \
758 stdcout << " + line " << __LINE__ << \
759 ": TOLERANCE_ABSOLUTE(" << TEST::absdiff_max_allowed << \
760 ") (\"" # a "\")\n"; \
769 #define WHITELIST(a) TEST::setWhitelist(__FILE__, __LINE__, (a));
783 #define TEST_EXCEPTION(exception_type, command) \
785 ++TEST::test_count; \
786 TEST::test_line = __LINE__; \
787 TEST::exception = 0; \
792 catch (exception_type&) \
794 TEST::exception = 1; \
796 catch (::OpenMS::Exception::BaseException& e) \
798 TEST::exception = 2; \
799 TEST::exception_name = e.getName(); \
801 catch (const std::exception& e) \
803 TEST::exception = 3; \
804 TEST::exception_name = e.what(); \
808 TEST::exception = 4; \
810 TEST::this_test = (TEST::exception == 1); \
811 TEST::test = TEST::test && TEST::this_test; \
813 TEST::initialNewline(); \
814 switch (TEST::exception) \
817 stdcout << " - line " << TEST::test_line << \
818 ": TEST_EXCEPTION(" # exception_type "," # command \
819 "): no exception thrown!\n"; \
820 TEST::failed_lines_list.push_back(TEST::test_line); \
823 if (TEST::verbose > 1) \
825 stdcout << " + line " << TEST::test_line << \
826 ": TEST_EXCEPTION(" # exception_type "," # command \
831 stdcout << " - line " << TEST::test_line << \
832 ": TEST_EXCEPTION(" # exception_type "," # command \
833 "): wrong exception thrown! \"" \
834 << TEST::exception_name << "\"\n"; \
835 TEST::failed_lines_list.push_back(TEST::test_line); \
838 stdcout << " - line " << TEST::test_line << \
839 ": TEST_EXCEPTION(" # exception_type "," # command \
840 "): wrong exception thrown! \"" \
841 << TEST::exception_name << "\"\n"; \
842 TEST::failed_lines_list.push_back(TEST::test_line); \
845 stdcout << " - line " << TEST::test_line << \
846 ": TEST_EXCEPTION(" # exception_type "," # command \
847 "): wrong exception thrown!\n"; \
848 TEST::failed_lines_list.push_back(TEST::test_line); \
865 #ifdef OPENMS_ASSERTIONS
866 #define TEST_PRECONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Precondition, command);
868 #define TEST_PRECONDITION_VIOLATED(command) STATUS("TEST_PRECONDITION_VIOLATED(" # command ") - skipped");
882 #ifdef OPENMS_ASSERTIONS
883 #define TEST_POSTCONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Postcondition, command);
885 #define TEST_POSTCONDITION_VIOLATED(command) STATUS("TEST_POSTCONDITION_VIOLATED(" # command ") - skipped");
905 #define TEST_EXCEPTION_WITH_MESSAGE(exception_type, command, message) \
907 ++TEST::test_count; \
908 TEST::test_line = __LINE__; \
909 TEST::exception = 0; \
914 catch (exception_type& et) \
916 if (std::string(et.what()) != std::string(message)) \
918 TEST::exception = 4; \
919 TEST::exception_message = et.what(); \
921 else TEST::exception = 1; \
923 catch (::OpenMS::Exception::BaseException& e) \
925 TEST::exception = 2; \
926 TEST::exception_name = e.getName(); \
930 TEST::exception = 3; \
932 TEST::this_test = (TEST::exception == 1); \
933 TEST::test = TEST::test && TEST::this_test; \
936 TEST::initialNewline(); \
937 switch (TEST::exception) \
940 stdcout << " - line " << TEST::test_line << \
941 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
942 "): no exception thrown!\n"; \
943 TEST::failed_lines_list.push_back(TEST::test_line); \
946 if (TEST::verbose > 1) \
949 stdcout << " + line " << TEST::test_line << \
950 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
955 stdcout << " - line " << TEST::test_line << \
956 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
957 "): wrong exception thrown! \"" << \
958 TEST::exception_name << "\"\n"; \
959 TEST::failed_lines_list.push_back(TEST::test_line); \
962 stdcout << " - line " << TEST::test_line << \
963 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
964 "): wrong exception thrown!\n"; \
965 TEST::failed_lines_list.push_back(TEST::test_line); \
968 stdcout << " - line " << TEST::test_line << \
969 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
970 "): exception has wrong message: got '" << \
971 TEST::exception_message << \
973 (message) << "'\n"; \
974 TEST::failed_lines_list.push_back(TEST::test_line); \
993 #define NEW_TMP_FILE_EXT(filename, extension) filename = TEST::createTmpFileName(__FILE__, __LINE__, extension);
996 #define NEW_TMP_FILE(filename) filename = TEST::createTmpFileName(__FILE__, __LINE__);
1006 #define ABORT_IF(condition) \
1010 TEST::test_line = __LINE__; \
1011 TEST::this_test = false; \
1012 TEST::test = TEST::test && TEST::this_test; \
1013 TEST::failed_lines_list.push_back(TEST::test_line); \
1014 TEST::initialNewline(); \
1015 stdcout << " - line " << TEST::test_line << \
1016 ": ABORT_IF(" # condition "): TEST ABORTED\n"; \
1038 #define STATUS(message) \
1040 TEST::initialNewline(); \
1041 stdcout << " line " \
1057 #define ADD_MESSAGE(message) \
1058 TEST::add_message = message;
1069 #define NOT_TESTABLE \
1070 TEST::test_count = 1;
#define stdcout
Provide a point of redirection for testing the test macros, see ClassTest_test.cpp.
Definition: ClassTest.h:32
Class to hold strings, numeric values, lists of strings and lists of numeric values.
Definition: DataValue.h:33
Class to hold strings, numeric values, vectors of strings and vectors of numeric values using the stl...
Definition: ParamValue.h:29
int Int
Signed integer type.
Definition: Types.h:72
Namespace for class tests.
Definition: ClassTest.h:41
double ratio_max
Maximum ratio of numbers observed so far, see TOLERANCE_RELATIVE.
int verbose
Verbosity level ( "-v" is 1 and "-V" is 2 )
int test_count
Counter for the number of elementary tests within the current subsection.
int endTestPostProcess(std::ostream &out)
void initialNewline()
make sure we have a newline before results from first subtest
void testStringSimilar(const char *file, int line, const std::string &string_1, const char *string_1_stringified, const std::string &string_2, const char *string_2_stringified)
Compare strings using absdiff_max_allowed and ratio_max_allowed.
void endSectionPostProcess(std::ostream &out, const int line)
void testEqual(const char *, int line, const T1 &expression_1, const char *expression_1_stringified, const T2 &expression_2, const char *expression_2_stringified)
Definition: ClassTest.h:271
int test_line
Line of current elementary test.
void testRealSimilar(const char *file, int line, long double number_1, const char *number_1_stringified, bool number_1_is_realtype, Int number_1_written_digits, long double number_2, const char *number_2_stringified, bool, Int number_2_written_digits)
Compare floating point numbers using absdiff_max_allowed and ratio_max_allowed.
double absdiff
Recent absolute difference of numbers, see TOLERANCE_ABSOLUTE.
char line_buffer[65536]
(A buffer for one line from a file. Used by TEST_FILE_EQUAL.)
std::string add_message
See ADD_MESSAGE.
bool validate(const std::vector< std::string > &file_names)
Validates the given files against the XML schema (if available)
std::string fuzzy_message
Last message from a fuzzy comparison. Written by isRealSimilar(), testStringSimilar(),...
void mainInit(const char *version, const char *class_name, int argc, const char *argv0)
Set up some classtest variables as obtained from the 'START_TEST' macro and check that no additional ...
bool all_tests
Status of the whole test.
std::string exception_message
(Used by various macros. Stores the "message" of the exception, if applicable.)
std::string test_name
Name of current subsection.
void testStringEqual(const char *file, int line, const std::string &string_1, const char *string_1_stringified, const std::string &string_2, const char *string_2_stringified)
used by TEST_STRING_EQUAL
double absdiff_max
Maximum difference of numbers observed so far, see TOLERANCE_ABSOLUTE.
void printWithPrefix(const std::string &text, const int marked=-1)
print the text, each line gets a prefix, the marked line number gets a special prefix
bool newline
(Flags whether a new line is in place, depending on context and verbosity setting....
bool test
Status of the current subsection.
double absdiff_max_allowed
Maximum absolute difference of numbers allowed, see TOLERANCE_ABSOLUTE.
const char * version_string
Version string supplied with START_TEST.
std::ifstream infile
Questionable file tested by TEST_FILE_EQUAL.
void testTrue(const char *, int line, const bool expression_1, const char *expression_1_stringified)
Definition: ClassTest.h:302
std::string createTmpFileName(const std::string &file, int line, const std::string &extension="")
Creates a temporary file name from the test name and the line with the specified extension.
void testFalse(const char *, int line, const bool expression_1, const char *expression_1_stringified)
Definition: ClassTest.h:325
std::string exception_name
(Used by various macros. Stores the "name" of the exception, if applicable.)
std::vector< UInt > failed_lines_list
List of all failed lines for summary at the end of the test.
void removeTempFiles()
removed all temporary files created with the NEW_TMP_FILE macro
double ratio
Recent ratio of numbers, see TOLERANCE_RELATIVE.
std::vector< std::string > tmp_file_list
List of tmp file names (these will be cleaned up, see NEW_TMP_FILE)
bool isFileSimilar(const std::string &filename_1, const std::string &filename_2)
Compare files using absdiff_max_allowed and ratio_max_allowed.
void testNotEqual(const char *, int line, const T1 &expression_1, const char *expression_1_stringified, const T2 &expression_2, const char *expression_2_stringified)
Definition: ClassTest.h:350
bool this_test
Status of last elementary test.
std::ifstream templatefile
Template (correct) file used by TEST_FILE_EQUAL.
double ratio_max_allowed
Maximum ratio of numbers allowed, see TOLERANCE_RELATIVE.
void setWhitelist(const char *const, const int line, const std::string &whitelist)
set the whitelist_
bool isRealType(float)
This overload returns true; float is a floating point type.
Definition: ClassTest.h:56
bool equal_files
(A variable used by TEST_FILE_EQUAL)
int start_section_line
Line where current subsection started.
void filesEqual(int line, const char *filename, const char *templatename, const char *filename_stringified, const char *templatename_stringified)
Test if two files are exactly equal (used in TEST_FILE_EQUAL macro)
void printLastException(std::ostream &out)
int exception
(Used by various macros. Indicates a rough category of the exception being caught....
bool isRealSimilar(long double number_1, long double number_2)
used by testRealSimilar()
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19