equal/hKis/test/testcoverage.c
2022-10-25 18:36:19 +08:00

89 lines
2.1 KiB
C

#include "test.h"
#include <ctype.h>
#include <dirent.h>
#include <sys/types.h>
static bool
is_cover_file_name (const char *name)
{
#define CHAR(CH) (*p++ == CH)
#define DIGIT() (isdigit (*p++))
const char *p = name;
// *INDENT-OFF*
return
CHAR ('c') && CHAR ('o') && CHAR ('v') && CHAR ('e') && CHAR ('r') &&
DIGIT () && DIGIT () && DIGIT () && DIGIT () &&
CHAR ('.') && CHAR ('c') && CHAR ('n') && CHAR ('f');
// *INDENT-ON*
#undef CHAR
#undef DIGIT
}
static void
schedule_cover_file (const char *dir, const char *name)
{
char path[512];
assert (dir[0]);
assert (dir[strlen (dir) - 1] == '/');
assert (strlen (dir) + strlen (name) + 1 < sizeof path);
sprintf (path, "%s%s", dir, name);
FILE *file = fopen (path, "r");
if (!file)
FATAL ("could not read '%s'", path);
int status;
if (fscanf (file, "c status %d\n", &status) != 1)
FATAL ("parse error at line 1 in '%s': expected 'c status <status>'",
path);
fclose (file);
tissat_schedule_application (status, path);
}
#define MAX_COVER_FILES (1<<16)
static char *cover_files[MAX_COVER_FILES];
static size_t size_cover_files;
static void
push_cover_file (const char *name)
{
assert (size_cover_files < MAX_COVER_FILES);
char *tmp = malloc (strlen (name) + 1);
cover_files[size_cover_files++] = strcpy (tmp, name);
}
static int
cmp (const void *p, const void *q)
{
return strcmp (*(char **) p, *(char **) q);
}
static void
sort_cover_files (void)
{
qsort (cover_files, size_cover_files, sizeof (char *), cmp);
}
void
tissat_schedule_coverage (void)
{
if (!tissat_found_test_directory)
return;
const char *path = "../test/cover/";
DIR *dir = opendir (path);
if (!dir)
FATAL ("could not open directory '%s' "
"(even though '../test/' claimed to exist)", path);
struct dirent *entry;
const char *name;
while ((entry = readdir (dir)))
if (is_cover_file_name ((name = entry->d_name)))
push_cover_file (name);
closedir (dir);
sort_cover_files ();
for (size_t i = 0; i < size_cover_files; i++)
schedule_cover_file (path, cover_files[i]);
for (size_t i = 0; i < size_cover_files; i++)
free (cover_files[i]);
}