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

// @dart = 2.9

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("@:", ""), "http://");
  check(new Uri.http("@:"), "http://");
  check(new Uri.http("@:8080", ""), "http://:8080");
  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();
}
