File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / expat / tests / minicheck.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:00:54 2012 UTC (12 years, 4 months ago) by misho
Branches: expat, MAIN
CVS tags: v2_1_0, v2_0_1p0, v2_0_1, HEAD
expat

    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>