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

#include "precomp.h"

/* Exported by gdi32.dll but undocumented */
INT
WINAPI
GetTextFaceAliasW(
    IN HDC hdc,
    IN INT c,
    OUT LPWSTR lpAliasName);

void Test_GetTextFace(void)
{
    HDC hDC;
    INT ret;
    INT ret2;
    WCHAR Buffer[20];

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

    /* Whether asking for the string size (NULL buffer) ignores the size argument */
    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 0, NULL);
    TEST(ret != 0);
    ok_err(0xE000BEEF);
    ret2 = ret;

    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, -1, NULL);
    TEST(ret != 0);
    ok_int(ret, ret2);
    ok_err(0xE000BEEF);
    ret2 = ret;

    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 10000, NULL);
    TEST(ret != 0);
    ok_int(ret, ret2);
    ok_err(0xE000BEEF);
    ret2 = ret;

    /* Whether the buffer is correctly filled */
    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 20, Buffer);
    TEST(ret != 0);
    TEST(ret <= 20);
    ok_int(Buffer[ret - 1], 0);
    ok_err(0xE000BEEF);

    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 1, Buffer);
    ok_int(ret, 1);
    ok_int(Buffer[ret - 1], 0);
    ok_err(0xE000BEEF);

    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 2, Buffer);
    ok_int(ret, 2);
    ok_int(Buffer[ret - 1], 0);
    ok_err(0xE000BEEF);

    /* Whether invalid buffer sizes are correctly ignored */
    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, 0, Buffer);
    ok_int(ret, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    SetLastError(0xE000BEEF);
    ret = GetTextFaceW(hDC, -1, Buffer);
    ok_int(ret, 0);
    ok_err(ERROR_INVALID_PARAMETER);

    DeleteDC(hDC);
}

void Test_GetTextFaceAliasW(void)
{
    HDC hDC;
    INT ret;
    INT ret2;
    UINT i;
    LOGFONTW lf;
    HFONT hFontOld, hFont;
    WCHAR buf1[LF_FACESIZE];
    WCHAR buf2[LF_FACESIZE];

    static struct
    {
        LPCWSTR lpFaceName;
        LPCWSTR lpExpectedFaceName;
        LPCWSTR lpExpectedAlias;
    } FaceTests[] =
    {
        {L"Arial", L"Arial", L"Arial"},
        {L"Tahoma", L"Tahoma", L"Tahoma"},
//        {L"Tahoma Bold", L"MS Sans Serif", L"MS Sans Serif"}, // That's what Windows 2003 and 7/10 returns. But not WHS testbot.
        {L"Helv", L"Helv", L"Helv"},
        {L"Tms Rmn", L"Tms Rmn", L"Tms Rmn"},
        {L"Times", L"Times", L"Times"},
        {L"invalid", L"MS Sans Serif", L"MS Sans Serif"}
    };

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

    for (i = 0; i < ARRAYSIZE(FaceTests); ++i)
    {
        ZeroMemory(&lf, sizeof(lf));
        StringCchCopyW(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), FaceTests[i].lpFaceName);

        hFont = CreateFontIndirectW(&lf);
        if (!hFont)
        {
            trace("Failed to create font '%S'!\n", lf.lfFaceName);
            continue;
        }

        hFontOld = SelectObject(hDC, hFont);

        ret = GetTextFaceW(hDC, ARRAYSIZE(buf1), buf1);
        ok(ret != 0, "%S GetTextFaceW failed.\n", FaceTests[i].lpFaceName);
        ok(wcscmp(buf1, FaceTests[i].lpExpectedFaceName) == 0, "'%S' GetTextFaceW failed, got '%S', expected '%S'.\n",
            FaceTests[i].lpFaceName, buf1, FaceTests[i].lpExpectedFaceName);

        ret2 = GetTextFaceAliasW(hDC, ARRAYSIZE(buf2), buf2);
        ok(ret2 != 0, "%S GetTextFaceAliasW failed.\n", FaceTests[i].lpFaceName);
        ok(wcscmp(buf2, FaceTests[i].lpExpectedAlias) == 0, "'%S' GetTextFaceAliasW failed, got '%S', expected '%S'.\n",
            FaceTests[i].lpFaceName, buf2, FaceTests[i].lpExpectedAlias);

        SelectObject(hDC, hFontOld);
        DeleteObject(hFont);
    }

    DeleteDC(hDC);
}

START_TEST(GetTextFace)
{
    Test_GetTextFace();
    Test_GetTextFaceAliasW();
}