1 /* Miniature re-implementation of the "check" library. 
   3  * This is intended to support just enough of check to run the Expat 
   4  * tests.  This interface is based entirely on the portion of the 
   5  * check library being used. 
  13 #include "minicheck.h" 
  16 suite_create(char *name
) 
  18     Suite 
*suite 
= (Suite 
*) calloc(1, sizeof(Suite
)); 
  26 tcase_create(char *name
) 
  28     TCase 
*tc 
= (TCase 
*) calloc(1, sizeof(TCase
)); 
  36 suite_add_tcase(Suite 
*suite
, TCase 
*tc
)  
  38     assert(suite 
!= NULL
); 
  40     assert(tc
->next_tcase 
== NULL
); 
  42     tc
->next_tcase 
= suite
->tests
; 
  47 tcase_add_checked_fixture(TCase 
*tc
, 
  48                           tcase_setup_function setup
, 
  49                           tcase_teardown_function teardown
) 
  53     tc
->teardown 
= teardown
; 
  57 tcase_add_test(TCase 
*tc
, tcase_test_function test
) 
  60     if (tc
->allocated 
== tc
->ntests
) { 
  61         int nalloc 
= tc
->allocated 
+ 100; 
  62         size_t new_size 
= sizeof(tcase_test_function
) * nalloc
; 
  63         tcase_test_function 
*new_tests 
= realloc(tc
->tests
, new_size
); 
  64         assert(new_tests 
!= NULL
); 
  65         if (new_tests 
!= tc
->tests
) { 
  67             tc
->tests 
= new_tests
; 
  69         tc
->allocated 
= nalloc
; 
  71     tc
->tests
[tc
->ntests
] = test
; 
  76 srunner_create(Suite 
*suite
) 
  78     SRunner 
*runner 
= calloc(1, sizeof(SRunner
)); 
  80         runner
->suite 
= suite
; 
  87 static char const *_check_current_function 
= NULL
; 
  88 static int _check_current_lineno 
= -1; 
  89 static char const *_check_current_filename 
= NULL
; 
  92 _check_set_test_info(char const *function
, char const *filename
, int lineno
) 
  94     _check_current_function 
= function
; 
  95     _check_current_lineno 
= lineno
; 
  96     _check_current_filename 
= filename
; 
 101 add_failure(SRunner 
*runner
, int verbosity
) 
 104     if (verbosity 
>= CK_VERBOSE
) { 
 105         printf("%s:%d: %s\n", _check_current_filename
, 
 106                _check_current_lineno
, _check_current_function
); 
 111 srunner_run_all(SRunner 
*runner
, int verbosity
) 
 115     assert(runner 
!= NULL
); 
 116     suite 
= runner
->suite
; 
 120         for (i 
= 0; i 
< tc
->ntests
; ++i
) { 
 123             if (tc
->setup 
!= NULL
) { 
 126                     add_failure(runner
, verbosity
); 
 133                 add_failure(runner
, verbosity
); 
 139             if (tc
->teardown 
!= NULL
) { 
 141                     add_failure(runner
, verbosity
); 
 150         int passed 
= runner
->nchecks 
- runner
->nfailures
; 
 151         double percentage 
= ((double) passed
) / runner
->nchecks
; 
 152         int display 
= (int) (percentage 
* 100); 
 153         printf("%d%%: Checks: %d, Failed: %d\n", 
 154                display
, runner
->nchecks
, runner
->nfailures
); 
 159 _fail_unless(int condition
, const char *file
, int line
, char *msg
) 
 161     /* Always print the error message so it isn't lost.  In this case, 
 162        we have a failure, so there's no reason to be quiet about what 
 171 srunner_ntests_failed(SRunner 
*runner
) 
 173     assert(runner 
!= NULL
); 
 174     return runner
->nfailures
; 
 178 srunner_free(SRunner 
*runner
)