1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import SKCore
import XCTest
/// Assert that splitting `str` into its command line components results in `expected`.
///
/// By default assert that escaping using Unix and Windows rules results in the same split. If `windows` is specified,
/// assert that escaping with Windows rules produces `windows` and escaping using Unix rules results in `expected`.
///
/// If set `initialCommandName` gets passed to the Windows split function.
func assertEscapedCommand(
_ str: String,
_ expected: [String],
windows: [String]? = nil,
initialCommandName: Bool = false,
file: StaticString = #filePath,
line: UInt = #line
) {
XCTAssertEqual(
splitShellEscapedCommand(str),
expected,
"Splitting Unix command line arguments",
file: file,
line: line
)
XCTAssertEqual(
splitWindowsCommandLine(str, initialCommandName: initialCommandName),
windows ?? expected,
"Splitting Windows command line arguments",
file: file,
line: line
)
}
final class SplitShellCommandTests: XCTestCase {
func testSplitShellEscapedCommandBasic() {
assertEscapedCommand("", [])
assertEscapedCommand(" ", [])
assertEscapedCommand("a", ["a"])
assertEscapedCommand("abc", ["abc"])
assertEscapedCommand("a😀c", ["a😀c"])
assertEscapedCommand("😀c", ["😀c"])
assertEscapedCommand("abc def", ["abc", "def"])
assertEscapedCommand("abc def", ["abc", "def"])
}
func testSplitShellEscapedCommandDoubleQuotes() {
assertEscapedCommand("\"", [""])
assertEscapedCommand(#""a"#, ["a"])
assertEscapedCommand("\"\"", [""])
assertEscapedCommand(#""a""#, ["a"])
assertEscapedCommand(#""a\"""#, [#"a""#])
assertEscapedCommand(#""a b c ""#, ["a b c "])
assertEscapedCommand(#""a " "#, ["a "])
assertEscapedCommand(#""a " b"#, ["a ", "b"])
assertEscapedCommand(#""a "b"#, ["a b"])
assertEscapedCommand(#"a"x ""b"#, ["ax b"], windows: [#"ax "b"#])
assertEscapedCommand(#""a"bcd"ef""""g""#, ["abcdefg"], windows: [#"abcdef""g"#])
}
func testSplitShellEscapedCommandSingleQuotes() {
assertEscapedCommand("'", [""], windows: ["'"])
assertEscapedCommand("'a", ["a"], windows: ["'a"])
assertEscapedCommand("''", [""], windows: ["''"])
assertEscapedCommand("'a'", ["a"], windows: ["'a'"])
assertEscapedCommand(#"'a\"'"#, [#"a\""#], windows: [#"'a"'"#])
assertEscapedCommand(#"'a b c '"#, ["a b c "], windows: ["'a", "b", "c", "'"])
assertEscapedCommand(#"'a ' "#, ["a "], windows: ["'a", "'"])
assertEscapedCommand(#"'a ' b"#, ["a ", "b"], windows: ["'a", "'", "b"])
assertEscapedCommand(#"'a 'b"#, ["a b"], windows: ["'a", "'b"])
assertEscapedCommand(#"a'x ''b"#, ["ax b"], windows: ["a'x", "''b"])
}
func testSplitShellEscapedCommandBackslash() {
assertEscapedCommand(#"a\\"#, [#"a\"#], windows: [#"a\\"#])
assertEscapedCommand(#"a'\b "c"'"#, ["a\\b \"c\""], windows: [#"a'\b"#, #"c'"#])
assertEscapedCommand(#"\""#, ["\""])
assertEscapedCommand(#"\\""#, [#"\"#])
assertEscapedCommand(#"\\\""#, [#"\""#])
assertEscapedCommand(#"\\ "#, [#"\"#], windows: [#"\\"#])
assertEscapedCommand(#"\\\ "#, [#"\ "#], windows: [#"\\\"#])
}
func testSplitShellEscapedCommandWindowsCommand() {
assertEscapedCommand(#"C:\swift.exe"#, [#"C:swift.exe"#], windows: [#"C:\swift.exe"#], initialCommandName: true)
assertEscapedCommand(
#"C:\ swift.exe"#,
[#"C: swift.exe"#],
windows: [#"C:\"#, #"swift.exe"#],
initialCommandName: true
)
assertEscapedCommand(
#"C:\ swift.exe"#,
[#"C: swift.exe"#],
windows: [#"C:\"#, #"swift.exe"#],
initialCommandName: false
)
assertEscapedCommand(#"C:\"swift.exe""#, [#"C:"swift.exe"#], windows: [#"C:\swift.exe"#], initialCommandName: true)
assertEscapedCommand(#"C:\"swift.exe""#, [#"C:"swift.exe"#], windows: [#"C:"swift.exe"#], initialCommandName: false)
}
func testSplitShellEscapedCommandWindowsTwoDoubleQuotes() {
assertEscapedCommand(#"" test with "" quote""#, [" test with quote"], windows: [#" test with " quote"#])
assertEscapedCommand(#"" test with "" quote""#, [" test with quote"], windows: [#" test with " quote"#])
}
}
|