/*
 * PROJECT:         ReactOS api tests
 * LICENSE:         GPL - See COPYING in the top level directory
 * PURPOSE:         Test for SetMapMode
 * PROGRAMMERS:     Timo Kreuzer
 *                  Katayama Hirofumi MZ
 */

#include "precomp.h"

void Test_SetMapMode()
{
    HDC hDC;
    SIZE WindowExt, ViewportExt;
    ULONG ulMapMode;
    POINT pt;

    hDC = CreateCompatibleDC(NULL);
    ok(hDC != 0, "CreateCompatibleDC failed, skipping tests.\n");
    if (!hDC) return;

    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);

    ulMapMode = SetMapMode(hDC, MM_ISOTROPIC);
    ok_long(ulMapMode, MM_TEXT);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);

    SetLastError(0);
    ulMapMode = SetMapMode(hDC, 0);
    ok_err(0);
    ok_long(ulMapMode, 0);

    /* Go through all valid values */
    ulMapMode = SetMapMode(hDC, 1);
    ok_long(ulMapMode, MM_ISOTROPIC);
    ulMapMode = SetMapMode(hDC, 2);
    ok_long(ulMapMode, 1);
    ulMapMode = SetMapMode(hDC, 3);
    ok_long(ulMapMode, 2);
    ulMapMode = SetMapMode(hDC, 4);
    ok_long(ulMapMode, 3);
    ulMapMode = SetMapMode(hDC, 5);
    ok_long(ulMapMode, 4);
    ulMapMode = SetMapMode(hDC, 6);
    ok_long(ulMapMode, 5);
    ulMapMode = SetMapMode(hDC, 7);
    ok_long(ulMapMode, 6);
    ulMapMode = SetMapMode(hDC, 8);
    ok_long(ulMapMode, 7);

    /* Test invalid value */
    ulMapMode = SetMapMode(hDC, 9);
    ok_long(ulMapMode, 0);
    ulMapMode = SetMapMode(hDC, 10);
    ok_long(ulMapMode, 0);

    ok_err(0);

    /* Test NULL DC */
    ulMapMode = SetMapMode((HDC)0, 2);
    ok_long(ulMapMode, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    /* Test NULL DC and invalid mode */
    ulMapMode = SetMapMode((HDC)0, 10);
    ok_long(ulMapMode, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    /* Test invalid DC */
    ulMapMode = SetMapMode((HDC)0x12345, 2);
    ok_long(ulMapMode, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    /* Test invalid DC and invalid mode */
    ulMapMode = SetMapMode((HDC)0x12345, 10);
    ok_long(ulMapMode, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    DeleteDC(hDC);

    /* Test a deleted DC */
    ulMapMode = SetMapMode(hDC, 2);
    ok_long(ulMapMode, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    /* Test MM_TEXT */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_TEXT);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);
    DeleteDC(hDC);

    /* Test MM_ISOTROPIC */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_ISOTROPIC);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 3600);
    //ok_long(WindowExt.cy, 2700);
    //ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES) - 4);
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_ANISOTROPIC */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_ANISOTROPIC);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);

    /* set MM_ISOTROPIC first, the values will be kept */
    SetMapMode(hDC, MM_ISOTROPIC);
    SetMapMode(hDC, MM_ANISOTROPIC);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 3600);
    //ok_long(WindowExt.cy, 2700);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_LOMETRIC */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_LOMETRIC);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 3600);
    //ok_long(WindowExt.cy, 2700);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_HIMETRIC */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_HIMETRIC);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 36000);
    //ok_long(WindowExt.cy, 27000);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_LOENGLISH */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_LOENGLISH);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 1417);
    //ok_long(WindowExt.cy, 1063);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_HIENGLISH */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_HIENGLISH);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 14173);
    //ok_long(WindowExt.cy, 10630);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    /* Test MM_TWIPS */
    hDC = CreateCompatibleDC(NULL);
    SetMapMode(hDC, MM_TWIPS);
    GetWindowExtEx(hDC, &WindowExt);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(WindowExt.cx, 20409);
    //ok_long(WindowExt.cy, 15307);
    ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES));
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    DeleteDC(hDC);

    //
    // Test mode and extents
    //
    hDC = CreateCompatibleDC(NULL);
    GetViewportExtEx(hDC, &ViewportExt);
    GetWindowExtEx(hDC, &WindowExt);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);

    SetMapMode(hDC, MM_ANISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    GetWindowExtEx(hDC, &WindowExt);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);
    SetWindowExtEx(hDC, 200, 200, NULL);
    SetViewportExtEx(hDC, 100, 100, NULL);

    SetMapMode(hDC, MM_ANISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    GetWindowExtEx(hDC, &WindowExt);
    ok_long(ViewportExt.cx, 100);
    ok_long(ViewportExt.cy, 100);
    ok_long(WindowExt.cx, 200);
    ok_long(WindowExt.cy, 200);

    SetMapMode(hDC, MM_ANISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(ViewportExt.cx, 100);
    ok_long(ViewportExt.cy, 100);
    ok_long(WindowExt.cx, 200);
    ok_long(WindowExt.cy, 200);

    SetMapMode(hDC, MM_ISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES) - 4);
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));
    SetWindowExtEx(hDC, 100, 100, NULL);
    SetViewportExtEx(hDC, 100, 100, NULL);

    SetMapMode(hDC, MM_ISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(ViewportExt.cx, 100);
    ok_long(ViewportExt.cy, 100);

    SetMapMode(hDC, MM_ANISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(ViewportExt.cx, 100);
    ok_long(ViewportExt.cy, 100);

    SetMapMode(hDC, MM_TEXT);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);

    SetMapMode(hDC, MM_ANISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);

    SetMapMode(hDC, MM_ISOTROPIC);
    GetViewportExtEx(hDC, &ViewportExt);
    //ok_long(ViewportExt.cx, GetDeviceCaps(GetDC(0), HORZRES) - 4);
    ok_long(ViewportExt.cy, -GetDeviceCaps(GetDC(0), VERTRES));

    SetMapMode(hDC, MM_TEXT);
    GetViewportExtEx(hDC, &ViewportExt);
    GetWindowExtEx(hDC, &WindowExt);
    ok_long(ViewportExt.cx, 1);
    ok_long(ViewportExt.cy, 1);
    ok_long(WindowExt.cx, 1);
    ok_long(WindowExt.cy, 1);
    DeleteDC(hDC);

    //
    // Test mode and GetCurrentPositionEx
    //
    hDC = CreateCompatibleDC(NULL);
    MoveToEx(hDC, 100, 100, NULL);
    SetMapMode(hDC, MM_ANISOTROPIC);
    GetCurrentPositionEx(hDC, &pt);
    ok_long(pt.x, 100);
    ok_long(pt.y, 100);
    SetMapMode(hDC, MM_TEXT);
    GetCurrentPositionEx(hDC, &pt);
    ok_long(pt.x, 100);
    ok_long(pt.y, 100);
    SetMapMode(hDC, MM_ISOTROPIC);
    GetCurrentPositionEx(hDC, &pt);
    ok_long(pt.x, 100);
    ok_long(pt.y, 100);
    DeleteDC(hDC);
}

START_TEST(SetMapMode)
{
    Test_SetMapMode();
}