// Copyright (c) 2017, 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 uri.examples;

// Examples from the Uri class documentation.
// Get an error if the documentation starts to be wrong.
// REMEMBER TO UPDATE BOTH.

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

main() {
  // Uri.http
  test("http://example.org/path?q=dart",
      new Uri.http("example.org", "/path", { "q" : "dart" }));
  test("http://user:pass@localhost:8080",
      new Uri.http("user:pass@localhost:8080", ""));
  test("http://example.org/a%20b", new Uri.http("example.org", "a b"));
  test("http://example.org/a%252F", new Uri.http("example.org", "/a%2F"));

  // Uri.file
  test("xxx/yyy", new Uri.file("xxx/yyy", windows: false));
  test("xxx/yyy/", new Uri.file("xxx/yyy/", windows: false));
  test("file:///xxx/yyy", new Uri.file("/xxx/yyy", windows: false));
  test("file:///xxx/yyy/", new Uri.file("/xxx/yyy/", windows: false));
  test("C%3A", new Uri.file("C:", windows: false));
  test("xxx/yyy", new Uri.file(r"xxx\yyy", windows: true));
  test("xxx/yyy/", new Uri.file(r"xxx\yyy\", windows: true));
  test("file:///xxx/yyy", new Uri.file(r"\xxx\yyy", windows: true));
  test("file:///xxx/yyy/", new Uri.file(r"\xxx\yyy/", windows: true));
  test("file:///C:/xxx/yyy", new Uri.file(r"C:\xxx\yyy", windows: true));
  test("file://server/share/file",
      new Uri.file(r"\\server\share\file", windows: true));
  Expect.throws(() => new Uri.file(r"C:", windows: true));
  Expect.throws(() => new Uri.file(r"C:xxx\yyy", windows: true));

  // isScheme.
  var uri = Uri.parse("http://example.com/");
  Expect.isTrue(uri.isScheme("HTTP"));

  // toFilePath.
  Expect.equals(r"xxx/yyy", Uri.parse("xxx/yyy").toFilePath(windows: false));
  Expect.equals(r"xxx/yyy/", Uri.parse("xxx/yyy/").toFilePath(windows: false));
  Expect.equals(r"/xxx/yyy",
      Uri.parse("file:///xxx/yyy").toFilePath(windows: false));
  Expect.equals(r"/xxx/yyy/",
      Uri.parse("file:///xxx/yyy/").toFilePath(windows: false));
  Expect.equals(r"/C:", Uri.parse("file:///C:").toFilePath(windows: false));
  Expect.equals(r"/C:a", Uri.parse("file:///C:a").toFilePath(windows: false));

  Expect.equals(r"xxx\yyy", Uri.parse("xxx/yyy").toFilePath(windows: true));
  Expect.equals(r"xxx\yyy\", Uri.parse("xxx/yyy/").toFilePath(windows: true));
  Expect.equals(r"\xxx\yyy",
      Uri.parse("file:///xxx/yyy").toFilePath(windows: true));
  Expect.equals(r"\xxx\yyy\",
      Uri.parse("file:///xxx/yyy/").toFilePath(windows: true));
  Expect.equals(r"C:\xxx\yyy",
      Uri.parse("file:///C:/xxx/yyy").toFilePath(windows: true));
  Expect.throws(() => Uri.parse("file:C:xxx/yyy").toFilePath(windows: true));
  Expect.equals(r"\\server\share\file",
      Uri.parse("file://server/share/file").toFilePath(windows: true));  //

  // replace.
  Uri uri1 = Uri.parse("a://b@c:4/d/e?f#g");
  Uri uri2 = uri1.replace(scheme: "A", path: "D/E/E", fragment: "G");
  Expect.equals("a://b@c:4/D/E/E?f#G", "$uri2");
  Uri uri3 = new Uri(
      scheme: "A",
      userInfo: uri1.userInfo,
      host: uri1.host,
      port: uri1.port,
      path: "D/E/E",
      query: uri1.query,
      fragment: "G");
  Expect.equals("a://b@c:4/D/E/E?f#G", "$uri3");
  Expect.equals(uri2, uri3);

  // UriData.mimeType
  var data = UriData.parse("data:text/plain;charset=utf-8,Hello%20World!");
  Expect.equals("text/plain", data.mimeType);
  Expect.equals("utf-8", data.charset);

  // Uri.parseIPv6Address - shouldn't throw.
  Uri.parseIPv6Address("::1");
  Uri.parseIPv6Address("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210");
  Uri.parseIPv6Address("3ffe:2a00:100:7031::1");
  Uri.parseIPv6Address("::FFFF:129.144.52.38");
  Uri.parseIPv6Address("2010:836B:4179::836B:4179");
}

test(String result, Uri value) {
  Expect.equals(Uri.parse(result), value);
  Expect.equals(result, value.toString());
}
