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

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();
}
