/* This is partially inspirated from the OSSP ts (Test Suite Library) */
-#include "gras_config.h"
+#include "portable.h"
#include "xbt/sysdep.h" /* vasprintf */
#include "xbt/cunit.h"
else
fprintf(stderr," log=NULL\n");
}
-static void xbt_test_log_free(xbt_test_log_t log) {
- if (!log)
- return;
- if (log->text)
- free(log->text);
- free(log);
-}
/* test suite test check */
typedef struct s_xbt_test_test {
static void xbt_test_test_dump(xbt_test_test_t test){
if (test) {
xbt_test_log_t log;
- int it_log;
+ unsigned int it_log;
fprintf(stderr," test %p(%s:%d)=%s (%s)\n",
test,test->file,test->line,test->title,
test->failed?"failed":"not failed");
static void xbt_test_unit_dump(xbt_test_unit_t unit) {
if (unit) {
xbt_test_test_t test;
- int it_test;
+ unsigned int it_test;
fprintf(stderr," UNIT %s: %s (%s)\n",
unit->name,unit->title,
(unit->enabled?"enabled":"disabled"));
free(suite);
}
+static void xbt_test_unit_free(void *unit) {
+ xbt_test_unit_t u = *(xbt_test_unit_t*)unit;
+ /* name is static */
+ free(u->title);
+ xbt_dynar_free(&u->tests);
+ free(u);
+}
+static void xbt_test_test_free(void *test) {
+ xbt_test_test_t t = *(xbt_test_test_t*)test;
+ free(t->title);
+ xbt_dynar_free(&(t->logs));
+ free(t);
+}
+static void xbt_test_log_free(void *log) {
+ xbt_test_log_t l= *(xbt_test_log_t*) log;
+ free(l->text);
+ free(l);
+}
+
/** @brief create test suite */
xbt_test_suite_t xbt_test_suite_new(const char *name, const char *fmt, ...) {
xbt_test_suite_t suite = xbt_new0(struct s_xbt_test_suite,1);
va_list ap;
if (!_xbt_test_suites)
- _xbt_test_suites = xbt_dynar_new(sizeof(xbt_test_suite_t),&xbt_test_suite_free);
+ _xbt_test_suites = xbt_dynar_new(sizeof(xbt_test_suite_t),xbt_test_suite_free);
va_start(ap, fmt);
vasprintf(&suite->title,fmt, ap);
- suite->units = xbt_dynar_new(sizeof(xbt_test_unit_t), NULL);
+ suite->units = xbt_dynar_new(sizeof(xbt_test_unit_t), &xbt_test_unit_free);
va_end(ap);
suite->name = name;
suite->enabled = 1;
/** @brief retrieve a testsuite from name, or create a new one */
xbt_test_suite_t xbt_test_suite_by_name(const char *name,const char *fmt, ...) {
xbt_test_suite_t suite;
- int it_suite;
+ unsigned int it_suite;
char *bufname;
va_list ap;
void xbt_test_suite_dump(xbt_test_suite_t suite) {
if (suite) {
xbt_test_unit_t unit;
- int it_unit;
+ unsigned int it_unit;
fprintf(stderr,"TESTSUITE %s: %s (%s)\n",
suite->name, suite->title,
suite->enabled?"enabled":"disabled");
unit->file = NULL;
unit->line = 0;
unit->enabled = 1;
- unit->tests = xbt_dynar_new(sizeof(xbt_test_test_t), NULL);
+ unit->tests = xbt_dynar_new(sizeof(xbt_test_test_t), xbt_test_test_free);
xbt_dynar_push(suite->units, &unit);
return;
const char *file;
int line;
char *cp;
- int it_unit,it_test,it_log;
+ unsigned int it_unit,it_test,it_log;
int first=1; /* for result pretty printing */
for (i=1;i<79;i++)
suite_title[i]='=';
suite_title[i++]='\n';
- suite_title[i]='\0';
+ suite_title[79]='\0';
sprintf(suite_title + 40 - (suite_len+4)/2, "[ %s ]", suite->title);
suite_title[40 + (suite_len+5)/2] = '=';
if (!suite->enabled)
sprintf(suite_title+ 70," DISABLED ");
- fprintf(stderr, "\n%s",suite_title);
+ fprintf(stderr, "\n%s\n",suite_title);
}
if (suite->enabled) {
(test->failed?" FAIL":" PASS"))),
test->title, file, line);
- xbt_dynar_foreach(test->logs,it_log,log) {
- file = (log->file != NULL ? log->file : file);
- line = (log->line != 0 ? log->line : line);
- fprintf(stderr, " %s:%d: %s\n",
- file, line,log->text);
-
+ if ( (test->expected_failure && !test->failed) || (!test->expected_failure && test->failed) ) {
+ xbt_dynar_foreach(test->logs,it_log,log) {
+ file = (log->file != NULL ? log->file : file);
+ line = (log->line != 0 ? log->line : line);
+ fprintf(stderr, " %s:%d: %s\n",
+ file, line,log->text);
+
+ }
}
}
fprintf(stderr, " Summary: %d of %d tests failed",unit->test_failed, unit->nb_tests);
int done = 0;
char dir[1024]; /* the directive */
/* iterators */
- int it_suite;
+ unsigned int it_suite;
xbt_test_suite_t suite;
xbt_test_unit_t unit;
- int it_unit;
+ unsigned int it_unit;
+
+ char suitename[512];
+ char unitname[512];
if (!selection || selection[0] == '\0')
return;
enabling = 0;
memmove(dir,dir+1,strlen(dir));
}
+ if (dir[0] == '+') {
+ enabling = 1;
+ memmove(dir,dir+1,strlen(dir));
+ }
-
- char suitename[512],unitname[512];
p =strchr(dir,':');
if (p) {
strcpy(unitname,p+1);
suite->enabled = enabling;
}
} else {
- int it;
- for (it=0; it<xbt_dynar_length(_xbt_test_suites); it++) {
+ unsigned int it;
+ for (it=0; it< xbt_dynar_length(_xbt_test_suites); it++) {
xbt_test_suite_t thissuite=xbt_dynar_get_as(_xbt_test_suites,it,xbt_test_suite_t);
if (!strcmp(suitename,thissuite->name)) {
/* Do not disable the whole suite when we just want to disable a child */
unit->enabled = enabling;
}
} else { /* act on one child only */
- int it2_unit;
+ unsigned int it2_unit;
/* search it, first (we won't reuse it for external loop which gets broken) */
- for (it2_unit=0; it2_unit<xbt_dynar_length(thissuite->units); it2_unit++) {
+ for (it2_unit=0; it2_unit< xbt_dynar_length(thissuite->units); it2_unit++) {
xbt_test_unit_t thisunit=xbt_dynar_get_as(thissuite->units,it2_unit,xbt_test_unit_t);
if (!strcmp(thisunit->name,unitname)) {
thisunit->enabled = enabling;
apply_selection(selection);
if (_xbt_test_suites) {
- int it_suite;
+ unsigned int it_suite;
xbt_test_suite_t suite;
xbt_dynar_foreach(_xbt_test_suites,it_suite,suite)
apply_selection(selection);
if (_xbt_test_suites) {
- int it_suite;
+ unsigned int it_suite;
xbt_test_suite_t suite;
int first=1;
}
return _xbt_test_unit_failed;
}
-
+void xbt_test_exit(void) {
+ xbt_dynar_free(&_xbt_test_suites);
+}
/* annotate test case with test */
void _xbt_test_add(const char*file,int line, const char *fmt, ...) {
xbt_assert(unit);
xbt_assert(fmt);
- test = xbt_new(struct s_xbt_test_test,1);
+ test = xbt_new0(struct s_xbt_test_test,1);
va_start(ap, fmt);
vasprintf(&test->title, fmt, ap);
va_end(ap);
test->ignored = 0;
test->file = file;
test->line = line;
- test->logs = xbt_dynar_new(sizeof(xbt_test_log_t),NULL);
+ test->logs = xbt_dynar_new(sizeof(xbt_test_log_t),xbt_test_log_free);
xbt_dynar_push(unit->tests,&test);
return;
}