| Index: pkg/args/test/args_test.dart | 
| diff --git a/pkg/args/test/args_test.dart b/pkg/args/test/args_test.dart | 
| index d807291e04d840e5e3f36f85463462deba04e1b9..cf31cc26210fba5cca1a4e8646db401a6e3129d1 100644 | 
| --- a/pkg/args/test/args_test.dart | 
| +++ b/pkg/args/test/args_test.dart | 
| @@ -32,6 +32,24 @@ main() { | 
| var parser = new ArgParser(); | 
| throwsIllegalArg(() => parser.addFlag('flummox', abbr: 'flu')); | 
| }); | 
| + | 
| +    test('throws ArgumentError if a flag name is invalid', () { | 
| +      var parser = new ArgParser(); | 
| + | 
| +      for(var name in _INVALID_OPTIONS) { | 
| +        var reason = '${Error.safeToString(name)} is not valid'; | 
| +        throwsIllegalArg(() => parser.addFlag(name), reason: reason); | 
| +      } | 
| +    }); | 
| + | 
| +    test('accepts valid flag names', () { | 
| +      var parser = new ArgParser(); | 
| + | 
| +      for(var name in _VALID_OPTIONS) { | 
| +        var reason = '${Error.safeToString(name)} is valid'; | 
| +        expect(() => parser.addFlag(name), returnsNormally, reason: reason); | 
| +      } | 
| +    }); | 
| }); | 
|  | 
| group('ArgParser.addOption()', () { | 
| @@ -58,6 +76,46 @@ main() { | 
| var parser = new ArgParser(); | 
| throwsIllegalArg(() => parser.addOption('flummox', abbr: 'flu')); | 
| }); | 
| + | 
| +    test('throws ArgumentError if the abbreviation is empty', () { | 
| +      var parser = new ArgParser(); | 
| +      throwsIllegalArg(() => parser.addOption('flummox', abbr: '')); | 
| +    }); | 
| + | 
| +    test('throws ArgumentError if the abbreviation is an invalid value', () { | 
| +      var parser = new ArgParser(); | 
| +      for(var name in _INVALID_OPTIONS.where((v) => v != null)) { | 
| +        throwsIllegalArg(() => parser.addOption('flummox', abbr: name)); | 
| +      } | 
| +    }); | 
| + | 
| +    test('throws ArgumentError if the abbreviation is a dash', () { | 
| +      var parser = new ArgParser(); | 
| +      throwsIllegalArg(() => parser.addOption('flummox', abbr: '-')); | 
| +    }); | 
| + | 
| +    test('allows explict null value for "abbr"', () { | 
| +      var parser = new ArgParser(); | 
| +      expect(() => parser.addOption('flummox', abbr: null), returnsNormally); | 
| +    }); | 
| + | 
| +    test('throws ArgumentError if an option name is invalid', () { | 
| +      var parser = new ArgParser(); | 
| + | 
| +      for(var name in _INVALID_OPTIONS) { | 
| +        var reason = '${Error.safeToString(name)} is not valid'; | 
| +        throwsIllegalArg(() => parser.addOption(name), reason: reason); | 
| +      } | 
| +    }); | 
| + | 
| +    test('accepts valid option names', () { | 
| +      var parser = new ArgParser(); | 
| + | 
| +      for(var name in _VALID_OPTIONS) { | 
| +        var reason = '${Error.safeToString(name)} is valid'; | 
| +        expect(() => parser.addOption(name), returnsNormally, reason: reason); | 
| +      } | 
| +    }); | 
| }); | 
|  | 
| group('ArgParser.getDefault()', () { | 
| @@ -155,10 +213,33 @@ main() { | 
| }); | 
| } | 
|  | 
| -throwsIllegalArg(function) { | 
| -  expect(function, throwsArgumentError); | 
| +throwsIllegalArg(function, {String reason: null}) { | 
| +  expect(function, throwsArgumentError, reason: reason); | 
| } | 
|  | 
| throwsFormat(ArgParser parser, List<String> args) { | 
| expect(() => parser.parse(args), throwsFormatException); | 
| } | 
| + | 
| +const _INVALID_OPTIONS = const [ | 
| + ' ', '', '-', '--', '--foo', | 
| + ' with space', | 
| + 'with\ttab', | 
| + 'with\rcarriage\rreturn', | 
| + 'with\nline\nfeed', | 
| + "'singlequotes'", | 
| + '"doublequotes"', | 
| + 'back\\slash', | 
| + 'forward/slash' | 
| +]; | 
| + | 
| +const _VALID_OPTIONS = const [ | 
| + 'a' // one char | 
| + 'contains-dash', | 
| + 'contains_underscore', | 
| + 'ends-with-dash-', | 
| + 'contains--doubledash--', | 
| + '1starts-with-number', | 
| + 'contains-a-1number', | 
| + 'ends-with-a-number8' | 
| +]; | 
|  |