[GDI32_APITEST] Add tests for GetFontResourceInfoW. Patch by Katayama Hirofumi MZ...
authorMark Jansen <mark.jansen@reactos.org>
Sat, 18 Feb 2017 11:25:31 +0000 (11:25 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Sat, 18 Feb 2017 11:25:31 +0000 (11:25 +0000)
svn path=/trunk/; revision=73825

rostests/apitests/gdi32/CMakeLists.txt
rostests/apitests/gdi32/GetFontResourceInfoW.c [new file with mode: 0644]
rostests/apitests/gdi32/testlist.c

index 8e27164..7c593eb 100644 (file)
@@ -44,6 +44,7 @@ list(APPEND SOURCE
     GetCurrentObject.c
     GetDIBColorTable.c
     GetDIBits.c
     GetCurrentObject.c
     GetDIBColorTable.c
     GetDIBits.c
+    GetFontResourceInfoW.c
     GetGlyphIndices.c
     GetObject.c
     GetRandomRgn.c
     GetGlyphIndices.c
     GetObject.c
     GetRandomRgn.c
diff --git a/rostests/apitests/gdi32/GetFontResourceInfoW.c b/rostests/apitests/gdi32/GetFontResourceInfoW.c
new file mode 100644 (file)
index 0000000..7b185a3
--- /dev/null
@@ -0,0 +1,433 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for GetFontResourceInfoW
+ * PROGRAMMERS:     Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
+ */
+#include <apitest.h>
+#include <wingdi.h>
+#include <winnls.h>
+#include <stdio.h>
+
+/* GetFontResourceInfoW is undocumented */
+BOOL WINAPI GetFontResourceInfoW(LPCWSTR lpFileName, DWORD *pdwBufSize, void* lpBuffer, DWORD dwType);
+
+/* structure of test entry */
+typedef struct GFRI_ENTRY
+{
+    LPCWSTR     File;
+    WCHAR       FontInfo[64];
+    INT         FontCount;
+    WCHAR       FaceNames[10][64];
+} GFRI_ENTRY;
+
+/* test entries */
+static const GFRI_ENTRY TestEntries[] =
+{
+    { L"symbol.ttf", L"Symbol|", 1, { L"Symbol" } },
+    { L"tahoma.ttf", L"Tahoma|", 1, { L"Tahoma" } },
+    { L"tahomabd.ttf", L"Tahoma Bold|", 1, { L"Tahoma" } }
+};
+
+/* Japanese */
+static const GFRI_ENTRY AdditionalTestEntriesJapanese[] =
+{
+    {
+        /* MS Gothic & MS UI Gothic & MS PGothic */
+        L"msgothic.ttc",
+        {
+            0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0x0020,
+            0x0026, 0x0020, 0x004D, 0x0053, 0x0020, 0x0055, 0x0049, 0x0020,
+            0x0047, 0x006F, 0x0074, 0x0068, 0x0069, 0x0063, 0x0020, 0x0026,
+            0x0020, 0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3,
+            0x30AF, L'|', 0
+        },
+        6,
+        {
+            { 0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 },
+            { L'@', 0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 },
+            L"MS UI Gothic",
+            L"@MS UI Gothic",
+            { 0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 },
+            { L'@', 0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }
+        }
+    }
+};
+
+/* English */
+static const GFRI_ENTRY AdditionalTestEntriesEnglish[] =
+{
+    {
+        /* MS Gothic & MS UI Gothic & MS PGothic */
+        L"msgothic.ttc",
+        L"MS Gothic & MS UI Gothic & MS PGothic|",
+        6,
+        {
+            L"MS Gothic",
+            L"@MS Gothic",
+            L"MS UI Gothic",
+            L"@MS UI Gothic",
+            L"MS PGothic",
+            L"@MS PGothic"
+        }
+    }
+};
+
+static void
+GetSystemFontDirectory(LPWSTR pszDir)
+{
+    GetWindowsDirectoryW(pszDir, MAX_PATH);
+    lstrcatW(pszDir, L"\\Fonts");
+}
+
+static void
+GetSystemFontPath(LPWSTR pszPath, LPCWSTR pszFile)
+{
+    GetSystemFontDirectory(pszPath);
+    lstrcatW(pszPath, L"\\");
+    lstrcatW(pszPath, pszFile);
+}
+
+static INT
+GetMultiSzLength(const WCHAR *pszz)
+{
+    INT Len, TotalLen = 0;
+    for (;;)
+    {
+        Len = lstrlenW(pszz);
+        TotalLen += Len + 1;
+        pszz += Len + 1;
+        if (*pszz == 0)
+            break;
+    }
+    ++TotalLen;
+    return TotalLen;
+}
+
+static void
+ReplaceChars(WCHAR *pch, INT Len, WCHAR From, WCHAR To)
+{
+    while (Len > 0)
+    {
+        if (*pch == From)
+        {
+            *pch = To;
+        }
+        //printf("0x%04X, ", *pch);
+        ++pch;
+        --Len;
+    }
+}
+
+static void
+SzFromMultiSz(WCHAR *pszz)
+{
+    INT Length = GetMultiSzLength(pszz);
+    //printf("Length: %d\n", Length);
+    if (Length > 0)
+    {
+        ReplaceChars(pszz, Length - 1, L'\0', L'|');
+        pszz[Length - 1] = 0;
+    }
+    else
+    {
+        pszz[0] = 0;
+    }
+    //printf("pszz: %S\n", pszz);
+}
+
+static void
+Test_GetFontResourceInfoW_case0(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD Size, Case = 0;
+    DWORD Data;
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+
+    /* data NULL, size non-zero */
+    Size = 1024;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, 1024);
+
+    /* size zero */
+    Data = 0xDEADFACE;
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, &Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Data, 0xDEADFACE);
+    ok_int(Size, 4);
+
+    /* size non-zero */
+    Data = 0xDEADFACE;
+    Size = sizeof(Data);
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, &Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Data, Entry->FontCount);
+    ok_int(Size, 4);
+}
+
+static void
+Test_GetFontResourceInfoW_case1(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD Size, Case = 1;
+    static WCHAR Data[1024 / sizeof(WCHAR)];
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    /* FIXME: What's the result of Size? */
+    ok(Size != 0, "Size expected non-zero but zero\n");
+
+    /* data NULL, size non-zero */
+    Size = 1024;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, 1024);
+
+    /* size zero */
+    Size = 0;
+    CopyMemory(Data, L"ABC\0", sizeof(L"ABC\0"));
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    /* FIXME: What's the result of Size? */
+    ok(Size != 0, "Size expected non-zero but zero\n");
+    ok(lstrcmpiW(Data, L"ABC") == 0, "data mismatched: \"%S\"\n", Data);
+
+    /* size non-zero */
+    Size = 1024;
+    CopyMemory(Data, L"ABC\0", sizeof(L"ABC\0"));
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    /* FIXME: What's the result of Size? */
+    ok(Size != 0, "Size expected non-zero but zero\n");
+
+    SzFromMultiSz(Data);
+    ok(lstrcmpiW(Data, Entry->FontInfo) == 0, "data mismatched: \"%S\" and \"%S\"\n",
+       Data, Entry->FontInfo);
+#if 0
+    if (lstrcmpiW(Data, Entry->FontInfo) != 0)
+    {
+        int i, len = lstrlenW(Data) + 1;
+        for (i = 0; i < len; ++i)
+        {
+            printf("0x%04X <=> 0x%04X\n", Data[i], Entry->FontInfo[i]);
+        }
+    }
+#endif
+}
+
+static void
+Test_GetFontResourceInfoW_case2(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD i, Size, Case = 2;
+    static LOGFONTW Data[100];
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, Entry->FontCount * sizeof(LOGFONTW));
+
+    /* data NULL, size non-zero */
+    Size = 1024;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, 1024);
+
+    /* size zero */
+    Size = 0;
+    ZeroMemory(Data, sizeof(Data));
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, Entry->FontCount * sizeof(LOGFONTW));
+
+    /* size non-zero */
+    Size = sizeof(Data);
+    ZeroMemory(Data, sizeof(Data));
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, Entry->FontCount * sizeof(LOGFONTW));
+    for (i = 0; i < Entry->FontCount; ++i)
+    {
+        ok(lstrcmpiW(Data[i].lfFaceName, Entry->FaceNames[i]) == 0,
+            "face name #%d mismatched: \"%S\" and \"%S\"\n", (int)i, Data[i].lfFaceName, Entry->FaceNames[i]);
+#if 0
+        if (lstrcmpiW(Data[i].lfFaceName, Entry->FaceNames[i]) != 0)
+        {
+            int k, len = lstrlenW(Data[i].lfFaceName);
+            for (k = 0; k < len; ++k)
+            {
+                printf("0x%04X <=> 0x%04X\n", Entry->FaceNames[i][k], Data[i].lfFaceName[k]);
+            }
+        }
+#endif
+    }
+}
+
+static void
+Test_GetFontResourceInfoW_case3(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD Size, Case = 3;
+    DWORD Data[2];
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+
+    /* data NULL, size non-zero */
+    Size = sizeof(Data);
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, 8);
+
+    /* size zero */
+    Size = 0;
+    Data[0] = 0xDEADFACE;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+    ok_int(Data[0], 0xDEADFACE);
+
+    /* size non-zero */
+    Size = sizeof(Data);
+    Data[0] = 0xDEADFACE;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+    ok_int(Data[0], 1);
+}
+
+static void
+Test_GetFontResourceInfoW_case4(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD Size, Case = 4;
+    WCHAR Data[MAX_PATH];
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, (lstrlenW(pszFilePath) + 1) * sizeof(WCHAR));
+
+    /* data NULL, size non-zero */
+    Size = MAX_PATH;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, MAX_PATH);
+
+    /* size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, (lstrlenW(pszFilePath) + 1) * sizeof(WCHAR));
+
+    /* size non-zero */
+    Size = MAX_PATH;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, (lstrlenW(pszFilePath) + 1) * sizeof(WCHAR));
+    ok(lstrcmpiW(pszFilePath, Data) == 0, "data mismatched: \"%S\"\n", Data);
+}
+
+static void
+Test_GetFontResourceInfoW_case5(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry)
+{
+    BOOL Ret;
+    DWORD Size, Case = 5;
+    DWORD Data;
+
+    /* data NULL, size zero */
+    Size = 0;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+
+    /* data NULL, size non-zero */
+    Size = sizeof(Data);
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, NULL, Case);
+    ok_int(Ret, 0);
+    ok_int(Size, 4);
+
+    /* size zero */
+    Size = 0;
+    Data = 0xDEADFACE;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, &Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+    ok_int(Data, 0xDEADFACE);
+
+    /* size non-zero */
+    Size = sizeof(Data);
+    Data = 0xDEADFACE;
+    Ret = GetFontResourceInfoW(pszFilePath, &Size, &Data, Case);
+    ok_int(Ret, 1);
+    ok_int(Size, 4);
+    ok_int(Data, 0);
+}
+
+static void
+DoEntry(const GFRI_ENTRY *Entry)
+{
+    WCHAR szPath[MAX_PATH];
+
+    GetSystemFontPath(szPath, Entry->File);
+    printf("GetSystemFontPath: %S\n", szPath);
+    if (GetFileAttributesW(szPath) == 0xFFFFFFFF)
+    {
+        skip("Font file \"%S\" was not found\n", szPath);
+        return;
+    }
+
+    Test_GetFontResourceInfoW_case0(szPath, Entry);
+    Test_GetFontResourceInfoW_case1(szPath, Entry);
+    Test_GetFontResourceInfoW_case2(szPath, Entry);
+    Test_GetFontResourceInfoW_case3(szPath, Entry);
+    Test_GetFontResourceInfoW_case4(szPath, Entry);
+    Test_GetFontResourceInfoW_case5(szPath, Entry);
+}
+
+START_TEST(GetFontResourceInfoW)
+{
+    INT i;
+    const GFRI_ENTRY *Entry;
+
+    printf("sizeof(LOGFONTW) == %u\n", (int)sizeof(LOGFONTW));
+
+    for (i = 0; i < _countof(TestEntries); ++i)
+    {
+        Entry = &TestEntries[i];
+        DoEntry(Entry);
+    }
+
+    if (PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_JAPANESE)
+    {
+        /* Japanese */
+        for (i = 0; i < _countof(AdditionalTestEntriesJapanese); ++i)
+        {
+            Entry = &AdditionalTestEntriesJapanese[i];
+            DoEntry(Entry);
+        }
+    }
+    else
+    {
+        /* non-Japanese */
+        for (i = 0; i < _countof(AdditionalTestEntriesEnglish); ++i)
+        {
+            Entry = &AdditionalTestEntriesEnglish[i];
+            DoEntry(Entry);
+        }
+    }
+}
index f721136..48204c0 100644 (file)
@@ -45,9 +45,10 @@ extern void func_GetClipRgn(void);
 extern void func_GetCurrentObject(void);
 extern void func_GetDIBColorTable(void);
 extern void func_GetDIBits(void);
 extern void func_GetCurrentObject(void);
 extern void func_GetDIBColorTable(void);
 extern void func_GetDIBits(void);
+extern void func_GetFontResourceInfoW(void);
 extern void func_GetGlyphIndices(void);
 extern void func_GetGlyphIndices(void);
-extern void func_GetPixel(void);
 extern void func_GetObject(void);
 extern void func_GetObject(void);
+extern void func_GetPixel(void);
 extern void func_GetRandomRgn(void);
 extern void func_GetStockObject(void);
 extern void func_GetTextExtentExPoint(void);
 extern void func_GetRandomRgn(void);
 extern void func_GetStockObject(void);
 extern void func_GetTextExtentExPoint(void);
@@ -116,6 +117,7 @@ const struct test winetest_testlist[] =
     { "GetCurrentObject", func_GetCurrentObject },
     { "GetDIBColorTable", func_GetDIBColorTable },
     { "GetDIBits", func_GetDIBits },
     { "GetCurrentObject", func_GetCurrentObject },
     { "GetDIBColorTable", func_GetDIBColorTable },
     { "GetDIBits", func_GetDIBits },
+    { "GetFontResourceInfoW", func_GetFontResourceInfoW },
     { "GetGlyphIndices", func_GetGlyphIndices },
     { "GetPixel", func_GetPixel },
     { "GetObject", func_GetObject },
     { "GetGlyphIndices", func_GetGlyphIndices },
     { "GetPixel", func_GetPixel },
     { "GetObject", func_GetObject },