Validate imports/exports in benchmark and example dirs

Just like test and tool
Also expanded and generalized these tests

Closes https://github.com/dart-lang/pub/issues/1537
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 259d228..6dcc5f4 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -819,12 +819,6 @@
 /// This will report the error and cause pub to exit with [exit_codes.DATA].
 void dataError(String message) => throw new DataException(message);
 
-/// Returns an iterable that contains the elements of [iter1] followed by those
-/// of [iter2].
-Iterable/*<T>*/ combineIterables/*<T>*/(
-        Iterable/*<T>*/ iter1, Iterable/*<T>*/ iter2) =>
-    iter1.toList()..addAll(iter2);
-
 /// Returns a UUID in v4 format as a `String`.
 ///
 /// If [bytes] is provided, it must be length 16 and have values between `0` and
diff --git a/lib/src/validator/strict_dependencies.dart b/lib/src/validator/strict_dependencies.dart
index 71647be..3259bb8 100644
--- a/lib/src/validator/strict_dependencies.dart
+++ b/lib/src/validator/strict_dependencies.dart
@@ -66,7 +66,7 @@
     var devDependencies =
         entrypoint.root.devDependencies.map((d) => d.name).toSet();
     _validateLibBin(dependencies, devDependencies);
-    _validateTestTool(dependencies, devDependencies);
+    _validateBenchmarkExampleTestTool(dependencies, devDependencies);
   }
 
   /// Validates that no Dart files in `lib/` or `bin/` have dependencies that
@@ -75,9 +75,7 @@
   /// The [devDeps] are used to generate special warnings for files that import
   /// dev dependencies.
   void _validateLibBin(Set<String> deps, Set<String> devDeps) {
-    var libFiles = entrypoint.root.listFiles(beneath: 'lib').where(_isDart);
-    var binFiles = entrypoint.root.listFiles(beneath: 'bin').where(_isDart);
-    for (var usage in _findPackages(combineIterables(libFiles, binFiles))) {
+    for (var usage in _usagesBeneath(['lib', 'bin'])) {
       if (!deps.contains(usage.package)) {
         if (devDeps.contains(usage.package)) {
           warnings.add(usage.dependencyMisplaceMessage());
@@ -88,20 +86,22 @@
     }
   }
 
-  /// Validates that no Dart files in `test/` or `tool/` have dependencies that
-  /// aren't in [deps] or [devDeps].
-  void _validateTestTool(Set<String> deps, Set<String> devDeps) {
-    var testFiles = entrypoint.root.listFiles(beneath: 'test').where(_isDart);
-    var toolFiles = entrypoint.root.listFiles(beneath: 'tool').where(_isDart);
-    for (var usage in _findPackages(combineIterables(testFiles, toolFiles))) {
+  /// Validates that no Dart files in `benchmark/`, `example/, `test/` or
+  /// `tool/` have dependencies that aren't in [deps] or [devDeps].
+  void _validateBenchmarkExampleTestTool(
+      Set<String> deps, Set<String> devDeps) {
+    for (var usage
+        in _usagesBeneath(['benchmark', 'example', 'test', 'tool'])) {
       if (!deps.contains(usage.package) && !devDeps.contains(usage.package)) {
         warnings.add(usage.dependencyMissingMessage());
       }
     }
   }
 
-  /// Returns whether [file] is a Dart file.
-  bool _isDart(String file) => p.extension(file) == '.dart';
+  Iterable<_Usage> _usagesBeneath(List<String> paths) => _findPackages(paths
+      .map((path) => entrypoint.root.listFiles(beneath: path))
+      .expand((files) => files)
+      .where((String file) => p.extension(file) == '.dart'));
 }
 
 /// A parsed import or export directive in a D source file.
diff --git a/test/validator/strict_dependencies_test.dart b/test/validator/strict_dependencies_test.dart
index 08a5109..a156687 100644
--- a/test/validator/strict_dependencies_test.dart
+++ b/test/validator/strict_dependencies_test.dart
@@ -69,37 +69,37 @@
       expectNoValidationError(strictDeps);
     });
 
-    integration('declares an "import" as a dev dependency in test/', () {
-      d.dir(appPath, [
-        d.libPubspec("test_pkg", "1.0.0",
-            devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
-        d.dir('test', [
-          d.file(
-              'library.dart',
-              r'''
-            import 'package:silly_monkey/silly_monkey.dart';
+    for (var port in ['import', 'export']) {
+      for (var isDev in [false, true]) {
+        var deps;
+        var devDeps;
+
+        if (isDev) {
+          devDeps = {"silly_monkey": "^1.2.3"};
+        } else {
+          deps = {"silly_monkey": "^1.2.3"};
+        }
+        for (var devDir in ['benchmark', 'example', 'test', 'tool']) {
+          integration(
+              'declares an "$port" as a '
+              '${isDev ? 'dev ': ''}dependency in $devDir/', () {
+            d.dir(appPath, [
+              d.libPubspec("test_pkg", "1.0.0",
+                  deps: deps, devDeps: devDeps, sdk: ">=1.8.0 <2.0.0"),
+              d.dir(devDir, [
+                d.file(
+                    'library.dart',
+                    '''
+            $port 'package:silly_monkey/silly_monkey.dart';
           '''),
-        ]),
-      ]).create();
+              ]),
+            ]).create();
 
-      expectNoValidationError(strictDeps);
-    });
-
-    integration('declares an "import" as a dev dependency in tool/', () {
-      d.dir(appPath, [
-        d.libPubspec("test_pkg", "1.0.0",
-            devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
-        d.dir('tool', [
-          d.file(
-              'library.dart',
-              r'''
-            import 'package:silly_monkey/silly_monkey.dart';
-          '''),
-        ]),
-      ]).create();
-
-      expectNoValidationError(strictDeps);
-    });
+            expectNoValidationError(strictDeps);
+          });
+        }
+      }
+    }
 
     integration('only uses dart: dependencies (not pub packages)', () {
       d
@@ -227,37 +227,45 @@
       expectValidationWarning(strictDeps);
     });
 
-    integration('declares an "import" as a devDependency for lib/', () {
-      d.dir(appPath, [
-        d.libPubspec("test_pkg", "1.0.0",
-            devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
-        d.dir('lib', [
-          d.file(
-              'library.dart',
-              r'''
-            import 'package:silly_monkey/silly_monkey.dart';
+    for (var port in ['import', 'export']) {
+      for (var codeDir in ['bin', 'lib']) {
+        integration('declares an "$port" as a devDependency for $codeDir/', () {
+          d.dir(appPath, [
+            d.libPubspec("test_pkg", "1.0.0",
+                devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
+            d.dir(codeDir, [
+              d.file(
+                  'library.dart',
+                  '''
+            $port 'package:silly_monkey/silly_monkey.dart';
           '''),
-        ]),
-      ]).create();
+            ]),
+          ]).create();
 
-      expectValidationWarning(strictDeps);
-    });
+          expectValidationWarning(strictDeps);
+        });
+      }
+    }
 
-    integration('declares an "import" as a devDependency for bin/', () {
-      d.dir(appPath, [
-        d.libPubspec("test_pkg", "1.0.0",
-            devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
-        d.dir('bin', [
-          d.file(
-              'library.dart',
-              r'''
-            import 'package:silly_monkey/silly_monkey.dart';
+    for (var port in ['import', 'export']) {
+      for (var devDir in ['benchmark', 'example', 'test', 'tool']) {
+        integration('does not declare an "$port" as a dependency in $devDir/',
+            () {
+          d.dir(appPath, [
+            d.libPubspec("test_pkg", "1.0.0", sdk: ">=1.8.0 <2.0.0"),
+            d.dir(devDir, [
+              d.file(
+                  'library.dart',
+                  '''
+            $port 'package:silly_monkey/silly_monkey.dart';
           '''),
-        ]),
-      ]).create();
+            ]),
+          ]).create();
 
-      expectValidationWarning(strictDeps);
-    });
+          expectValidationWarning(strictDeps);
+        });
+      }
+    }
 
     group('declares an import with an invalid package URL: ', () {
       integration('"package:"', () {