Alexandre Julliard : kernel32/tests: Add tests for NtGetNlsSectionPtr() and RtlInitCodePageTable().

Alexandre Julliard julliard at winehq.org
Tue Nov 26 16:21:24 CST 2019


Module: wine
Branch: master
Commit: 4901386892449c0831194fe3aed1d6a572f04405
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4901386892449c0831194fe3aed1d6a572f04405

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 26 17:56:04 2019 +0100

kernel32/tests: Add tests for NtGetNlsSectionPtr() and RtlInitCodePageTable().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/locale.c | 116 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 115 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 0e2c3496a9..5ae7bd492b 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -87,6 +87,8 @@ static INT (WINAPI *pNormalizeString)(NORM_FORM, LPCWSTR, INT, LPWSTR, INT);
 static INT (WINAPI *pFindStringOrdinal)(DWORD, LPCWSTR lpStringSource, INT, LPCWSTR, INT, BOOL);
 static NTSTATUS (WINAPI *pRtlNormalizeString)(ULONG, LPCWSTR, INT, LPWSTR, INT*);
 static NTSTATUS (WINAPI *pRtlIsNormalizedString)(ULONG, LPCWSTR, INT, BOOLEAN*);
+static NTSTATUS (WINAPI *pNtGetNlsSectionPtr)(ULONG,ULONG,void*,void**,SIZE_T*);
+static void (WINAPI *pRtlInitCodePageTable)(USHORT*,CPTABLEINFO*);
 
 static void InitFunctionPointers(void)
 {
@@ -130,6 +132,8 @@ static void InitFunctionPointers(void)
   X(RtlLocaleNameToLcid);
   X(RtlNormalizeString);
   X(RtlIsNormalizedString);
+  X(NtGetNlsSectionPtr);
+  X(RtlInitCodePageTable);
 #undef X
 }
 
@@ -1572,7 +1576,7 @@ static void test_GetNumberFormatA(void)
   if (IsValidLocale(lcid, 0))
   {
     STRINGSA("-12345","-12 345,00"); /* Try French formatting */
-    Expected[3] = 160; /* Non breaking space */
+    Expected[3] = (char)160; /* Non breaking space */
     ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, ARRAY_SIZE(buffer));
     ok(ret, "Expected ret != 0, got %d, error %d\n", ret, GetLastError());
     EXPECT_LENA; EXPECT_EQA;
@@ -4092,6 +4096,7 @@ static void test_EnumTimeFormatsW(void)
             GetLastError());
     }
 }
+
 static void test_GetCPInfo(void)
 {
     BOOL ret;
@@ -4135,6 +4140,115 @@ static void test_GetCPInfo(void)
         ok(cpinfo.MaxCharSize == 4 || broken(cpinfo.MaxCharSize == 3) /* win9x */,
            "expected 4, got %u\n", cpinfo.MaxCharSize);
     }
+
+    if (pNtGetNlsSectionPtr)
+    {
+        CPTABLEINFO table;
+        NTSTATUS status;
+        void *ptr, *ptr2;
+        SIZE_T size;
+        int i;
+
+        for (i = 0; i < 100; i++)
+        {
+            ptr = NULL;
+            size = 0;
+            status = pNtGetNlsSectionPtr( i, 9999, NULL, &ptr, &size );
+            switch (i)
+            {
+            case 9:  /* unknown */
+            case 13: /* unknown */
+                ok( status == STATUS_INVALID_PARAMETER_1 || status == STATUS_INVALID_PARAMETER_3, /* vista */
+                    "%u: failed %x\n", i, status );
+                break;
+            case 10:  /* casemap */
+                ok( status == STATUS_INVALID_PARAMETER_1 || status == STATUS_UNSUCCESSFUL,
+                    "%u: failed %x\n", i, status );
+                break;
+            case 11:  /* codepage */
+            case 12:  /* normalization */
+                ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "%u: failed %x\n", i, status );
+                break;
+            default:
+                ok( status == STATUS_INVALID_PARAMETER_1, "%u: failed %x\n", i, status );
+                break;
+            }
+        }
+
+        /* casemap table */
+
+        status = pNtGetNlsSectionPtr( 10, 0, NULL, &ptr, &size );
+        if (status != STATUS_INVALID_PARAMETER_1)
+        {
+            ok( !status, "failed %x\n", status );
+            ok( size > 0x1000 && size <= 0x8000 , "wrong size %lx\n", size );
+            status = pNtGetNlsSectionPtr( 10, 0, NULL, &ptr2, &size );
+            ok( ptr != ptr2, "got same pointer\n" );
+            ret = UnmapViewOfFile( ptr );
+            todo_wine ok( ret, "UnmapViewOfFile failed err %u\n", GetLastError() );
+            ret = UnmapViewOfFile( ptr2 );
+            todo_wine ok( ret, "UnmapViewOfFile failed err %u\n", GetLastError() );
+        }
+
+        /* codepage tables */
+
+        ptr = (void *)0xdeadbeef;
+        size = 0xdeadbeef;
+        status = pNtGetNlsSectionPtr( 11, 437, NULL, &ptr, &size );
+        ok( !status, "failed %x\n", status );
+        ok( size > 0x10000 && size <= 0x20000, "wrong size %lx\n", size );
+        memset( &table, 0xcc, sizeof(table) );
+        if (pRtlInitCodePageTable)
+        {
+            pRtlInitCodePageTable( ptr, &table );
+            ok( table.CodePage == 437, "wrong codepage %u\n", table.CodePage );
+            ok( table.MaximumCharacterSize == 1, "wrong char size %u\n", table.MaximumCharacterSize );
+            ok( table.DefaultChar == '?', "wrong default char %x\n", table.DefaultChar );
+            ok( !table.DBCSCodePage, "wrong dbcs %u\n", table.DBCSCodePage );
+        }
+        ret = UnmapViewOfFile( ptr );
+        todo_wine ok( ret, "UnmapViewOfFile failed err %u\n", GetLastError() );
+
+        status = pNtGetNlsSectionPtr( 11, 932, NULL, &ptr, &size );
+        ok( !status, "failed %x\n", status );
+        ok( size > 0x20000 && size <= 0x30000, "wrong size %lx\n", size );
+        memset( &table, 0xcc, sizeof(table) );
+        if (pRtlInitCodePageTable)
+        {
+            pRtlInitCodePageTable( ptr, &table );
+            ok( table.CodePage == 932, "wrong codepage %u\n", table.CodePage );
+            ok( table.MaximumCharacterSize == 2, "wrong char size %u\n", table.MaximumCharacterSize );
+            ok( table.DefaultChar == '?', "wrong default char %x\n", table.DefaultChar );
+            ok( table.DBCSCodePage == TRUE, "wrong dbcs %u\n", table.DBCSCodePage );
+        }
+        ret = UnmapViewOfFile( ptr );
+        todo_wine ok( ret, "UnmapViewOfFile failed err %u\n", GetLastError() );
+
+        /* normalization tables */
+
+        for (i = 0; i < 100; i++)
+        {
+            status = pNtGetNlsSectionPtr( 12, i, NULL, &ptr, &size );
+            switch (i)
+            {
+            case NormalizationC:
+            case NormalizationD:
+            case NormalizationKC:
+            case NormalizationKD:
+            case 13:  /* IDN */
+                todo_wine ok( !status, "%u: failed %x\n", i, status );
+                if (status) break;
+                ok( size > 0x8000 && size <= 0x30000 , "wrong size %lx\n", size );
+                ret = UnmapViewOfFile( ptr );
+                ok( ret, "UnmapViewOfFile failed err %u\n", GetLastError() );
+                break;
+            default:
+                ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "%u: failed %x\n", i, status );
+                break;
+            }
+        }
+    }
+    else win_skip( "NtGetNlsSectionPtr not supported\n" );
 }
 
 /*




More information about the wine-cvs mailing list