Transform dartdoc_test into an integration test (#1694)

* Fix bug where --version didn't do anything

* Review comments

* Rebuild test package docs for retype deprecation in dev.55

* dartdoc_test as full integration test now

* Eliminate unused initializer and update pubspec
diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart
index 9814648..2b76997 100644
--- a/bin/dartdoc.dart
+++ b/bin/dartdoc.dart
@@ -13,8 +13,8 @@
 import 'package:dartdoc/src/logging.dart';
 import 'package:stack_trace/stack_trace.dart';
 
-class DartdocProgramOptionContext extends DartdocOptionContext
-    with LoggingContext, GeneratorContext {
+class DartdocProgramOptionContext extends DartdocGeneratorOptionContext
+    with LoggingContext {
   DartdocProgramOptionContext(DartdocOptionSet optionSet, Directory dir)
       : super(optionSet, dir);
 
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index 66bb355..df2e0ba 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -39,6 +39,14 @@
 // Update when pubspec version changes.
 const String dartdocVersion = '0.19.1-dev';
 
+/// Helper class to initialize the default generators since they require
+/// GeneratorContext.
+class DartdocGeneratorOptionContext extends DartdocOptionContext
+    with GeneratorContext {
+  DartdocGeneratorOptionContext(DartdocOptionSet optionSet, Directory dir)
+      : super(optionSet, dir);
+}
+
 /// Generates Dart documentation for all public Dart libraries in the given
 /// directory.
 class Dartdoc extends PackageBuilder {
@@ -57,9 +65,9 @@
 
   /// An asynchronous factory method that builds Dartdoc's file writers
   /// and returns a Dartdoc object with them.
-  static withDefaultGenerators(DartdocOptionContext config) async {
+  static withDefaultGenerators(DartdocGeneratorOptionContext config) async {
     List<Generator> generators =
-        await initGenerators(config as GeneratorContext);
+        await initGenerators(config);
     return new Dartdoc._(config, generators);
   }
 
@@ -294,7 +302,7 @@
     // The package index isn't supposed to be in the search, so suppress the
     // warning.
     found.add(indexPath);
-    for (Map<String, String> entry in jsonData) {
+    for (Map<String, dynamic> entry in jsonData) {
       if (entry.containsKey('href')) {
         String entryPath = pathLib.joinAll([origin, entry['href']]);
         if (!visited.contains(entryPath)) {
diff --git a/lib/src/model.dart b/lib/src/model.dart
index 3e4c982..ffb2aef 100644
--- a/lib/src/model.dart
+++ b/lib/src/model.dart
@@ -1320,7 +1320,7 @@
   }
 
   @override
-  List<EnumField> get documentationFrom {
+  List<ModelElement> get documentationFrom {
     if (name == 'values' && name == 'index') return [this];
     return super.documentationFrom;
   }
diff --git a/pubspec.lock b/pubspec.lock
index 00dac62..9f4ceba 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -105,7 +105,7 @@
       name: grinder
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.8.1"
+    version: "0.8.2"
   html:
     dependency: "direct main"
     description:
@@ -203,7 +203,7 @@
       name: mustache4dart
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   node_preamble:
     dependency: transitive
     description:
@@ -401,4 +401,4 @@
     source: hosted
     version: "2.1.13"
 sdks:
-  dart: ">=2.0.0-dev.23.0 <=2.0.0-dev.54.0"
+  dart: ">=2.0.0-dev.23.0 <=2.0.0-dev.55.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index ac12668..ecbab4f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -17,7 +17,7 @@
   http_parser: '>=3.0.3 <4.0.0'
   logging: ^0.11.3+1
   markdown: ^2.0.0
-  mustache4dart: ^2.1.1
+  mustache4dart: ^2.1.2
   package_config: '>=0.1.5 <2.0.0'
   path: ^1.3.0
   pub_semver: ^1.3.7
@@ -28,7 +28,7 @@
   yaml: ^2.1.0
 dev_dependencies:
   dhttpd: ^2.0.0
-  grinder: ^0.8.1
+  grinder: ^0.8.2
   io: ^0.3.0
   http: ^0.11.0
   meta: ^1.0.0
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index 6499e38..f03f0a6 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -16,7 +16,7 @@
 import 'src/utils.dart';
 
 void main() {
-  group('dartdoc without generators', () {
+  group('dartdoc with generators', () {
     Directory tempDir;
     List<String> outputParam;
     setUp(() {
@@ -28,12 +28,12 @@
       delete(tempDir);
     });
 
-    Future<DartdocOptionContext> contextFromArgvTemp(List<String> argv) async {
-      return await contextFromArgv(argv..addAll(outputParam));
+    Future<DartdocGeneratorOptionContext> generatorContextFromArgvTemp(List<String> argv) async {
+      return await generatorContextFromArgv(argv..addAll(outputParam));
     }
 
     test('basic interlinking test', () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(await contextFromArgvTemp(
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(await generatorContextFromArgvTemp(
           ['--input', testPackageDir.path, '--link-to-remote']));
       DartdocResults results = await dartdoc.generateDocs();
       PackageGraph p = results.packageGraph;
@@ -60,10 +60,11 @@
           contains(stringLink));
     });
 
+
     test('generate docs for ${pathLib.basename(testPackageDir.path)} works',
         () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(
-          await contextFromArgvTemp(['--input', testPackageDir.path]));
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(
+          await generatorContextFromArgvTemp(['--input', testPackageDir.path]));
 
       DartdocResults results = await dartdoc.generateDocs();
       expect(results.packageGraph, isNotNull);
@@ -77,8 +78,8 @@
 
     test('generate docs for ${pathLib.basename(testPackageBadDir.path)} fails',
         () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(
-          await contextFromArgvTemp(['--input', testPackageBadDir.path]));
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(
+          await generatorContextFromArgvTemp(['--input', testPackageBadDir.path]));
 
       try {
         await dartdoc.generateDocs();
@@ -89,8 +90,8 @@
     });
 
     test('generate docs for a package that does not have a readme', () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(
-          await contextFromArgvTemp(['--input', testPackageWithNoReadme.path]));
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(
+          await generatorContextFromArgvTemp(['--input', testPackageWithNoReadme.path]));
 
       DartdocResults results = await dartdoc.generateDocs();
       expect(results.packageGraph, isNotNull);
@@ -103,7 +104,7 @@
     });
 
     test('generate docs including a single library', () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(await contextFromArgvTemp(
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(await generatorContextFromArgvTemp(
           ['--input', testPackageDir.path, '--include', 'fake']));
 
       DartdocResults results = await dartdoc.generateDocs();
@@ -117,7 +118,7 @@
     });
 
     test('generate docs excluding a single library', () async {
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(await contextFromArgvTemp(
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(await generatorContextFromArgvTemp(
           ['--input', testPackageDir.path, '--exclude', 'fake']));
 
       DartdocResults results = await dartdoc.generateDocs();
@@ -134,7 +135,7 @@
     test('generate docs for package with embedder yaml', () async {
       PackageMeta meta = new PackageMeta.fromDir(testPackageWithEmbedderYaml);
       if (meta.needsPubGet) meta.runPubGet();
-      Dartdoc dartdoc = new Dartdoc.withoutGenerators(await contextFromArgvTemp(
+      Dartdoc dartdoc = await Dartdoc.withDefaultGenerators(await generatorContextFromArgvTemp(
           ['--input', testPackageWithEmbedderYaml.path]));
 
       DartdocResults results = await dartdoc.generateDocs();
diff --git a/test/src/utils.dart b/test/src/utils.dart
index 482ee9f..993d0c0 100644
--- a/test/src/utils.dart
+++ b/test/src/utils.dart
@@ -8,6 +8,7 @@
 import 'dart:io';
 
 import 'package:dartdoc/dartdoc.dart';
+import 'package:dartdoc/src/html/html_generator.dart';
 import 'package:dartdoc/src/model.dart';
 import 'package:dartdoc/src/package_meta.dart';
 
@@ -25,6 +26,17 @@
 final Directory testPackageWithNoReadme =
     new Directory('testing/test_package_small');
 
+
+/// Convenience factory to build a [DartdocGeneratorOptionContext] and associate
+/// it with a [DartdocOptionSet] based on the current working directory.
+Future<DartdocGeneratorOptionContext> generatorContextFromArgv(List<String> argv) async {
+  DartdocOptionSet optionSet = await DartdocOptionSet
+      .fromOptionGenerators('dartdoc', [createDartdocOptions, createGeneratorOptions]);
+  optionSet.parseArguments(argv);
+  return new DartdocGeneratorOptionContext(optionSet, Directory.current);
+}
+
+
 /// Convenience factory to build a [DartdocOptionContext] and associate it with a
 /// [DartdocOptionSet] based on the current working directory.
 Future<DartdocOptionContext> contextFromArgv(List<String> argv) async {
diff --git a/tool/grind.dart b/tool/grind.dart
index d38f124..2d38b54 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -734,10 +734,7 @@
   // sdk#32901 is really bad on Windows.
   for (File dartFile in testFiles
       .where((f) =>
-          !f.path.endsWith('html_generator_test.dart') && !Platform.isWindows)
-      .where((f) =>
-          // grinder stopped working with preview-dart-2.
-          !f.path.endsWith('grind_test.dart'))) {
+          !f.path.endsWith('html_generator_test.dart') && !Platform.isWindows)) {
     // absolute path to work around dart-lang/sdk#32901
     await testFutures.addFuture(new SubprocessLauncher(
             'dart2-${pathLib.basename(dartFile.absolute.path)}')