| Index: packages/package_config/test/discovery_analysis_test.dart
|
| diff --git a/packages/package_config/test/discovery_analysis_test.dart b/packages/package_config/test/discovery_analysis_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f33a4a8c61030becf228e7e5bd9dcae05b4653c7
|
| --- /dev/null
|
| +++ b/packages/package_config/test/discovery_analysis_test.dart
|
| @@ -0,0 +1,124 @@
|
| +// Copyright (c) 2015, 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.
|
| +
|
| +library package_config.discovery_analysis_test;
|
| +
|
| +import "dart:async";
|
| +import "dart:io";
|
| +
|
| +import "package:package_config/discovery_analysis.dart";
|
| +import "package:package_config/packages.dart";
|
| +import "package:path/path.dart" as path;
|
| +import "package:test/test.dart";
|
| +
|
| +main() {
|
| + fileTest("basic",
|
| + {".packages": packagesFile,
|
| + "foo": {".packages": packagesFile},
|
| + "bar": {"packages": {"foo": {}, "bar":{}, "baz": {}}},
|
| + "baz": {}},
|
| + (Directory directory) {
|
| + var dirUri = new Uri.directory(directory.path);
|
| + PackageContext ctx = PackageContext.findAll(directory);
|
| + PackageContext root = ctx[directory];
|
| + expect(root, same(ctx));
|
| + validatePackagesFile(root.packages, dirUri);
|
| + var fooDir = sub(directory, "foo");
|
| + PackageContext foo = ctx[fooDir];
|
| + expect(identical(root, foo), isFalse);
|
| + validatePackagesFile(foo.packages, dirUri.resolve("foo/"));
|
| + var barDir = sub(directory, "bar");
|
| + PackageContext bar = ctx[sub(directory, "bar")];
|
| + validatePackagesDir(bar.packages, dirUri.resolve("bar/"));
|
| + PackageContext barbar = ctx[sub(barDir, "bar")];
|
| + expect(barbar, same(bar)); // inherited.
|
| + PackageContext baz = ctx[sub(directory, "baz")];
|
| + expect(baz, same(root)); // inherited.
|
| +
|
| + var map = ctx.asMap();
|
| + expect(map.keys.map((dir) => dir.path),
|
| + unorderedEquals([directory.path, fooDir.path, barDir.path]));
|
| + });
|
| +}
|
| +
|
| +Directory sub(Directory parent, String dirName) {
|
| + return new Directory(path.join(parent.path, dirName));
|
| +}
|
| +
|
| +const packagesFile = """
|
| +# A comment
|
| +foo:file:///dart/packages/foo/
|
| +bar:http://example.com/dart/packages/bar/
|
| +baz:packages/baz/
|
| +""";
|
| +
|
| +void validatePackagesFile(Packages resolver, Uri location) {
|
| + expect(resolver, isNotNull);
|
| + expect(resolver.resolve(pkg("foo", "bar/baz")),
|
| + equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
|
| + expect(resolver.resolve(pkg("bar", "baz/qux")),
|
| + equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
|
| + expect(resolver.resolve(pkg("baz", "qux/foo")),
|
| + equals(location.resolve("packages/baz/qux/foo")));
|
| + expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
|
| +}
|
| +
|
| +void validatePackagesDir(Packages resolver, Uri location) {
|
| + // Expect three packages: foo, bar and baz
|
| + expect(resolver, isNotNull);
|
| + expect(resolver.resolve(pkg("foo", "bar/baz")),
|
| + equals(location.resolve("packages/foo/bar/baz")));
|
| + expect(resolver.resolve(pkg("bar", "baz/qux")),
|
| + equals(location.resolve("packages/bar/baz/qux")));
|
| + expect(resolver.resolve(pkg("baz", "qux/foo")),
|
| + equals(location.resolve("packages/baz/qux/foo")));
|
| + if (location.scheme == "file") {
|
| + expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
|
| + } else {
|
| + expect(() => resolver.packages, throws);
|
| + }
|
| +}
|
| +
|
| +Uri pkg(String packageName, String packagePath) {
|
| + var path;
|
| + if (packagePath.startsWith('/')) {
|
| + path = "$packageName$packagePath";
|
| + } else {
|
| + path = "$packageName/$packagePath";
|
| + }
|
| + return new Uri(scheme: "package", path: path);
|
| +}
|
| +
|
| +/// Create a directory structure from [description] and run [fileTest].
|
| +///
|
| +/// Description is a map, each key is a file entry. If the value is a map,
|
| +/// it's a sub-dir, otherwise it's a file and the value is the content
|
| +/// as a string.
|
| +void fileTest(String name,
|
| + Map description,
|
| + Future fileTest(Directory directory)) {
|
| + group("file-test", () {
|
| + Directory tempDir = Directory.systemTemp.createTempSync("file-test");
|
| + setUp(() {
|
| + _createFiles(tempDir, description);
|
| + });
|
| + tearDown(() {
|
| + tempDir.deleteSync(recursive: true);
|
| + });
|
| + test(name, () => fileTest(tempDir));
|
| + });
|
| +}
|
| +
|
| +void _createFiles(Directory target, Map description) {
|
| + description.forEach((name, content) {
|
| + if (content is Map) {
|
| + Directory subDir = new Directory(path.join(target.path, name));
|
| + subDir.createSync();
|
| + _createFiles(subDir, content);
|
| + } else {
|
| + File file = new File(path.join(target.path, name));
|
| + file.writeAsStringSync(content, flush: true);
|
| + }
|
| + });
|
| +}
|
|
|