ShellExecute(): Test %1, %l and %L

Francois Gouget fgouget at codeweavers.com
Wed Aug 17 03:31:45 CDT 2005


Changelog:

  * dlls/shell32/tests/shlexec.c

    Francois Gouget <fgouget at codeweavers.com>
    Test "%l" and "%L". At the same time this tests alternate verbs.
    Test %1, %l and %L with no quotes.
    test->todo is a bitmask so fix the checks accordingly.

-- 
Francois Gouget
fgouget at codeweavers.com

-------------- next part --------------
Index: dlls/shell32/tests/shlexec.c
===================================================================
RCS file: /var/cvs/wine/dlls/shell32/tests/shlexec.c,v
retrieving revision 1.2
diff -u -p -r1.2 shlexec.c
--- dlls/shell32/tests/shlexec.c	16 Aug 2005 19:29:27 -0000	1.2
+++ dlls/shell32/tests/shlexec.c	17 Aug 2005 08:25:42 -0000
@@ -229,7 +229,8 @@ static void delete_test_association(cons
     SHDeleteKey(HKEY_CLASSES_ROOT, extension);
 }
 
-static void create_test_verb(const char* extension, const char* verb)
+static void create_test_verb(const char* extension, const char* verb,
+                             const char* cmdtail)
 {
     HKEY hkey_shell, hkey_verb, hkey_cmd;
     char shell[MAX_PATH];
@@ -247,8 +248,8 @@ static void create_test_verb(const char*
                       NULL, &hkey_cmd, NULL);
     assert(rc==ERROR_SUCCESS);
 
-    cmd=malloc(strlen(argv0)+10+strlen(child_file)+2+strlen(verb)+5+1);
-    sprintf(cmd,"%s shlexec \"%s\" %s \"%%1\"", argv0, child_file, verb);
+    cmd=malloc(strlen(argv0)+10+strlen(child_file)+2+strlen(cmdtail)+1);
+    sprintf(cmd,"%s shlexec \"%s\" %s", argv0, child_file, cmdtail);
     rc=RegSetValueEx(hkey_cmd, NULL, 0, REG_SZ, cmd, strlen(cmd)+1);
     assert(rc==ERROR_SUCCESS);
 
@@ -474,6 +475,7 @@ static const char* testfiles[]=
 
 typedef struct
 {
+    char* verb;
     char* basename;
     int rc;
     int todo;
@@ -482,23 +484,40 @@ typedef struct
 static filename_tests_t filename_tests[]=
 {
     /* Test bad / nonexistent filenames */
-    {"%s\\nonexistent.shlexec", ERROR_FILE_NOT_FOUND, 0x1},
-    {"%s\\nonexistent.noassoc", ERROR_FILE_NOT_FOUND, 0x1},
+    {NULL,           "%s\\nonexistent.shlexec", ERROR_FILE_NOT_FOUND, 0x1},
+    {NULL,           "%s\\nonexistent.noassoc", ERROR_FILE_NOT_FOUND, 0x1},
 
     /* Standard tests */
-    {"%s\\test file.shlexec",   0, 0x0},
-    {"%s\\test file.shlexec.",  0, 0x0},
-    {"%s\\%%nasty%% $file.shlexec",  0, 0x0},
-    {"%s/test file.shlexec",    0, 0x0},
+    {NULL,           "%s\\test file.shlexec",   0, 0x0},
+    {NULL,           "%s\\test file.shlexec.",  0, 0x0},
+    {NULL,           "%s\\%%nasty%% $file.shlexec", 0, 0x0},
+    {NULL,           "%s/test file.shlexec",    0, 0x0},
 
     /* Test filenames with no association */
-    {"%s\\test file.noassoc",   SE_ERR_NOASSOC, 0x0},
+    {NULL,           "%s\\test file.noassoc",   SE_ERR_NOASSOC, 0x0},
 
     /* Test double extensions */
-    {"%s\\test file.noassoc.shlexec", 0, 0},
-    {"%s\\test file.shlexec.noassoc", SE_ERR_NOASSOC, 0x0},
+    {NULL,           "%s\\test file.noassoc.shlexec", 0, 0},
+    {NULL,           "%s\\test file.shlexec.noassoc", SE_ERR_NOASSOC, 0x0},
 
-    {NULL, 0, 0}
+    /* Test alternate verbs */
+    {"LowerL",       "%s\\nonexistent.shlexec", ERROR_FILE_NOT_FOUND, 0x1},
+    {"LowerL",       "%s\\test file.noassoc",   SE_ERR_NOASSOC, 0x0},
+
+    {"QuotedLowerL", "%s\\test file.shlexec",   0, 0x0},
+    {"QuotedUpperL", "%s\\test file.shlexec",   0, 0x0},
+
+    {NULL, NULL, 0, 0}
+};
+
+static filename_tests_t noquotes_tests[]=
+{
+    /* Test unquoted '%1' thingies */
+    {"NoQuotes",     "%s\\test file.shlexec",   0, 0xa},
+    {"LowerL",       "%s\\test file.shlexec",   0, 0x0},
+    {"UpperL",       "%s\\test file.shlexec",   0, 0x0},
+
+    {NULL, NULL, 0, 0}
 };
 
 static void test_filename()
@@ -522,7 +541,7 @@ static void test_filename()
                 c++;
             }
         }
-        rc=shell_execute(NULL, filename, NULL, NULL);
+        rc=shell_execute(test->verb, filename, NULL, NULL);
         if (rc>=32)
             rc=0;
         if ((test->todo & 0x1)==0)
@@ -537,6 +556,7 @@ static void test_filename()
         }
         if (rc==0)
         {
+            const char* verb;
             if ((test->todo & 0x2)==0)
             {
                 okChildInt("argcA", 5);
@@ -545,15 +565,16 @@ static void test_filename()
             {
                 okChildInt("argcA", 5);
             }
-            if ((test->todo & 0x3)==0)
+            verb=(test->verb ? test->verb : "Open");
+            if ((test->todo & 0x4)==0)
             {
-                okChildString("argvA3", "Open");
+                okChildString("argvA3", verb);
             }
             else todo_wine
             {
-                okChildString("argvA3", "Open");
+                okChildString("argvA3", verb);
             }
-            if ((test->todo & 0x4)==0)
+            if ((test->todo & 0x8)==0)
             {
                 okChildPath("argvA4", filename);
             }
@@ -565,6 +586,74 @@ static void test_filename()
         test++;
     }
 
+    test=noquotes_tests;
+    while (test->basename)
+    {
+        sprintf(filename, test->basename, tmpdir);
+        rc=shell_execute(test->verb, filename, NULL, NULL);
+        if (rc>=32)
+            rc=0;
+        if ((test->todo & 0x1)==0)
+        {
+            ok(rc==test->rc, "%s failed: rc=%d err=%ld\n", shell_call,
+               rc, GetLastError());
+        }
+        else todo_wine
+        {
+            ok(rc==test->rc, "%s failed: rc=%d err=%ld\n", shell_call,
+               rc, GetLastError());
+        }
+        if (rc==0)
+        {
+            int count;
+            const char* verb;
+            char* str;
+
+            verb=(test->verb ? test->verb : "Open");
+            if ((test->todo & 0x4)==0)
+            {
+                okChildString("argvA3", verb);
+            }
+            else todo_wine
+            {
+                okChildString("argvA3", verb);
+            }
+
+            count=4;
+            str=filename;
+            while (1)
+            {
+                char attrib[18];
+                char* space;
+                space=strchr(str, ' ');
+                if (space)
+                    *space='\0';
+                sprintf(attrib, "argvA%d", count);
+                if ((test->todo & 0x8)==0)
+                {
+                    okChildPath(attrib, str);
+                }
+                else todo_wine
+                {
+                    okChildPath(attrib, str);
+                }
+                count++;
+                if (!space)
+                    break;
+                str=space+1;
+            }
+            if ((test->todo & 0x2)==0)
+            {
+                okChildInt("argcA", count);
+            }
+            else todo_wine
+            {
+                okChildInt("argcA", count);
+            }
+        }
+        test++;
+    }
+
     if (dllver.dwMajorVersion != 0)
     {
         /* The more recent versions of shell32.dll accept quoted filenames
@@ -592,17 +677,17 @@ static void test_filename()
 static filename_tests_t lnk_tests[]=
 {
     /* Pass bad / nonexistent filenames as a parameter */
-    {"%s\\nonexistent.shlexec", 0, 0xa},
-    {"%s\\nonexistent.noassoc", 0, 0xa},
+    {NULL, "%s\\nonexistent.shlexec", 0, 0xa},
+    {NULL, "%s\\nonexistent.noassoc", 0, 0xa},
 
     /* Pass regular paths as a parameter */
-    {"%s\\test file.shlexec",   0, 0xa},
-    {"%s/%%nasty%% $file.shlexec",  0, 0xa},
+    {NULL, "%s\\test file.shlexec",   0, 0xa},
+    {NULL, "%s/%%nasty%% $file.shlexec", 0, 0xa},
 
     /* Pass filenames with no association as a parameter */
-    {"%s\\test file.noassoc",   0, 0xa},
+    {NULL, "%s\\test file.noassoc",   0, 0xa},
 
-    {NULL, 0, 0}
+    {NULL, NULL, 0, 0}
 };
 
 static void test_lnks()
@@ -825,7 +910,12 @@ static void init_test()
 
     /* Create a basic association suitable for most tests */
     create_test_association(".shlexec");
-    create_test_verb(".shlexec", "Open");
+    create_test_verb(".shlexec", "Open", "Open \"%1\"");
+    create_test_verb(".shlexec", "NoQuotes", "NoQuotes %1");
+    create_test_verb(".shlexec", "LowerL", "LowerL %l");
+    create_test_verb(".shlexec", "QuotedLowerL", "QuotedLowerL \"%l\"");
+    create_test_verb(".shlexec", "UpperL", "UpperL %L");
+    create_test_verb(".shlexec", "QuotedUpperL", "QuotedUpperL \"%L\"");
 }
 
 static void cleanup_test()


More information about the wine-patches mailing list