Skip to content

Commit

Permalink
Update Windows arg parsing tests
Browse files Browse the repository at this point in the history
This updates the tests to be consistent with argv in modern C/C++ applications.
  • Loading branch information
ChrisDenton committed Aug 8, 2021
1 parent 442e627 commit 565a519
Showing 1 changed file with 47 additions and 17 deletions.
64 changes: 47 additions & 17 deletions library/std/src/sys/windows/args/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ fn chk(string: &str, parts: &[&str]) {
let mut wide: Vec<u16> = OsString::from(string).encode_wide().collect();
wide.push(0);
let parsed =
unsafe { parse_lp_cmd_line(wide.as_ptr() as *const u16, || OsString::from("TEST.EXE")) };
unsafe { parse_lp_cmd_line(WStrUnits::new(wide.as_ptr()), || OsString::from("TEST.EXE")) };
let expected: Vec<OsString> = parts.iter().map(|k| OsString::from(k)).collect();
assert_eq!(parsed.as_slice(), expected.as_slice());
assert_eq!(parsed.as_slice(), expected.as_slice(), "{:?}", string);
}

#[test]
Expand All @@ -27,35 +27,65 @@ fn single_words() {
#[test]
fn official_examples() {
chk(r#"EXE "abc" d e"#, &["EXE", "abc", "d", "e"]);
chk(r#"EXE a\\\b d"e f"g h"#, &["EXE", r#"a\\\b"#, "de fg", "h"]);
chk(r#"EXE a\\\b d"e f"g h"#, &["EXE", r"a\\\b", "de fg", "h"]);
chk(r#"EXE a\\\"b c d"#, &["EXE", r#"a\"b"#, "c", "d"]);
chk(r#"EXE a\\\\"b c" d e"#, &["EXE", r#"a\\b c"#, "d", "e"]);
chk(r#"EXE a\\\\"b c" d e"#, &["EXE", r"a\\b c", "d", "e"]);
}

#[test]
fn whitespace_behavior() {
chk(r#" test"#, &["", "test"]);
chk(r#" test"#, &["", "test"]);
chk(r#" test test2"#, &["", "test", "test2"]);
chk(r#" test test2"#, &["", "test", "test2"]);
chk(r#"test test2 "#, &["test", "test2"]);
chk(r#"test test2 "#, &["test", "test2"]);
chk(r#"test "#, &["test"]);
chk(" test", &["", "test"]);
chk(" test", &["", "test"]);
chk(" test test2", &["", "test", "test2"]);
chk(" test test2", &["", "test", "test2"]);
chk("test test2 ", &["test", "test2"]);
chk("test test2 ", &["test", "test2"]);
chk("test ", &["test"]);
}

#[test]
fn genius_quotes() {
chk(r#"EXE "" """#, &["EXE", "", ""]);
chk(r#"EXE "" """"#, &["EXE", "", "\""]);
chk(r#"EXE "" """"#, &["EXE", "", r#"""#]);
chk(
r#"EXE "this is """all""" in the same argument""#,
&["EXE", "this is \"all\" in the same argument"],
&["EXE", r#"this is "all" in the same argument"#],
);
chk(r#"EXE "a"""#, &["EXE", "a\""]);
chk(r#"EXE "a"" a"#, &["EXE", "a\"", "a"]);
chk(r#"EXE "a"""#, &["EXE", r#"a""#]);
chk(r#"EXE "a"" a"#, &["EXE", r#"a" a"#]);
// quotes cannot be escaped in command names
chk(r#""EXE" check"#, &["EXE", "check"]);
chk(r#""EXE check""#, &["EXE check"]);
chk(r#""EXE """for""" check"#, &["EXE ", r#"for""#, "check"]);
chk(r#""EXE \"for\" check"#, &[r#"EXE \"#, r#"for""#, "check"]);
chk(r#""EXE """for""" check"#, &["EXE for check"]);
chk(r#""EXE \"for\" check"#, &[r"EXE \for\ check"]);
chk(r#""EXE \" for \" check"#, &[r"EXE \", "for", r#"""#, "check"]);
chk(r#"E"X"E test"#, &["EXE", "test"]);
chk(r#"EX""E test"#, &["EXE", "test"]);
}

// from https://daviddeley.com/autohotkey/parameters/parameters.htm#WINCRULESEX
#[test]
fn post_2008() {
chk("EXE CallMeIshmael", &["EXE", "CallMeIshmael"]);
chk(r#"EXE "Call Me Ishmael""#, &["EXE", "Call Me Ishmael"]);
chk(r#"EXE Cal"l Me I"shmael"#, &["EXE", "Call Me Ishmael"]);
chk(r#"EXE CallMe\"Ishmael"#, &["EXE", r#"CallMe"Ishmael"#]);
chk(r#"EXE "CallMe\"Ishmael""#, &["EXE", r#"CallMe"Ishmael"#]);
chk(r#"EXE "Call Me Ishmael\\""#, &["EXE", r"Call Me Ishmael\"]);
chk(r#"EXE "CallMe\\\"Ishmael""#, &["EXE", r#"CallMe\"Ishmael"#]);
chk(r#"EXE a\\\b"#, &["EXE", r"a\\\b"]);
chk(r#"EXE "a\\\b""#, &["EXE", r"a\\\b"]);
chk(r#"EXE "\"Call Me Ishmael\"""#, &["EXE", r#""Call Me Ishmael""#]);
chk(r#"EXE "C:\TEST A\\""#, &["EXE", r"C:\TEST A\"]);
chk(r#"EXE "\"C:\TEST A\\\"""#, &["EXE", r#""C:\TEST A\""#]);
chk(r#"EXE "a b c" d e"#, &["EXE", "a b c", "d", "e"]);
chk(r#"EXE "ab\"c" "\\" d"#, &["EXE", r#"ab"c"#, r"\", "d"]);
chk(r#"EXE a\\\b d"e f"g h"#, &["EXE", r"a\\\b", "de fg", "h"]);
chk(r#"EXE a\\\"b c d"#, &["EXE", r#"a\"b"#, "c", "d"]);
chk(r#"EXE a\\\\"b c" d e"#, &["EXE", r"a\\b c", "d", "e"]);
// Double Double Quotes
chk(r#"EXE "a b c"""#, &["EXE", r#"a b c""#]);
chk(r#"EXE """CallMeIshmael""" b c"#, &["EXE", r#""CallMeIshmael""#, "b", "c"]);
chk(r#"EXE """Call Me Ishmael""""#, &["EXE", r#""Call Me Ishmael""#]);
chk(r#"EXE """"Call Me Ishmael"" b c"#, &["EXE", r#""Call"#, "Me", "Ishmael", "b", "c"]);
}

0 comments on commit 565a519

Please sign in to comment.