blob: 426680e247ad92caef1857de5ca4657e8d4c7338 [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);
});
});
});
}