This is essentially redundant. We should have tests for all behaviours of CommandLineToArgv() above; the purpose of test_argify() is to test how ShellExecute() et al. parses its parameters, and to show that this is different from CommandLineToArgv(). Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> --- dlls/shell32/tests/shlexec.c | 167 +++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 108 deletions(-) diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c index c67cc46..ab77fa1 100644 --- a/dlls/shell32/tests/shlexec.c +++ b/dlls/shell32/tests/shlexec.c @@ -1418,8 +1418,8 @@ typedef struct const char* verb; const char* params; int todo; - cmdline_tests_t cmd; - cmdline_tests_t broken; + const char *cmd; + const char *broken; } argify_tests_t; static const argify_tests_t argify_tests[] = @@ -1429,33 +1429,28 @@ static const argify_tests_t argify_tests[] = * parameters string, including the trailing spaces, no matter what * arguments have already been used. */ - {"Params232S", "p2 p3 p4 ", 0xc2, - {" p2 p3 \"p2\" \"p2 p3 p4 \"", - {"", "p2", "p3", "p2", "p2 p3 p4 ", NULL}, 0}}, + {"Params232S", "p2 p3 p4 ", TRUE, + " p2 p3 \"p2\" \"p2 p3 p4 \""}, /* Unquoted argument references like %2 don't automatically quote their * argument. Similarly, when they are quoted they don't escape the quotes * that their argument may contain. */ - {"Params232S", "\"p two\" p3 p4 ", 0x3f3, - {" p two p3 \"p two\" \"\"p two\" p3 p4 \"", - {"", "p", "two", "p3", "p two", "p", "two p3 p4 ", NULL}, 0}}, + {"Params232S", "\"p two\" p3 p4 ", TRUE, + " p two p3 \"p two\" \"\"p two\" p3 p4 \""}, /* Only single digits are supported so only %1 to %9. Shown here with %20 * because %10 is a pain. */ - {"Params20", "p", 0, - {" \"p0\"", - {"", "p0", NULL}, 0}}, + {"Params20", "p", FALSE, + " \"p0\""}, /* Only (double-)quotes have a special meaning. */ - {"Params23456", "'p2 p3` p4\\ $even", 0x40, - {" \"'p2\" \"p3`\" \"p4\\\" \"$even\" \"\"", - {"", "'p2", "p3`", "p4\" $even \"", NULL}, 0}}, + {"Params23456", "'p2 p3` p4\\ $even", FALSE, + " \"'p2\" \"p3`\" \"p4\\\" \"$even\" \"\""}, - {"Params23456", "p=2 p-3 p4\tp4\rp4\np4", 0x1c2, - {" \"p=2\" \"p-3\" \"p4\tp4\rp4\np4\" \"\" \"\"", - {"", "p=2", "p-3", "p4\tp4\rp4\np4", "", "", NULL}, 0}}, + {"Params23456", "p=2 p-3 p4\tp4\rp4\np4", TRUE, + " \"p=2\" \"p-3\" \"p4\tp4\rp4\np4\" \"\" \"\""}, /* In unquoted strings, quotes are treated are a parameter separator just * like spaces! However they can be doubled to get a literal quote. @@ -1463,125 +1458,102 @@ static const argify_tests_t argify_tests[] = * 2n quotes -> n quotes * 2n+1 quotes -> n quotes and a parameter separator */ - {"Params23456789", "one\"quote \"p four\" one\"quote p7", 0xff3, - {" \"one\" \"quote\" \"p four\" \"one\" \"quote\" \"p7\" \"\" \"\"", - {"", "one", "quote", "p four", "one", "quote", "p7", "", "", NULL}, 0}}, + {"Params23456789", "one\"quote \"p four\" one\"quote p7", TRUE, + " \"one\" \"quote\" \"p four\" \"one\" \"quote\" \"p7\" \"\" \"\""}, - {"Params23456789", "two\"\"quotes \"p three\" two\"\"quotes p5", 0xf2, - {" \"two\"quotes\" \"p three\" \"two\"quotes\" \"p5\" \"\" \"\" \"\" \"\"", - {"", "twoquotes p", "three twoquotes", "p5", "", "", "", "", NULL}, 0}}, + {"Params23456789", "two\"\"quotes \"p three\" two\"\"quotes p5", TRUE, + " \"two\"quotes\" \"p three\" \"two\"quotes\" \"p5\" \"\" \"\" \"\" \"\""}, - {"Params23456789", "three\"\"\"quotes \"p four\" three\"\"\"quotes p6", 0xff3, - {" \"three\"\" \"quotes\" \"p four\" \"three\"\" \"quotes\" \"p6\" \"\" \"\"", - {"", "three\"", "quotes", "p four", "three\"", "quotes", "p6", "", "", NULL}, 0}}, + {"Params23456789", "three\"\"\"quotes \"p four\" three\"\"\"quotes p6", TRUE, + " \"three\"\" \"quotes\" \"p four\" \"three\"\" \"quotes\" \"p6\" \"\" \"\""}, - {"Params23456789", "four\"\"\"\"quotes \"p three\" four\"\"\"\"quotes p5", 0xf3, - {" \"four\"\"quotes\" \"p three\" \"four\"\"quotes\" \"p5\" \"\" \"\" \"\" \"\"", - {"", "four\"quotes p", "three fourquotes p5 \"", "", "", "", NULL}, 0}}, + {"Params23456789", "four\"\"\"\"quotes \"p three\" four\"\"\"\"quotes p5", TRUE, + " \"four\"\"quotes\" \"p three\" \"four\"\"quotes\" \"p5\" \"\" \"\" \"\" \"\""}, /* Quoted strings cannot be continued by tacking on a non space character * either. */ - {"Params23456", "\"p two\"p3 \"p four\"p5 p6", 0x1f3, - {" \"p two\" \"p3\" \"p four\" \"p5\" \"p6\"", - {"", "p two", "p3", "p four", "p5", "p6", NULL}, 0}}, + {"Params23456", "\"p two\"p3 \"p four\"p5 p6", TRUE, + " \"p two\" \"p3\" \"p four\" \"p5\" \"p6\""}, /* In quoted strings, the quotes are halved and an odd number closes the * string. Specifically: * 2n quotes -> n quotes * 2n+1 quotes -> n quotes and closes the string and hence the parameter */ - {"Params23456789", "\"one q\"uote \"p four\" \"one q\"uote p7", 0xff3, - {" \"one q\" \"uote\" \"p four\" \"one q\" \"uote\" \"p7\" \"\" \"\"", - {"", "one q", "uote", "p four", "one q", "uote", "p7", "", "", NULL}, 0}}, + {"Params23456789", "\"one q\"uote \"p four\" \"one q\"uote p7", TRUE, + " \"one q\" \"uote\" \"p four\" \"one q\" \"uote\" \"p7\" \"\" \"\""}, - {"Params23456789", "\"two \"\" quotes\" \"p three\" \"two \"\" quotes\" p5", 0x1ff3, - {" \"two \" quotes\" \"p three\" \"two \" quotes\" \"p5\" \"\" \"\" \"\" \"\"", - {"", "two ", "quotes p", "three two", " quotes", "p5", "", "", "", "", NULL}, 0}}, + {"Params23456789", "\"two \"\" quotes\" \"p three\" \"two \"\" quotes\" p5", TRUE, + " \"two \" quotes\" \"p three\" \"two \" quotes\" \"p5\" \"\" \"\" \"\" \"\""}, - {"Params23456789", "\"three q\"\"\"uotes \"p four\" \"three q\"\"\"uotes p7", 0xff3, - {" \"three q\"\" \"uotes\" \"p four\" \"three q\"\" \"uotes\" \"p7\" \"\" \"\"", - {"", "three q\"", "uotes", "p four", "three q\"", "uotes", "p7", "", "", NULL}, 0}}, + {"Params23456789", "\"three q\"\"\"uotes \"p four\" \"three q\"\"\"uotes p7", TRUE, + " \"three q\"\" \"uotes\" \"p four\" \"three q\"\" \"uotes\" \"p7\" \"\" \"\""}, - {"Params23456789", "\"four \"\"\"\" quotes\" \"p three\" \"four \"\"\"\" quotes\" p5", 0xff3, - {" \"four \"\" quotes\" \"p three\" \"four \"\" quotes\" \"p5\" \"\" \"\" \"\" \"\"", - {"", "four \"", "quotes p", "three four", "", "quotes p5 \"", "", "", "", NULL}, 0}}, + {"Params23456789", "\"four \"\"\"\" quotes\" \"p three\" \"four \"\"\"\" quotes\" p5", TRUE, + " \"four \"\" quotes\" \"p three\" \"four \"\" quotes\" \"p5\" \"\" \"\" \"\" \"\""}, /* The quoted string rules also apply to consecutive quotes at the start * of a parameter but don't count the opening quote! */ - {"Params23456789", "\"\"twoquotes \"p four\" \"\"twoquotes p7", 0xbf3, - {" \"\" \"twoquotes\" \"p four\" \"\" \"twoquotes\" \"p7\" \"\" \"\"", - {"", "", "twoquotes", "p four", "", "twoquotes", "p7", "", "", NULL}, 0}}, + {"Params23456789", "\"\"twoquotes \"p four\" \"\"twoquotes p7", TRUE, + " \"\" \"twoquotes\" \"p four\" \"\" \"twoquotes\" \"p7\" \"\" \"\""}, - {"Params23456789", "\"\"\"three quotes\" \"p three\" \"\"\"three quotes\" p5", 0x6f3, - {" \"\"three quotes\" \"p three\" \"\"three quotes\" \"p5\" \"\" \"\" \"\" \"\"", - {"", "three", "quotes p", "three \"three", "quotes p5 \"", "", "", "", NULL}, 0}}, + {"Params23456789", "\"\"\"three quotes\" \"p three\" \"\"\"three quotes\" p5", TRUE, + " \"\"three quotes\" \"p three\" \"\"three quotes\" \"p5\" \"\" \"\" \"\" \"\""}, - {"Params23456789", "\"\"\"\"fourquotes \"p four\" \"\"\"\"fourquotes p7", 0xbf3, - {" \"\"\" \"fourquotes\" \"p four\" \"\"\" \"fourquotes\" \"p7\" \"\" \"\"", - {"", "\"", "fourquotes", "p four", "\"", "fourquotes", "p7", "", "", NULL}, 0}}, + {"Params23456789", "\"\"\"\"fourquotes \"p four\" \"\"\"\"fourquotes p7", TRUE, + " \"\"\" \"fourquotes\" \"p four\" \"\"\" \"fourquotes\" \"p7\" \"\" \"\""}, /* An unclosed quoted string gets lost! */ - {"Params23456", "p2 \"p3\" \"p4 is lost", 0x1c3, - {" \"p2\" \"p3\" \"\" \"\" \"\"", - {"", "p2", "p3", "", "", "", NULL}, 0}, - {" \"p2\" \"p3\" \"p3\" \"\" \"\"", - {"", "p2", "p3", "p3", "", "", NULL}, 0}}, + {"Params23456", "p2 \"p3\" \"p4 is lost", TRUE, + " \"p2\" \"p3\" \"\" \"\" \"\"", + " \"p2\" \"p3\" \"p3\" \"\" \"\""}, /* NT4/2k */ /* Backslashes have no special meaning even when preceding quotes. All * they do is start an unquoted string. */ - {"Params23456", "\\\"p\\three \"pfour\\\" pfive", 0x73, - {" \"\\\" \"p\\three\" \"pfour\\\" \"pfive\" \"\"", - {"", "\" p\\three pfour\"", "pfive", "", NULL}, 0}}, + {"Params23456", "\\\"p\\three \"pfour\\\" pfive", TRUE, + " \"\\\" \"p\\three\" \"pfour\\\" \"pfive\" \"\""}, /* Environment variables are left untouched. */ - {"Params23456", "%TMPDIR% %t %c", 0, - {" \"%TMPDIR%\" \"%t\" \"%c\" \"\" \"\"", - {"", "%TMPDIR%", "%t", "%c", "", "", NULL}, 0}}, + {"Params23456", "%TMPDIR% %t %c", FALSE, + " \"%TMPDIR%\" \"%t\" \"%c\" \"\" \"\""}, /* %~2 is equivalent to %*. However %~3 and higher include the spaces * before the parameter! * (but not the previous parameter's closing quote fortunately) */ - {"Params2345Etc", "p2 p3 \"p4\" p5 p6 ", 0x3f3, - {" ~2=\"p2 p3 \"p4\" p5 p6 \" ~3=\" p3 \"p4\" p5 p6 \" ~4=\" \"p4\" p5 p6 \" ~5= p5 p6 ", - {"", "~2=p2 p3 p4 p5 p6 ", "~3= p3 p4 p5 p6 ", "~4= p4 p5 p6 ", "~5=", "p5", "p6", NULL}, 0}}, + {"Params2345Etc", "p2 p3 \"p4\" p5 p6 ", TRUE, + " ~2=\"p2 p3 \"p4\" p5 p6 \" ~3=\" p3 \"p4\" p5 p6 \" ~4=\" \"p4\" p5 p6 \" ~5= p5 p6 "}, /* %~n works even if there is no nth parameter. */ - {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 ", 0x12, - {" ~9=\" \"", - {"", "~9= ", NULL}, 0}}, + {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 ", TRUE, + " ~9=\" \""}, - {"Params9Etc", "p2 p3 p4 p5 p6 p7 ", 0x12, - {" ~9=\"\"", - {"", "~9=", NULL}, 0}}, + {"Params9Etc", "p2 p3 p4 p5 p6 p7 ", TRUE, + " ~9=\"\""}, /* The %~n directives also transmit the tenth parameter and beyond. */ - {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 and beyond!", 0x12, - {" ~9=\" p9 p10 p11 and beyond!\"", - {"", "~9= p9 p10 p11 and beyond!", NULL}, 0}}, + {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 and beyond!", TRUE, + " ~9=\" p9 p10 p11 and beyond!\""}, /* Bad formatting directives lose their % sign, except those followed by * a tilde! Environment variables are not expanded but lose their % sign. */ - {"ParamsBad", "p2 p3 p4 p5", 0x12, - {" \"% - %~ %~0 %~1 %~a %~* a b c TMPDIR\"", - {"", "% - %~ %~0 %~1 %~a %~* a b c TMPDIR", NULL}, 0}}, + {"ParamsBad", "p2 p3 p4 p5", TRUE, + " \"% - %~ %~0 %~1 %~a %~* a b c TMPDIR\""}, - {NULL, NULL, 0, {NULL, {NULL}, 0}} + {0} }; static void test_argify(void) { - BOOL has_cl2a = TRUE; char fileA[MAX_PATH], params[2*MAX_PATH+12]; INT_PTR rc; const argify_tests_t* test; - const cmdline_tests_t *bad; + const char *bad; const char* cmd; - unsigned i, count; /* Test with a long parameter */ for (rc = 0; rc < MAX_PATH; rc++) @@ -1614,21 +1586,11 @@ static void test_argify(void) test = argify_tests; while (test->params) { - bad = test->broken.cmd ? &test->broken : &test->cmd; + bad = test->broken ? test->broken : test->cmd; - /* trace("***** verb='%s' params='%s'\n", test->verb, test->params); */ rc = shell_execute_ex(SEE_MASK_DOENVSUBST, test->verb, fileA, test->params, NULL, NULL); okShell(rc > 32, "failed: rc=%lu\n", rc); - count = 0; - while (test->cmd.args[count]) - count++; - /* +4 for the shlexec arguments, -1 because of the added "" - * argument for the CommandLineToArgvW() tests. - */ - todo_wine_if(test->todo & 0x1) - okChildInt("argcA", 4 + count - 1); - cmd = getChildString("Child", "cmdlineA"); /* Our commands are such that the verb immediately precedes the * part we are interested in. @@ -1636,20 +1598,9 @@ static void test_argify(void) if (cmd) cmd = strstr(cmd, test->verb); if (cmd) cmd += strlen(test->verb); if (!cmd) cmd = "(null)"; - todo_wine_if(test->todo & 0x2) - okShell(!strcmp(cmd, test->cmd.cmd) || broken(!strcmp(cmd, bad->cmd)), - "the cmdline is '%s' instead of '%s'\n", cmd, test->cmd.cmd); - - for (i = 0; i < count - 1; i++) - { - char argname[18]; - sprintf(argname, "argvA%d", 4 + i); - todo_wine_if(test->todo & (1 << (i+4))) - okChildStringBroken(argname, test->cmd.args[i+1], bad->args[i+1]); - } - - if (has_cl2a) - has_cl2a = test_one_cmdline(&(test->cmd)); + todo_wine_if(test->todo) + okShell(!strcmp(cmd, test->cmd) || broken(!strcmp(cmd, bad)), + "expected '%s', got '%s'\n", cmd, test->cmd); test++; } } -- 2.7.4