Home | History | Annotate | Line # | Download | only in gcc
selftest.h revision 1.1.1.5
      1      1.1  mrg /* A self-testing framework, for use by -fself-test.
      2  1.1.1.5  mrg    Copyright (C) 2015-2022 Free Software Foundation, Inc.
      3      1.1  mrg 
      4      1.1  mrg This file is part of GCC.
      5      1.1  mrg 
      6      1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      7      1.1  mrg the terms of the GNU General Public License as published by the Free
      8      1.1  mrg Software Foundation; either version 3, or (at your option) any later
      9      1.1  mrg version.
     10      1.1  mrg 
     11      1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     12      1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13      1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14      1.1  mrg for more details.
     15      1.1  mrg 
     16      1.1  mrg You should have received a copy of the GNU General Public License
     17      1.1  mrg along with GCC; see the file COPYING3.  If not see
     18      1.1  mrg <http://www.gnu.org/licenses/>.  */
     19      1.1  mrg 
     20      1.1  mrg #ifndef GCC_SELFTEST_H
     21      1.1  mrg #define GCC_SELFTEST_H
     22      1.1  mrg 
     23      1.1  mrg /* The selftest code should entirely disappear in a production
     24      1.1  mrg    configuration, hence we guard all of it with #if CHECKING_P.  */
     25      1.1  mrg 
     26      1.1  mrg #if CHECKING_P
     27      1.1  mrg 
     28      1.1  mrg namespace selftest {
     29      1.1  mrg 
     30      1.1  mrg /* A struct describing the source-location of a selftest, to make it
     31      1.1  mrg    easier to track down failing tests.  */
     32      1.1  mrg 
     33  1.1.1.4  mrg class location
     34      1.1  mrg {
     35  1.1.1.4  mrg public:
     36      1.1  mrg   location (const char *file, int line, const char *function)
     37      1.1  mrg     : m_file (file), m_line (line), m_function (function) {}
     38      1.1  mrg 
     39      1.1  mrg   const char *m_file;
     40      1.1  mrg   int m_line;
     41      1.1  mrg   const char *m_function;
     42      1.1  mrg };
     43      1.1  mrg 
     44      1.1  mrg /* A macro for use in selftests and by the ASSERT_ macros below,
     45      1.1  mrg    constructing a selftest::location for the current source location.  */
     46      1.1  mrg 
     47      1.1  mrg #define SELFTEST_LOCATION \
     48      1.1  mrg   (::selftest::location (__FILE__, __LINE__, __FUNCTION__))
     49      1.1  mrg 
     50      1.1  mrg /* The entrypoint for running all tests.  */
     51      1.1  mrg 
     52      1.1  mrg extern void run_tests ();
     53      1.1  mrg 
     54      1.1  mrg /* Record the successful outcome of some aspect of the test.  */
     55      1.1  mrg 
     56      1.1  mrg extern void pass (const location &loc, const char *msg);
     57      1.1  mrg 
     58      1.1  mrg /* Report the failed outcome of some aspect of the test and abort.  */
     59      1.1  mrg 
     60      1.1  mrg extern void fail (const location &loc, const char *msg)
     61      1.1  mrg   ATTRIBUTE_NORETURN;
     62      1.1  mrg 
     63      1.1  mrg /* As "fail", but using printf-style formatted output.  */
     64      1.1  mrg 
     65      1.1  mrg extern void fail_formatted (const location &loc, const char *fmt, ...)
     66      1.1  mrg   ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN;
     67      1.1  mrg 
     68      1.1  mrg /* Implementation detail of ASSERT_STREQ.  */
     69      1.1  mrg 
     70      1.1  mrg extern void assert_streq (const location &loc,
     71  1.1.1.3  mrg 			  const char *desc_val1, const char *desc_val2,
     72  1.1.1.3  mrg 			  const char *val1, const char *val2);
     73      1.1  mrg 
     74      1.1  mrg /* Implementation detail of ASSERT_STR_CONTAINS.  */
     75      1.1  mrg 
     76      1.1  mrg extern void assert_str_contains (const location &loc,
     77      1.1  mrg 				 const char *desc_haystack,
     78      1.1  mrg 				 const char *desc_needle,
     79      1.1  mrg 				 const char *val_haystack,
     80      1.1  mrg 				 const char *val_needle);
     81      1.1  mrg 
     82  1.1.1.3  mrg /* Implementation detail of ASSERT_STR_STARTSWITH.  */
     83  1.1.1.3  mrg 
     84  1.1.1.3  mrg extern void assert_str_startswith (const location &loc,
     85  1.1.1.3  mrg 				   const char *desc_str,
     86  1.1.1.3  mrg 				   const char *desc_prefix,
     87  1.1.1.3  mrg 				   const char *val_str,
     88  1.1.1.3  mrg 				   const char *val_prefix);
     89  1.1.1.3  mrg 
     90  1.1.1.3  mrg 
     91      1.1  mrg /* A named temporary file for use in selftests.
     92      1.1  mrg    Usable for writing out files, and as the base class for
     93      1.1  mrg    temp_source_file.
     94      1.1  mrg    The file is unlinked in the destructor.  */
     95      1.1  mrg 
     96      1.1  mrg class named_temp_file
     97      1.1  mrg {
     98      1.1  mrg  public:
     99      1.1  mrg   named_temp_file (const char *suffix);
    100      1.1  mrg   ~named_temp_file ();
    101      1.1  mrg   const char *get_filename () const { return m_filename; }
    102      1.1  mrg 
    103      1.1  mrg  private:
    104      1.1  mrg   char *m_filename;
    105      1.1  mrg };
    106      1.1  mrg 
    107      1.1  mrg /* A class for writing out a temporary sourcefile for use in selftests
    108      1.1  mrg    of input handling.  */
    109      1.1  mrg 
    110      1.1  mrg class temp_source_file : public named_temp_file
    111      1.1  mrg {
    112      1.1  mrg  public:
    113      1.1  mrg   temp_source_file (const location &loc, const char *suffix,
    114      1.1  mrg 		    const char *content);
    115  1.1.1.5  mrg   temp_source_file (const location &loc, const char *suffix,
    116  1.1.1.5  mrg 		    const char *content, size_t sz);
    117      1.1  mrg };
    118      1.1  mrg 
    119  1.1.1.3  mrg /* RAII-style class for avoiding introducing locale-specific differences
    120  1.1.1.3  mrg    in strings containing localized quote marks, by temporarily overriding
    121  1.1.1.3  mrg    the "open_quote" and "close_quote" globals to something hardcoded.
    122  1.1.1.3  mrg 
    123  1.1.1.3  mrg    Specifically, the C locale's values are used:
    124  1.1.1.3  mrg    - open_quote becomes "`"
    125  1.1.1.3  mrg    - close_quote becomes "'"
    126  1.1.1.3  mrg    for the lifetime of the object.  */
    127  1.1.1.3  mrg 
    128  1.1.1.3  mrg class auto_fix_quotes
    129  1.1.1.3  mrg {
    130  1.1.1.3  mrg  public:
    131  1.1.1.3  mrg   auto_fix_quotes ();
    132  1.1.1.3  mrg   ~auto_fix_quotes ();
    133  1.1.1.3  mrg 
    134  1.1.1.3  mrg  private:
    135  1.1.1.3  mrg   const char *m_saved_open_quote;
    136  1.1.1.3  mrg   const char *m_saved_close_quote;
    137  1.1.1.3  mrg };
    138  1.1.1.3  mrg 
    139      1.1  mrg /* Various selftests involving location-handling require constructing a
    140      1.1  mrg    line table and one or more line maps within it.
    141      1.1  mrg 
    142      1.1  mrg    For maximum test coverage we want to run these tests with a variety
    143      1.1  mrg    of situations:
    144      1.1  mrg    - line_table->default_range_bits: some frontends use a non-zero value
    145      1.1  mrg    and others use zero
    146  1.1.1.5  mrg    - the fallback modes within line-map.cc: there are various threshold
    147  1.1.1.5  mrg    values for location_t beyond line-map.cc changes
    148      1.1  mrg    behavior (disabling of the range-packing optimization, disabling
    149      1.1  mrg    of column-tracking).  We can exercise these by starting the line_table
    150      1.1  mrg    at interesting values at or near these thresholds.
    151      1.1  mrg 
    152      1.1  mrg    The following struct describes a particular case within our test
    153      1.1  mrg    matrix.  */
    154      1.1  mrg 
    155  1.1.1.4  mrg class line_table_case;
    156      1.1  mrg 
    157      1.1  mrg /* A class for overriding the global "line_table" within a selftest,
    158      1.1  mrg    restoring its value afterwards.  At most one instance of this
    159      1.1  mrg    class can exist at once, due to the need to keep the old value
    160      1.1  mrg    of line_table as a GC root.  */
    161      1.1  mrg 
    162      1.1  mrg class line_table_test
    163      1.1  mrg {
    164      1.1  mrg  public:
    165      1.1  mrg   /* Default constructor.  Override "line_table", using sane defaults
    166      1.1  mrg      for the temporary line_table.  */
    167      1.1  mrg   line_table_test ();
    168      1.1  mrg 
    169      1.1  mrg   /* Constructor.  Override "line_table", using the case described by C.  */
    170      1.1  mrg   line_table_test (const line_table_case &c);
    171      1.1  mrg 
    172      1.1  mrg   /* Destructor.  Restore the saved line_table.  */
    173      1.1  mrg   ~line_table_test ();
    174      1.1  mrg };
    175      1.1  mrg 
    176  1.1.1.4  mrg /* Helper function for selftests that need a function decl.  */
    177  1.1.1.4  mrg 
    178  1.1.1.4  mrg extern tree make_fndecl (tree return_type,
    179  1.1.1.4  mrg 			 const char *name,
    180  1.1.1.4  mrg 			 vec <tree> &param_types,
    181  1.1.1.4  mrg 			 bool is_variadic = false);
    182  1.1.1.4  mrg 
    183      1.1  mrg /* Run TESTCASE multiple times, once for each case in our test matrix.  */
    184      1.1  mrg 
    185      1.1  mrg extern void
    186      1.1  mrg for_each_line_table_case (void (*testcase) (const line_table_case &));
    187      1.1  mrg 
    188      1.1  mrg /* Read the contents of PATH into memory, returning a 0-terminated buffer
    189      1.1  mrg    that must be freed by the caller.
    190      1.1  mrg    Fail (and abort) if there are any problems, with LOC as the reported
    191      1.1  mrg    location of the failure.  */
    192      1.1  mrg 
    193      1.1  mrg extern char *read_file (const location &loc, const char *path);
    194      1.1  mrg 
    195      1.1  mrg /* Convert a path relative to SRCDIR/gcc/testsuite/selftests
    196      1.1  mrg    to a real path (either absolute, or relative to pwd).
    197      1.1  mrg    The result should be freed by the caller.  */
    198      1.1  mrg 
    199      1.1  mrg extern char *locate_file (const char *path);
    200      1.1  mrg 
    201      1.1  mrg /* The path of SRCDIR/testsuite/selftests.  */
    202      1.1  mrg 
    203      1.1  mrg extern const char *path_to_selftest_files;
    204      1.1  mrg 
    205  1.1.1.2  mrg /* selftest::test_runner is an implementation detail of selftest::run_tests,
    206  1.1.1.2  mrg    exposed here to allow plugins to run their own suites of tests.  */
    207  1.1.1.2  mrg 
    208  1.1.1.2  mrg class test_runner
    209  1.1.1.2  mrg {
    210  1.1.1.2  mrg  public:
    211  1.1.1.2  mrg   test_runner (const char *name);
    212  1.1.1.2  mrg   ~test_runner ();
    213  1.1.1.2  mrg 
    214  1.1.1.2  mrg  private:
    215  1.1.1.2  mrg   const char *m_name;
    216  1.1.1.2  mrg   long m_start_time;
    217  1.1.1.2  mrg };
    218  1.1.1.2  mrg 
    219      1.1  mrg /* Declarations for specific families of tests (by source file), in
    220      1.1  mrg    alphabetical order.  */
    221  1.1.1.5  mrg extern void attribs_cc_tests ();
    222  1.1.1.5  mrg extern void bitmap_cc_tests ();
    223  1.1.1.5  mrg extern void cgraph_cc_tests ();
    224  1.1.1.5  mrg extern void convert_cc_tests ();
    225  1.1.1.4  mrg extern void diagnostic_format_json_cc_tests ();
    226  1.1.1.5  mrg extern void diagnostic_show_locus_cc_tests ();
    227  1.1.1.4  mrg extern void digraph_cc_tests ();
    228  1.1.1.5  mrg extern void dumpfile_cc_tests ();
    229  1.1.1.5  mrg extern void edit_context_cc_tests ();
    230  1.1.1.5  mrg extern void et_forest_cc_tests ();
    231  1.1.1.5  mrg extern void fibonacci_heap_cc_tests ();
    232  1.1.1.5  mrg extern void fold_const_cc_tests ();
    233  1.1.1.5  mrg extern void function_tests_cc_tests ();
    234  1.1.1.5  mrg extern void ggc_tests_cc_tests ();
    235  1.1.1.5  mrg extern void gimple_cc_tests ();
    236  1.1.1.5  mrg extern void hash_map_tests_cc_tests ();
    237  1.1.1.5  mrg extern void hash_set_tests_cc_tests ();
    238  1.1.1.5  mrg extern void input_cc_tests ();
    239  1.1.1.3  mrg extern void json_cc_tests ();
    240  1.1.1.3  mrg extern void optinfo_emit_json_cc_tests ();
    241  1.1.1.5  mrg extern void opts_cc_tests ();
    242  1.1.1.4  mrg extern void ordered_hash_map_tests_cc_tests ();
    243  1.1.1.5  mrg extern void predict_cc_tests ();
    244  1.1.1.5  mrg extern void pretty_print_cc_tests ();
    245  1.1.1.4  mrg extern void range_tests ();
    246  1.1.1.5  mrg extern void range_op_tests ();
    247  1.1.1.5  mrg extern void gimple_range_tests ();
    248  1.1.1.5  mrg extern void read_rtl_function_cc_tests ();
    249  1.1.1.5  mrg extern void rtl_tests_cc_tests ();
    250  1.1.1.5  mrg extern void sbitmap_cc_tests ();
    251  1.1.1.5  mrg extern void selftest_cc_tests ();
    252  1.1.1.5  mrg extern void simplify_rtx_cc_tests ();
    253  1.1.1.5  mrg extern void spellcheck_cc_tests ();
    254  1.1.1.5  mrg extern void spellcheck_tree_cc_tests ();
    255  1.1.1.5  mrg extern void splay_tree_cc_tests ();
    256  1.1.1.5  mrg extern void sreal_cc_tests ();
    257  1.1.1.5  mrg extern void store_merging_cc_tests ();
    258  1.1.1.5  mrg extern void tree_cc_tests ();
    259  1.1.1.5  mrg extern void tree_cfg_cc_tests ();
    260  1.1.1.4  mrg extern void tree_diagnostic_path_cc_tests ();
    261  1.1.1.4  mrg extern void tristate_cc_tests ();
    262  1.1.1.5  mrg extern void typed_splay_tree_cc_tests ();
    263  1.1.1.5  mrg extern void vec_cc_tests ();
    264  1.1.1.5  mrg extern void vec_perm_indices_cc_tests ();
    265  1.1.1.3  mrg extern void wide_int_cc_tests ();
    266  1.1.1.5  mrg extern void opt_suggestions_cc_tests ();
    267  1.1.1.5  mrg extern void dbgcnt_cc_tests ();
    268  1.1.1.5  mrg extern void ipa_modref_tree_cc_tests ();
    269      1.1  mrg 
    270      1.1  mrg extern int num_passes;
    271      1.1  mrg 
    272      1.1  mrg } /* end of namespace selftest.  */
    273      1.1  mrg 
    274      1.1  mrg /* Macros for writing tests.  */
    275      1.1  mrg 
    276      1.1  mrg /* Evaluate EXPR and coerce to bool, calling
    277      1.1  mrg    ::selftest::pass if it is true,
    278      1.1  mrg    ::selftest::fail if it false.  */
    279      1.1  mrg 
    280      1.1  mrg #define ASSERT_TRUE(EXPR)				\
    281      1.1  mrg   ASSERT_TRUE_AT (SELFTEST_LOCATION, (EXPR))
    282      1.1  mrg 
    283      1.1  mrg /* Like ASSERT_TRUE, but treat LOC as the effective location of the
    284      1.1  mrg    selftest.  */
    285      1.1  mrg 
    286      1.1  mrg #define ASSERT_TRUE_AT(LOC, EXPR)			\
    287      1.1  mrg   SELFTEST_BEGIN_STMT					\
    288  1.1.1.2  mrg   const char *desc_ = "ASSERT_TRUE (" #EXPR ")";	\
    289  1.1.1.2  mrg   bool actual_ = (EXPR);				\
    290  1.1.1.2  mrg   if (actual_)						\
    291  1.1.1.2  mrg     ::selftest::pass ((LOC), desc_);			\
    292      1.1  mrg   else							\
    293  1.1.1.2  mrg     ::selftest::fail ((LOC), desc_);			\
    294      1.1  mrg   SELFTEST_END_STMT
    295      1.1  mrg 
    296      1.1  mrg /* Evaluate EXPR and coerce to bool, calling
    297      1.1  mrg    ::selftest::pass if it is false,
    298      1.1  mrg    ::selftest::fail if it true.  */
    299      1.1  mrg 
    300      1.1  mrg #define ASSERT_FALSE(EXPR)					\
    301      1.1  mrg   ASSERT_FALSE_AT (SELFTEST_LOCATION, (EXPR))
    302      1.1  mrg 
    303      1.1  mrg /* Like ASSERT_FALSE, but treat LOC as the effective location of the
    304      1.1  mrg    selftest.  */
    305      1.1  mrg 
    306      1.1  mrg #define ASSERT_FALSE_AT(LOC, EXPR)				\
    307      1.1  mrg   SELFTEST_BEGIN_STMT						\
    308  1.1.1.2  mrg   const char *desc_ = "ASSERT_FALSE (" #EXPR ")";		\
    309  1.1.1.2  mrg   bool actual_ = (EXPR);					\
    310  1.1.1.2  mrg   if (actual_)							\
    311  1.1.1.2  mrg     ::selftest::fail ((LOC), desc_);				\
    312  1.1.1.2  mrg   else								\
    313  1.1.1.2  mrg     ::selftest::pass ((LOC), desc_);				\
    314      1.1  mrg   SELFTEST_END_STMT
    315      1.1  mrg 
    316  1.1.1.3  mrg /* Evaluate VAL1 and VAL2 and compare them with ==, calling
    317      1.1  mrg    ::selftest::pass if they are equal,
    318      1.1  mrg    ::selftest::fail if they are non-equal.  */
    319      1.1  mrg 
    320  1.1.1.3  mrg #define ASSERT_EQ(VAL1, VAL2) \
    321  1.1.1.3  mrg   ASSERT_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
    322      1.1  mrg 
    323      1.1  mrg /* Like ASSERT_EQ, but treat LOC as the effective location of the
    324      1.1  mrg    selftest.  */
    325      1.1  mrg 
    326  1.1.1.3  mrg #define ASSERT_EQ_AT(LOC, VAL1, VAL2)		       \
    327      1.1  mrg   SELFTEST_BEGIN_STMT					       \
    328  1.1.1.3  mrg   const char *desc_ = "ASSERT_EQ (" #VAL1 ", " #VAL2 ")"; \
    329  1.1.1.3  mrg   if ((VAL1) == (VAL2))				       \
    330  1.1.1.2  mrg     ::selftest::pass ((LOC), desc_);			       \
    331      1.1  mrg   else							       \
    332  1.1.1.2  mrg     ::selftest::fail ((LOC), desc_);			       \
    333  1.1.1.2  mrg   SELFTEST_END_STMT
    334  1.1.1.2  mrg 
    335  1.1.1.3  mrg /* Evaluate VAL1 and VAL2 and compare them with known_eq, calling
    336  1.1.1.2  mrg    ::selftest::pass if they are always equal,
    337  1.1.1.2  mrg    ::selftest::fail if they might be non-equal.  */
    338  1.1.1.2  mrg 
    339  1.1.1.3  mrg #define ASSERT_KNOWN_EQ(VAL1, VAL2) \
    340  1.1.1.3  mrg   ASSERT_KNOWN_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
    341  1.1.1.2  mrg 
    342  1.1.1.2  mrg /* Like ASSERT_KNOWN_EQ, but treat LOC as the effective location of the
    343  1.1.1.2  mrg    selftest.  */
    344  1.1.1.2  mrg 
    345  1.1.1.3  mrg #define ASSERT_KNOWN_EQ_AT(LOC, VAL1, VAL2)			\
    346  1.1.1.2  mrg   SELFTEST_BEGIN_STMT							\
    347  1.1.1.3  mrg   const char *desc = "ASSERT_KNOWN_EQ (" #VAL1 ", " #VAL2 ")";	\
    348  1.1.1.3  mrg   if (known_eq (VAL1, VAL2))					\
    349  1.1.1.2  mrg     ::selftest::pass ((LOC), desc);					\
    350  1.1.1.2  mrg   else									\
    351  1.1.1.2  mrg     ::selftest::fail ((LOC), desc);					\
    352      1.1  mrg   SELFTEST_END_STMT
    353      1.1  mrg 
    354  1.1.1.3  mrg /* Evaluate VAL1 and VAL2 and compare them with !=, calling
    355      1.1  mrg    ::selftest::pass if they are non-equal,
    356      1.1  mrg    ::selftest::fail if they are equal.  */
    357      1.1  mrg 
    358  1.1.1.3  mrg #define ASSERT_NE(VAL1, VAL2)			       \
    359      1.1  mrg   SELFTEST_BEGIN_STMT					       \
    360  1.1.1.3  mrg   const char *desc_ = "ASSERT_NE (" #VAL1 ", " #VAL2 ")"; \
    361  1.1.1.3  mrg   if ((VAL1) != (VAL2))				       \
    362  1.1.1.2  mrg     ::selftest::pass (SELFTEST_LOCATION, desc_);	       \
    363  1.1.1.2  mrg   else							       \
    364  1.1.1.2  mrg     ::selftest::fail (SELFTEST_LOCATION, desc_);	       \
    365  1.1.1.2  mrg   SELFTEST_END_STMT
    366  1.1.1.2  mrg 
    367  1.1.1.3  mrg /* Evaluate VAL1 and VAL2 and compare them with maybe_ne, calling
    368  1.1.1.2  mrg    ::selftest::pass if they might be non-equal,
    369  1.1.1.2  mrg    ::selftest::fail if they are known to be equal.  */
    370  1.1.1.2  mrg 
    371  1.1.1.3  mrg #define ASSERT_MAYBE_NE(VAL1, VAL2) \
    372  1.1.1.3  mrg   ASSERT_MAYBE_NE_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
    373  1.1.1.2  mrg 
    374  1.1.1.2  mrg /* Like ASSERT_MAYBE_NE, but treat LOC as the effective location of the
    375  1.1.1.2  mrg    selftest.  */
    376  1.1.1.2  mrg 
    377  1.1.1.3  mrg #define ASSERT_MAYBE_NE_AT(LOC, VAL1, VAL2)			\
    378  1.1.1.2  mrg   SELFTEST_BEGIN_STMT							\
    379  1.1.1.3  mrg   const char *desc = "ASSERT_MAYBE_NE (" #VAL1 ", " #VAL2 ")";	\
    380  1.1.1.3  mrg   if (maybe_ne (VAL1, VAL2))					\
    381  1.1.1.2  mrg     ::selftest::pass ((LOC), desc);					\
    382  1.1.1.2  mrg   else									\
    383  1.1.1.2  mrg     ::selftest::fail ((LOC), desc);					\
    384  1.1.1.2  mrg   SELFTEST_END_STMT
    385  1.1.1.2  mrg 
    386  1.1.1.2  mrg /* Evaluate LHS and RHS and compare them with >, calling
    387  1.1.1.2  mrg    ::selftest::pass if LHS > RHS,
    388  1.1.1.2  mrg    ::selftest::fail otherwise.  */
    389  1.1.1.2  mrg 
    390  1.1.1.2  mrg #define ASSERT_GT(LHS, RHS)				\
    391  1.1.1.2  mrg   ASSERT_GT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
    392  1.1.1.2  mrg 
    393  1.1.1.2  mrg /* Like ASSERT_GT, but treat LOC as the effective location of the
    394  1.1.1.2  mrg    selftest.  */
    395  1.1.1.2  mrg 
    396  1.1.1.2  mrg #define ASSERT_GT_AT(LOC, LHS, RHS)		       \
    397  1.1.1.2  mrg   SELFTEST_BEGIN_STMT					       \
    398  1.1.1.2  mrg   const char *desc_ = "ASSERT_GT (" #LHS ", " #RHS ")";	       \
    399  1.1.1.2  mrg   if ((LHS) > (RHS))					       \
    400  1.1.1.2  mrg     ::selftest::pass ((LOC), desc_);			       \
    401      1.1  mrg   else							       \
    402  1.1.1.2  mrg     ::selftest::fail ((LOC), desc_);			       \
    403  1.1.1.2  mrg   SELFTEST_END_STMT
    404  1.1.1.2  mrg 
    405  1.1.1.2  mrg /* Evaluate LHS and RHS and compare them with <, calling
    406  1.1.1.2  mrg    ::selftest::pass if LHS < RHS,
    407  1.1.1.2  mrg    ::selftest::fail otherwise.  */
    408  1.1.1.2  mrg 
    409  1.1.1.2  mrg #define ASSERT_LT(LHS, RHS)				\
    410  1.1.1.2  mrg   ASSERT_LT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
    411  1.1.1.2  mrg 
    412  1.1.1.2  mrg /* Like ASSERT_LT, but treat LOC as the effective location of the
    413  1.1.1.2  mrg    selftest.  */
    414  1.1.1.2  mrg 
    415  1.1.1.2  mrg #define ASSERT_LT_AT(LOC, LHS, RHS)		       \
    416  1.1.1.2  mrg   SELFTEST_BEGIN_STMT					       \
    417  1.1.1.2  mrg   const char *desc_ = "ASSERT_LT (" #LHS ", " #RHS ")";	       \
    418  1.1.1.2  mrg   if ((LHS) < (RHS))					       \
    419  1.1.1.2  mrg     ::selftest::pass ((LOC), desc_);			       \
    420  1.1.1.2  mrg   else							       \
    421  1.1.1.2  mrg     ::selftest::fail ((LOC), desc_);			       \
    422      1.1  mrg   SELFTEST_END_STMT
    423      1.1  mrg 
    424  1.1.1.3  mrg /* Evaluate VAL1 and VAL2 and compare them with strcmp, calling
    425  1.1.1.3  mrg    ::selftest::pass if they are equal (and both are non-NULL),
    426  1.1.1.3  mrg    ::selftest::fail if they are non-equal, or are both NULL.  */
    427      1.1  mrg 
    428  1.1.1.3  mrg #define ASSERT_STREQ(VAL1, VAL2)				    \
    429      1.1  mrg   SELFTEST_BEGIN_STMT						    \
    430  1.1.1.3  mrg   ::selftest::assert_streq (SELFTEST_LOCATION, #VAL1, #VAL2, \
    431  1.1.1.3  mrg 			    (VAL1), (VAL2));		    \
    432      1.1  mrg   SELFTEST_END_STMT
    433      1.1  mrg 
    434      1.1  mrg /* Like ASSERT_STREQ, but treat LOC as the effective location of the
    435      1.1  mrg    selftest.  */
    436      1.1  mrg 
    437  1.1.1.3  mrg #define ASSERT_STREQ_AT(LOC, VAL1, VAL2)			    \
    438      1.1  mrg   SELFTEST_BEGIN_STMT						    \
    439  1.1.1.3  mrg   ::selftest::assert_streq ((LOC), #VAL1, #VAL2,		    \
    440  1.1.1.3  mrg 			    (VAL1), (VAL2));		    \
    441      1.1  mrg   SELFTEST_END_STMT
    442      1.1  mrg 
    443      1.1  mrg /* Evaluate HAYSTACK and NEEDLE and use strstr to determine if NEEDLE
    444      1.1  mrg    is within HAYSTACK.
    445      1.1  mrg    ::selftest::pass if NEEDLE is found.
    446      1.1  mrg    ::selftest::fail if it is not found.  */
    447      1.1  mrg 
    448      1.1  mrg #define ASSERT_STR_CONTAINS(HAYSTACK, NEEDLE)				\
    449      1.1  mrg   SELFTEST_BEGIN_STMT							\
    450      1.1  mrg   ::selftest::assert_str_contains (SELFTEST_LOCATION, #HAYSTACK, #NEEDLE, \
    451      1.1  mrg 				   (HAYSTACK), (NEEDLE));		\
    452      1.1  mrg   SELFTEST_END_STMT
    453      1.1  mrg 
    454  1.1.1.3  mrg /* Like ASSERT_STR_CONTAINS, but treat LOC as the effective location of the
    455  1.1.1.3  mrg    selftest.  */
    456  1.1.1.3  mrg 
    457  1.1.1.3  mrg #define ASSERT_STR_CONTAINS_AT(LOC, HAYSTACK, NEEDLE)			\
    458  1.1.1.3  mrg   SELFTEST_BEGIN_STMT							\
    459  1.1.1.3  mrg   ::selftest::assert_str_contains (LOC, #HAYSTACK, #NEEDLE,		\
    460  1.1.1.3  mrg 				   (HAYSTACK), (NEEDLE));		\
    461  1.1.1.3  mrg   SELFTEST_END_STMT
    462  1.1.1.3  mrg 
    463  1.1.1.3  mrg /* Evaluate STR and PREFIX and determine if STR starts with PREFIX.
    464  1.1.1.3  mrg      ::selftest::pass if STR does start with PREFIX.
    465  1.1.1.3  mrg      ::selftest::fail if does not, or either is NULL.  */
    466  1.1.1.3  mrg 
    467  1.1.1.3  mrg #define ASSERT_STR_STARTSWITH(STR, PREFIX)				    \
    468  1.1.1.3  mrg   SELFTEST_BEGIN_STMT							    \
    469  1.1.1.3  mrg   ::selftest::assert_str_startswith (SELFTEST_LOCATION, #STR, #PREFIX,	    \
    470  1.1.1.3  mrg 				     (STR), (PREFIX));			    \
    471  1.1.1.3  mrg   SELFTEST_END_STMT
    472  1.1.1.3  mrg 
    473      1.1  mrg /* Evaluate PRED1 (VAL1), calling ::selftest::pass if it is true,
    474      1.1  mrg    ::selftest::fail if it is false.  */
    475      1.1  mrg 
    476  1.1.1.2  mrg #define ASSERT_PRED1(PRED1, VAL1)				\
    477  1.1.1.2  mrg   SELFTEST_BEGIN_STMT						\
    478  1.1.1.2  mrg   const char *desc_ = "ASSERT_PRED1 (" #PRED1 ", " #VAL1 ")";	\
    479  1.1.1.2  mrg   bool actual_ = (PRED1) (VAL1);				\
    480  1.1.1.2  mrg   if (actual_)							\
    481  1.1.1.2  mrg     ::selftest::pass (SELFTEST_LOCATION, desc_);		\
    482  1.1.1.2  mrg   else								\
    483  1.1.1.2  mrg     ::selftest::fail (SELFTEST_LOCATION, desc_);		\
    484      1.1  mrg   SELFTEST_END_STMT
    485      1.1  mrg 
    486      1.1  mrg #define SELFTEST_BEGIN_STMT do {
    487      1.1  mrg #define SELFTEST_END_STMT   } while (0)
    488      1.1  mrg 
    489      1.1  mrg #endif /* #if CHECKING_P */
    490      1.1  mrg 
    491      1.1  mrg #endif /* GCC_SELFTEST_H */
    492