/**
 * Copyright © 2011 Red Hat, Inc.
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a
 *  copy of this software and associated documentation files (the "Software"),
 *  to deal in the Software without restriction, including without limitation
 *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
 *  and/or sell copies of the Software, and to permit persons to whom the
 *  Software is furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice (including the next
 *  paragraph) shall be included in all copies or substantial portions of the
 *  Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 *  DEALINGS IN THE SOFTWARE.
 */

#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif

#include <stdint.h>
#include "misc.h"
#include "scrnintstr.h"

ScreenInfo screenInfo;

static void
dix_version_compare(void)
{
    int rc;

    rc = version_compare(0, 0, 1, 0);
    assert(rc < 0);
    rc = version_compare(1, 0, 0, 0);
    assert(rc > 0);
    rc = version_compare(0, 0, 0, 0);
    assert(rc == 0);
    rc = version_compare(1, 0, 1, 0);
    assert(rc == 0);
    rc = version_compare(1, 0, 0, 9);
    assert(rc > 0);
    rc = version_compare(0, 9, 1, 0);
    assert(rc < 0);
    rc = version_compare(1, 0, 1, 9);
    assert(rc < 0);
    rc = version_compare(1, 9, 1, 0);
    assert(rc > 0);
    rc = version_compare(2, 0, 1, 9);
    assert(rc > 0);
    rc = version_compare(1, 9, 2, 0);
    assert(rc < 0);
}

static void
dix_update_desktop_dimensions(void)
{
    int i;
    int x, y, w, h;
    int w2, h2;
    ScreenRec screens[MAXSCREENS];

    for (i = 0; i < MAXSCREENS; i++)
        screenInfo.screens[i] = &screens[i];

    x = 0;
    y = 0;
    w = 10;
    h = 5;
    w2 = 35;
    h2 = 25;

#define assert_dimensions(_x, _y, _w, _h) \
    update_desktop_dimensions();          \
    assert(screenInfo.x == _x);           \
    assert(screenInfo.y == _y);           \
    assert(screenInfo.width == _w);       \
    assert(screenInfo.height == _h);

#define set_screen(idx, _x, _y, _w, _h)   \
    screenInfo.screens[idx]->x = _x;      \
    screenInfo.screens[idx]->y = _y;      \
    screenInfo.screens[idx]->width = _w;  \
    screenInfo.screens[idx]->height = _h; \

    /* single screen */
    screenInfo.numScreens = 1;
    set_screen(0, x, y, w, h);
    assert_dimensions(x, y, w, h);

    /* dualhead rightof */
    screenInfo.numScreens = 2;
    set_screen(1, w, 0, w2, h2);
    assert_dimensions(x, y, w + w2, h2);

    /* dualhead belowof */
    screenInfo.numScreens = 2;
    set_screen(1, 0, h, w2, h2);
    assert_dimensions(x, y, w2, h + h2);

    /* triplehead L shape */
    screenInfo.numScreens = 3;
    set_screen(1, 0, h, w2, h2);
    set_screen(2, w2, h2, w, h);
    assert_dimensions(x, y, w + w2, h + h2);

    /* quadhead 2x2 */
    screenInfo.numScreens = 4;
    set_screen(1, 0, h, w, h);
    set_screen(2, w, h, w, h2);
    set_screen(3, w, 0, w2, h);
    assert_dimensions(x, y, w + w2, h + h2);

    /* quadhead horiz line */
    screenInfo.numScreens = 4;
    set_screen(1, w, 0, w, h);
    set_screen(2, 2 * w, 0, w, h);
    set_screen(3, 3 * w, 0, w, h);
    assert_dimensions(x, y, 4 * w, h);

    /* quadhead vert line */
    screenInfo.numScreens = 4;
    set_screen(1, 0, h, w, h);
    set_screen(2, 0, 2 * h, w, h);
    set_screen(3, 0, 3 * h, w, h);
    assert_dimensions(x, y, w, 4 * h);

    /* x overlap */
    screenInfo.numScreens = 2;
    set_screen(0, 0, 0, w2, h2);
    set_screen(1, w, 0, w2, h2);
    assert_dimensions(x, y, w2 + w, h2);

    /* y overlap */
    screenInfo.numScreens = 2;
    set_screen(0, 0, 0, w2, h2);
    set_screen(1, 0, h, w2, h2);
    assert_dimensions(x, y, w2, h2 + h);

    /* negative origin */
    screenInfo.numScreens = 1;
    set_screen(0, -w2, -h2, w, h);
    assert_dimensions(-w2, -h2, w, h);

    /* dualhead negative origin, overlap */
    screenInfo.numScreens = 2;
    set_screen(0, -w2, -h2, w2, h2);
    set_screen(1, -w, -h, w, h);
    assert_dimensions(-w2, -h2, w2, h2);
}

int
main(int argc, char **argv)
{
    dix_version_compare();
    dix_update_desktop_dimensions();

    return 0;
}
