/* test-screens.c --- some test cases for the "monitor sanity" checks. * xscreensaver, Copyright (c) 2008 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include /* This file doesn't need the Xt headers, so stub these types out... */ #undef XtPointer #define XtAppContext void* #define XrmDatabase void* #define XtIntervalId void* #define XtPointer void* #define Widget void* #include "xscreensaver.h" #include "visual.h" #undef WidthOfScreen #undef HeightOfScreen #define WidthOfScreen(s) 10240 #define HeightOfScreen(s) 10240 #undef screen_number #define screen_number(s) ((int) s) #include "screens.c" /* to get at static void check_monitor_sanity() */ char *progname = 0; char *progclass = "XScreenSaver"; const char *blurb(void) { return progname; } Bool safe_XF86VidModeGetViewPort(Display *d, int i, int *x, int *y) { abort(); } void initialize_screen_root_widget(saver_screen_info *ssi) { abort(); } Visual *get_best_gl_visual (saver_info *si, Screen *sc) { abort(); } static const char * failstr (monitor_sanity san) { switch (san) { case S_SANE: return "OK"; case S_ENCLOSED: return "ENC"; case S_DUPLICATE: return "DUP"; case S_OVERLAP: return "OVR"; case S_OFFSCREEN: return "OFF"; case S_DISABLED: return "DIS"; default: abort(); break; } } static void test (int testnum, const char *screens, const char *desired) { monitor *monitors[100]; char result[2048]; char *out = result; int i, nscreens = 0; char *token = strtok (strdup(screens), ","); while (token) { monitor *m = calloc (1, sizeof (monitor)); char c; m->id = (testnum * 1000) + nscreens; if (5 == sscanf (token, "%dx%d+%d+%d@%d%c", &m->width, &m->height, &m->x, &m->y, (int *) &m->screen, &c)) ; else if (4 != sscanf (token, "%dx%d+%d+%d%c", &m->width, &m->height, &m->x, &m->y, &c)) { fprintf (stderr, "%s: unparsable geometry: %s\n", blurb(), token); exit (1); } monitors[nscreens] = m; nscreens++; token = strtok (0, ","); } monitors[nscreens] = 0; check_monitor_sanity (monitors); *out = 0; for (i = 0; i < nscreens; i++) { monitor *m = monitors[i]; if (out != result) *out++ = ','; if (m->sanity == S_SANE) { sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y); if (m->screen) sprintf (out + strlen(out), "@%d", (int) m->screen); } else strcpy (out, failstr (m->sanity)); out += strlen(out); } *out = 0; if (!strcmp (result, desired)) fprintf (stderr, "%s: test %2d OK\n", blurb(), testnum); else fprintf (stderr, "%s: test %2d FAILED:\n" "%s: given: %s\n" "%s: wanted: %s\n" "%s: got: %s\n", blurb(), testnum, blurb(), screens, blurb(), desired, blurb(), result); # if 0 { saver_info SI; SI.monitor_layout = monitors; describe_monitor_layout (&SI); } # endif } static void run_tests(void) { int i = 1; # define A(a) test (i++, a, a); # define B(a,b) test (i++, a, b) A(""); A("1024x768+0+0"); A("1024x768+0+0,1024x768+1024+0"); A("1024x768+0+0,1024x768+0+768"); A("1024x768+0+0,1024x768+0+768,1024x768+1024+0"); A("800x600+0+0,800x600+0+0@1,800x600+10+0@2"); B("1024x768+999999+0", "OFF"); B("1024x768+-999999+-999999", "OFF"); B("1024x768+0+0,1024x768+0+0", "1024x768+0+0,DUP"); B("1024x768+0+0,1024x768+0+0,1024x768+0+0", "1024x768+0+0,DUP,DUP"); B("1024x768+0+0,1024x768+1024+0,1024x768+0+0", "1024x768+0+0,1024x768+1024+0,DUP"); B("1280x1024+0+0,1024x768+0+64,800x600+0+0,640x480+0+0,720x400+0+0", "1280x1024+0+0,ENC,ENC,ENC,ENC"); B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,800x600+0+0,720x400+0+0", "ENC,1280x1024+0+0,ENC,ENC,ENC,ENC"); B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,1280x1024+0+0,720x400+0+0", "ENC,1280x1024+0+0,ENC,ENC,DUP,ENC"); B("720x400+0+0,640x480+0+0,800x600+0+0,1024x768+0+64,1280x1024+0+0", "ENC,ENC,ENC,ENC,1280x1024+0+0"); B("1280x1024+0+0,800x600+1280+0,800x600+1300+0", "1280x1024+0+0,800x600+1280+0,OVR"); B("1280x1024+0+0,800x600+1280+0,800x600+1300+0,1280x1024+0+0,800x600+1280+0", "1280x1024+0+0,800x600+1280+0,OVR,DUP,DUP"); /* +-------------+----+ +------+---+ 1: 1440x900, widescreen display | : | | 3+4 : | 2: 1280x1024, conventional display | 1+2 : 1 | +......+ | 3: 1024x768, laptop | : | | 3 | 4: 800x600, external projector +.............+----+ +----------+ | 2 | | | +-------------+ */ B("1440x900+0+0,1280x1024+0+0,1024x768+1440+0,800x600+1440+0", "1440x900+0+0,OVR,1024x768+1440+0,ENC"); B("800x600+0+0,800x600+0+0,800x600+800+0", "800x600+0+0,DUP,800x600+800+0"); B("1600x1200+0+0,1360x768+0+0", "1600x1200+0+0,ENC"); B("1600x1200+0+0,1360x768+0+0,1600x1200+0+0@1,1360x768+0+0@1", "1600x1200+0+0,ENC,1600x1200+0+0@1,ENC"); } int main (int argc, char **argv) { char *s; progname = argv[0]; s = strrchr(progname, '/'); if (s) progname = s+1; if (argc != 1) { fprintf (stderr, "usage: %s\n", argv[0]); exit (1); } run_tests(); exit (0); }