Annotation of embedaddon/expat/tests/minicheck.c, revision 1.1.1.1

1.1       misho       1: /* Miniature re-implementation of the "check" library.
                      2:  *
                      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.
                      6:  */
                      7: 
                      8: #include <stdio.h>
                      9: #include <stdlib.h>
                     10: #include <setjmp.h>
                     11: #include <assert.h>
                     12: 
                     13: #include "minicheck.h"
                     14: 
                     15: Suite *
                     16: suite_create(char *name)
                     17: {
                     18:     Suite *suite = (Suite *) calloc(1, sizeof(Suite));
                     19:     if (suite != NULL) {
                     20:         suite->name = name;
                     21:     }
                     22:     return suite;
                     23: }
                     24: 
                     25: TCase *
                     26: tcase_create(char *name)
                     27: {
                     28:     TCase *tc = (TCase *) calloc(1, sizeof(TCase));
                     29:     if (tc != NULL) {
                     30:         tc->name = name;
                     31:     }
                     32:     return tc;
                     33: }
                     34: 
                     35: void
                     36: suite_add_tcase(Suite *suite, TCase *tc) 
                     37: {
                     38:     assert(suite != NULL);
                     39:     assert(tc != NULL);
                     40:     assert(tc->next_tcase == NULL);
                     41: 
                     42:     tc->next_tcase = suite->tests;
                     43:     suite->tests = tc;
                     44: }
                     45: 
                     46: void
                     47: tcase_add_checked_fixture(TCase *tc,
                     48:                           tcase_setup_function setup,
                     49:                           tcase_teardown_function teardown)
                     50: {
                     51:     assert(tc != NULL);
                     52:     tc->setup = setup;
                     53:     tc->teardown = teardown;
                     54: }
                     55: 
                     56: void
                     57: tcase_add_test(TCase *tc, tcase_test_function test)
                     58: {
                     59:     assert(tc != NULL);
                     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) {
                     66:             free(tc->tests);
                     67:             tc->tests = new_tests;
                     68:         }
                     69:         tc->allocated = nalloc;
                     70:     }
                     71:     tc->tests[tc->ntests] = test;
                     72:     tc->ntests++;
                     73: }
                     74: 
                     75: SRunner *
                     76: srunner_create(Suite *suite)
                     77: {
                     78:     SRunner *runner = calloc(1, sizeof(SRunner));
                     79:     if (runner != NULL) {
                     80:         runner->suite = suite;
                     81:     }
                     82:     return runner;
                     83: }
                     84: 
                     85: static jmp_buf env;
                     86: 
                     87: static char const *_check_current_function = NULL;
                     88: static int _check_current_lineno = -1;
                     89: static char const *_check_current_filename = NULL;
                     90: 
                     91: void
                     92: _check_set_test_info(char const *function, char const *filename, int lineno)
                     93: {
                     94:     _check_current_function = function;
                     95:     _check_current_lineno = lineno;
                     96:     _check_current_filename = filename;
                     97: }
                     98: 
                     99: 
                    100: static void
                    101: add_failure(SRunner *runner, int verbosity)
                    102: {
                    103:     runner->nfailures++;
                    104:     if (verbosity >= CK_VERBOSE) {
                    105:         printf("%s:%d: %s\n", _check_current_filename,
                    106:                _check_current_lineno, _check_current_function);
                    107:     }
                    108: }
                    109: 
                    110: void
                    111: srunner_run_all(SRunner *runner, int verbosity)
                    112: {
                    113:     Suite *suite;
                    114:     TCase *tc;
                    115:     assert(runner != NULL);
                    116:     suite = runner->suite;
                    117:     tc = suite->tests;
                    118:     while (tc != NULL) {
                    119:         int i;
                    120:         for (i = 0; i < tc->ntests; ++i) {
                    121:             runner->nchecks++;
                    122: 
                    123:             if (tc->setup != NULL) {
                    124:                 /* setup */
                    125:                 if (setjmp(env)) {
                    126:                     add_failure(runner, verbosity);
                    127:                     continue;
                    128:                 }
                    129:                 tc->setup();
                    130:             }
                    131:             /* test */
                    132:             if (setjmp(env)) {
                    133:                 add_failure(runner, verbosity);
                    134:                 continue;
                    135:             }
                    136:             (tc->tests[i])();
                    137: 
                    138:             /* teardown */
                    139:             if (tc->teardown != NULL) {
                    140:                 if (setjmp(env)) {
                    141:                     add_failure(runner, verbosity);
                    142:                     continue;
                    143:                 }
                    144:                 tc->teardown();
                    145:             }
                    146:         }
                    147:         tc = tc->next_tcase;
                    148:     }
                    149:     if (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);
                    155:     }
                    156: }
                    157: 
                    158: void
                    159: _fail_unless(int condition, const char *file, int line, char *msg)
                    160: {
                    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
                    163:        it is.
                    164:     */
                    165:     if (msg != NULL)
                    166:         printf("%s", msg);
                    167:     longjmp(env, 1);
                    168: }
                    169: 
                    170: int
                    171: srunner_ntests_failed(SRunner *runner)
                    172: {
                    173:     assert(runner != NULL);
                    174:     return runner->nfailures;
                    175: }
                    176: 
                    177: void
                    178: srunner_free(SRunner *runner)
                    179: {
                    180:     free(runner->suite);
                    181:     free(runner);
                    182: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>