Add slash to package dir URI after resolving reference against base.

Used to add slash to reference before resolving it.
It only makes a difference for the empty URI reference which
never makes sense anyway - this just ensures the error is the same
as on the VM. It is, arguably, what the specification requires.

R=sgjesse@google.com

Review URL: https://codereview.chromium.org//1297923004.
diff --git a/lib/packages_file.dart b/lib/packages_file.dart
index 3f432aa..f30781d 100644
--- a/lib/packages_file.dart
+++ b/lib/packages_file.dart
@@ -57,11 +57,11 @@
     }
     var packageUri = new String.fromCharCodes(source, separatorIndex + 1, end);
     var packageLocation = Uri.parse(packageUri);
+    packageLocation = baseLocation.resolveUri(packageLocation);
     if (!packageLocation.path.endsWith('/')) {
       packageLocation =
           packageLocation.replace(path: packageLocation.path + "/");
     }
-    packageLocation = baseLocation.resolveUri(packageLocation);
     if (result.containsKey(packageName)) {
       throw new FormatException(
           "Same package name occured twice.", source, start);
diff --git a/test/parse_test.dart b/test/parse_test.dart
index 6f830a1..8ed5c2e 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -50,13 +50,27 @@
         equals(base.resolve("../test/").resolve("bar/baz.dart")));
   });
 
-  test("single absolute", () {
+  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(
@@ -121,14 +135,16 @@
 }
 
 // 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 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 multiRelativeSample = "foo:../test/\nbar:../test2/\n";
+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;="