| /* |
| Check: a unit test framework for C |
| Copyright (C) 2001, Arien Malec |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License |
| as published by the Free Software Foundation; either version 2 |
| of the License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| */ |
| #ifdef HAVE_CONFIG_H |
| # include "config.h" |
| #endif |
| |
| #include <stdio.h> |
| |
| #ifdef STDC_HEADERS |
| # include <string.h> |
| # include <stdlib.h> |
| #endif |
| |
| #include "error.h" |
| #include "list.h" |
| #include "check.h" |
| #include "check_impl.h" |
| #include "check_msg.h" |
| |
| #ifndef USE_FORKWAITMSG |
| extern int nofork_exit_status; |
| #endif |
| |
| Suite *suite_create (const char *name) |
| { |
| Suite *s; |
| s = emalloc (sizeof(Suite)); /* freed in suite_free */ |
| if (name == NULL) |
| s->name = ""; |
| else |
| s->name = name; |
| s->tclst = list_create(); |
| return s; |
| } |
| |
| void suite_free (Suite *s) |
| { |
| List *l; |
| if (s == NULL) |
| return; |
| for (l = s->tclst; !list_at_end(l); list_advance (l)) { |
| tcase_free (list_val(l)); |
| } |
| list_free (s->tclst); |
| free(s); |
| } |
| |
| TCase *tcase_create (const char *name) |
| { |
| TCase *tc = emalloc (sizeof(TCase)); /*freed in tcase_free */ |
| if (name == NULL) |
| tc->name = ""; |
| else |
| tc->name = name; |
| tc->tflst = list_create(); |
| tc->setup = tc->teardown = NULL; |
| |
| return tc; |
| } |
| |
| |
| void tcase_free (TCase *tc) |
| { |
| List *l; |
| l = tc->tflst; |
| for (list_front(l); !list_at_end(l); list_advance(l)) { |
| free (list_val(l)); |
| } |
| list_free(tc->tflst); |
| free(tc); |
| } |
| |
| void suite_add_tcase (Suite *s, TCase *tc) |
| { |
| if (s == NULL || tc == NULL) |
| return; |
| list_add_end (s->tclst, tc); |
| } |
| |
| void tcase_add_test_ (TCase *tc, TFun fn, const char *name) |
| { |
| TF * tf; |
| if (tc == NULL || fn == NULL || name == NULL) |
| return; |
| tf = emalloc (sizeof(TF)); /* freed in tcase_free */ |
| tf->fn = fn; |
| tf->name = name; |
| list_add_end (tc->tflst, tf); |
| } |
| |
| void tcase_set_fixture (TCase *tc, SFun setup, SFun teardown) |
| { |
| tc->setup = setup; |
| tc->teardown = teardown; |
| } |
| |
| |
| void tcase_fn_start (int msqid, const char *fname, const char *file, int line) |
| { |
| send_last_loc_msg (msqid, file, line); |
| } |
| |
| void mark_point_ (int msqid, char *file, int line) |
| { |
| send_last_loc_msg (msqid, file, line); |
| } |
| |
| int fail_unless_ (int msqid, int result, const char *file, int line, |
| const char * msg) |
| { |
| if (line > MAXLINE) |
| eprintf ("Line number %d too large to use", line); |
| |
| send_last_loc_msg (msqid, file, line); |
| if (!result) { |
| send_failure_msg (msqid, msg); |
| #ifdef USE_FORKWAITMSG |
| exit(1); |
| #else |
| nofork_exit_status = 1; |
| return 1; |
| #endif |
| } |
| return 0; |
| } |