
/*
 *  Run some tests
 *
 *  (C) Copyright 2001-2003 Geert Uytterhoeven
 *
 *  This file is subject to the terms and conditions of the GNU General Public
 *  License. See the file COPYING in the main directory of this archive for
 *  more details.
 */

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

#include "types.h"
#include "fb.h"
#include "visual.h"
#include "test.h"
#include "util.h"


static const struct test *all_tests[] = {
    &test001,
    &test002,
    &test003,
    &test004,
    &test005,
    &test006,
    &test007,
    &test008,
    &test009,
    &test010,
    &test011,
    &test012,
    NULL
};


    /*
     *  Run one test
     */

#define TEST_REQ_MIN(reqname, varname)				\
    if (test->reqs & REQF_ ## reqname) {			\
	if (varname < test->reqname) {				\
	    Debug("Requirement " #reqname " >= %d not met\n",	\
		  test->reqname);				\
	    return;						\
	}							\
    }

static void run_one_test(const struct test *test)
{
    enum test_res res;

    Debug("Running test %s\n", test->name);

    if (test->visual != VISUAL_NONE && !visual_set(test->visual)) {
	Debug("Visual %d not supported\n", test->visual);
	return;
    }

    TEST_REQ_MIN(bits_per_pixel, fb_var.bits_per_pixel);
    TEST_REQ_MIN(num_colors, idx_len);
    TEST_REQ_MIN(red_length, fb_var.red.length);
    TEST_REQ_MIN(green_length, fb_var.green.length);
    TEST_REQ_MIN(blue_length, fb_var.blue.length);
    TEST_REQ_MIN(transp_length, fb_var.transp.length);
    TEST_REQ_MIN(xres, fb_var.xres);
    TEST_REQ_MIN(yres, fb_var.yres);
    if (test->reqs & REQF_panning) {
	if (!(fb_fix.xpanstep && fb_var.xres_virtual-fb_var.xres) &&
	    !(fb_fix.ypanstep && fb_var.yres_virtual-fb_var.yres)) {
	    Debug("No support for virtual screen and panning\n");
	    return;
	}
    }

    res = test->func();
    switch (res) {
	case TEST_OK:
	    Message("%s: PASSED\n", test->name);
	    break;

	case TEST_FAIL:
	    Error("%s: FAILED\n", test->name);
	    break;

	case TEST_NA:
	    Debug("Not applicable\n");
	    break;

	default:
	    Fatal("%s returned unknown code %d\n", test->name, res);
	    break;
    }
}

#undef TEST_REQ_MIN


    /*
     *  Test run
     */

void test_run(const char *name)
{
    int i;

    for (i = 0; all_tests[i]; i++)
	if (!name || !strcmp(all_tests[i]->name, name))
	    run_one_test(all_tests[i]);
}


    /*
     *  List all tests
     */

void test_list(const char *name, int verbose)
{
    int i;
    const struct test *test;

    for (i = 0; all_tests[i]; i++)
	if (!name || !strcmp(all_tests[i]->name, name)) {
	    test = all_tests[i];
	    printf("%s: %s\n", test->name, test->desc);
	}
}

