2008-09-13 14:19:22 -07:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
|
|
#include <windows.h>
|
|
|
|
#undef WIN32_LEAN_AND_MEAN
|
|
|
|
|
2008-10-11 00:23:55 -07:00
|
|
|
#include "evil_suite.h"
|
2008-10-22 14:36:55 -07:00
|
|
|
#include "evil_test_environment.h"
|
2008-10-11 00:23:55 -07:00
|
|
|
#include "evil_test_memcpy.h"
|
2008-09-13 14:19:22 -07:00
|
|
|
|
|
|
|
|
2008-10-19 21:42:26 -07:00
|
|
|
typedef int(*function)(suite *s);
|
2008-09-13 14:19:22 -07:00
|
|
|
|
|
|
|
struct test
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
function fct;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct list
|
|
|
|
{
|
|
|
|
void *data;
|
2008-10-19 21:42:26 -07:00
|
|
|
int succeed;
|
2008-09-13 14:19:22 -07:00
|
|
|
list *next;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct suite
|
|
|
|
{
|
2008-10-19 21:42:26 -07:00
|
|
|
LARGE_INTEGER freq;
|
|
|
|
LARGE_INTEGER start;
|
|
|
|
LARGE_INTEGER end;
|
|
|
|
|
2008-09-13 14:19:22 -07:00
|
|
|
list *first;
|
|
|
|
list *l;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
suite *
|
|
|
|
suite_new(void)
|
|
|
|
{
|
|
|
|
suite *s;
|
|
|
|
|
|
|
|
s = (suite *)malloc(sizeof(suite));
|
|
|
|
if (!s) return NULL;
|
|
|
|
|
2008-10-19 21:42:26 -07:00
|
|
|
if (!QueryPerformanceFrequency(&s->freq))
|
|
|
|
{
|
|
|
|
free(s);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2008-09-13 14:19:22 -07:00
|
|
|
s->first = NULL;
|
|
|
|
s->l = NULL;
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
suite_del(suite *s)
|
|
|
|
{
|
|
|
|
list *l;
|
|
|
|
list *tmp;
|
|
|
|
|
|
|
|
if (!s) return;
|
|
|
|
|
|
|
|
l = s->first;
|
|
|
|
while (l)
|
|
|
|
{
|
|
|
|
tmp = l->next;
|
|
|
|
free(l->data);
|
|
|
|
free(l);
|
|
|
|
l = tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
free(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-10-19 21:42:26 -07:00
|
|
|
suite_time_start(suite *s)
|
2008-09-13 14:19:22 -07:00
|
|
|
{
|
2008-10-19 21:42:26 -07:00
|
|
|
QueryPerformanceCounter(&s->start);
|
2008-09-13 14:19:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-10-19 21:42:26 -07:00
|
|
|
suite_time_stop(suite *s)
|
2008-09-13 14:19:22 -07:00
|
|
|
{
|
2008-10-19 21:42:26 -07:00
|
|
|
QueryPerformanceCounter(&s->end);
|
2008-09-13 14:19:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
2008-10-19 21:42:26 -07:00
|
|
|
suite_time_get(suite *s)
|
2008-09-13 14:19:22 -07:00
|
|
|
{
|
2008-10-19 21:42:26 -07:00
|
|
|
return (double)(s->end.QuadPart - s->start.QuadPart) / (double)s->freq.QuadPart;
|
2008-09-13 14:19:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
suite_test_add(suite *s, const char *name, function fct)
|
|
|
|
{
|
|
|
|
test *t;
|
|
|
|
list *l;
|
|
|
|
|
|
|
|
t = (test *)malloc(sizeof(test));
|
|
|
|
if (!t) return;
|
|
|
|
|
|
|
|
l = (list *)malloc(sizeof(list));
|
|
|
|
if (!l)
|
|
|
|
{
|
|
|
|
free(t);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
t->name = name;
|
|
|
|
t->fct = fct;
|
|
|
|
|
|
|
|
l->data = t;
|
2008-10-19 21:42:26 -07:00
|
|
|
l->succeed = 0;
|
2008-09-13 14:19:22 -07:00
|
|
|
l->next = NULL;
|
|
|
|
|
|
|
|
if (!s->first) s->first = l;
|
|
|
|
|
|
|
|
if (!s->l)
|
|
|
|
s->l = l;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s->l->next = l;
|
|
|
|
s->l =l;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
suite_run(suite *s)
|
|
|
|
{
|
|
|
|
list *l;
|
|
|
|
|
|
|
|
l = s->first;
|
|
|
|
while (l)
|
|
|
|
{
|
|
|
|
test *t;
|
|
|
|
|
|
|
|
t = (test *)l->data;
|
2008-10-19 21:42:26 -07:00
|
|
|
l->succeed = t->fct(s);
|
|
|
|
printf("%s test: %s\n", t->name, l->succeed ? "success" : "failure");
|
2008-09-13 14:19:22 -07:00
|
|
|
l = l->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main()
|
|
|
|
{
|
|
|
|
test tests[] = {
|
2008-10-22 14:36:55 -07:00
|
|
|
{ "environment", test_environment },
|
|
|
|
{ "memcpy ", test_memcpy },
|
|
|
|
{ NULL, NULL },
|
2008-09-13 14:19:22 -07:00
|
|
|
};
|
|
|
|
suite *s;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
s = suite_new();
|
|
|
|
if (!s)
|
2008-10-19 21:42:26 -07:00
|
|
|
return EXIT_FAILURE;
|
2008-09-13 14:19:22 -07:00
|
|
|
|
|
|
|
for (i = 0; ; ++i)
|
|
|
|
{
|
|
|
|
if (!tests[i].name)
|
|
|
|
break;
|
|
|
|
|
|
|
|
suite_test_add(s, tests[i].name, tests[i].fct);
|
|
|
|
}
|
|
|
|
|
|
|
|
suite_run(s);
|
|
|
|
|
|
|
|
suite_del(s);
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|