| // 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); |
| }); |
| }); |
| }); |
| } |