// Copyright (c) 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:io/io.dart'; import 'package:test/test.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([r'$`"\'])); }); 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(r'"foo bar\'), throwsFormatException); }); }); }); }