|
OpenMS
2.5.0
|
Go to the documentation of this file.
48 #include <OpenMS/OpenMSConfig.h>
49 #include <OpenMS/config.h>
66 #define stdcout std::cout
82 validate(
const std::vector<std::string>& file_names);
85 std::string OPENMS_DLLAPI
89 inline bool OPENMS_DLLAPI
96 inline bool OPENMS_DLLAPI
103 inline bool OPENMS_DLLAPI
110 inline bool OPENMS_DLLAPI
117 template <
typename T>
131 const char* number_1_stringified,
132 bool number_1_is_realtype,
Int number_1_written_digits,
133 long double number_2,
const char* number_2_stringified,
134 bool ,
Int number_2_written_digits);
149 const std::string& string_1,
150 const char* string_1_stringified,
151 const std::string& string_2,
152 const char* string_2_stringified);
157 const std::string& string_1,
158 const char* string_1_stringified,
159 const std::string& string_2,
160 const char* string_2_stringified);
169 const std::string& filename_2);
182 const std::string& whitelist);
191 extern OPENMS_DLLAPI
double ratio;
200 extern OPENMS_DLLAPI
double absdiff;
206 extern OPENMS_DLLAPI
int verbose;
212 extern OPENMS_DLLAPI
bool test;
227 extern OPENMS_DLLAPI std::string
test_name;
245 extern OPENMS_DLLAPI std::ifstream
infile;
269 extern OPENMS_DLLAPI
bool newline;
271 template <
typename T1,
typename T2>
273 testEqual(
const char* ,
int line,
const T1& expression_1,
274 const char* expression_1_stringified,
275 const T2& expression_2,
276 const char* expression_2_stringified)
280 this_test = bool(expression_1 == T1(expression_2));
286 stdcout <<
" + line " << line <<
": TEST_EQUAL("
287 << expression_1_stringified <<
','
288 << expression_2_stringified <<
"): got '" << expression_1
289 <<
"', expected '" << expression_2 <<
"'\n";
293 stdcout <<
" - line " << line <<
": TEST_EQUAL("
294 << expression_1_stringified <<
','
295 << expression_2_stringified <<
"): got '" << expression_1
296 <<
"', expected '" << expression_2 <<
"'\n";
302 template <
typename T1,
typename T2>
305 const char* expression_1_stringified,
306 const T2& expression_2,
307 const char* expression_2_stringified)
311 this_test = !(expression_1 == T1(expression_2));
317 stdcout <<
" + line " << line <<
": TEST_NOT_EQUAL("
318 << expression_1_stringified <<
','
319 << expression_2_stringified <<
"): got '" << expression_1
320 <<
"', forbidden is '" << expression_2 <<
"'\n";
324 stdcout <<
" - line " << line <<
": TEST_NOT_EQUAL("
325 << expression_1_stringified <<
','
326 << expression_2_stringified <<
"): got '" << expression_1
327 <<
"', forbidden is '" << expression_2 <<
"'\n";
392 #define START_TEST(class_name, version) \
393 int main(int argc, char** argv) \
395 OpenMS::UInt64 seed = 2453440375; \
396 OpenMS::UniqueIdGenerator::setSeed(seed); \
397 TEST::version_string = version; \
402 << "This is " << argv[0] << ", the test program for the\n" \
403 << # class_name " class.\n" \
405 "On successful operation it returns PASSED,\n" \
406 "otherwise FAILED is printed.\n"; \
426 catch (::OpenMS::Exception::BaseException& e) \
428 TEST::this_test = false; \
429 TEST::test = false; \
430 TEST::all_tests = false; \
432 TEST::initialNewline(); \
433 stdcout << "Error: Caught unexpected OpenMS exception of type '" \
436 if ((e.getLine() > 0) && std::strcmp(e.getFile(), "")) \
438 stdcout << " thrown in line " << e.getLine() << " of file '" << e.getFile() \
439 << "' in function '" << e.getFunction() << "'"; \
441 stdcout << " - Message: " << e.what() << std::endl; \
445 catch (std::exception& e) \
447 TEST::this_test = false; \
448 TEST::test = false; \
449 TEST::all_tests = false; \
451 TEST::initialNewline(); \
452 stdcout << "Error: Caught unexpected std::exception" << std::endl; \
453 stdcout << " - Message: " << e.what() << std::endl; \
459 TEST::this_test = false; \
460 TEST::test = false; \
461 TEST::all_tests = false; \
463 TEST::initialNewline(); \
464 stdcout << "Error: Caught unidentified and unexpected exception - No message." \
469 if (!TEST::validate(TEST::tmp_file_list)) \
471 TEST::all_tests = false; \
474 if (!TEST::all_tests) \
476 stdcout << "FAILED" << std::endl; \
477 if (TEST::add_message != "") stdcout << "Message: " \
478 << TEST::add_message \
480 stdcout << "Failed lines: "; \
481 for (OpenMS::Size i = 0; i < TEST::failed_lines_list.size(); ++i) \
483 stdcout << TEST::failed_lines_list[i] << " "; \
485 stdcout << std::endl; \
491 for (OpenMS::Size i = 0; i < TEST::tmp_file_list.size(); ++i) \
493 if (!OpenMS::File::remove(TEST::tmp_file_list[i])) \
495 stdcout << "Warning: unable to remove temporary file '" \
496 << TEST::tmp_file_list[i] \
501 stdcout << "PASSED"; \
502 if (TEST::add_message != "") stdcout << " (" << TEST::add_message << ")"; \
503 stdcout << std::endl; \
530 #define START_SECTION(name_of_test) \
532 TEST::newline = false; \
533 TEST::test_name = # name_of_test; \
534 TEST::test_count = 0; \
535 TEST::start_section_line = __LINE__; \
536 stdcout << "checking " << TEST::test_name << " ... " << std::flush; \
567 #define END_SECTION \
571 catch (::OpenMS::Exception::BaseException& e) \
573 TEST::this_test = false; \
574 TEST::test = false; \
575 TEST::all_tests = false; \
577 TEST::initialNewline(); \
578 stdcout << "Error: Caught unexpected exception of type '" << e.getName() << "'"; \
579 if ((e.getLine() > 0) && (std::strcmp(e.getFile(), "") != 0)) \
581 stdcout << " thrown in line " << e.getLine() << " of file '" << e.getFile() \
582 << "' in function '" << e.getFunction() << "'"; \
584 stdcout << " - Message: " << e.what() << std::endl; \
588 catch (std::exception& e) \
590 TEST::this_test = false; \
591 TEST::test = false; \
592 TEST::all_tests = false; \
594 TEST::initialNewline(); \
595 stdcout << "Error: Caught std::exception" << std::endl; \
596 stdcout << " - Message: " << e.what() << std::endl; \
602 TEST::this_test = false; \
603 TEST::test = false; \
604 TEST::all_tests = false; \
606 TEST::initialNewline(); \
607 stdcout << "Error: Caught unidentified and unexpected exception - No message." \
611 TEST::all_tests = TEST::all_tests && TEST::test; \
615 stdcout << ": passed" << std::endl; \
619 stdcout << ": failed" << std::endl; \
623 if (TEST::test_count == 0) \
625 bool destructor = false; \
626 for (OpenMS::Size i = 0; i != TEST::test_name.size(); ++i) \
628 if (TEST::test_name[i] == '~') \
634 if (!destructor) stdcout << "Warning: no subtests performed in '" \
641 stdcout << std::endl;
664 #define TEST_EQUAL(a, b) TEST::testEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
677 #define TEST_NOT_EQUAL(a, b) TEST::testNotEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
691 #define TEST_STRING_EQUAL(a, b) TEST::testStringEqual(__FILE__, __LINE__, (a), (# a), (b), (# b));
707 #define TEST_FILE_EQUAL(filename, templatename) \
709 ++TEST::test_count; \
710 TEST::test_line = __LINE__; \
712 TEST::equal_files = true; \
713 TEST::infile.open(filename, std::ios::in); \
714 TEST::templatefile.open(templatename, std::ios::in); \
716 if (TEST::infile.good() && TEST::templatefile.good()) \
718 std::string TEST_FILE__template_line; \
719 std::string TEST_FILE__line; \
721 while (TEST::infile.good() && TEST::templatefile.good()) \
723 TEST::templatefile.getline(TEST::line_buffer, 65535); \
724 TEST_FILE__template_line = TEST::line_buffer; \
725 TEST::infile.getline(TEST::line_buffer, 65535); \
726 TEST_FILE__line = TEST::line_buffer; \
728 TEST::equal_files &= (TEST_FILE__template_line == TEST_FILE__line); \
729 if (TEST_FILE__template_line != TEST_FILE__line) \
732 TEST::initialNewline(); \
733 stdcout << " TEST_FILE_EQUAL: line mismatch:\n got: '" \
734 << TEST_FILE__line << "'\n expected: '" \
735 << TEST_FILE__template_line << "'\n"; \
742 TEST::equal_files = false; \
744 TEST::initialNewline(); \
745 stdcout << " + line " \
747 << ": TEST_FILE_EQUAL(" \
751 stdcout << ") : " << " cannot open file: \""; \
752 if (!TEST::infile.good()) \
754 stdcout << filename << "\" (input file) "; \
756 if (!TEST::templatefile.good()) \
758 stdcout << templatename << "\" (template file) "; \
764 TEST::infile.close(); \
765 TEST::templatefile.close(); \
766 TEST::infile.clear(); \
767 TEST::templatefile.clear(); \
769 TEST::this_test = TEST::equal_files; \
770 TEST::test = TEST::test && TEST::this_test; \
772 TEST::initialNewline(); \
773 if (TEST::this_test) \
775 stdcout << " + line " \
777 << ": TEST_FILE_EQUAL(" \
785 stdcout << " - line " \
787 << ": TEST_FILE_EQUAL(" \
791 << "): false (different files: " \
796 TEST::failed_lines_list.push_back(TEST::test_line); \
816 #define TEST_REAL_SIMILAR(a, b) TEST::testRealSimilar(__FILE__, __LINE__, (a), (# a), TEST::isRealType(a), writtenDigits(a), (b), (# b), TEST::isRealType(b), writtenDigits(b));
833 #define TEST_STRING_SIMILAR(a, b) TEST::testStringSimilar(__FILE__, __LINE__, (a), (# a), (b), (# b));
849 #define TEST_FILE_SIMILAR(a, b) \
851 ++TEST::test_count; \
852 TEST::test_line = __LINE__; \
853 TEST::this_test = TEST::isFileSimilar((a), (b)); \
854 TEST::test = TEST::test && TEST::this_test; \
856 TEST::initialNewline(); \
857 if (TEST::this_test) \
859 stdcout << " + line " << __LINE__ \
860 << ": TEST_FILE_SIMILAR(" # a "," # b "): absolute: " \
861 << precisionWrapper(TEST::absdiff) \
863 << precisionWrapper(TEST::absdiff_max_allowed) \
865 << precisionWrapper(TEST::ratio) \
867 << precisionWrapper(TEST::ratio_max_allowed) \
869 stdcout << "message: \n"; \
870 stdcout << TEST::fuzzy_message; \
874 stdcout << " - line " << TEST::test_line << \
875 ": TEST_FILE_SIMILAR(" # a "," # b ") ... -\n"; \
876 stdcout << "message: \n"; \
877 stdcout << TEST::fuzzy_message; \
878 TEST::failed_lines_list.push_back(TEST::test_line); \
895 #define TOLERANCE_RELATIVE(a) \
896 TEST::ratio_max_allowed = (a); \
898 TEST::initialNewline(); \
899 stdcout << " + line " << __LINE__ << \
900 ": TOLERANCE_RELATIVE(" << TEST::ratio_max_allowed << \
901 ") (\"" # a "\")\n"; \
915 #define TOLERANCE_ABSOLUTE(a) \
916 TEST::absdiff_max_allowed = (a); \
918 TEST::initialNewline(); \
919 stdcout << " + line " << __LINE__ << \
920 ": TOLERANCE_ABSOLUTE(" << TEST::absdiff_max_allowed << \
921 ") (\"" # a "\")\n"; \
929 #define WHITELIST(a) TEST::setWhitelist(__FILE__, __LINE__, (a));
943 #define TEST_EXCEPTION(exception_type, command) \
945 ++TEST::test_count; \
946 TEST::test_line = __LINE__; \
947 TEST::exception = 0; \
952 catch (exception_type&) \
954 TEST::exception = 1; \
956 catch (::OpenMS::Exception::BaseException& e) \
958 TEST::exception = 2; \
959 TEST::exception_name = e.getName(); \
963 TEST::exception = 3; \
965 TEST::this_test = (TEST::exception == 1); \
966 TEST::test = TEST::test && TEST::this_test; \
969 TEST::initialNewline(); \
970 switch (TEST::exception) \
973 stdcout << " - line " << TEST::test_line << \
974 ": TEST_EXCEPTION(" # exception_type "," # command \
975 "): no exception thrown!\n"; \
976 TEST::failed_lines_list.push_back(TEST::test_line); \
979 stdcout << " + line " << TEST::test_line << \
980 ": TEST_EXCEPTION(" # exception_type "," # command \
984 stdcout << " - line " << TEST::test_line << \
985 ": TEST_EXCEPTION(" # exception_type "," # command \
986 "): wrong exception thrown! \"" \
987 << TEST::exception_name << "\"\n"; \
988 TEST::failed_lines_list.push_back(TEST::test_line); \
991 stdcout << " - line " << TEST::test_line << \
992 ": TEST_EXCEPTION(" # exception_type "," # command \
993 "): wrong exception thrown!\n"; \
994 TEST::failed_lines_list.push_back(TEST::test_line); \
1011 #ifdef OPENMS_ASSERTIONS
1012 #define TEST_PRECONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Precondition, command);
1014 #define TEST_PRECONDITION_VIOLATED(command) STATUS("TEST_PRECONDITION_VIOLATED(" # command ") - skipped");
1028 #ifdef OPENMS_ASSERTIONS
1029 #define TEST_POSTCONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Postcondition, command);
1031 #define TEST_POSTCONDITION_VIOLATED(command) STATUS("TEST_POSTCONDITION_VIOLATED(" # command ") - skipped");
1051 #define TEST_EXCEPTION_WITH_MESSAGE(exception_type, command, message) \
1053 ++TEST::test_count; \
1054 TEST::test_line = __LINE__; \
1055 TEST::exception = 0; \
1060 catch (exception_type& et) \
1062 if (std::string(et.getMessage()) != std::string(message)) \
1064 TEST::exception = 4; \
1065 TEST::exception_message = et.getMessage(); \
1067 else TEST::exception = 1; \
1069 catch (::OpenMS::Exception::BaseException& e) \
1071 TEST::exception = 2; \
1072 TEST::exception_name = e.getName(); \
1076 TEST::exception = 3; \
1078 TEST::this_test = (TEST::exception == 1); \
1079 TEST::test = TEST::test && TEST::this_test; \
1082 TEST::initialNewline(); \
1083 switch (TEST::exception) \
1086 stdcout << " - line " << TEST::test_line << \
1087 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
1088 "): no exception thrown!\n"; \
1089 TEST::failed_lines_list.push_back(TEST::test_line); \
1093 stdcout << " + line " << TEST::test_line << \
1094 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
1098 stdcout << " - line " << TEST::test_line << \
1099 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
1100 "): wrong exception thrown! \"" << \
1101 TEST::exception_name << "\"\n"; \
1102 TEST::failed_lines_list.push_back(TEST::test_line); \
1105 stdcout << " - line " << TEST::test_line << \
1106 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
1107 "): wrong exception thrown!\n"; \
1108 TEST::failed_lines_list.push_back(TEST::test_line); \
1111 stdcout << " - line " << TEST::test_line << \
1112 ": TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message \
1113 "): exception has wrong message: got '" << \
1114 TEST::exception_message << \
1115 "', expected '" << \
1116 (message) << "'\n"; \
1117 TEST::failed_lines_list.push_back(TEST::test_line); \
1138 #define NEW_TMP_FILE(filename) \
1140 filename = TEST::tmpFileName(__FILE__, __LINE__); \
1141 TEST::tmp_file_list.push_back(filename); \
1143 TEST::initialNewline(); \
1144 stdcout << " creating new temporary filename '" \
1159 #define ABORT_IF(condition) \
1163 TEST::initialNewline(); \
1164 stdcout << " - line " << __LINE__ << \
1165 ": ABORT_IF(" # condition "): TEST ABORTED\n"; \
1166 TEST::failed_lines_list.push_back(TEST::test_line); \
1188 #define STATUS(message) \
1190 TEST::initialNewline(); \
1191 stdcout << " line " \
1207 #define ADD_MESSAGE(message) \
1208 TEST::add_message = message;
1219 #define NOT_TESTABLE \
1220 TEST::test_count = 1;
bool this_test
Status of last elementary test.
bool isRealType(float)
This overload returns true; float is a floating point type.
Definition: ClassTest.h:90
bool validate(const std::vector< std::string > &file_names)
Validates the given files against the XML schema (if available)
bool isFileSimilar(const std::string &filename_1, const std::string &filename_2)
Compare files using absdiff_max_allowed and ratio_max_allowed.
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
char line_buffer[65536]
(A buffer for one line from a file. Used by TEST_FILE_EQUAL.)
double absdiff_max
Maximum difference of numbers observed so far, see TOLERANCE_ABSOLUTE.
double ratio_max_allowed
Maximum ratio of numbers allowed, see TOLERANCE_RELATIVE.
std::string fuzzy_message
Last message from a fuzzy comparison. Written by isRealSimilar(), testStringSimilar(),...
double ratio
Recent ratio of numbers, see TOLERANCE_RELATIVE.
std::ifstream templatefile
Template (correct) file used by TEST_FILE_EQUAL.
int exception
(Used by various macros. Indicates a rough category of the exception being caught....
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.
bool newline
(Flags whether a new line is in place, depending on context and verbosity setting....
std::string exception_name
(Used by various macros. Stores the "name" of the exception, if applicable.)
int start_section_line
Line where current subsection started.
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:304
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46
std::string add_message
See ADD_MESSAGE.
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.
Class to hold strings, numeric values, lists of strings and lists of numeric values.
Definition: DataValue.h:56
std::vector< std::string > tmp_file_list
List of tmp file names (these will be cleaned up, see NEW_TMP_FILE)
void setWhitelist(const char *const, const int line, const std::string &whitelist)
set the whitelist_
void initialNewline()
make sure we have a newline before results from first subtest
std::vector< UInt > failed_lines_list
List of all failed lines for summary at the end of the test.
double ratio_max
Maximum ratio of numbers observed so far, see TOLERANCE_RELATIVE.
double absdiff
Recent absolute difference of numbers, see TOLERANCE_ABSOLUTE.
bool isRealSimilar(long double number_1, long double number_2)
used by testRealSimilar()
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:273
std::string tmpFileName(const std::string &file, int line)
Creates a temporary file name from the test name and the line.
std::string exception_message
(Used by various macros. Stores the "message" of the exception, if applicable.)
bool equal_files
(A variable used by TEST_FILE_EQUAL)
bool test
Status of the current subsection.
int verbose
Verbosity level ( "-v" is 1 and "-V" is 2 )
const char * version_string
Version string supplied with START_TEST.
bool all_tests
Status of the whole test.
double absdiff_max_allowed
Maximum absolute difference of numbers allowed, see TOLERANCE_ABSOLUTE.
int test_count
Counter for the number of elementary tests within the current subsection.
#define stdcout
Provide a point of redirection for testing the test macros, see ClassTest_test.cpp.
Definition: ClassTest.h:66
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
Namespace for class tests.
Definition: ClassTest.h:74
std::string test_name
Name of current subsection.
int test_line
Line of current elementary test.
std::ifstream infile
Questionable file tested by TEST_FILE_EQUAL.