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> ¶m_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