| // Copyright (c) 2019, 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 'dart:io' show Directory, File, FileSystemEntity; | 
 |  | 
 | import 'package:testing/testing.dart' | 
 |     show Chain, FileBasedTestDescription, TestDescription, runMe; | 
 |  | 
 | import 'spelling_test_base.dart' show SpellContext; | 
 |  | 
 | import 'spell_checking_utils.dart' as spell; | 
 |  | 
 | import 'testing_utils.dart' show checkEnvironment; | 
 |  | 
 | void main([List<String> arguments = const []]) => | 
 |     runMe(arguments, createContext, configurationPath: "../testing.json"); | 
 |  | 
 | Future<SpellContext> createContext( | 
 |     Chain suite, Map<String, String> environment) async { | 
 |   const Set<String> knownEnvironmentKeys = {"interactive", "onlyInGit"}; | 
 |   checkEnvironment(environment, knownEnvironmentKeys); | 
 |  | 
 |   bool interactive = environment["interactive"] == "true"; | 
 |   bool onlyInGit = environment["onlyInGit"] != "false"; | 
 |   return new SpellContextExternal( | 
 |       interactive: interactive, onlyInGit: onlyInGit); | 
 | } | 
 |  | 
 | class SpellContextExternal extends SpellContext { | 
 |   SpellContextExternal({required bool interactive, required bool onlyInGit}) | 
 |       : super(interactive: interactive, onlyInGit: onlyInGit); | 
 |  | 
 |   @override | 
 |   List<spell.Dictionaries> get dictionaries => const <spell.Dictionaries>[]; | 
 |  | 
 |   @override | 
 |   bool get onlyDenylisted => true; | 
 |  | 
 |   @override | 
 |   String get repoRelativeSuitePath => | 
 |       "pkg/front_end/test/spelling_test_external_targets.dart"; | 
 |  | 
 |   @override | 
 |   Stream<TestDescription> list(Chain suite) async* { | 
 |     for (String subdir in const ["pkg/", "sdk/"]) { | 
 |       Directory testRoot = new Directory.fromUri(suite.uri.resolve(subdir)); | 
 |       if (await testRoot.exists()) { | 
 |         Stream<FileSystemEntity> files = | 
 |             testRoot.list(recursive: true, followLinks: false); | 
 |         await for (FileSystemEntity entity in files) { | 
 |           if (entity is! File) continue; | 
 |           String path = entity.uri.path; | 
 |           if (suite.exclude.any((RegExp r) => path.contains(r))) continue; | 
 |           if (suite.pattern.any((RegExp r) => path.contains(r))) { | 
 |             yield new FileBasedTestDescription(suite.uri, entity); | 
 |           } | 
 |         } | 
 |       } else { | 
 |         throw "${suite.uri} isn't a directory"; | 
 |       } | 
 |     } | 
 |   } | 
 | } |