// Copyright (c) 2024, 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'; import 'model.dart'; /// Returns the [DynamicModuleTest] associated with a folder under [uri]. DynamicModuleTest loadTest(Uri uri) { var folder = Directory.fromUri(uri); var testUri = folder.uri; // normalized in case the trailing '/' was missing. final name = testUri.pathSegments.lastWhere((s) => s.isNotEmpty); String? main; String? interface; final dynamicModules = {}; for (var entry in folder.listSync(recursive: true)) { var entryUri = entry.uri; if (entry is! File) continue; var filePath = entryUri.path.substring(testUri.path.length); if (filePath == 'dynamic_interface.yaml') { interface = filePath; continue; } if (!filePath.endsWith('.dart')) continue; if (filePath == 'main.dart') { main = filePath; } else if (filePath.startsWith('modules/entry')) { var moduleName = filePath.substring('modules/'.length); assert(!dynamicModules.containsKey(moduleName)); dynamicModules[moduleName] = filePath; } } // Validate the test is well structured if (main == null) { throw UnsupportedError("missing main.dart entrypoint in '$name'"); } if (interface == null) { throw UnsupportedError("missing dynamic_interface.yaml in '$name'"); } if (dynamicModules.isEmpty) { throw UnsupportedError("no dynamic modules found in '$name'"); } return DynamicModuleTest(name, testUri, main, interface, dynamicModules); } /// Returns all [DynamicModuleTests]s under [uri], one per subfolder. List loadAllTests(Uri uri) { var folder = Directory.fromUri(uri); final result = []; for (var entry in folder.listSync(recursive: false)) { if (entry is! Directory) continue; result.add(loadTest(entry.uri)); } return result; }