| // 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] as String, test[1], false); | 
 |     check(test[0] as String, 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(); | 
 | } |