/**
 * @file parse_event_tests.c
 *
 * @remark Copyright 2003 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "op_parse_event.h"

struct events_test {
	/* second pointer is the null terminating array marker */
	char const * const tests[2];
	struct parsed_event expected;
};

static struct events_test const events[] = 
{
	{ { "FOO:3000:0:0:0", 0 },    { "FOO", 3000, 0, NULL, 0, 0, 0 } },
	{ { "BAR:3000", 0 },          { "BAR", 3000, 0, NULL, 1, 1, 0 } },
	{ { "FOOBAR:3000:1:1:1", 0 }, { "FOOBAR", 3000, 1, NULL, 1, 1, 0 } },
	{ { NULL, NULL },             { 0, 0, 0, NULL, 0, 0, 0 } }
};

static void do_test(struct events_test const * ev)
{
	struct parsed_event parsed;

	parse_events(&parsed, 1, ev->tests);

	if (strcmp(ev->expected.name, parsed.name) ||
	    ev->expected.count != parsed.count ||
	    ev->expected.unit_mask != parsed.unit_mask ||
	    ev->expected.kernel != parsed.kernel ||
	    ev->expected.user != parsed.user) {
		printf("for %s expect { %s, %d, %d, %d, %d } found "
		       "{ %s, %d, %d, %d, %d }\n",
                       ev->tests[0], ev->expected.name, ev->expected.count,
                       ev->expected.unit_mask, ev->expected.kernel,
                       ev->expected.user, parsed.name, parsed.count,
                       parsed.unit_mask, parsed.kernel, parsed.user);
		exit(EXIT_FAILURE);
	}
}

int main(void)
{
	struct events_test const * ev;
	for (ev = events; ev->tests[0]; ++ev)
		do_test(ev);

	return 0;
}
