| Index: tests/corelib/uri_test.dart
|
| diff --git a/tests/corelib/uri_test.dart b/tests/corelib/uri_test.dart
|
| index 5c8c1d1b1c6a40f744a3ff69d3aad16da41ede8d..9e4b24f0d61eb96565ba3f72037dbaf9ace985c0 100644
|
| --- a/tests/corelib/uri_test.dart
|
| +++ b/tests/corelib/uri_test.dart
|
| @@ -85,14 +85,42 @@ testEncodeDecodeQueryComponent(String orig,
|
| }
|
|
|
| testUriPerRFCs() {
|
| - final urisSample = "http://a/b/c/d;p?q";
|
| - Uri base = Uri.parse(urisSample);
|
| + // Convert a Uri to a guaranteed "non simple" URI with the same content.
|
| + toComplex(Uri uri) {
|
| + Uri complex = new Uri(
|
| + scheme: uri.scheme,
|
| + userInfo: uri.hasAuthority ? uri.userInfo : null,
|
| + host: uri.hasAuthority ? uri.host : null,
|
| + port: uri.hasAuthority ? uri.port : null,
|
| + path: uri.path,
|
| + query: uri.hasQuery ? uri.query : null,
|
| + fragment: uri.hasFragment ? uri.fragment : null,
|
| + );
|
| + assert(complex.toString() == uri.toString());
|
| + return complex;
|
| + }
|
| +
|
| + Uri base;
|
| + Uri complexBase;
|
| + // Sets the [base] and [complexBase] to the parse of the URI and a
|
| + // guaranteed non-simple version of the same URI.
|
| + setBase(String uri) {
|
| + base = Uri.parse(uri);
|
| + complexBase = toComplex(base);
|
| + }
|
| +
|
| testResolve(expect, relative) {
|
| String name = "$base << $relative";
|
| Expect.stringEquals(expect, base.resolve(relative).toString(), name);
|
| +
|
| + Expect.stringEquals(expect, complexBase.resolve(relative).toString(),
|
| + name + " (complex base)");
|
| }
|
|
|
| // From RFC 3986.
|
| + final urisSample = "http://a/b/c/d;p?q";
|
| + setBase(urisSample);
|
| +
|
| testResolve("g:h", "g:h");
|
| testResolve("http://a/b/c/g", "g");
|
| testResolve("http://a/b/c/g", "./g");
|
| @@ -139,47 +167,66 @@ testUriPerRFCs() {
|
| // Additional tests (not from RFC 3986).
|
| testResolve("http://a/b/g;p/h;s", "../g;p/h;s");
|
|
|
| - base = Uri.parse("s:a/b");
|
| + setBase("s:a/b");
|
| testResolve("s:a/c", "c");
|
| testResolve("s:/c", "../c");
|
|
|
| - base = Uri.parse("S:a/b");
|
| + setBase("S:a/b");
|
| testResolve("s:a/c", "c");
|
| testResolve("s:/c", "../c");
|
|
|
| - base = Uri.parse("s:foo");
|
| + setBase("s:foo");
|
| testResolve("s:bar", "bar");
|
| testResolve("s:bar", "../bar");
|
|
|
| - base = Uri.parse("S:foo");
|
| + setBase("S:foo");
|
| testResolve("s:bar", "bar");
|
| testResolve("s:bar", "../bar");
|
|
|
| // Special-case (deliberate non-RFC behavior).
|
| - base = Uri.parse("foo/bar");
|
| + setBase("foo/bar");
|
| testResolve("foo/baz", "baz");
|
| testResolve("baz", "../baz");
|
|
|
| - base = Uri.parse("s:/foo");
|
| + setBase("s:/foo");
|
| testResolve("s:/bar", "bar");
|
| testResolve("s:/bar", "../bar");
|
|
|
| - base = Uri.parse("S:/foo");
|
| + setBase("S:/foo");
|
| testResolve("s:/bar", "bar");
|
| testResolve("s:/bar", "../bar");
|
|
|
| // Test non-URI base (no scheme, no authority, relative path).
|
| - base = Uri.parse("a/b/c?_#_");
|
| + setBase("a/b/c?_#_");
|
| testResolve("a/b/g?q#f", "g?q#f");
|
| testResolve("./", "../..");
|
| testResolve("../", "../../..");
|
| testResolve("a/b/", ".");
|
| testResolve("c", "../../c"); // Deliberate non-RFC behavior.
|
| - base = Uri.parse("../../a/b/c?_#_"); // Initial ".." in base url.
|
| + setBase("../../a/b/c?_#_"); // Initial ".." in base url.
|
| testResolve("../../a/d", "../d");
|
| + testResolve("../../d", "../../d");
|
| testResolve("../../../d", "../../../d");
|
| -
|
| - base = Uri.parse("s://h/p?q#f"); // A simple base.
|
| + setBase("../../a/b");
|
| + testResolve("../../a/d", "d");
|
| + testResolve("../../d", "../d");
|
| + testResolve("../../../d", "../../d");
|
| + setBase("../../a");
|
| + testResolve("../../d", "d");
|
| + testResolve("../../../d", "../d");
|
| + testResolve("../../../../d", "../../d");
|
| +
|
| + // Absoluyte path, not scheme or authority.
|
| + setBase("/a");
|
| + testResolve("/b", "b");
|
| + testResolve("/b", "../b");
|
| + testResolve("/b", "../../b");
|
| + setBase("/a/b");
|
| + testResolve("/a/c", "c");
|
| + testResolve("/c", "../c");
|
| + testResolve("/c", "../../c");
|
| +
|
| + setBase("s://h/p?q#f"); // A simple base.
|
| // Simple references:
|
| testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
|
| testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
|
| @@ -195,7 +242,7 @@ testUriPerRFCs() {
|
| testResolve("s://h/p?Q#F%20", "?Q#F%20");
|
| testResolve("s://h/p?q#F%20", "#F%20");
|
|
|
| - base = Uri.parse("s://h/p1/p2/p3"); // A simple base with a path.
|
| + setBase("s://h/p1/p2/p3"); // A simple base with a path.
|
| testResolve("s://h/p1/p2/", ".");
|
| testResolve("s://h/p1/p2/", "./");
|
| testResolve("s://h/p1/", "..");
|
| @@ -206,7 +253,7 @@ testUriPerRFCs() {
|
| testResolve("s://h/", "../../../..");
|
| testResolve("s://h/", "../../../../");
|
|
|
| - base = Uri.parse("s://h/p?q#f%20"); // A non-simpe base.
|
| + setBase("s://h/p?q#f%20"); // A non-simpe base.
|
| // Simple references:
|
| testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
|
| testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
|
| @@ -222,7 +269,7 @@ testUriPerRFCs() {
|
| testResolve("s://h/p?Q#F%20", "?Q#F%20");
|
| testResolve("s://h/p?q#F%20", "#F%20");
|
|
|
| - base = Uri.parse("S://h/p1/p2/p3"); // A non-simple base with a path.
|
| + setBase("S://h/p1/p2/p3"); // A non-simple base with a path.
|
| testResolve("s://h/p1/p2/", ".");
|
| testResolve("s://h/p1/p2/", "./");
|
| testResolve("s://h/p1/", "..");
|
| @@ -233,7 +280,7 @@ testUriPerRFCs() {
|
| testResolve("s://h/", "../../../..");
|
| testResolve("s://h/", "../../../../");
|
|
|
| - base = Uri.parse("../../../"); // A simple relative path.
|
| + setBase("../../../"); // A simple relative path.
|
| testResolve("../../../a", "a");
|
| testResolve("../../../../a", "../a");
|
| testResolve("../../../a%20", "a%20");
|
| @@ -242,8 +289,7 @@ testUriPerRFCs() {
|
| // Tests covering the branches of the merge algorithm in RFC 3986
|
| // with both simple and complex base URIs.
|
| for (var b in ["s://a/pa/pb?q#f", "s://a/pa/pb?q#f%20"]) {
|
| - var origBase = Uri.parse(b);
|
| - base = origBase;
|
| + setBase(b);
|
|
|
| // if defined(R.scheme) then ...
|
| testResolve("s2://a2/p2?q2#f2", "s2://a2/p2?q2#f2");
|
| @@ -271,40 +317,40 @@ testUriPerRFCs() {
|
| // (Cover the merge function and the remove-dot-fragments functions too).
|
|
|
| // If base has authority and empty path ...
|
| - var emptyPathBase = Uri.parse(b.replaceFirst("/pa/pb", ""));
|
| - base = emptyPathBase;
|
| + var emptyPathBase = b.replaceFirst("/pa/pb", "");
|
| + setBase(emptyPathBase);
|
| testResolve("s://a/p2?q2#f2", "p2?q2#f2");
|
| testResolve("s://a/p2#f2", "p2#f2");
|
| testResolve("s://a/p2", "p2");
|
|
|
| - base = origBase;
|
| + setBase(b);
|
| // otherwise
|
| // (Cover both no authority and non-empty path and both).
|
| - var noAuthEmptyPathBase = Uri.parse(b.replaceFirst("//a/pa/pb", ""));
|
| - var noAuthAbsPathBase = Uri.parse(b.replaceFirst("//a", ""));
|
| - var noAuthRelPathBase = Uri.parse(b.replaceFirst("//a/", ""));
|
| - var noAuthRelSinglePathBase = Uri.parse(b.replaceFirst("//a/pa/", ""));
|
| + var noAuthEmptyPathBase = b.replaceFirst("//a/pa/pb", "");
|
| + var noAuthAbsPathBase = b.replaceFirst("//a", "");
|
| + var noAuthRelPathBase = b.replaceFirst("//a/", "");
|
| + var noAuthRelSinglePathBase = b.replaceFirst("//a/pa/", "");
|
|
|
| testResolve("s://a/pa/p2?q2#f2", "p2?q2#f2");
|
| testResolve("s://a/pa/p2#f2", "p2#f2");
|
| testResolve("s://a/pa/p2", "p2");
|
|
|
| - base = noAuthEmptyPathBase;
|
| + setBase(noAuthEmptyPathBase);
|
| testResolve("s:p2?q2#f2", "p2?q2#f2");
|
| testResolve("s:p2#f2", "p2#f2");
|
| testResolve("s:p2", "p2");
|
|
|
| - base = noAuthAbsPathBase;
|
| + setBase(noAuthAbsPathBase);
|
| testResolve("s:/pa/p2?q2#f2", "p2?q2#f2");
|
| testResolve("s:/pa/p2#f2", "p2#f2");
|
| testResolve("s:/pa/p2", "p2");
|
|
|
| - base = noAuthRelPathBase;
|
| + setBase(noAuthRelPathBase);
|
| testResolve("s:pa/p2?q2#f2", "p2?q2#f2");
|
| testResolve("s:pa/p2#f2", "p2#f2");
|
| testResolve("s:pa/p2", "p2");
|
|
|
| - base = noAuthRelSinglePathBase;
|
| + setBase(noAuthRelSinglePathBase);
|
| testResolve("s:p2?q2#f2", "p2?q2#f2");
|
| testResolve("s:p2#f2", "p2#f2");
|
| testResolve("s:p2", "p2");
|
| @@ -314,7 +360,7 @@ testUriPerRFCs() {
|
| // A. if input buffer starts with "../" or "./".
|
| // This only happens if base has only a single (may be empty) segment and
|
| // no slash.
|
| - base = emptyPathBase;
|
| + setBase(emptyPathBase);
|
| testResolve("s://a/p2", "../p2");
|
| testResolve("s://a/", "../");
|
| testResolve("s://a/", "..");
|
| @@ -324,7 +370,7 @@ testUriPerRFCs() {
|
| testResolve("s://a/p2", "../../p2");
|
| testResolve("s://a/p2", "../../././p2");
|
|
|
| - base = noAuthRelSinglePathBase;
|
| + setBase(noAuthRelSinglePathBase);
|
| testResolve("s:p2", "../p2");
|
| testResolve("s:", "../");
|
| testResolve("s:", "..");
|
| @@ -337,31 +383,30 @@ testUriPerRFCs() {
|
| // B. if input buffer starts with "/./" or is "/.". replace with "/".
|
| // (The URI implementation removes the "." path segments when parsing,
|
| // so this case isn't handled by merge).
|
| - base = origBase;
|
| + setBase(b);
|
| testResolve("s://a/pa/p2", "./p2");
|
|
|
| // C. if input buffer starts with "/../" or is "/..", replace with "/"
|
| // and remove preceeding segment.
|
| testResolve("s://a/p2", "../p2");
|
| - var longPathBase = Uri.parse(b.replaceFirst("/pb", "/pb/pc/pd"));
|
| - base = longPathBase;
|
| + var longPathBase = b.replaceFirst("/pb", "/pb/pc/pd");
|
| + setBase(longPathBase);
|
| testResolve("s://a/pa/pb/p2", "../p2");
|
| testResolve("s://a/pa/p2", "../../p2");
|
| testResolve("s://a/p2", "../../../p2");
|
| testResolve("s://a/p2", "../../../../p2");
|
| - var noAuthRelLongPathBase =
|
| - Uri.parse(b.replaceFirst("//a/pa/pb", "pa/pb/pc/pd"));
|
| - base = noAuthRelLongPathBase;
|
| + var noAuthRelLongPathBase = b.replaceFirst("//a/pa/pb", "pa/pb/pc/pd");
|
| + setBase(noAuthRelLongPathBase);
|
| testResolve("s:pa/pb/p2", "../p2");
|
| testResolve("s:pa/p2", "../../p2");
|
| testResolve("s:/p2", "../../../p2");
|
| testResolve("s:/p2", "../../../../p2");
|
|
|
| // D. if the input buffer contains only ".." or ".", remove it.
|
| - base = noAuthEmptyPathBase;
|
| + setBase(noAuthEmptyPathBase);
|
| testResolve("s:", "..");
|
| testResolve("s:", ".");
|
| - base = noAuthRelSinglePathBase;
|
| + setBase(noAuthRelSinglePathBase);
|
| testResolve("s:", "..");
|
| testResolve("s:", ".");
|
| }
|
|
|