Detlef Riekenberg : shell32/tests: Add tests for DoEnvironmentSubstA/W.

Alexandre Julliard julliard at winehq.org
Wed Dec 5 13:43:10 CST 2012


Module: wine
Branch: master
Commit: fc3868a07f18063ee2397aea7fbbd4af9e0e04c8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fc3868a07f18063ee2397aea7fbbd4af9e0e04c8

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Tue Dec  4 11:38:02 2012 +0100

shell32/tests: Add tests for DoEnvironmentSubstA/W.

---

 dlls/shell32/tests/shellpath.c |  152 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 152 insertions(+), 0 deletions(-)

diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c
index 1798ada..729a341 100644
--- a/dlls/shell32/tests/shellpath.c
+++ b/dlls/shell32/tests/shellpath.c
@@ -2495,6 +2495,157 @@ static void test_knownFolders(void)
     CoUninitialize();
 }
 
+
+static void test_DoEnvironmentSubst(void)
+{
+    WCHAR expectedW[MAX_PATH];
+    WCHAR bufferW[MAX_PATH];
+    CHAR  expectedA[MAX_PATH];
+    CHAR  bufferA[MAX_PATH];
+    DWORD res;
+    DWORD res2;
+    DWORD len;
+    INT   i;
+    static const WCHAR does_not_existW[] = {'%','D','O','E','S','_','N','O','T','_','E','X','I','S','T','%',0};
+    static const CHAR  does_not_existA[] = "%DOES_NOT_EXIST%";
+    static const CHAR  *names[] = {
+                            /* interactive apps and services (works on all windows versions) */
+                            "%ALLUSERSPROFILE%", "%APPDATA%", "%LOCALAPPDATA%",
+                            "%NUMBER_OF_PROCESSORS%", "%OS%", "%PROCESSOR_ARCHITECTURE%",
+                            "%PROCESSOR_IDENTIFIER%", "%PROCESSOR_LEVEL%", "%PROCESSOR_REVISION%",
+                            "%ProgramFiles%", "%SystemDrive%",
+                            "%SystemRoot%", "%USERPROFILE%", "%windir%",
+                            /* todo_wine: "%COMPUTERNAME%", "%ProgramData%", "%PUBLIC%", */
+
+                            /* replace more than one var is allowed */
+                            "%HOMEDRIVE%%HOMEPATH%",
+                            "%OS% %windir%"}; /* always the last entry in the table */
+
+    for (i = 0; i < (sizeof(names)/sizeof(LPSTR)); i++)
+    {
+        memset(bufferA, '#', MAX_PATH - 1);
+        bufferA[MAX_PATH - 1] = 0;
+        lstrcpyA(bufferA, names[i]);
+        MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+
+        res2 = ExpandEnvironmentStringsA(names[i], expectedA, MAX_PATH);
+        res = DoEnvironmentSubstA(bufferA, MAX_PATH);
+
+        /* is the space for the terminating 0 included? */
+        if (!i && HIWORD(res) && (LOWORD(res) == (lstrlenA(bufferA))))
+        {
+            win_skip("DoEnvironmentSubstA/W are broken on NT 4\n");
+            return;
+        }
+        ok(HIWORD(res) && (LOWORD(res) == res2),
+            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
+        ok(!lstrcmpA(bufferA, expectedA),
+            "%d: got %s (expected %s)\n", i, bufferA, expectedA);
+
+        res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
+        res = DoEnvironmentSubstW(bufferW, MAX_PATH);
+        ok(HIWORD(res) && (LOWORD(res) == res2),
+            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
+        ok(!lstrcmpW(bufferW, expectedW),
+            "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
+    }
+
+    i--; /* reuse data in the last table entry */
+    len = LOWORD(res); /* needed length */
+
+    /* one character extra is fine */
+    memset(bufferA, '#', MAX_PATH - 1);
+    bufferA[len + 2] = 0;
+    lstrcpyA(bufferA, names[i]);
+    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+
+    res2 = ExpandEnvironmentStringsA(bufferA, expectedA, MAX_PATH);
+    res = DoEnvironmentSubstA(bufferA, len + 1);
+    ok(HIWORD(res) && (LOWORD(res) == res2),
+        "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
+    ok(!lstrcmpA(bufferA, expectedA),
+        "+1: got %s (expected %s)\n", bufferA, expectedA);
+
+    res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
+    res = DoEnvironmentSubstW(bufferW, len + 1);
+    ok(HIWORD(res) && (LOWORD(res) == res2),
+        "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
+    ok(!lstrcmpW(bufferW, expectedW),
+        "+1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
+
+
+    /* minimal buffer length (result string and terminating 0) */
+    memset(bufferA, '#', MAX_PATH - 1);
+    bufferA[len + 2] = 0;
+    lstrcpyA(bufferA, names[i]);
+    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+
+    /* ANSI version failed without an extra byte, as documented on msdn */
+    res = DoEnvironmentSubstA(bufferA, len);
+    ok(!HIWORD(res) && (LOWORD(res) == len),
+        " 0: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len);
+    ok(!lstrcmpA(bufferA, names[i]),
+        " 0: got %s (expected %s)\n", bufferA, names[i]);
+
+    /* DoEnvironmentSubstW works as expected */
+    res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
+    res = DoEnvironmentSubstW(bufferW, len);
+    ok(HIWORD(res) && (LOWORD(res) == res2),
+        " 0: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
+    ok(!lstrcmpW(bufferW, expectedW),
+        " 0: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
+
+
+    /* buffer to small */
+    /* result: FALSE / provided buffer length / the buffer is untouched */
+    memset(bufferA, '#', MAX_PATH - 1);
+    bufferA[len + 2] = 0;
+    lstrcpyA(bufferA, names[i]);
+    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+
+    res = DoEnvironmentSubstA(bufferA, len - 1);
+    ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
+        "-1: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
+    ok(!lstrcmpA(bufferA, names[i]),
+        "-1: got %s (expected %s)\n", bufferA, names[i]);
+
+    lstrcpyW(expectedW, bufferW);
+    res = DoEnvironmentSubstW(bufferW, len - 1);
+    ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
+        "-1: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
+    ok(!lstrcmpW(bufferW, expectedW),
+        "-1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
+
+
+    /* unknown variable */
+    /* result: TRUE / string length including terminating 0 / the buffer is untouched */
+    memset(bufferA, '#', MAX_PATH - 1);
+    bufferA[MAX_PATH - 1] = 0;
+    lstrcpyA(bufferA, does_not_existA);
+    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));
+
+    res2 = lstrlenA(does_not_existA) + 1;
+    res = DoEnvironmentSubstA(bufferA, MAX_PATH);
+    ok(HIWORD(res) && (LOWORD(res) == res2),
+            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
+    ok(!lstrcmpA(bufferA, does_not_existA),
+        "%d: got %s (expected %s)\n", i, bufferA, does_not_existA);
+
+    res = DoEnvironmentSubstW(bufferW, MAX_PATH);
+    ok(HIWORD(res) && (LOWORD(res) == res2),
+        "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
+    ok(!lstrcmpW(bufferW, does_not_existW),
+        "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(does_not_existW));
+
+
+    if (0)
+    {
+        /* NULL crashes on windows */
+        res = DoEnvironmentSubstA(NULL, MAX_PATH);
+        res = DoEnvironmentSubstW(NULL, MAX_PATH);
+    }
+}
+
 START_TEST(shellpath)
 {
     if (!init()) return;
@@ -2522,5 +2673,6 @@ START_TEST(shellpath)
         test_NonExistentPath();
         test_SHGetFolderPathEx();
         test_knownFolders();
+        test_DoEnvironmentSubst();
     }
 }




More information about the wine-cvs mailing list