blob: 610c36d2110ea4df35ac3b88ed2e8abd77938157 [file] [log] [blame]
// Copyright 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:test/test.dart';
import 'package:io/io.dart';
void main() {
group("shellSplit()", () {
group("returns an empty list for", () {
test("an empty string", () {
expect(shellSplit(""), isEmpty);
});
test("spaces", () {
expect(shellSplit(" "), isEmpty);
});
test("tabs", () {
expect(shellSplit("\t\t\t"), isEmpty);
});
test("newlines", () {
expect(shellSplit("\n\n\n"), isEmpty);
});
test("a comment", () {
expect(shellSplit("#foo bar baz"), isEmpty);
});
test("a mix", () {
expect(shellSplit(" \t\n# foo"), isEmpty);
});
});
group("parses unquoted", () {
test("a single token", () {
expect(shellSplit("foo"), equals(["foo"]));
});
test("multiple tokens", () {
expect(shellSplit("foo bar baz"), equals(["foo", "bar", "baz"]));
});
test("tokens separated by tabs", () {
expect(shellSplit("foo\tbar\tbaz"), equals(["foo", "bar", "baz"]));
});
test("tokens separated by newlines", () {
expect(shellSplit("foo\nbar\nbaz"), equals(["foo", "bar", "baz"]));
});
test("a token after whitespace", () {
expect(shellSplit(" \t\nfoo"), equals(["foo"]));
});
test("a token before whitespace", () {
expect(shellSplit("foo \t\n"), equals(["foo"]));
});
test("a token with a hash", () {
expect(shellSplit("foo#bar"), equals(["foo#bar"]));
});
test("a token before a comment", () {
expect(shellSplit("foo #bar"), equals(["foo"]));
});
test("dynamic shell features", () {
expect(
shellSplit(r"foo $(bar baz)"), equals(["foo", r"$(bar", "baz)"]));
expect(shellSplit("foo `bar baz`"), equals(["foo", "`bar", "baz`"]));
expect(shellSplit(r"foo $bar | baz"),
equals(["foo", r"$bar", "|", "baz"]));
});
});
group("parses a backslash", () {
test("before a normal character", () {
expect(shellSplit(r"foo\bar"), equals(["foobar"]));
});
test("before a dynamic shell feature", () {
expect(shellSplit(r"foo\$bar"), equals([r"foo$bar"]));
});
test("before a single quote", () {
expect(shellSplit(r"foo\'bar"), equals(["foo'bar"]));
});
test("before a double quote", () {
expect(shellSplit(r'foo\"bar'), equals(['foo"bar']));
});
test("before a space", () {
expect(shellSplit(r'foo\ bar'), equals(['foo bar']));
});
test("at the beginning of a token", () {
expect(shellSplit(r'\ foo'), equals([' foo']));
});
test("before whitespace followed by a hash", () {
expect(shellSplit(r'\ #foo'), equals([' #foo']));
});
test("before a newline in a token", () {
expect(shellSplit('foo\\\nbar'), equals(['foobar']));
});
test("before a newline outside a token", () {
expect(shellSplit('foo \\\n bar'), equals(['foo', 'bar']));
});
test("before a backslash", () {
expect(shellSplit(r'foo\\bar'), equals([r'foo\bar']));
});
});
group("parses single quotes", () {
test("that are empty", () {
expect(shellSplit("''"), equals([""]));
});
test("that contain normal characters", () {
expect(shellSplit("'foo'"), equals(["foo"]));
});
test("that contain active characters", () {
expect(shellSplit("'\" \\#'"), equals([r'" \#']));
});
test("before a hash", () {
expect(shellSplit("''#foo"), equals([r'#foo']));
});
test("inside a token", () {
expect(shellSplit("foo'bar baz'qux"), equals([r'foobar bazqux']));
});
test("without a closing quote", () {
expect(() => shellSplit("'foo bar"), throwsFormatException);
});
});
group("parses double quotes", () {
test("that are empty", () {
expect(shellSplit('""'), equals([""]));
});
test("that contain normal characters", () {
expect(shellSplit('"foo"'), equals(["foo"]));
});
test("that contain otherwise-active characters", () {
expect(shellSplit('"\' #"'), equals(["' #"]));
});
test("that contain escaped characters", () {
expect(shellSplit(r'"\$\`\"\\"'), equals(['\$`"\\']));
});
test("that contain an escaped newline", () {
expect(shellSplit('"\\\n"'), equals(['']));
});
test("that contain a backslash that's not an escape", () {
expect(shellSplit(r'"f\oo"'), equals([r'f\oo']));
});
test("before a hash", () {
expect(shellSplit('""#foo'), equals([r'#foo']));
});
test("inside a token", () {
expect(shellSplit('foo"bar baz"qux'), equals([r'foobar bazqux']));
});
test("without a closing quote", () {
expect(() => shellSplit('"foo bar'), throwsFormatException);
expect(() => shellSplit('"foo bar\\'), throwsFormatException);
});
});
});
}