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

import "package:expect/expect.dart";

void testHttpUri() {
  void check(Uri uri, String expected) {
    Expect.equals(expected, uri.toString());
  }

  check(new Uri.http("", ""), "http:");
  check(new Uri.http("@:", ""), "http://");
  check(new Uri.http("@:8080", ""), "http://:8080");
  check(new Uri.http("@host:", ""), "http://host");
  check(new Uri.http("@host:", ""), "http://host");
  check(new Uri.http("xxx:yyy@host:8080", ""), "http://xxx:yyy@host:8080");
  check(new Uri.http("host", "a"), "http://host/a");
  check(new Uri.http("host", "/a"), "http://host/a");
  check(new Uri.http("host", "a/"), "http://host/a/");
  check(new Uri.http("host", "/a/"), "http://host/a/");
  check(new Uri.http("host", "a/b"), "http://host/a/b");
  check(new Uri.http("host", "/a/b"), "http://host/a/b");
  check(new Uri.http("host", "a/b/"), "http://host/a/b/");
  check(new Uri.http("host", "/a/b/"), "http://host/a/b/");
  check(new Uri.http("host", "a b"), "http://host/a%20b");
  check(new Uri.http("host", "/a b"), "http://host/a%20b");
  check(new Uri.http("host", "/a b/"), "http://host/a%20b/");
  check(new Uri.http("host", "/a%2F"), "http://host/a%252F");
  check(new Uri.http("host", "/a%2F/"), "http://host/a%252F/");
  check(new Uri.http("host", "/a/b", {"c": "d"}), "http://host/a/b?c=d");
  check(
      new Uri.http("host", "/a/b", {"c=": "&d"}), "http://host/a/b?c%3D=%26d");
  check(new Uri.http("[::]", "a"), "http://[::]/a");
  check(new Uri.http("[::127.0.0.1]", "a"), "http://[::127.0.0.1]/a");
  check(new Uri.http('[fe80::8eae:4c4d:fee9:8434%rename3]', ''),
      'http://[fe80::8eae:4c4d:fee9:8434%25rename3]');
  check(new Uri.http('[ff02::1%1%41]', ''), 'http://[ff02::1%251a]');
  check(new Uri.http('[ff02::1%321]', ''), 'http://[ff02::1%25321]');
  check(new Uri.http('[ff02::1%%321]', ''), 'http://[ff02::1%2521]');
}

void testHttpsUri() {
  void check(Uri uri, String expected) {
    Expect.equals(expected, uri.toString());
  }

  check(new Uri.https("", ""), "https:");
  check(new Uri.https("@:", ""), "https://");
  check(new Uri.https("@:8080", ""), "https://:8080");
  check(new Uri.https("@host:", ""), "https://host");
  check(new Uri.https("@host:", ""), "https://host");
  check(new Uri.https("xxx:yyy@host:8080", ""), "https://xxx:yyy@host:8080");
  check(new Uri.https("host", "a"), "https://host/a");
  check(new Uri.https("host", "/a"), "https://host/a");
  check(new Uri.https("host", "a/"), "https://host/a/");
  check(new Uri.https("host", "/a/"), "https://host/a/");
  check(new Uri.https("host", "a/b"), "https://host/a/b");
  check(new Uri.https("host", "/a/b"), "https://host/a/b");
  check(new Uri.https("host", "a/b/"), "https://host/a/b/");
  check(new Uri.https("host", "/a/b/"), "https://host/a/b/");
  check(new Uri.https("host", "a b"), "https://host/a%20b");
  check(new Uri.https("host", "/a b"), "https://host/a%20b");
  check(new Uri.https("host", "/a b/"), "https://host/a%20b/");
  check(new Uri.https("host", "/a%2F"), "https://host/a%252F");
  check(new Uri.https("host", "/a%2F/"), "https://host/a%252F/");
  check(new Uri.https("host", "/a/b", {"c": "d"}), "https://host/a/b?c=d");
  check(new Uri.https("host", "/a/b", {"c=": "&d"}),
      "https://host/a/b?c%3D=%26d");
  check(new Uri.https("[::]", "a"), "https://[::]/a");
  check(new Uri.https("[::127.0.0.1]", "a"), "https://[::127.0.0.1]/a");
}

void testResolveHttpScheme() {
  String s = "//myserver:1234/path/some/thing";
  Uri uri = Uri.parse(s);
  Uri http = new Uri(scheme: "http");
  Uri https = new Uri(scheme: "https");
  Expect.equals("http:$s", http.resolveUri(uri).toString());
  Expect.equals("https:$s", https.resolveUri(uri).toString());
}

void testQuery() {
  var uri = Uri.http("example.com", "a/b", <String, dynamic>{
    "a": "b",
    "c": ["d", "e"]
  });
  Expect.equals(uri.toString(), "http://example.com/a/b?a=b&c=d&c=e");
  Expect.listEquals(uri.queryParametersAll["c"]!, ["d", "e"]);

  uri = Uri.https("example.com", "a/b", <String, dynamic>{
    "a": "b",
    "c": ["d", "e"]
  });
  Expect.equals(uri.toString(), "https://example.com/a/b?a=b&c=d&c=e");
  Expect.listEquals(uri.queryParametersAll["c"]!, ["d", "e"]);

  uri = Uri.http("example.com", "a/b", {
    "a b c": ["d e", "f g"]
  });
  Expect.equals(uri.toString(), "http://example.com/a/b?a+b+c=d+e&a+b+c=f+g");
  uri = Uri.https("example.com", "a/b", {
    "a b c": ["d e", "f g"]
  });
  Expect.equals(uri.toString(), "https://example.com/a/b?a+b+c=d+e&a+b+c=f+g");
}

main() {
  testHttpUri();
  testHttpsUri();
  testResolveHttpScheme();
  testQuery();
}
