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

testFileUri() {
  final unsupported = new UnsupportedError("");

  var tests = [
    ["", "", ""],
    ["relative", "relative", "relative"],
    ["relative/", "relative/", "relative\\"],
    ["a%20b", "a b", "a b"],
    ["a%20b/", "a b/", "a b\\"],
    ["a/b", "a/b", "a\\b"],
    ["a/b/", "a/b/", "a\\b\\"],
    ["a%20b/c%20d", "a b/c d", "a b\\c d"],
    ["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
    ["file:///absolute", "/absolute", "\\absolute"],
    ["file:///absolute", "/absolute", "\\absolute"],
    ["file:///a/b", "/a/b", "\\a\\b"],
    ["file:///a/b", "/a/b", "\\a\\b"],
    ["file://server/a/b", unsupported, "\\\\server\\a\\b"],
    ["file://server/a/b/", unsupported, "\\\\server\\a\\b\\"],
    ["file:///C:/", "/C:/", "C:\\"],
    ["file:///C:/a/b", "/C:/a/b", "C:\\a\\b"],
    ["file:///C:/a/b/", "/C:/a/b/", "C:\\a\\b\\"],
    ["http:/a/b", unsupported, unsupported],
    ["https:/a/b", unsupported, unsupported],
    ["urn:a:b", unsupported, unsupported],
  ];

  void check(String s, filePath, bool windows) {
    Uri uri = Uri.parse(s);
    if (filePath is Error) {
      if (filePath is UnsupportedError) {
        Expect.throwsUnsupportedError(() => uri.toFilePath(windows: windows));
      } else {
        Expect.throws(() => uri.toFilePath(windows: windows));
      }
    } else {
      Expect.equals(filePath, uri.toFilePath(windows: windows));
      Expect.equals(s, new Uri.file(filePath, windows: windows).toString());
    }
  }

  for (var test in tests) {
    check(test[0], test[1], false);
    check(test[0], test[2], true);
  }

  Uri uri;
  uri = Uri.parse("file:a");
  Expect.equals("/a", uri.toFilePath(windows: false));
  Expect.equals("\\a", uri.toFilePath(windows: true));
  uri = Uri.parse("file:a/");
  Expect.equals("/a/", uri.toFilePath(windows: false));
  Expect.equals("\\a\\", uri.toFilePath(windows: true));
}

testFileUriWindowsSlash() {
  var tests = [
    ["", "", ""],
    ["relative", "relative", "relative"],
    ["relative/", "relative/", "relative\\"],
    ["a%20b", "a b", "a b"],
    ["a%20b/", "a b/", "a b\\"],
    ["a/b", "a/b", "a\\b"],
    ["a/b/", "a/b/", "a\\b\\"],
    ["a%20b/c%20d", "a b/c d", "a b\\c d"],
    ["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
    ["file:///absolute", "/absolute", "\\absolute"],
    ["file:///absolute", "/absolute", "\\absolute"],
    ["file:///a/b", "/a/b", "\\a\\b"],
    ["file:///a/b", "/a/b", "\\a\\b"],
    ["file://server/a/b", "//server/a/b", "\\\\server\\a\\b"],
    ["file://server/a/b/", "//server/a/b/", "\\\\server\\a\\b\\"],
    ["file:///C:/", "C:/", "C:\\"],
    ["file:///C:/a/b", "C:/a/b", "C:\\a\\b"],
    ["file:///C:/a/b/", "C:/a/b/", "C:\\a\\b\\"],
  ];

  for (var test in tests) {
    Uri uri = new Uri.file(test[1], windows: true);
    Expect.equals(test[0], uri.toString());
    Expect.equals(test[2], uri.toFilePath(windows: true));
    bool couldBeDir = uri.path.isEmpty || uri.path.endsWith('\\');
    Uri dirUri = new Uri.directory(test[1], windows: true);
    Expect.isTrue(dirUri.path.isEmpty || dirUri.path.endsWith('/'));
    if (couldBeDir) {
      Expect.equals(uri, dirUri);
    }
  }
}

testFileUriWindowsWin32Namespace() {
  var tests = [
    ["\\\\?\\C:\\", "file:///C:/", "C:\\"],
    ["\\\\?\\C:\\", "file:///C:/", "C:\\"],
    [
      "\\\\?\\UNC\\server\\share\\file",
      "file://server/share/file",
      "\\\\server\\share\\file"
    ],
  ];

  for (var test in tests) {
    Uri uri = new Uri.file(test[0], windows: true);
    Expect.equals(test[1], uri.toString());
    Expect.equals(test[2], uri.toFilePath(windows: true));
  }

  Expect.throwsArgumentError(() => new Uri.file("\\\\?\\file", windows: true));
  Expect.throwsArgumentError(
      () => new Uri.file("\\\\?\\UNX\\server\\share\\file", windows: true));
  Expect.throwsArgumentError(
      () => new Uri.directory("\\\\?\\file", windows: true));
  Expect.throwsArgumentError(() =>
      new Uri.directory("\\\\?\\UNX\\server\\share\\file", windows: true));
}

testFileUriDriveLetter() {
  check(String s, String nonWindows, String windows) {
    Uri uri;
    uri = Uri.parse(s);
    Expect.equals(nonWindows, uri.toFilePath(windows: false));
    if (windows != null) {
      Expect.equals(windows, uri.toFilePath(windows: true));
    } else {
      Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
    }
  }

  check("file:///C:", "/C:", "C:\\");
  check("file:///C:/", "/C:/", "C:\\");
  check("file:///C:a", "/C:a", null);
  check("file:///C:a/", "/C:a/", null);

  Expect.throwsArgumentError(() => new Uri.file("C:", windows: true));
  Expect.throwsArgumentError(() => new Uri.file("C:a", windows: true));
  Expect.throwsArgumentError(() => new Uri.file("C:a\b", windows: true));
  Expect.throwsArgumentError(() => new Uri.directory("C:", windows: true));
  Expect.throwsArgumentError(() => new Uri.directory("C:a", windows: true));
  Expect.throwsArgumentError(() => new Uri.directory("C:a\b", windows: true));
}

testFileUriResolve() {
  var tests = [
    ["file:///a", "/a", "", "\\a", ""],
    ["file:///a/", "/a/", "", "\\a\\", ""],
    ["file:///b", "/a", "b", "\\a", "b"],
    ["file:///b/", "/a", "b/", "\\a", "b\\"],
    ["file:///a/b", "/a/", "b", "\\a\\", "b"],
    ["file:///a/b/", "/a/", "b/", "\\a\\", "b\\"],
    ["file:///a/c/d", "/a/b", "c/d", "\\a\\b", "c\\d"],
    ["file:///a/c/d/", "/a/b", "c/d/", "\\a\\b", "c\\d\\"],
    ["file:///a/b/c/d", "/a/b/", "c/d", "\\a\\b\\", "c\\d"],
    ["file:///a/b/c/d/", "/a/b/", "c/d/", "\\a\\b\\", "c\\d\\"],
  ];

  check(String s, String absolute, String relative, bool windows) {
    Uri absoluteUri = new Uri.file(absolute, windows: windows);
    Uri relativeUri = new Uri.file(relative, windows: windows);
    String relativeString = windows ? relative.replaceAll("\\", "/") : relative;
    Expect.equals(s, absoluteUri.resolve(relativeString).toString());
    Expect.equals(s, absoluteUri.resolveUri(relativeUri).toString());
  }

  for (var test in tests) {
    check(test[0], test[1], test[2], false);
    check(test[0], test[1], test[2], true);
    check(test[0], test[1], test[4], true);
    check(test[0], test[3], test[2], true);
    check(test[0], test[3], test[4], true);
  }
}

testFileUriIllegalCharacters() {
  // Slash is an invalid character in file names on both non-Windows
  // and Windows.
  Uri uri = Uri.parse("file:///a%2Fb");
  Expect.throwsUnsupportedError(() => uri.toFilePath(windows: false));
  Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));

  // Illegal characters in windows file names.
  var illegalWindowsPaths = [
    "a<b",
    "a>b",
    "a:b",
    "a\"b",
    "a|b",
    "a?b",
    "a*b",
    "\\\\?\\c:\\a/b"
  ];

  for (var test in illegalWindowsPaths) {
    Expect.throwsArgumentError(() => new Uri.file(test, windows: true));
    Expect.throwsArgumentError(() => new Uri.file("\\$test", windows: true));
    Expect.throwsArgumentError(() => new Uri.directory(test, windows: true));
    Expect
        .throwsArgumentError(() => new Uri.directory("\\$test", windows: true));

    // It is possible to create non-Windows URIs, but not Windows URIs.
    Uri uri = new Uri.file(test, windows: false);
    Uri absoluteUri = new Uri.file("/$test", windows: false);
    Uri dirUri = new Uri.directory(test, windows: false);
    Uri dirAbsoluteUri = new Uri.directory("/$test", windows: false);
    Expect.throwsArgumentError(() => new Uri.file(test, windows: true));
    Expect.throwsArgumentError(() => new Uri.file("\\$test", windows: true));
    Expect.throwsArgumentError(() => new Uri.directory(test, windows: true));
    Expect
        .throwsArgumentError(() => new Uri.directory("\\$test", windows: true));

    // It is possible to extract non-Windows file path, but not
    // Windows file path.
    Expect.equals(test, uri.toFilePath(windows: false));
    Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
    Expect.equals("$test/", dirUri.toFilePath(windows: false));
    Expect.equals("/$test/", dirAbsoluteUri.toFilePath(windows: false));
    Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
    Expect.throwsUnsupportedError(() => absoluteUri.toFilePath(windows: true));
    Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
    Expect
        .throwsUnsupportedError(() => dirAbsoluteUri.toFilePath(windows: true));
  }

  // Backslash
  illegalWindowsPaths = ["a\\b", "a\\b\\"];
  for (var test in illegalWindowsPaths) {
    // It is possible to create both non-Windows URIs, and Windows URIs.
    Uri uri = new Uri.file(test, windows: false);
    Uri absoluteUri = new Uri.file("/$test", windows: false);
    Uri dirUri = new Uri.directory(test, windows: false);
    Uri dirAbsoluteUri = new Uri.directory("/$test", windows: false);
    new Uri.file(test, windows: true);
    new Uri.file("\\$test", windows: true);

    // It is possible to extract non-Windows file path, but not
    // Windows file path from the non-Windows URI (it has a backslash
    // in a path segment).
    Expect.equals(test, uri.toFilePath(windows: false));
    Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
    Expect.equals("$test/", dirUri.toFilePath(windows: false));
    Expect.equals("/$test/", dirAbsoluteUri.toFilePath(windows: false));
    Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
    Expect.throwsUnsupportedError(() => absoluteUri.toFilePath(windows: true));
    Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
    Expect
        .throwsUnsupportedError(() => dirAbsoluteUri.toFilePath(windows: true));
  }
}

testFileUriIllegalDriveLetter() {
  Expect.throwsArgumentError(() => new Uri.file("1:\\", windows: true));
  Expect.throwsArgumentError(() => new Uri.directory("1:\\", windows: true));
  Uri uri = new Uri.file("1:\\", windows: false);
  Uri dirUri = new Uri.directory("1:\\", windows: false);
  Expect.equals("1:\\", uri.toFilePath(windows: false));
  Expect.equals("1:\\/", dirUri.toFilePath(windows: false));
  Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
  Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
}

testAdditionalComponents() {
  check(String s, {bool windowsOk: false}) {
    Uri uri = Uri.parse(s);
    Expect.throwsUnsupportedError(() => uri.toFilePath(windows: false));
    if (windowsOk) {
      Expect.isTrue(uri.toFilePath(windows: true) is String);
    } else {
      Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
    }
  }

  check("file:///path?query");
  check("file:///path#fragment");
  check("file:///path?query#fragment");
  check("file://host/path", windowsOk: true);
  check("file://user:password@host/path", windowsOk: true);
}

main() {
  testFileUri();
  testFileUriWindowsSlash();
  testFileUriDriveLetter();
  testFileUriWindowsWin32Namespace();
  testFileUriResolve();
  testFileUriIllegalCharacters();
  testFileUriIllegalDriveLetter();
  testAdditionalComponents();
}
