// Copyright (c) 2012, 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 uriTest;

import "package:expect/expect.dart";
import 'dart:convert';

testUri(String uriText, bool isAbsolute) {
  var uri = Uri.parse(uriText);

  // Test that parsing a substring works the same as parsing the string.
  String wrapper = "://@[]:/%?#";
  var embeddedUri = Uri.parse(
       "$wrapper$uri$wrapper", wrapper.length, uriText.length + wrapper.length);

  Expect.equals(uri, embeddedUri);
  Expect.equals(isAbsolute, uri.isAbsolute);
  Expect.stringEquals(uriText, uri.toString());

  // Test equals and hashCode members.
  var uri2 = Uri.parse(uriText);
  Expect.equals(uri, uri2);
  Expect.equals(uri.hashCode, uri2.hashCode);

  // Test that removeFragment doesn't change anything else.
  if (uri.hasFragment) {
    Expect.equals(Uri.parse(uriText.substring(0, uriText.indexOf('#'))),
                  uri.removeFragment());
  } else {
    Expect.equals(uri,
                  Uri.parse(uriText + "#fragment").removeFragment());
  }

  // Test uri.replace on uri with fragment
  uri = Uri.parse('http://hello.com/fake#fragment');
  uri = uri.replace(path: "D/E/E");
  Expect.stringEquals('http://hello.com/D/E/E#fragment', uri.toString());
}

testEncodeDecode(String orig, String encoded) {
  var e = Uri.encodeFull(orig);
  Expect.stringEquals(encoded, e);
  var d = Uri.decodeFull(encoded);
  Expect.stringEquals(orig, d);
}

testEncodeDecodeComponent(String orig, String encoded) {
  var e = Uri.encodeComponent(orig);
  Expect.stringEquals(encoded, e);
  var d = Uri.decodeComponent(encoded);
  Expect.stringEquals(orig, d);
}

testEncodeDecodeQueryComponent(String orig,
                               String encodedUTF8,
                               String encodedLatin1,
                               String encodedAscii) {
  var e, d;
  e = Uri.encodeQueryComponent(orig);
  Expect.stringEquals(encodedUTF8, e);
  d = Uri.decodeQueryComponent(encodedUTF8);
  Expect.stringEquals(orig, d);

  e = Uri.encodeQueryComponent(orig, encoding: UTF8);
  Expect.stringEquals(encodedUTF8, e);
  d = Uri.decodeQueryComponent(encodedUTF8, encoding: UTF8);
  Expect.stringEquals(orig, d);

  e = Uri.encodeQueryComponent(orig, encoding: LATIN1);
  Expect.stringEquals(encodedLatin1, e);
  d = Uri.decodeQueryComponent(encodedLatin1, encoding: LATIN1);
  Expect.stringEquals(orig, d);

  if (encodedAscii != null) {
    e = Uri.encodeQueryComponent(orig, encoding: ASCII);
    Expect.stringEquals(encodedAscii, e);
    d = Uri.decodeQueryComponent(encodedAscii, encoding: ASCII);
    Expect.stringEquals(orig, d);
  } else {
    Expect.throws(() => Uri.encodeQueryComponent(orig, encoding: ASCII),
                  (e) => e is ArgumentError);
  }
}

testUriPerRFCs() {
  final urisSample = "http://a/b/c/d;p?q";
  Uri base = Uri.parse(urisSample);
  testResolve(expect, relative) {
    String name = "$base << $relative";
    Expect.stringEquals(expect, base.resolve(relative).toString(), name);
  }

  // From RFC 3986.
  testResolve("g:h",                   "g:h");
  testResolve("http://a/b/c/g",        "g");
  testResolve("http://a/b/c/g",        "./g");
  testResolve("http://a/b/c/g/",       "g/");
  testResolve("http://a/g",            "/g");
  testResolve("http://g",              "//g");
  testResolve("http://a/b/c/d;p?y",    "?y");
  testResolve("http://a/b/c/g?y",      "g?y");
  testResolve("http://a/b/c/d;p?q#s",  "#s");
  testResolve("http://a/b/c/g#s",      "g#s");
  testResolve("http://a/b/c/g?y#s",    "g?y#s");
  testResolve("http://a/b/c/;x",       ";x");
  testResolve("http://a/b/c/g;x",      "g;x");
  testResolve("http://a/b/c/g;x?y#s",  "g;x?y#s");
  testResolve("http://a/b/c/d;p?q",    "");
  testResolve("http://a/b/c/",         ".");
  testResolve("http://a/b/c/",         "./");
  testResolve("http://a/b/",           "..");
  testResolve("http://a/b/",           "../");
  testResolve("http://a/b/g",          "../g");
  testResolve("http://a/",             "../..");
  testResolve("http://a/",             "../../");
  testResolve("http://a/g",            "../../g");
  testResolve("http://a/g",            "../../../g");
  testResolve("http://a/g",            "../../../../g");
  testResolve("http://a/g",            "/./g");
  testResolve("http://a/g",            "/../g");
  testResolve("http://a/b/c/g.",       "g.");
  testResolve("http://a/b/c/.g",       ".g");
  testResolve("http://a/b/c/g..",      "g..");
  testResolve("http://a/b/c/..g",      "..g");
  testResolve("http://a/b/g",          "./../g");
  testResolve("http://a/b/c/g/",       "./g/.");
  testResolve("http://a/b/c/g/h",      "g/./h");
  testResolve("http://a/b/c/h",        "g/../h");
  testResolve("http://a/b/c/g;x=1/y",  "g;x=1/./y");
  testResolve("http://a/b/c/y",        "g;x=1/../y");
  testResolve("http://a/b/c/g?y/./x",  "g?y/./x");
  testResolve("http://a/b/c/g?y/../x", "g?y/../x");
  testResolve("http://a/b/c/g#s/./x",  "g#s/./x");
  testResolve("http://a/b/c/g#s/../x", "g#s/../x");
  testResolve("http:g",                "http:g");

  // Additional tests (not from RFC 3986).
  testResolve("http://a/b/g;p/h;s",    "../g;p/h;s");

  base = Uri.parse("s:a/b");
  testResolve("s:a/c", "c");
  testResolve("s:/c", "../c");

  base = Uri.parse("S:a/b");
  testResolve("s:a/c", "c");
  testResolve("s:/c", "../c");

  base = Uri.parse("s:foo");
  testResolve("s:bar", "bar");
  testResolve("s:bar", "../bar");

  base = Uri.parse("S:foo");
  testResolve("s:bar", "bar");
  testResolve("s:bar", "../bar");

  // Special-case (deliberate non-RFC behavior).
  base = Uri.parse("foo/bar");
  testResolve("foo/baz", "baz");
  testResolve("baz", "../baz");

  base = Uri.parse("s:/foo");
  testResolve("s:/bar", "bar");
  testResolve("s:/bar", "../bar");

  base = Uri.parse("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?_#_");
  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.
  testResolve("../../a/d", "../d");
  testResolve("../../../d", "../../../d");

  base = Uri.parse("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");
  testResolve("s://h/P?Q#F", "/P?Q#F");
  testResolve("s://h/p?Q#F", "?Q#F");
  testResolve("s://h/p?q#F", "#F");
  testResolve("s://h/p?q", "");
  // Non-simple references:
  testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
  testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
  testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
  testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
  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.
  testResolve("s://h/p1/p2/", ".");
  testResolve("s://h/p1/p2/", "./");
  testResolve("s://h/p1/", "..");
  testResolve("s://h/p1/", "../");
  testResolve("s://h/", "../..");
  testResolve("s://h/", "../../");
  testResolve("s://h/p1/%20", "../%20");
  testResolve("s://h/", "../../../..");
  testResolve("s://h/", "../../../../");

  base = Uri.parse("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");
  testResolve("s://h/P?Q#F", "/P?Q#F");
  testResolve("s://h/p?Q#F", "?Q#F");
  testResolve("s://h/p?q#F", "#F");
  testResolve("s://h/p?q", "");
  // Non-simple references:
  testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
  testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
  testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
  testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
  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.
  testResolve("s://h/p1/p2/", ".");
  testResolve("s://h/p1/p2/", "./");
  testResolve("s://h/p1/", "..");
  testResolve("s://h/p1/", "../");
  testResolve("s://h/", "../..");
  testResolve("s://h/", "../../");
  testResolve("s://h/p1/%20", "../%20");
  testResolve("s://h/", "../../../..");
  testResolve("s://h/", "../../../../");

  base = Uri.parse("../../../");  // A simple relative path.
  testResolve("../../../a", "a");
  testResolve("../../../../a", "../a");
  testResolve("../../../a%20", "a%20");
  testResolve("../../../../a%20", "../a%20");

  // 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;

    // if defined(R.scheme) then ...
    testResolve("s2://a2/p2?q2#f2", "s2://a2/p2?q2#f2");
    // else, if defined(R.authority) then ...
    testResolve("s://a2/p2?q2#f2", "//a2/p2?q2#f2");
    testResolve("s://a2/?q2#f2", "//a2/../?q2#f2");
    testResolve("s://a2?q2#f2", "//a2?q2#f2");
    testResolve("s://a2#f2", "//a2#f2");
    testResolve("s://a2", "//a2");
    // else, if (R.path == "") then ...
    //   if defined(R.query) then
    testResolve("s://a/pa/pb?q2#f2", "?q2#f2");
    testResolve("s://a/pa/pb?q2", "?q2");
    //   else
    testResolve("s://a/pa/pb?q#f2", "#f2");
    testResolve("s://a/pa/pb?q", "");
    // else, if (R.path starts-with "/") then ...
    testResolve("s://a/p2?q2#f2", "/p2?q2#f2");
    testResolve("s://a/?q2#f2", "/?q2#f2");
    testResolve("s://a/#f2", "/#f2");
    testResolve("s://a/", "/");
    testResolve("s://a/", "/../");
    // else ... T.path = merge(Base.path, R.path)
    // ... remove-dot-fragments(T.path) ...
    // (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;
    testResolve("s://a/p2?q2#f2", "p2?q2#f2");
    testResolve("s://a/p2#f2", "p2#f2");
    testResolve("s://a/p2", "p2");

    base = origBase;
    // 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/", ""));

    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;
    testResolve("s:p2?q2#f2", "p2?q2#f2");
    testResolve("s:p2#f2", "p2#f2");
    testResolve("s:p2", "p2");

    base = noAuthAbsPathBase;
    testResolve("s:/pa/p2?q2#f2", "p2?q2#f2");
    testResolve("s:/pa/p2#f2", "p2#f2");
    testResolve("s:/pa/p2", "p2");

    base = noAuthRelPathBase;
    testResolve("s:pa/p2?q2#f2", "p2?q2#f2");
    testResolve("s:pa/p2#f2", "p2#f2");
    testResolve("s:pa/p2", "p2");

    base = noAuthRelSinglePathBase;
    testResolve("s:p2?q2#f2", "p2?q2#f2");
    testResolve("s:p2#f2", "p2#f2");
    testResolve("s:p2", "p2");

    // Then remove dot segments.

    // 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;
    testResolve("s://a/p2", "../p2");
    testResolve("s://a/", "../");
    testResolve("s://a/", "..");
    testResolve("s://a/p2", "./p2");
    testResolve("s://a/", "./");
    testResolve("s://a/", ".");
    testResolve("s://a/p2", "../../p2");
    testResolve("s://a/p2", "../../././p2");

    base = noAuthRelSinglePathBase;
    testResolve("s:p2", "../p2");
    testResolve("s:", "../");
    testResolve("s:", "..");
    testResolve("s:p2", "./p2");
    testResolve("s:", "./");
    testResolve("s:", ".");
    testResolve("s:p2", "../../p2");
    testResolve("s:p2", "../../././p2");

    // 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;
    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;
    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;
    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;
    testResolve("s:", "..");
    testResolve("s:", ".");
    base = noAuthRelSinglePathBase;
    testResolve("s:", "..");
    testResolve("s:", ".");
  }
}

void testResolvePath(String expected, String path) {
  Expect.equals(expected,
                new Uri(path: '/').resolveUri(new Uri(path: path)).path);
  Expect.equals(
      "http://localhost$expected",
      Uri.parse("http://localhost").resolveUri(new Uri(path: path)).toString());
}

const ALPHA = r"abcdefghijklmnopqrstuvwxuzABCDEFGHIJKLMNOPQRSTUVWXUZ";
const DIGIT = r"0123456789";
const PERCENT_ENCODED = "%00%ff";
const SUBDELIM = r"!$&'()*+,;=";

const SCHEMECHAR = "$ALPHA$DIGIT+-.";
const UNRESERVED = "$ALPHA$DIGIT-._~";
const REGNAMECHAR = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED";
const USERINFOCHAR = "$REGNAMECHAR:";

const PCHAR_NC = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED@";
const PCHAR = "$PCHAR_NC:";
const QUERYCHAR = "$PCHAR/?";

void testValidCharacters() {
  // test that all valid characters are accepted.

  for (var scheme in ["", "$SCHEMECHAR$SCHEMECHAR:"]) {
    for (var userinfo in ["", "@", "$USERINFOCHAR$USERINFOCHAR@",
                          "$USERINFOCHAR:$DIGIT@"]) {
      for (var host in ["", "$REGNAMECHAR$REGNAMECHAR",
                        "255.255.255.256",  // valid reg-name.
                        "[ffff::ffff:ffff]", "[ffff::255.255.255.255]"]) {
        for (var port in ["", ":", ":$DIGIT$DIGIT"]) {
          var auth = "$userinfo$host$port";
          if (auth.isNotEmpty) auth = "//$auth";
          var paths = ["", "/", "/$PCHAR", "/$PCHAR/"];  // Absolute or empty.
          if (auth.isNotEmpty) {
            // Initial segment may be empty.
            paths..add("//$PCHAR");
          } else {
            // Path may begin with non-slash.
            if (scheme.isEmpty) {
              // Initial segment must not contain colon.
              paths..add(PCHAR_NC)
                   ..add("$PCHAR_NC/$PCHAR")
                   ..add("$PCHAR_NC/$PCHAR/");
            } else {
              paths..add(PCHAR)
                   ..add("$PCHAR/$PCHAR")
                   ..add("$PCHAR/$PCHAR/");
            }
          }
          for (var path in paths) {
            for (var query in ["", "?", "?$QUERYCHAR"]) {
              for (var fragment in ["", "#", "#$QUERYCHAR"]) {
                var uri = "$scheme$auth$path$query$fragment";
                // Should not throw.
                var result = Uri.parse(uri);
              }
            }
          }
        }
      }
    }
  }
}

void testInvalidUrls() {
  void checkInvalid(uri) {
    try {
      var result = Uri.parse(uri);
      Expect.fail("Invalid URI `$uri` parsed to $result\n" + dump(result));
    } on FormatException {
      // Success.
    }
  }
  checkInvalid("s%41://x.x/");      // No escapes in scheme,
                                    // and no colon before slash in path.
  checkInvalid("1a://x.x/");        // Scheme must start with letter,
                                    // and no colon before slash in path.
  checkInvalid(".a://x.x/");        // Scheme must start with letter,
                                    // and no colon before slash in path.
  checkInvalid("_:");               // Character not valid in scheme,
                                    // and no colon before slash in path.
  checkInvalid(":");                // Scheme must start with letter,
                                    // and no colon before slash in path.

  void checkInvalidReplaced(uri, invalid, replacement) {
    var source = uri.replaceAll('{}', invalid);
    var expected = uri.replaceAll('{}', replacement);
    var result = Uri.parse(source);
    Expect.equals(expected, "$result", "Source: $source\n${dump(result)}");
  }

  // Regression test for http://dartbug.com/16081
  checkInvalidReplaced("http://www.example.org/red%09ros{}#red)",
                       "\u00e9", "%C3%A9");
  checkInvalidReplaced("http://r{}sum\{}.example.org", "\u00E9", "%C3%A9");

  // Invalid characters. The characters must be rejected, even if normalizing
  // the input would cause them to be valid (normalization happens after
  // validation).
  var invalidCharsAndReplacements = [
    "\xe7",      "%C3%A7",       // Arbitrary non-ASCII letter
    " ",         "%20",          // Space, not allowed anywhere.
    '"',         "%22",          // Quote, not allowed anywhere
    "<>",        "%3C%3E",       // Less/greater-than, not allowed anywhere.
    "\x7f",      "%7F",          // DEL, not allowed anywhere
    "\xdf",      "%C3%9F",       // German lower-case scharf-S.
                                 // Becomes ASCII when upper-cased.
    "\u0130",    "%C4%B0",       // Latin capital dotted I,
                                 // becomes ASCII lower-case in Turkish.
    "%\uFB03",   "%25%EF%AC%83", // % + Ligature ffi,
                                 // becomes ASCII when upper-cased,
                                 // should not be read as "%FFI".
    "\u212a",    "%E2%84%AA",    // Kelvin sign. Becomes ASCII when lower-cased.
    "%1g",       "%251g",        // Invalid escape.
    "\u{10000}", "%F0%90%80%80", // Non-BMP character as surrogate pair.
  ];
  for (int i = 0; i < invalidCharsAndReplacements.length; i += 2) {
    var invalid = invalidCharsAndReplacements[i];
    var valid = invalidCharsAndReplacements[i + 1];
    checkInvalid("A{}b:///".replaceAll('{}', invalid));
    checkInvalid("{}b:///".replaceAll('{}', invalid));
    checkInvalidReplaced("s://user{}info@x.x/", invalid, valid);
    checkInvalidReplaced("s://reg{}name/", invalid, valid);
    checkInvalid("s://regname:12{}45/".replaceAll("{}", invalid));
    checkInvalidReplaced("s://regname/p{}ath/", invalid, valid);
    checkInvalidReplaced("/p{}ath/", invalid, valid);
    checkInvalidReplaced("p{}ath/", invalid, valid);
    checkInvalidReplaced("s://regname/path/?x{}x", invalid, valid);
    checkInvalidReplaced("s://regname/path/#x{}x", invalid, valid);
    checkInvalidReplaced("s://regname/path/??#x{}x", invalid, valid);
  }

  // At most one @ in userinfo.
  checkInvalid("s://x@x@x.x/");
  // No colon in host except before a port.
  checkInvalid("s://x@x:x/");
  // At most one port.
  checkInvalid("s://x@x:9:9/");
  // At most one #.
  checkInvalid("s://x/x#foo#bar");
  // @ not allowed in scheme.
  checkInvalid("s@://x:9/x?x#x");
  // ] not allowed alone in host.
  checkInvalid("s://xx]/");
  // ] not allowed anywhere except in host.
  checkInvalid("s://xx/]");
  checkInvalid("s://xx/?]");
  checkInvalid("s://xx/#]");
  checkInvalid("s:/]");
  checkInvalid("s:/?]");
  checkInvalid("s:/#]");
  // IPv6 must be enclosed in [ and ] for Uri.parse.
  // It is allowed un-enclosed as argument to `Uri(host:...)` because we don't
  // need to delimit.
  checkInvalid("s://ffff::ffff:1234/");
}

void testNormalization() {
  // The Uri constructor and the Uri.parse function performs RFC-3986
  // syntax based normalization.

  var uri;

  // Scheme: Only case normalization. Schemes cannot contain escapes.
  uri = Uri.parse("A:");
  Expect.equals("a", uri.scheme);
  uri = Uri.parse("Z:");
  Expect.equals("z", uri.scheme);
  uri = Uri.parse("$SCHEMECHAR:");
  Expect.equals(SCHEMECHAR.toLowerCase(), uri.scheme);

  // Percent escape normalization.
  // Escapes of unreserved characters are converted to the character,
  // subject to case normalization in reg-name.
  for (var i = 0; i < UNRESERVED.length; i++) {
    var char = UNRESERVED[i];
    var escape = "%" + char.codeUnitAt(0).toRadixString(16);  // all > 0xf.

    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
                    "?vV${escape}vV#wW${escape}wW");
    Expect.equals("xX${char}xX", uri.userInfo);
    Expect.equals("yY${char}yY".toLowerCase(), uri.host);
    Expect.equals("/zZ${char}zZ", uri.path);
    Expect.equals("vV${char}vV", uri.query);
    Expect.equals("wW${char}wW", uri.fragment);

    uri = Uri.parse("s://yY${escape}yY/zZ${escape}zZ"
                    "?vV${escape}vV#wW${escape}wW");
    Expect.equals("yY${char}yY".toLowerCase(), uri.host);
    Expect.equals("/zZ${char}zZ", uri.path);
    Expect.equals("vV${char}vV", uri.query);
    Expect.equals("wW${char}wW", uri.fragment);
  }

  // Escapes of reserved characters are kept, but upper-cased.
  for (var escape in ["%00", "%1f", "%7F", "%fF"]) {
    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
                    "?vV${escape}vV#wW${escape}wW");
    var normalizedEscape = escape.toUpperCase();
    Expect.equals("xX${normalizedEscape}xX", uri.userInfo);
    Expect.equals("yy${normalizedEscape}yy", uri.host);
    Expect.equals("/zZ${normalizedEscape}zZ", uri.path);
    Expect.equals("vV${normalizedEscape}vV", uri.query);
    Expect.equals("wW${normalizedEscape}wW", uri.fragment);
  }

  // Some host normalization edge cases.
  uri = Uri.parse("x://x%61X%41x%41X%61x/");
  Expect.equals("xaxaxaxax", uri.host);

  uri = Uri.parse("x://Xxxxxxxx/");
  Expect.equals("xxxxxxxx", uri.host);

  uri = Uri.parse("x://xxxxxxxX/");
  Expect.equals("xxxxxxxx", uri.host);

  uri = Uri.parse("x://xxxxxxxx%61/");
  Expect.equals("xxxxxxxxa", uri.host);

  uri = Uri.parse("x://%61xxxxxxxx/");
  Expect.equals("axxxxxxxx", uri.host);

  uri = Uri.parse("x://X/");
  Expect.equals("x", uri.host);

  uri = Uri.parse("x://%61/");
  Expect.equals("a", uri.host);

  uri = new Uri(scheme: "x", path: "//y");
  Expect.equals("//y", uri.path);
  Expect.equals("x:////y", uri.toString());

  uri = new Uri(scheme: "file", path: "//y");
  Expect.equals("//y", uri.path);
  Expect.equals("file:////y", uri.toString());

  // File scheme noralizes to always showing authority, even if empty.
  uri = new Uri(scheme: "file", path: "/y");
  Expect.equals("file:///y", uri.toString());
  uri = new Uri(scheme: "file", path: "y");
  Expect.equals("file:///y", uri.toString());

  // Empty host/query/fragment ensures the delimiter is there.
  // Different from not being there.
  Expect.equals("scheme:/", Uri.parse("scheme:/").toString());
  Expect.equals("scheme:/",
                new Uri(scheme: "scheme", path: "/").toString());

  Expect.equals("scheme:///?#", Uri.parse("scheme:///?#").toString());
  Expect.equals("scheme:///#",
                new Uri(scheme: "scheme", host: "", path: "/",
                        query: "", fragment: "").toString());
}

void testReplace() {
  var uris = [
    Uri.parse(""),
    Uri.parse("a://@:/?#"),
    Uri.parse("a://:/?#"),  // Parsed as simple URI.
    Uri.parse("a://b@c:4/e/f?g#h"),
    Uri.parse("a://c:4/e/f?g#h"),  // Parsed as simple URI.
    Uri.parse("$SCHEMECHAR://$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR"
              "?$QUERYCHAR#$QUERYCHAR"),  // Parsed as simple URI.
    Uri.parse("$SCHEMECHAR://$USERINFOCHAR@$REGNAMECHAR:$DIGIT/$PCHAR/$PCHAR"
              "?$QUERYCHAR#$QUERYCHAR"),
  ];
  for (var uri1 in uris) {
    for (var uri2 in uris) {
      if (identical(uri1, uri2)) continue;
      var scheme = uri1.scheme;
      var userInfo = uri1.hasAuthority ? uri1.userInfo : "";
      var host = uri1.hasAuthority ? uri1.host : null;
      var port = uri1.hasAuthority ? uri1.port : 0;
      var path = uri1.path;
      var query = uri1.hasQuery ? uri1.query : null;
      var fragment = uri1.hasFragment ? uri1.fragment : null;

      var tmp1 = uri1;

      void test() {
        var tmp2 = new Uri(scheme: scheme, userInfo: userInfo, host: host,
                           port: port, path: path,
                           query: query == "" ? null : query,
                           queryParameters: query == "" ? {} : null,
                           fragment: fragment);
        Expect.equals(tmp1, tmp2);
      }

      test();

      scheme = uri2.scheme;
      tmp1 = tmp1.replace(scheme: scheme);
      test();

      if (uri2.hasAuthority) {
        userInfo = uri2.userInfo;
        host = uri2.host;
        port = uri2.port;
        tmp1 = tmp1.replace(userInfo: userInfo, host: host, port: port);
        test();
      }

      path = uri2.path;
      tmp1 = tmp1.replace(path: path);
      test();

      if (uri2.hasQuery) {
        query = uri2.query;
        tmp1 = tmp1.replace(query: query);
        test();
      }

      if (uri2.hasFragment) {
        fragment = uri2.fragment;
        tmp1 = tmp1.replace(fragment: fragment);
        test();
      }
    }
  }

  // Regression test, http://dartbug.com/20814
  var uri = Uri.parse("/no-authorty/");
  uri = uri.replace(fragment: "fragment");
  Expect.isFalse(uri.hasAuthority);

  uri = new Uri(scheme: "foo", path: "bar");
  uri = uri.replace(
      queryParameters: {"x": ["42", "37"], "y": ["43", "38"]});
  var params = uri.queryParametersAll;
  Expect.equals(2, params.length);
  Expect.listEquals(["42", "37"], params["x"]);
  Expect.listEquals(["43", "38"], params["y"]);

  // Test replacing with empty strings.
  uri = Uri.parse("s://a:1/b/c?d#e");
  Expect.equals("s://a:1/b/c?d#", uri.replace(fragment: "").toString());
  Expect.equals("s://a:1/b/c?#e", uri.replace(query: "").toString());
  Expect.equals("s://a:1?d#e", uri.replace(path: "").toString());
  Expect.equals("s://:1/b/c?d#e", uri.replace(host: "").toString());
}

main() {
  testUri("http:", true);
  testUri("file:///", true);
  testUri("file", false);
  testUri("http://user@example.com:8080/fisk?query=89&hest=silas", true);
  testUri("http://user@example.com:8080/fisk?query=89&hest=silas#fragment",
          false);
  Expect.stringEquals("http://user@example.com/a/b/c?query#fragment",
                      new Uri(
                          scheme: "http",
                          userInfo: "user",
                          host: "example.com",
                          port: 80,
                          path: "/a/b/c",
                          query: "query",
                          fragment: "fragment").toString());
  Expect.stringEquals("/a/b/c/",
                      new Uri(
                          scheme: null,
                          userInfo: null,
                          host: null,
                          port: 0,
                          path: "/a/b/c/",
                          query: null,
                          fragment: null).toString());
  Expect.stringEquals("file:///", Uri.parse("file:").toString());
  Expect.stringEquals("file:///", Uri.parse("file:/").toString());
  Expect.stringEquals("file:///", Uri.parse("file:").toString());
  Expect.stringEquals("file:///foo", Uri.parse("file:foo").toString());
  Expect.stringEquals("file:///foo", Uri.parse("file:/foo").toString());
  Expect.stringEquals("file://foo/", Uri.parse("file://foo").toString());

  testResolvePath("/a/g", "/a/b/c/./../../g");
  testResolvePath("/a/g", "/a/b/c/./../../g");
  testResolvePath("/mid/6", "mid/content=5/../6");
  testResolvePath("/a/b/e", "a/b/c/d/../../e");
  testResolvePath("/a/b/e", "../a/b/c/d/../../e");
  testResolvePath("/a/b/e", "./a/b/c/d/../../e");
  testResolvePath("/a/b/e", "../a/b/./c/d/../../e");
  testResolvePath("/a/b/e", "./a/b/./c/d/../../e");
  testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/.");
  testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/./.");
  testResolvePath("/a/b/e/", "./a/b/./c/d/../../e/././.");

  testUriPerRFCs();

  Expect.stringEquals(
      "http://example.com",
      Uri.parse("http://example.com/a/b/c").origin);
  Expect.stringEquals(
      "https://example.com",
      Uri.parse("https://example.com/a/b/c").origin);
  Expect.stringEquals(
      "http://example.com:1234",
      Uri.parse("http://example.com:1234/a/b/c").origin);
  Expect.stringEquals(
      "https://example.com:1234",
      Uri.parse("https://example.com:1234/a/b/c").origin);
  Expect.throws(
      () => Uri.parse("http:").origin,
      (e) { return e is StateError; },
      "origin for uri with empty host should fail");
  Expect.throws(
      () => new Uri(
          scheme: "http",
          userInfo: null,
          host: "",
          port: 80,
          path: "/a/b/c",
          query: "query",
          fragment: "fragment").origin,
      (e) { return e is StateError; },
      "origin for uri with empty host should fail");
  Expect.throws(
      () => new Uri(
          scheme: null,
          userInfo: null,
          host: "",
          port: 80,
          path: "/a/b/c",
          query: "query",
          fragment: "fragment").origin,
      (e) { return e is StateError; },
      "origin for uri with empty scheme should fail");
  Expect.throws(
      () => new Uri(
          scheme: "http",
          userInfo: null,
          host: null,
          port: 80,
          path: "/a/b/c",
          query: "query",
          fragment: "fragment").origin,
      (e) { return e is StateError; },
      "origin for uri with empty host should fail");
  Expect.throws(
      () => Uri.parse("http://:80").origin,
      (e) { return e is StateError; },
      "origin for uri with empty host should fail");
  Expect.throws(
      () => Uri.parse("file://localhost/test.txt").origin,
      (e) { return e is StateError; },
      "origin for non-http/https uri should fail");

  // URI encode tests
  // Create a string with code point 0x10000 encoded as a surrogate pair.
  var s = UTF8.decode([0xf0, 0x90, 0x80, 0x80]);

  Expect.stringEquals("\u{10000}", s);

  testEncodeDecode("A + B", "A%20+%20B");
  testEncodeDecode("\uFFFE", "%EF%BF%BE");
  testEncodeDecode("\uFFFF", "%EF%BF%BF");
  testEncodeDecode("\uFFFE", "%EF%BF%BE");
  testEncodeDecode("\uFFFF", "%EF%BF%BF");
  testEncodeDecode("\x7f", "%7F");
  testEncodeDecode("\x80", "%C2%80");
  testEncodeDecode("\u0800", "%E0%A0%80");
  // All characters not escaped by encodeFull.
  var unescapedFull =
      r"abcdefghijklmnopqrstuvwxyz"
      r"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      r"0123456789!#$&'()*+,-./:;=?@_~";
  // ASCII characters escaped by encodeFull:
  var escapedFull =
      "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
      "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
      r' "%<>[\]^`{|}'
      "\x7f";
  var escapedTo =
      "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"
      "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F"
      "%20%22%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F";
  testEncodeDecode(unescapedFull, unescapedFull);
  testEncodeDecode(escapedFull, escapedTo);
  var nonAscii =
      "\x80-\xff-\u{100}-\u{7ff}-\u{800}-\u{ffff}-\u{10000}-\u{10ffff}";
  var nonAsciiEncoding =
      "%C2%80-%C3%BF-%C4%80-%DF%BF-%E0%A0%80-%EF%BF%BF-"
      "%F0%90%80%80-%F4%8F%BF%BF";
  testEncodeDecode(nonAscii, nonAsciiEncoding);
  testEncodeDecode(s, "%F0%90%80%80");
  testEncodeDecodeComponent("A + B", "A%20%2B%20B");
  testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
  testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF");
  testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
  testEncodeDecodeComponent("\uFFFF", "%EF%BF%BF");
  testEncodeDecodeComponent("\x7f", "%7F");
  testEncodeDecodeComponent("\x80", "%C2%80");
  testEncodeDecodeComponent("\u0800", "%E0%A0%80");
  testEncodeDecodeComponent(":/@',;?&=+\$", "%3A%2F%40'%2C%3B%3F%26%3D%2B%24");
  testEncodeDecodeComponent(s, "%F0%90%80%80");
  testEncodeDecodeQueryComponent("A + B", "A+%2B+B", "A+%2B+B", "A+%2B+B");
  testEncodeDecodeQueryComponent(
      "æ ø å", "%C3%A6+%C3%B8+%C3%A5", "%E6+%F8+%E5", null);
  testEncodeDecodeComponent(nonAscii, nonAsciiEncoding);

  // Invalid URI - : and @ is swapped, port ("host") should be numeric.
  Expect.throws(
      () => Uri.parse("file://user@password:host/path"),
      (e) => e is FormatException);

  testValidCharacters();
  testInvalidUrls();
  testNormalization();
  testReplace();
}

String dump(Uri uri) {
  return "URI: $uri\n"
      "  Scheme:    ${uri.scheme} #${uri.scheme.length}\n"
      "  User-info: ${uri.userInfo} #${uri.userInfo.length}\n"
      "  Host:      ${uri.host} #${uri.host.length}\n"
      "  Port:      ${uri.port}\n"
      "  Path:      ${uri.path} #${uri.path.length}\n"
      "  Query:     ${uri.query} #${uri.query.length}\n"
      "  Fragment:  ${uri.fragment} #${uri.fragment.length}\n";
}
