Fix addMultiOption() and addOption(allowMultiple) usage (#94)

We were printing the option list, with square brackets, even for
options that didn't have a default.

Fixes dart-lang/test#774.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 20eba1f..0ab3399 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.4.1
+
+* Fix the way default values for multi-valued options are printed in argument
+  usage.
+
 ## 1.4.0
 
 * Deprecated `OptionType.FLAG`, `OptionType.SINGLE`, and `OptionType.MULTIPLE`
diff --git a/lib/src/usage.dart b/lib/src/usage.dart
index 85edcac..3ce6d6b 100644
--- a/lib/src/usage.dart
+++ b/lib/src/usage.dart
@@ -88,10 +88,20 @@
         newline();
       } else if (option.allowed != null) {
         write(2, buildAllowedList(option));
-      } else if (option.defaultsTo != null) {
-        if (option.isFlag && option.defaultsTo == true) {
+      } else if (option.isFlag) {
+        if (option.defaultsTo == true) {
           write(2, '(defaults to on)');
-        } else if (!option.isFlag) {
+        }
+      } else if (option.isMultiple) {
+        if (option.defaultsTo != null && option.defaultsTo.isNotEmpty) {
+          write(
+              2,
+              '(defaults to ' +
+                  option.defaultsTo.map((value) => '"$value"').join(', ') +
+                  ')');
+        }
+      } else {
+        if (option.defaultsTo != null) {
           write(2, '(defaults to "${option.defaultsTo}")');
         }
       }
@@ -217,13 +227,17 @@
   }
 
   String buildAllowedList(Option option) {
+    var isDefault = option.defaultsTo is List
+        ? option.defaultsTo.contains
+        : (value) => value == option.defaultsTo;
+
     var allowedBuffer = new StringBuffer();
     allowedBuffer.write('[');
-    bool first = true;
+    var first = true;
     for (var allowed in option.allowed) {
       if (!first) allowedBuffer.write(', ');
       allowedBuffer.write(allowed);
-      if (allowed == option.defaultsTo) {
+      if (isDefault(allowed)) {
         allowedBuffer.write(' (default)');
       }
       first = false;
diff --git a/pubspec.yaml b/pubspec.yaml
index c476bc3..b733152 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 1.4.0
+version: 1.4.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/args
 description: >
diff --git a/test/usage_test.dart b/test/usage_test.dart
index cef3a16..ef0b01a 100644
--- a/test/usage_test.dart
+++ b/test/usage_test.dart
@@ -91,22 +91,63 @@
       var parser = new ArgParser();
       parser.addFlag('affirm', help: 'Should be on', defaultsTo: true);
       parser.addFlag('negate', help: 'Should be off', defaultsTo: false);
+      parser.addFlag('null', help: 'Should be null', defaultsTo: null);
 
       validateUsage(parser, '''
           --[no-]affirm    Should be on
                            (defaults to on)
 
           --[no-]negate    Should be off
+          --[no-]null      Should be null
           ''');
     });
 
     test('the default value for an option with no allowed list is shown', () {
       var parser = new ArgParser();
-      parser.addOption('any', help: 'Can be anything', defaultsTo: 'whatevs');
+      parser.addOption('single',
+          help: 'Can be anything', defaultsTo: 'whatevs');
+      parser.addMultiOption('multiple',
+          help: 'Can be anything', defaultsTo: ['whatevs']);
+      parser.addOption('allow-multi',
+          help: 'Can be anything', defaultsTo: 'whatevs', allowMultiple: true);
+
+      validateUsage(parser, '''
+          --single         Can be anything
+                           (defaults to "whatevs")
+
+          --multiple       Can be anything
+                           (defaults to "whatevs")
+
+          --allow-multi    Can be anything
+                           (defaults to "whatevs")
+          ''');
+    });
+
+    test('multiple default values for an option with no allowed list are shown',
+        () {
+      var parser = new ArgParser();
+      parser.addMultiOption('any',
+          help: 'Can be anything', defaultsTo: ['some', 'stuff']);
 
       validateUsage(parser, '''
           --any    Can be anything
-                   (defaults to "whatevs")
+                   (defaults to "some", "stuff")
+          ''');
+    });
+
+    test('no default values are shown for a multi option with an empty default',
+        () {
+      var parser = new ArgParser();
+      parser.addMultiOption('implicit', help: 'Implicit default');
+      parser
+          .addMultiOption('explicit', help: 'Explicit default', defaultsTo: []);
+      parser.addOption('allow-multi',
+          help: 'Implicit with allowMultiple', allowMultiple: true);
+
+      validateUsage(parser, '''
+          --implicit       Implicit default
+          --explicit       Explicit default
+          --allow-multi    Implicit with allowMultiple
           ''');
     });
 
@@ -145,6 +186,19 @@
           ''');
     });
 
+    test('multiple defaults are highlighted in the allowed list', () {
+      var parser = new ArgParser();
+      parser.addMultiOption('suit',
+          help: 'Like in cards',
+          defaultsTo: ['clubs', 'diamonds'],
+          allowed: ['spades', 'clubs', 'hearts', 'diamonds']);
+
+      validateUsage(parser, '''
+          --suit    Like in cards
+                    [spades, clubs (default), hearts, diamonds (default)]
+          ''');
+    });
+
     test('the allowed help is shown', () {
       var parser = new ArgParser();
       parser.addOption('suit',