ref: 6a7c384764bf6d69450037b1fb2ff3dd96b5e81c
dir: /test/run.c/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "soundpipe.h"
#include "md5.h"
#include "tap.h"
#include "test.h"
#define TEST(str, desc, md5hash) int str(sp_test *tst, sp_data *sp, const char *hash);
#include "all_tests.h"
#undef TEST
#define SIZE(x) sizeof(x) / sizeof(*x)
typedef struct {
sp_data *sp;
uint32_t size;
} test_data;
static void print_help()
{
printf("Commands:\n");
printf("\tgen_header: print header.\n");
printf("\tregen_header: regenerate header\n");
printf("\trender NUM: render output at position NUM\n");
printf("\ttest NUM: test position NUM\n");
}
/* TODO: refactor */
int main(int argc, char *argv[])
{
uint32_t n;
sp_test_entry tests [] = {
#define TEST(str, desc, md5hash) {str, desc, md5hash},
#include "all_tests.h"
#undef TEST
};
int err = 0;
unsigned int rc;
unsigned int errcnt;
sp_test *tst;
sp_data *sp;
sp_create(&sp);
uint32_t size = 44100 * 5;
errcnt = 0;
if(argc == 1) {
plan(SIZE(tests));
for(n = 0; n < SIZE(tests); n++) {
sp_test_create(&tst, size);
rc = ok(tests[n].func(tst, sp, tests[n].hash) == SP_OK, tests[n].desc);
#ifdef WRITE_RAW
if(n != 0) sp_test_write_raw(tst, n);
#endif
if(n != 0 && !rc) {
errcnt++;
}
sp_test_destroy(&tst);
}
if(errcnt > 0) {
fprintf(stderr, "Testing resulted in %d error(s).\n", errcnt);
}
} else {
if (!strcmp(argv[1], "gen_header")) {
for(n = 0; n < SIZE(tests); n++) {
printf("TEST(t_%s, \"%s\", \"%s\")\n",
tests[n].desc, tests[n].desc, tests[n].hash);
}
} else if (!strcmp(argv[1], "test")) {
if(argc < 3) {
fprintf(stderr, "Not enough options for test!\n");
err = 1;
} else {
unsigned int pos = atoi(argv[2]) - 1;
if(pos > SIZE(tests)) {
fprintf(stderr, "Test number %d exceeds size\n", pos);
} else {
plan(SIZE(tests));
sp_test_create(&tst, size);
ok(tests[pos].func(tst, sp, tests[pos].hash) == SP_OK, tests[pos].desc);
sp_test_destroy(&tst);
}
}
} else if (!strcmp(argv[1], "regen_header")) {
for(n = 0; n < SIZE(tests); n++) {
sp_test_create(&tst, size);
tst->mode = HEADER;
tst->cur_entry = &tests[n];
tests[n].func(tst, sp, tests[n].hash);
sp_test_destroy(&tst);
}
} else if (!strcmp(argv[1], "render")) {
if(argc < 3) {
fprintf(stderr, "Not enough options for render!\n");
err = 1;
} else {
unsigned int pos = atoi(argv[2]) - 1;
if(pos > SIZE(tests)) {
fprintf(stderr, "Test number %d exceeds size\n", pos);
} else {
sp_test_create(&tst, size);
tests[pos].func(tst, sp, tests[pos].hash);
sp_test_write_raw(tst, pos + 1);
sp_test_destroy(&tst);
}
}
} else if (!strcmp(argv[1], "help")) {
print_help();
} else {
fprintf(stderr, "Invalid command %s\n", argv[1]);
err = 1;
}
}
sp_destroy(&sp);
return err;
}