|  |  | 
|  | /* | 
|  | *  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 "export.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, | 
|  | &test013, | 
|  | 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 (%s)\n", test->name, test->desc); | 
|  |  | 
|  | 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); | 
|  | if (Opt_Export) | 
|  | export_fb(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); | 
|  | } | 
|  | } | 
|  |  |