19 #include <OpenMS/OpenMSConfig.h> 
   20 #include <OpenMS/config.h> 
   26 #include <type_traits> 
   35 #define stdcout std::cout 
   51       validate(
const std::vector<std::string>& file_names);
 
   54       std::string OPENMS_DLLAPI
 
   58       inline bool OPENMS_DLLAPI
 
   65       inline bool OPENMS_DLLAPI
 
   72       inline bool OPENMS_DLLAPI
 
   79       inline bool OPENMS_DLLAPI
 
   86       inline bool OPENMS_DLLAPI
 
  107                       const char* number_1_stringified,
 
  108                       bool number_1_is_realtype, 
Int number_1_written_digits,
 
  109                       long double number_2, 
const char* number_2_stringified,
 
  110                       bool , 
Int number_2_written_digits);
 
  125                         const std::string& string_1,
 
  126                         const char* string_1_stringified,
 
  127                         const std::string& string_2,
 
  128                         const char* string_2_stringified);
 
  133                       const std::string& string_1,
 
  134                       const char* string_1_stringified,
 
  135                       const std::string& string_2,
 
  136                       const char* string_2_stringified);
 
  145                     const std::string& filename_2);
 
  164       void OPENMS_DLLAPI 
mainInit(
const char* version, 
const char* class_name, 
int argc, 
const char* argv0);
 
  175       void OPENMS_DLLAPI 
filesEqual(
int line, 
const char* filename, 
const char* templatename, 
const char* filename_stringified, 
const char* templatename_stringified);
 
  183                    const std::string& whitelist);
 
  192       extern OPENMS_DLLAPI 
double ratio;
 
  201       extern OPENMS_DLLAPI 
double absdiff;
 
  207       extern OPENMS_DLLAPI 
int verbose;
 
  213       extern OPENMS_DLLAPI 
bool test;
 
  228       extern OPENMS_DLLAPI std::string 
test_name;
 
  246       extern OPENMS_DLLAPI std::ifstream 
infile;
 
  270       extern OPENMS_DLLAPI 
bool newline;
 
  272       template <
typename T1, 
typename T2>
 
  274       testEqual(
const char* , 
int line, 
const T1& expression_1,
 
  275                 const char* expression_1_stringified,
 
  276                 const T2& expression_2,
 
  277                 const char* expression_2_stringified)
 
  281         this_test = bool(expression_1 == T1(expression_2)) ;
 
  287             stdcout << 
' ' << (
this_test ? 
'+' : 
'-') << 
"  line " << line << 
" : TEST_EQUAL(" << expression_1_stringified << 
',' 
  288                     << expression_2_stringified << 
"): got '";
 
  291             if constexpr (std::is_same_v<std::remove_cv_t<T1>, 
XMLCh*> || std::is_same_v<std::remove_cv_t<T2>, 
XMLCh*>)
 
  293               stdcout << (expression_1 == 
nullptr ? 
"(null)" : 
"(XMLCh*)") << 
"', expected '" 
  294                       << (expression_2 == 
nullptr ? 
"(null)" : 
"(XMLCh*)") << 
"'\n";
 
  296             else if constexpr (std::is_enum_v<T1> && std::is_enum_v<T2>)
 
  298               stdcout << static_cast<int>(expression_1) << 
"', expected '" << 
static_cast<int>(expression_2) << 
"'\n";
 
  302               stdcout << expression_1 << 
"', expected '" << expression_2 << 
"'\n";
 
  312       void testTrue(
const char* , 
int line, 
const bool expression_1, 
const char* expression_1_stringified)
 
  324               stdcout << 
" +  line " << line << 
":  TEST_TRUE(" << expression_1_stringified << 
"): ok\n";
 
  329             stdcout << 
" -  line " << line << 
":  TEST_TRUE(" << expression_1_stringified << 
"): failed\n";
 
  335       void testFalse(
const char* , 
int line, 
const bool expression_1, 
const char* expression_1_stringified)
 
  347               stdcout << 
" +  line " << line << 
":  TEST_FALSE(" << expression_1_stringified << 
"): ok\n";
 
  352             stdcout << 
" -  line " << line << 
":  TEST_FALSE(" << expression_1_stringified << 
"): failed\n";
 
  358       template <
typename T1, 
typename T2>
 
  361                    const char* expression_1_stringified,
 
  362                    const T2& expression_2,
 
  363                    const char* expression_2_stringified)
 
  367         this_test = !(expression_1 == T1(expression_2));
 
  373             stdcout << 
' ' << (
this_test ? 
'+' : 
'-') << 
"  line " << line << 
" : TEST_NOT_EQUAL(" << expression_1_stringified << 
',' 
  374                     << expression_2_stringified << 
"): got '";
 
  375             if constexpr (std::is_enum_v<T1> && std::is_enum_v<T2>)
 
  377               stdcout << static_cast<int>(expression_1) << 
"', forbidden is '" << 
static_cast<int>(expression_2) << 
"'\n";
 
  379             else { 
stdcout << expression_1 << 
"', expected '" << expression_2 << 
"'\n"; }
 
  453 #define START_TEST(class_name, version)                                                   \ 
  454   int main(int argc, char** argv)                                                         \ 
  456     TEST::mainInit(version, #class_name, argc, argv[0]);                                  \ 
  475       TEST::printLastException(stdcout);                                                  \ 
  477     return TEST::endTestPostProcess(stdcout);                                             \ 
  502 #define START_SECTION(name_of_test)                                                       \ 
  504   TEST::newline = false;                                                                  \ 
  505   TEST::test_name = # name_of_test;                                                       \ 
  506   TEST::test_count = 0;                                                                   \ 
  507   TEST::start_section_line = __LINE__;                                                    \ 
  508   stdcout << "checking " << TEST::test_name << " ... " << std::flush;                   \
 
  539 #define END_SECTION                                                                       \ 
  545     TEST::printLastException(stdcout);\ 
  547   TEST::endSectionPostProcess(stdcout, __LINE__); 
  571 #define TEST_EQUAL(a, b) TEST::testEqual(__FILE__, __LINE__, (a), (# a), (b), (# b)); 
  582 #define TEST_TRUE(a) TEST::testTrue(__FILE__, __LINE__, (a), (#a)); 
  593 #define TEST_FALSE(a) TEST::testFalse(__FILE__, __LINE__, (a), (#a)); 
  607 #define TEST_NOT_EQUAL(a, b) TEST::testNotEqual(__FILE__, __LINE__, (a), (# a), (b), (# b)); 
  621 #define TEST_STRING_EQUAL(a, b) TEST::testStringEqual(__FILE__, __LINE__, (a), (# a), (b), (# b)); 
  637 #define TEST_FILE_EQUAL(filename, templatename)                                           \ 
  639     TEST::filesEqual(__LINE__, filename, templatename, #filename, #templatename);         \ 
  657 #define TEST_REAL_SIMILAR(a, b) TEST::testRealSimilar(__FILE__, __LINE__, (a), (# a), TEST::isRealType(a), writtenDigits(a), (b), (# b), TEST::isRealType(b), writtenDigits(b)); 
  674 #define TEST_STRING_SIMILAR(a, b) TEST::testStringSimilar(__FILE__, __LINE__, (a), (# a), (b), (# b)); 
  690 #define TEST_FILE_SIMILAR(a, b)                                                           \ 
  692     ++TEST::test_count;                                                                   \ 
  693     TEST::test_line = __LINE__;                                                           \ 
  694     TEST::this_test = TEST::isFileSimilar((a), (b));                                      \ 
  695     TEST::test = TEST::test && TEST::this_test;                                           \ 
  697       TEST::initialNewline();                                                             \ 
  698       if (TEST::this_test)                                                                \ 
  700         if (TEST::verbose > 1)                                                            \ 
  702           stdcout << " +  line " << __LINE__                                              \
 
  703                     << ":  TEST_FILE_SIMILAR(" # a "," # b "):  absolute: "               \
 
  704                     << precisionWrapper(TEST::absdiff)                                    \
 
  706                     << precisionWrapper(TEST::absdiff_max_allowed)                        \
 
  708                     << precisionWrapper(TEST::ratio)                                      \
 
  710                     << precisionWrapper(TEST::ratio_max_allowed)                          \
 
  712           stdcout << "message: \n";                                                       \
 
  713           stdcout << TEST::fuzzy_message;                                                 \
 
  718         stdcout << " -  line " << TEST::test_line <<                                      \
 
  719           ": TEST_FILE_SIMILAR(" # a "," # b ") ...    -\n";                              \
 
  720         stdcout << "message: \n";                                                         \
 
  721         stdcout << TEST::fuzzy_message;                                                   \
 
  722         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  739 #define TOLERANCE_RELATIVE(a)                                                             \ 
  740   TEST::ratio_max_allowed = (a);                                                          \ 
  742     TEST::initialNewline();                                                               \ 
  743     if (TEST::verbose > 1)                                                                \ 
  745       stdcout << " +  line " << __LINE__ <<                                               \
 
  746         ":  TOLERANCE_RELATIVE(" <<     TEST::ratio_max_allowed <<                        \
 
  747         ")   (\"" # a "\")\n";                                                            \
 
  762 #define TOLERANCE_ABSOLUTE(a)                                                             \ 
  763   TEST::absdiff_max_allowed = (a);                                                        \ 
  765     TEST::initialNewline();                                                               \ 
  766     if (TEST::verbose > 1)                                                                \ 
  768       stdcout << " +  line " << __LINE__ <<                                               \
 
  769         ":  TOLERANCE_ABSOLUTE(" <<     TEST::absdiff_max_allowed   <<                    \
 
  770         ")   (\"" # a "\")\n";                                                            \
 
  779 #define WHITELIST(a) TEST::setWhitelist(__FILE__, __LINE__, (a)); 
  793 #define TEST_EXCEPTION(exception_type, command)                                           \ 
  795     ++TEST::test_count;                                                                   \ 
  796     TEST::test_line = __LINE__;                                                           \ 
  797     TEST::exception = 0;                                                                  \ 
  802     catch (exception_type&)                                                               \ 
  804       TEST::exception = 1;                                                                \ 
  806     catch (::OpenMS::Exception::BaseException& e)                                         \ 
  808       TEST::exception = 2;                                                                \ 
  809       TEST::exception_name = e.getName();                                                 \ 
  811     catch (const std::exception& e)                                                       \ 
  813       TEST::exception = 3;                                                                \ 
  814       TEST::exception_name = e.what();                                                    \ 
  818       TEST::exception = 4;                                                                \ 
  820     TEST::this_test = (TEST::exception == 1);                                             \ 
  821     TEST::test = TEST::test && TEST::this_test;                                           \ 
  823       TEST::initialNewline();                                                             \ 
  824       switch (TEST::exception)                                                            \ 
  827         stdcout << " -  line " << TEST::test_line <<                                    \
 
  828           ":  TEST_EXCEPTION(" # exception_type "," # command                               \
 
  829           "): no exception thrown!\n";                                                    \
 
  830         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  833         if (TEST::verbose > 1)                                                            \
 
  835           stdcout << " +  line " << TEST::test_line <<                                    \
 
  836             ":  TEST_EXCEPTION(" # exception_type "," # command                           \
 
  841         stdcout << " -  line " << TEST::test_line <<                                    \
 
  842           ":  TEST_EXCEPTION(" # exception_type "," # command                               \
 
  843           "): wrong exception thrown!  \""                                                  \
 
  844                   << TEST::exception_name << "\"\n";                                     \
 
  845         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  848         stdcout << " -  line " << TEST::test_line <<                                    \
 
  849           ":  TEST_EXCEPTION(" # exception_type "," # command                               \
 
  850           "): wrong exception thrown!  \""                                                  \
 
  851                   << TEST::exception_name << "\"\n";                                     \
 
  852         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  855         stdcout << " -  line " << TEST::test_line <<                                    \
 
  856           ":  TEST_EXCEPTION(" # exception_type "," # command                               \
 
  857           "): wrong exception thrown!\n";                                                 \
 
  858         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  875 #ifdef OPENMS_ASSERTIONS 
  876 #define TEST_PRECONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Precondition, command); 
  878 #define TEST_PRECONDITION_VIOLATED(command) STATUS("TEST_PRECONDITION_VIOLATED(" # command ")  -  skipped");
 
  892 #ifdef OPENMS_ASSERTIONS 
  893 #define TEST_POSTCONDITION_VIOLATED(command) TEST_EXCEPTION(Exception::Postcondition, command); 
  895 #define TEST_POSTCONDITION_VIOLATED(command) STATUS("TEST_POSTCONDITION_VIOLATED(" # command ")  -  skipped");
 
  915 #define TEST_EXCEPTION_WITH_MESSAGE(exception_type, command, message)                     \ 
  917     ++TEST::test_count;                                                                   \ 
  918     TEST::test_line = __LINE__;                                                           \ 
  919     TEST::exception = 0;                                                                  \ 
  924     catch (exception_type& et)                                                            \ 
  926       if (std::string(et.what()) != std::string(message))                                 \ 
  928         TEST::exception = 4;                                                              \ 
  929         TEST::exception_message = et.what();                                              \ 
  931       else TEST::exception = 1;                                                           \ 
  933     catch (::OpenMS::Exception::BaseException& e)                                         \ 
  935       TEST::exception = 2;                                                                \ 
  936       TEST::exception_name = e.getName();                                                 \ 
  940       TEST::exception = 3;                                                                \ 
  942     TEST::this_test = (TEST::exception == 1);                                             \ 
  943     TEST::test = TEST::test && TEST::this_test;                                           \ 
  946       TEST::initialNewline();                                                             \ 
  947       switch (TEST::exception)                                                            \ 
  950         stdcout << " -  line " << TEST::test_line <<                                    \
 
  951           ":  TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message   \
 
  952           "): no exception thrown!\n";                                                    \
 
  953         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  956         if (TEST::verbose > 1)                                                            \
 
  959           stdcout << " +  line " << TEST::test_line <<                                    \
 
  960             ":  TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message   \
 
  965         stdcout << " -  line " << TEST::test_line <<                                    \
 
  966           ":  TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message   \
 
  967           "): wrong exception thrown!  \"" <<                                               \
 
  968           TEST::exception_name << "\"\n";                                                \
 
  969         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  972         stdcout << " -  line " << TEST::test_line <<                                    \
 
  973           ":  TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message   \
 
  974           "): wrong exception thrown!\n";                                                 \
 
  975         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
  978         stdcout << " -  line " << TEST::test_line <<                                    \
 
  979           ":  TEST_EXCEPTION_WITH_MESSAGE(" # exception_type "," # command ", " # message   \
 
  980           "): exception has wrong message: got '" <<                                        \
 
  981           TEST::exception_message <<                                                        \
 
  983           (message) << "'\n";                                                                 \
 
  984         TEST::failed_lines_list.push_back(TEST::test_line);                               \
 
 1003 #define NEW_TMP_FILE_EXT(filename, extension) filename = TEST::createTmpFileName(__FILE__, __LINE__, extension); 
 1006 #define NEW_TMP_FILE(filename) filename = TEST::createTmpFileName(__FILE__, __LINE__); 
 1016 #define ABORT_IF(condition)                                                               \ 
 1020       TEST::test_line = __LINE__;                                                         \ 
 1021       TEST::this_test = false;                                                            \ 
 1022       TEST::test = TEST::test && TEST::this_test;                                         \ 
 1023       TEST::failed_lines_list.push_back(TEST::test_line);                                 \ 
 1024       TEST::initialNewline();                                                             \ 
 1025       stdcout << " -  line " << TEST::test_line <<                                        \
 
 1026         ":  ABORT_IF(" # condition "):  TEST ABORTED\n";                                  \
 
 1048 #define STATUS(message)                                                                   \ 
 1050     TEST::initialNewline();                                                               \ 
 1051     stdcout << "    line "                                                                \
 
 1067 #define ADD_MESSAGE(message)                                                              \ 
 1068   TEST::add_message = message; 
 1079 #define NOT_TESTABLE                                                                      \ 
 1080   TEST::test_count = 1; 
char16_t XMLCh
Definition: ClassTest.h:28
 
#define stdcout
Provide a point of redirection for testing the test macros, see ClassTest_test.cpp.
Definition: ClassTest.h:35
 
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:44
 
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:274
 
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:312
 
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:335
 
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:360
 
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:59
 
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