Index: packages/package_config/test/parse_test.dart |
diff --git a/packages/package_config/test/parse_test.dart b/packages/package_config/test/parse_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ed5c2eb79b953b1db93359286c9a69bd141b6b8 |
--- /dev/null |
+++ b/packages/package_config/test/parse_test.dart |
@@ -0,0 +1,167 @@ |
+// 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.parse_test; |
+ |
+import "package:package_config/packages.dart"; |
+import "package:package_config/packages_file.dart" show parse; |
+import "package:package_config/src/packages_impl.dart"; |
+import "package:test/test.dart"; |
+ |
+main() { |
+ var base = Uri.parse("file:///one/two/three/packages.map"); |
+ test("empty", () { |
+ var packages = doParse(emptySample, base); |
+ expect(packages.asMap(), isEmpty); |
+ }); |
+ test("comment only", () { |
+ var packages = doParse(commentOnlySample, base); |
+ expect(packages.asMap(), isEmpty); |
+ }); |
+ test("empty lines only", () { |
+ var packages = doParse(emptyLinesSample, base); |
+ expect(packages.asMap(), isEmpty); |
+ }); |
+ |
+ test("empty lines only", () { |
+ var packages = doParse(emptyLinesSample, base); |
+ expect(packages.asMap(), isEmpty); |
+ }); |
+ |
+ test("single", () { |
+ var packages = doParse(singleRelativeSample, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ }); |
+ |
+ test("single no slash", () { |
+ var packages = doParse(singleRelativeSampleNoSlash, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ }); |
+ |
+ test("single no newline", () { |
+ var packages = doParse(singleRelativeSampleNoNewline, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ }); |
+ |
+ test("single absolute authority", () { |
+ var packages = doParse(singleAbsoluteSample, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(Uri.parse("http://example.com/some/where/bar/baz.dart"))); |
+ }); |
+ |
+ test("single empty path", () { |
+ var packages = doParse(singleEmptyPathSample, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.replace(path: "${base.path}/bar/baz.dart"))); |
+ }); |
+ |
+ test("single absolute path", () { |
+ var packages = doParse(singleAbsolutePathSample, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.replace(path: "/test/bar/baz.dart"))); |
+ }); |
+ |
+ test("multiple", () { |
+ var packages = doParse(multiRelativeSample, base); |
+ expect( |
+ packages.packages.toList()..sort(), equals(["bar", "foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ expect(packages.resolve(Uri.parse("package:bar/foo/baz.dart")), |
+ equals(base.resolve("../test2/").resolve("foo/baz.dart"))); |
+ }); |
+ |
+ test("dot-dot 1", () { |
+ var packages = doParse(singleRelativeSample, base); |
+ expect(packages.packages.toList(), equals(["foo"])); |
+ expect(packages.resolve(Uri.parse("package:foo/qux/../bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ }); |
+ |
+ test("all valid chars can be used in URI segment", () { |
+ var packages = doParse(allValidCharsSample, base); |
+ expect(packages.packages.toList(), equals([allValidChars])); |
+ expect(packages.resolve(Uri.parse("package:$allValidChars/bar/baz.dart")), |
+ equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
+ }); |
+ |
+ test("no invalid chars accepted", () { |
+ var map = {}; |
+ for (int i = 0; i < allValidChars.length; i++) { |
+ map[allValidChars.codeUnitAt(i)] = true; |
+ } |
+ for (int i = 0; i <= 255; i++) { |
+ if (map[i] == true) continue; |
+ var char = new String.fromCharCode(i); |
+ expect(() => doParse("x${char}x:x", null), throws); |
+ } |
+ }); |
+ |
+ test("no escapes", () { |
+ expect(() => doParse("x%41x:x", base), throws); |
+ }); |
+ |
+ test("same name twice", () { |
+ expect(() => doParse(singleRelativeSample * 2, base), throws); |
+ }); |
+ |
+ for (String invalidSample in invalid) { |
+ test("invalid '$invalidSample'", () { |
+ var result; |
+ try { |
+ result = doParse(invalidSample, base); |
+ } on FormatException { |
+ // expected |
+ return; |
+ } |
+ fail("Resolved to $result"); |
+ }); |
+ } |
+} |
+ |
+Packages doParse(String sample, Uri baseUri) { |
+ Map<String, Uri> map = parse(sample.codeUnits, baseUri); |
+ return new MapPackages(map); |
+} |
+ |
+// Valid samples. |
+var emptySample = ""; |
+var commentOnlySample = "# comment only\n"; |
+var emptyLinesSample = "\n\n\r\n"; |
+var singleRelativeSample = "foo:../test/\n"; |
+var singleRelativeSampleNoSlash = "foo:../test\n"; |
+var singleRelativeSampleNoNewline = "foo:../test/"; |
+var singleAbsoluteSample = "foo:http://example.com/some/where/\n"; |
+var singleEmptyPathSample = "foo:\n"; |
+var singleAbsolutePathSample = "foo:/test/\n"; |
+var multiRelativeSample = "foo:../test/\nbar:../test2/\n"; |
+// All valid path segment characters in an URI. |
+var allValidChars = |
+ r"!$&'()*+,-.0123456789;=" |
+ r"@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"; |
+ |
+var allValidCharsSample = "${allValidChars}:../test/\n"; |
+ |
+// Invalid samples. |
+var invalid = [ |
+ ":baz.dart", // empty. |
+ "foobar=baz.dart", // no colon (but an equals, which is not the same) |
+ ".:../test/", // dot segment |
+ "..:../test/", // dot-dot segment |
+ "...:../test/", // dot-dot-dot segment |
+ "foo/bar:../test/", // slash in name |
+ "/foo:../test/", // slash at start of name |
+ "?:../test/", // invalid characters. |
+ "[:../test/", // invalid characters. |
+ "x#:../test/", // invalid characters. |
+]; |