Only return true on Windows for Uri.IsUnc on file:// URI
[mono.git] / mcs / class / System / Test / System / UriTest2.cs
old mode 100755 (executable)
new mode 100644 (file)
index 4e5452a..2d956cc
@@ -1,14 +1,59 @@
+//\r
+// UriTest2.cs - More NUnit Test Cases for System.Uri\r
+//\r
+\r
 using System;\r
-using System.IO;
+using System.IO;\r
 using System.Reflection;\r
 using System.Text;\r
 using NUnit.Framework;\r
 \r
 namespace MonoTests.System\r
 {\r
+       // help bring Moonlight tests back to mono/mcs nunit\r
+\r
+       public delegate void TestCode ();\r
+\r
+       static class Assert2 {\r
+\r
+               public static void Throws<TException> (TestCode code, string message) where TException : Exception\r
+               {\r
+                       Throws (code, typeof (TException), null, message);\r
+               }\r
+\r
+               public static void Throws (TestCode code, Type expected_exception, Type expected_inner_exception, string message)\r
+               {\r
+                       bool failed = false;\r
+                       try {\r
+                               code ();\r
+                               failed = true;\r
+                       }\r
+                       catch (Exception ex) {\r
+                               if (!(ex.GetType () == expected_exception))\r
+                                       throw new AssertionException (string.Format ("Expected '{0}', got '{1}'. {2}", expected_exception.FullName, ex.GetType ().FullName, message));\r
+                               //System.Diagnostics.Debug.WriteLine (ex.ToString ());\r
+                               if (expected_inner_exception != null) {\r
+                                       // we only check if the inner exception was supplied\r
+                                       if (ex.InnerException.GetType () != expected_inner_exception)\r
+                                               throw new AssertionException (string.Format ("Expected InnerException '{0}', got '{1}'. {2}", expected_inner_exception.FullName, ex.InnerException.GetType ().FullName, message));\r
+                               }\r
+                       }\r
+                       if (failed)\r
+                               throw new AssertionException (string.Format ("Expected '{0}', but got no exception. {1}", expected_exception.FullName, message));\r
+               }\r
+       }\r
+
        [TestFixture]\r
-       public class UriTest2 : Assertion\r
+       public class UriTest2\r
        {\r
+               protected bool isWin32 = false;\r
+               \r
+               [SetUp]\r
+               public void SetUp ()\r
+               {\r
+                       isWin32 = (Path.DirectorySeparatorChar == '\\');\r
+               }\r
+\r
                // Segments cannot be validated here...\r
                public void AssertUri (string relsrc, Uri uri,\r
                        string toString,\r
@@ -29,28 +74,29 @@ namespace MonoTests.System
                        string fragment,\r
                        string userInfo)\r
                {\r
-                       AssertEquals (relsrc + " AbsoluteUri", absoluteUri, uri.AbsoluteUri);\r
-                       AssertEquals (relsrc + " Scheme", scheme, uri.Scheme);\r
-                       AssertEquals (relsrc + " Host", host, uri.Host);\r
-                       AssertEquals (relsrc + " Port", port, uri.Port);\r
+                       Assert.AreEqual (absoluteUri, uri.AbsoluteUri, relsrc + " AbsoluteUri");\r
+                       Assert.AreEqual (scheme, uri.Scheme, relsrc + " Scheme");\r
+                       Assert.AreEqual (host, uri.Host, relsrc + " Host");\r
+                       Assert.AreEqual (port, uri.Port, relsrc + " Port");\r
                        // Windows UNC path is not automatically testable on *nix environment,\r
                        if (relsrc.StartsWith ("\\\\") && Path.DirectorySeparatorChar == '\\')\r
-                               AssertEquals (relsrc + " LocalPath", localPath, uri.LocalPath);\r
-                       AssertEquals (relsrc + " Query", query, uri.Query);\r
-                       AssertEquals (relsrc + " Fragment", fragment, uri.Fragment);\r
-                       AssertEquals (relsrc + " IsFile", isFile, uri.IsFile);\r
-                       AssertEquals (relsrc + " IsUnc", isUnc, uri.IsUnc);\r
-                       AssertEquals (relsrc + " IsLoopback", isLoopback, uri.IsLoopback);\r
-                       AssertEquals (relsrc + " Authority", authority, uri.Authority);\r
-                       AssertEquals (relsrc + " UserEscaped", userEscaped, uri.UserEscaped);\r
-                       AssertEquals (relsrc + " UserInfo", userInfo, uri.UserInfo);\r
-                       AssertEquals (relsrc + " HostNameType", hostNameType, uri.HostNameType);\r
-                       AssertEquals (relsrc + " AbsolutePath", absolutePath, uri.AbsolutePath);\r
-                       AssertEquals (relsrc + " PathAndQuery", pathAndQuery, uri.PathAndQuery);\r
-                       AssertEquals (relsrc + " ToString()", toString, uri.ToString ());\r
+                               Assert.AreEqual (localPath, uri.LocalPath, relsrc + " LocalPath");\r
+                       Assert.AreEqual (query, uri.Query, relsrc + " Query");\r
+                       Assert.AreEqual (fragment, uri.Fragment, relsrc + " Fragment");\r
+                       Assert.AreEqual (isFile, uri.IsFile, relsrc + " IsFile");\r
+                       Assert.AreEqual (isUnc, uri.IsUnc, relsrc + " IsUnc");\r
+                       Assert.AreEqual (isLoopback, uri.IsLoopback, relsrc + " IsLoopback");\r
+                       Assert.AreEqual (authority, uri.Authority, relsrc + " Authority");\r
+                       Assert.AreEqual (userEscaped, uri.UserEscaped, relsrc + " UserEscaped");\r
+                       Assert.AreEqual (userInfo, uri.UserInfo, relsrc + " UserInfo");\r
+                       Assert.AreEqual (hostNameType, uri.HostNameType, relsrc + " HostNameType");\r
+                       Assert.AreEqual (absolutePath, uri.AbsolutePath, relsrc + " AbsolutePath");\r
+                       Assert.AreEqual (pathAndQuery, uri.PathAndQuery, relsrc + " PathAndQuery");\r
+                       Assert.AreEqual (toString, uri.ToString (), relsrc + " ToString()");\r
                }\r
 \r
                [Test]\r
+               [Ignore ("Tests needs to be updated for 2.0")]\r
                public void AbsoluteUriFromFile ()\r
                {\r
                        FromResource ("test-uri-props.txt", null);\r
@@ -58,20 +104,24 @@ namespace MonoTests.System
                \r
                [Test]\r
                [Category("NotDotNet")]\r
+               [Ignore ("Tests needs to be updated for 2.0")]\r
                public void AbsoluteUriFromFileManual ()\r
                {\r
+                       if (Path.DirectorySeparatorChar == '\\')\r
+                               return;\r
                        FromResource ("test-uri-props-manual.txt", null);\r
                }\r
                \r
                [Test]\r
+               [Ignore ("Tests needs to be updated for 2.0")]\r
                public void RelativeUriFromFile ()\r
                {\r
                        FromResource ("test-uri-relative-props.txt", new Uri ("http://www.go-mono.com"));\r
                }\r
                \r
                private void FromResource (string res, Uri baseUri)\r
-               {
-                       Assembly a = Assembly.GetExecutingAssembly ();
+               {\r
+                       Assembly a = Assembly.GetExecutingAssembly ();\r
                        Stream s = a.GetManifestResourceStream (res);\r
                        StreamReader sr = new StreamReader (s, Encoding.UTF8);\r
                        while (sr.Peek () > 0) {\r
@@ -126,19 +176,777 @@ TextWriter sw = Console.Out;
                                                sr.ReadLine ());\r
 //                             Console.WriteLine ("Passed: " + uriString);\r
                                } catch (UriFormatException ex) {\r
-                                       Fail (String.Format ("Construction failed: [{0}] {1}", uriString, ex.Message));\r
+                                       Assert.Fail (String.Format ("Construction failed: [{0}] {1}", uriString, ex.Message));\r
                                }\r
                        }\r
                }\r
+\r
+               [Test]\r
+               public void MoreUnescape () // bug 733316\r
+               {\r
+                       int index = 0;\r
+                       char unesc = Uri.HexUnescape ("%F6", ref index);\r
+                       Assert.AreEqual (3, index, "#01");\r
+                       Assert.AreEqual (0xf6, unesc, "#02");\r
+               }\r
+\r
+               [Test]\r
+               public void UriScheme ()\r
+               {\r
+                       Assert.AreEqual ("://", Uri.SchemeDelimiter, "://");\r
+                       Assert.AreEqual ("file", Uri.UriSchemeFile, "file");\r
+                       Assert.AreEqual ("ftp", Uri.UriSchemeFtp, "ftp");\r
+                       Assert.AreEqual ("gopher", Uri.UriSchemeGopher, "gopher");\r
+                       Assert.AreEqual ("http", Uri.UriSchemeHttp, "http");\r
+                       Assert.AreEqual ("https", Uri.UriSchemeHttps, "https");\r
+                       Assert.AreEqual ("mailto", Uri.UriSchemeMailto, "mailto");\r
+                       Assert.AreEqual ("news", Uri.UriSchemeNews, "news");\r
+                       Assert.AreEqual ("nntp", Uri.UriSchemeNntp, "file");\r
+                       Assert.AreEqual ("net.pipe", Uri.UriSchemeNetPipe, "net.pipe");\r
+                       Assert.AreEqual ("net.tcp", Uri.UriSchemeNetTcp, "net.tcp");\r
+               }\r
+\r
+               [Test] // bug #71049\r
+               [ExpectedException (typeof (UriFormatException))]\r
+               public void StarsInHost ()\r
+               {\r
+                       new Uri ("http://w*w*w.go-mono.com");\r
+               }\r
+\r
+               [Test]\r
+               public void NoHostName1_Bug76146 ()\r
+               {\r
+                       Uri u = new Uri ("foo:///?bar");\r
+                       Assert.AreEqual ("/", u.AbsolutePath, "AbsolutePath");\r
+                       Assert.AreEqual ("foo:///?bar", u.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual (String.Empty, u.Authority, "Authority");\r
+                       Assert.AreEqual (String.Empty, u.Fragment, "Fragment");\r
+                       Assert.AreEqual (String.Empty, u.Host, "Host");\r
+                       // FIXME (2.0) - Normally this is never Basic without an Host name :(\r
+                       // Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "HostNameType");\r
+                       Assert.IsTrue (u.IsDefaultPort, "IsDefaultPort");\r
+                       Assert.IsFalse (u.IsFile, "IsFile");\r
+                       // FIXME Assert.IsTrue (u.IsLoopback, "IsLoopback");\r
+                       Assert.IsFalse (u.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/", u.LocalPath, "LocalPath");\r
+                       Assert.AreEqual ("/?bar", u.PathAndQuery, "PathAndQuery");\r
+                       Assert.AreEqual ("foo", u.Scheme, "Scheme");\r
+                       Assert.IsFalse (u.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, u.UserInfo, "UserInfo");\r
+               }\r
+\r
+               [Test]\r
+               public void NoHostName2_Bug76146 ()\r
+               {\r
+                       Uri u = new Uri ("foo:///bar");\r
+                       Assert.AreEqual ("/bar", u.AbsolutePath, "AbsolutePath");\r
+                       Assert.AreEqual ("foo:///bar", u.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual (String.Empty, u.Authority, "Authority");\r
+                       Assert.AreEqual (String.Empty, u.Fragment, "Fragment");\r
+                       Assert.AreEqual (String.Empty, u.Host, "Host");\r
+                       // FIXME (2.0) - Normally this is never Basic without an Host name :(\r
+                       // Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "HostNameType");\r
+                       Assert.IsTrue (u.IsDefaultPort, "IsDefaultPort");\r
+                       Assert.IsFalse (u.IsFile, "IsFile");\r
+                       // FIXME Assert.IsTrue (u.IsLoopback, "IsLoopback");\r
+                       Assert.IsFalse (u.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/bar", u.LocalPath, "LocalPath");\r
+                       Assert.AreEqual ("/bar", u.PathAndQuery, "PathAndQuery");\r
+                       Assert.AreEqual ("foo", u.Scheme, "Scheme");\r
+                       Assert.IsFalse (u.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, u.UserInfo, "UserInfo");\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (UriFormatException))]\r
+               public void InvalidIPAddress_Bug76659 ()\r
+               {\r
+                       new Uri ("http://127.0.0.1::::/");\r
+               }\r
+
+               [Test]\r
+               public void File ()\r
+               {\r
+                       string s = "file:///dir1%2f..%2fdir%2fapp.xap#header";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/dir/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       // default port is removed\r
+                       Assert.AreEqual ("file:///dir/app.xap#header", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual (String.Empty, uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual ("#header", uri.Fragment, "Fragment");\r
+                       Assert.AreEqual (String.Empty, uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/dir/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (-1, uri.Port, "Port");\r
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");\r
+                       Assert.AreEqual ("file", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpWithDefaultPort ()\r
+               {\r
+                       string s = "HTTP://host.domain.com:80/app.xap";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       // default port is removed\r
+                       Assert.AreEqual ("http://host.domain.com/app.xap", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (80, uri.Port, "Port");\r
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");\r
+                       Assert.AreEqual ("http", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpWithoutPort ()\r
+               {\r
+                       string s = "Http://host.DOMAIN.com/dir/app.xap#options";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/dir/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       Assert.AreEqual ("http://host.domain.com/dir/app.xap#options", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual ("#options", uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/dir/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (80, uri.Port, "Port");\r
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");\r
+                       Assert.AreEqual ("http", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpWithNonStandardPort ()\r
+               {\r
+                       string s = "http://monkey:s3kr3t@HOST.domain.Com:8080/dir/../app.xap?option=1";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       // non-standard port is present\r
+                       Assert.AreEqual ("http://monkey:s3kr3t@host.domain.com:8080/app.xap?option=1", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (8080, uri.Port, "Port");\r
+                       Assert.AreEqual ("?option=1", uri.Query, "Query");\r
+                       Assert.AreEqual ("http", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual ("monkey:s3kr3t", uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpsWithDefaultPort ()\r
+               {\r
+                       string s = "httpS://host.domain.com:443/";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/", uri.AbsolutePath, "AbsolutePath");\r
+                       // default port is removed\r
+                       Assert.AreEqual ("https://host.domain.com/", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (443, uri.Port, "Port");\r
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");\r
+                       Assert.AreEqual ("https", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpsWithoutPort ()\r
+               {\r
+                       string s = "Https://host.DOMAIN.com/dir%2fapp.xap#";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/dir/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       Assert.AreEqual ("https://host.domain.com/dir/app.xap#", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual ("#", uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/dir/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (443, uri.Port, "Port");\r
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");\r
+                       Assert.AreEqual ("https", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void HttpsWithNonStandardPort ()\r
+               {\r
+                       string s = "https://monkey:s3kr3t@HOST.domain.Com:4430/dir/..%5Capp.xap?";\r
+                       Uri uri = new Uri (s);\r
+                       Assert.AreEqual ("/app.xap", uri.AbsolutePath, "AbsolutePath");\r
+                       // non-standard port is present\r
+                       Assert.AreEqual ("https://monkey:s3kr3t@host.domain.com:4430/app.xap?", uri.AbsoluteUri, "AbsoluteUri");\r
+                       Assert.AreEqual ("host.domain.com", uri.DnsSafeHost, "DnsSafeHost");\r
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");\r
+                       Assert.AreEqual ("host.domain.com", uri.Host, "Host");\r
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");\r
+                       Assert.AreEqual ("/app.xap", uri.LocalPath, "LocalPath");\r
+                       Assert.AreEqual (s, uri.OriginalString, "OriginalString");\r
+                       Assert.AreEqual (4430, uri.Port, "Port");\r
+                       Assert.AreEqual ("?", uri.Query, "Query");\r
+                       Assert.AreEqual ("https", uri.Scheme, "Scheme");\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+                       Assert.AreEqual ("monkey:s3kr3t", uri.UserInfo, "UserInfo");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void Relative ()\r
+               {\r
+                       Uri relative = new Uri ("/Moonlight", UriKind.Relative);\r
+\r
+                       Assert2.Throws<ArgumentNullException> (delegate {\r
+                               new Uri (null, "/Moonlight");\r
+                       }, "null,string");\r
+                       Assert2.Throws<ArgumentNullException> (delegate {\r
+                               new Uri (null, relative);\r
+                       }, "null,Uri");\r
+\r
+                       Assert2.Throws<ArgumentOutOfRangeException> (delegate {\r
+                               new Uri (relative, "/Moonlight");\r
+                       }, "Uri,string");\r
+                       Assert2.Throws<ArgumentOutOfRangeException> (delegate {\r
+                               new Uri (relative, relative);\r
+                       }, "Uri,Uri");\r
+\r
+                       Assert2.Throws<ArgumentOutOfRangeException> (delegate {\r
+                               new Uri (relative, (string) null);\r
+                       }, "Uri,string-null");\r
+                       Assert2.Throws<ArgumentOutOfRangeException> (delegate {\r
+                               new Uri (relative, (Uri) null);\r
+                       }, "Uri,Uri-null");\r
+               }\r
+\r
+               private void CheckRelativeUri (Uri uri)\r
+               {\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.AbsolutePath);\r
+                       }, "AbsolutePath");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.AbsoluteUri);\r
+                       }, "AbsoluteUri");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.DnsSafeHost);\r
+                       }, "DnsSafeHost");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.Fragment);\r
+                       }, "Fragment");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.Host);\r
+                       }, "Host");\r
+\r
+                       Assert.IsFalse (uri.IsAbsoluteUri, "IsAbsoluteUri");\r
+\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.IsUnc);\r
+                       }, "IsUnc");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.LocalPath);\r
+                       }, "LocalPath");\r
+\r
+                       Assert.AreEqual ("/Moonlight", uri.OriginalString, "OriginalString");\r
+\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.Port);\r
+                       }, "Port");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.Query);\r
+                       }, "Query");\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.Scheme);\r
+                       }, "Scheme");\r
+\r
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");\r
+\r
+                       Assert2.Throws<InvalidOperationException> (delegate {\r
+                               Assert.IsNotNull (uri.UserInfo);\r
+                       }, "UserInfo");\r
+\r
+                       Assert.AreEqual ("/Moonlight", uri.ToString (), "ToString");\r
+               }\r
+\r
+               [Test]\r
+               public void Relative_AsRelative ()\r
+               {\r
+                       Uri uri = new Uri ("/Moonlight", UriKind.Relative);\r
+                       CheckRelativeUri (uri);\r
+               }\r
+\r
+               [Test]\r
+               public void Bug496783 ()\r
+               {\r
+                       string s = "tcp://csve2.csse.unimelb.edu.au:9090/Aneka";\r
+                       Uri uri = new Uri (s);\r
+                       // this is not parsed by a known UriParser\r
+                       Assert.IsFalse (UriParser.IsKnownScheme (uri.Scheme), "UriParser");\r
+\r
+                       Uri uri2 = new Uri ("tcp://csve2.csse.unimelb.edu.au:9090/");\r
+                       Assert.IsTrue (uri2.IsBaseOf (uri), "IsBaseOf");\r
+\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.GetComponents (UriComponents.AbsoluteUri, UriFormat.Unescaped), "AbsoluteUri");\r
+                       Assert.AreEqual (uri.Fragment, uri.GetComponents (UriComponents.Fragment, UriFormat.Unescaped), "Fragment");\r
+                       Assert.AreEqual (uri.Host, uri.GetComponents (UriComponents.Host, UriFormat.Unescaped), "Host");\r
+                       Assert.AreEqual (uri.Authority, uri.GetComponents (UriComponents.HostAndPort, UriFormat.Unescaped), "HostAndPort");\r
+                       Assert.AreEqual (uri.AbsoluteUri, uri.GetComponents (UriComponents.HttpRequestUrl, UriFormat.Unescaped), "HttpRequestUrl");\r
+                       Assert.AreEqual (String.Empty, uri.GetComponents (UriComponents.KeepDelimiter, UriFormat.Unescaped), "KeepDelimiter");\r
+                       Assert.AreEqual ("Aneka", uri.GetComponents (UriComponents.Path, UriFormat.Unescaped), "Path");\r
+                       Assert.AreEqual (uri.LocalPath, uri.GetComponents (UriComponents.PathAndQuery, UriFormat.Unescaped), "PathAndQuery");\r
+                       Assert.AreEqual (uri.Port.ToString (), uri.GetComponents (UriComponents.Port, UriFormat.Unescaped), "Port");\r
+                       Assert.AreEqual (uri.Query, uri.GetComponents (UriComponents.Query, UriFormat.Unescaped), "Query");\r
+                       Assert.AreEqual (uri.Scheme, uri.GetComponents (UriComponents.Scheme, UriFormat.Unescaped), "Scheme");\r
+                       Assert.AreEqual ("tcp://csve2.csse.unimelb.edu.au:9090", uri.GetComponents (UriComponents.SchemeAndServer, UriFormat.Unescaped), "SchemeAndServer");\r
+                       Assert.AreEqual (uri.OriginalString, uri.GetComponents (UriComponents.SerializationInfoString, UriFormat.Unescaped), "SerializationInfoString");\r
+                       Assert.AreEqual (uri.Authority, uri.GetComponents (UriComponents.StrongAuthority, UriFormat.Unescaped), "StrongAuthority");\r
+                       Assert.AreEqual (uri.Port.ToString (), uri.GetComponents (UriComponents.StrongPort, UriFormat.Unescaped), "StrongPort");\r
+                       Assert.AreEqual (uri.UserInfo, uri.GetComponents (UriComponents.UserInfo, UriFormat.Unescaped), "UserInfo");\r
+               }\r
 
                [Test]
-               public void MoreUnescape () // bug 733316
+               public void Merge_Query_Fragment ()
                {
-                       int index = 0;
-                       char unesc = Uri.HexUnescape ("%F6", ref index);
-                       AssertEquals ("#01", 3, index);
-                       AssertEquals ("#02", 0xf6, unesc);
+                       Uri absolute = new Uri ("http://host/dir/subdir/weird;name?moonlight");
+                       Assert.AreEqual ("?moonlight", absolute.Query, "absolute.Query");
+
+                       Uri merged = new Uri (absolute, "#mono");
+                       Assert.AreEqual ("#mono", merged.Fragment, "merged.Fragment");
+                       Assert.AreEqual ("?moonlight", merged.Query, "merged.Query");
+                       Assert.AreEqual ("http://host/dir/subdir/weird;name?moonlight#mono", merged.ToString (), "merged.ToString");
+               }
+
+               [Test]
+               public void Merge_Query_Query ()
+               {
+                       Uri absolute = new Uri ("http://host/dir/subdir/weird;name?moonlight");
+                       Assert.AreEqual ("?moonlight", absolute.Query, "absolute.Query");
+
+                       Uri merged = new Uri (absolute, "?moon");
+                       Assert.AreEqual ("?moon", merged.Query, "merged.Query");
+#if NET_4_0
+                       Assert.AreEqual ("http://host/dir/subdir/weird;name?moon", merged.ToString (), "merged.ToString");
+#else
+                       Assert.AreEqual ("http://host/dir/subdir/?moon", merged.ToString (), "merged.ToString");
+#endif
+               }
+
+               [Test]
+               public void Merge_Query_RelativePath ()
+               {
+                       Uri absolute = new Uri ("http://host/dir/subdir/weird;name?moonlight");
+                       Assert.AreEqual ("?moonlight", absolute.Query, "absolute.Query");
+
+                       Uri merged = new Uri (absolute, "../");
+                       Assert.AreEqual (String.Empty, merged.Query, "../Query");
+                       Assert.AreEqual ("http://host/dir/", merged.ToString (), "../ToString");
+
+                       merged = new Uri (absolute, "..");
+                       Assert.AreEqual (String.Empty, merged.Query, "..Query");
+                       Assert.AreEqual ("http://host/dir/", merged.ToString (), "..ToString");
+
+                       merged = new Uri (absolute, "./");
+                       Assert.AreEqual (String.Empty, merged.Query, "./Query");
+                       Assert.AreEqual ("http://host/dir/subdir/", merged.ToString (), "./ToString");
+
+                       merged = new Uri (absolute, ".");
+                       Assert.AreEqual (String.Empty, merged.Query, ".Query");
+                       Assert.AreEqual ("http://host/dir/subdir/", merged.ToString (), ".ToString");
+
+                       merged = new Uri (absolute, "/");
+                       Assert.AreEqual (String.Empty, merged.Query, "/Query");
+                       Assert.AreEqual ("http://host/", merged.ToString (), "/ToString");
+
+                       merged = new Uri (absolute, "index.html");
+                       Assert.AreEqual (String.Empty, merged.Query, "index.html Query");
+                       Assert.AreEqual ("http://host/dir/subdir/index.html", merged.ToString (), "index.html ToString");
+
+                       merged = new Uri (absolute, "i");
+                       Assert.AreEqual (String.Empty, merged.Query, "i Query");
+                       Assert.AreEqual ("http://host/dir/subdir/i", merged.ToString (), "i ToString");
+
+                       merged = new Uri (absolute, String.Empty);
+                       Assert.AreEqual ("?moonlight", merged.Query, "Query");
+                       Assert.AreEqual ("http://host/dir/subdir/weird;name?moonlight", merged.ToString (), "ToString");
+               }
+
+               [Test]
+               public void Merge_Fragment_RelativePath ()
+               {
+                       Uri absolute = new Uri ("http://host/dir/subdir/weird;name#mono");
+                       Assert.AreEqual ("#mono", absolute.Fragment, "absolute.Fragment");
+
+                       Uri merged = new Uri (absolute, "../");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "../Fragment");
+                       Assert.AreEqual ("http://host/dir/", merged.ToString (), "../ToString");
+
+                       merged = new Uri (absolute, "..");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "..Fragment");
+                       Assert.AreEqual ("http://host/dir/", merged.ToString (), "..ToString");
+
+                       merged = new Uri (absolute, "./");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "./Fragment");
+                       Assert.AreEqual ("http://host/dir/subdir/", merged.ToString (), "./ToString");
+
+                       merged = new Uri (absolute, ".");
+                       Assert.AreEqual (String.Empty, merged.Fragment, ".Fragment");
+                       Assert.AreEqual ("http://host/dir/subdir/", merged.ToString (), ".ToString");
+
+                       merged = new Uri (absolute, "/");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "/Fragment");
+                       Assert.AreEqual ("http://host/", merged.ToString (), "/ToString");
+
+                       merged = new Uri (absolute, "index.html");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "index.html Fragment");
+                       Assert.AreEqual ("http://host/dir/subdir/index.html", merged.ToString (), "index.html ToString");
+
+                       merged = new Uri (absolute, "i");
+                       Assert.AreEqual (String.Empty, merged.Fragment, "i Fragment");
+                       Assert.AreEqual ("http://host/dir/subdir/i", merged.ToString (), "i ToString");
+
+                       merged = new Uri (absolute, String.Empty);
+                       Assert.AreEqual ("#mono", merged.Fragment, "Fragment");
+                       Assert.AreEqual ("http://host/dir/subdir/weird;name#mono", merged.ToString (), "ToString");
+               }
+
+               [Test]
+               public void Host_Drive ()
+               {
+                       Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("c:"), "c:");
+                       Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("c"), "c");
+
+                       Uri uri = new Uri ("http://c:/dir/subdir/file");
+                       Assert.AreEqual ("c", uri.Authority, "http.Authority");
+                       Assert.AreEqual ("c", uri.DnsSafeHost, "http.DnsSafeHost");
+                       Assert.AreEqual ("c", uri.Host, "http.Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "http.HostNameType");
+                       Assert.AreEqual ("http://c/dir/subdir/file", uri.ToString (), "http.ToString");
+
+                       uri = new Uri ("https://c:/dir/subdir/file");
+                       Assert.AreEqual ("c", uri.Authority, "https.Authority");
+                       Assert.AreEqual ("c", uri.DnsSafeHost, "https.DnsSafeHost");
+                       Assert.AreEqual ("c", uri.Host, "https.Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "https.HostNameType");
+                       Assert.AreEqual ("https://c/dir/subdir/file", uri.ToString (), "https.ToString");
+
+                       uri = new Uri ("ftp://c:/dir/subdir/file");
+                       Assert.AreEqual ("c", uri.Authority, "ftp.Authority");
+                       Assert.AreEqual ("c", uri.DnsSafeHost, "ftp.DnsSafeHost");
+                       Assert.AreEqual ("c", uri.Host, "ftp.Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "ftp.HostNameType");
+                       Assert.AreEqual ("ftp://c/dir/subdir/file", uri.ToString (), "ftp.ToString");
+
+                       uri = new Uri ("nntp://c:/123456@c");
+                       Assert.AreEqual ("c", uri.Authority, "nntp.Authority");
+                       Assert.AreEqual ("c", uri.DnsSafeHost, "nntp.DnsSafeHost");
+                       Assert.AreEqual ("c", uri.Host, "nntp.Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "nntp.HostNameType");
+                       Assert.AreEqual ("nntp://c/123456@c", uri.ToString (), "nntp.ToString");
+
+                       uri = new Uri ("file://c:/dir/subdir/file");
+                       Assert.AreEqual (String.Empty, uri.Authority, "file.Authority");
+                       Assert.AreEqual (String.Empty, uri.DnsSafeHost, "file.DnsSafeHost");
+                       Assert.AreEqual (String.Empty, uri.Host, "file.Host");
+                       Assert.AreEqual (UriHostNameType.Basic, uri.HostNameType, "file.HostNameType");
+                       Assert.AreEqual ("file:///c:/dir/subdir/file", uri.ToString (), "file.ToString");
+               }
+
+               [Test]
+               public void UnknownScheme ()
+               {
+                       Uri uri = new Uri ("mono:c:\\dir\\subdir\\file");
+                       Assert.IsFalse (uri.IsWellFormedOriginalString (), "IsWellFormedOriginalString");
+                       Assert.AreEqual (String.Empty, uri.Host, "Host");
+                       Assert.AreEqual ("c:\\dir\\subdir\\file", uri.LocalPath, "LocalPath");
+                       // make the next assert work on both Windows and Mac (wrt Silverlight)
+                       Assert.AreEqual ("mono:c:/dir/subdir/file", uri.ToString ().Replace ("%5C", "/"), "ToString");
+
+                       uri = new Uri ("mono://host/dir/subdir/file");
+                       Assert.IsTrue (uri.IsWellFormedOriginalString (), "2/IsWellFormedOriginalString");
+                       Assert.AreEqual ("host", uri.Host, "2/Host");
+                       Assert.AreEqual ("/dir/subdir/file", uri.AbsolutePath, "2/AbsolutePath");
+                       Assert.AreEqual ("/dir/subdir/file", uri.LocalPath, "2/LocalPath");
+
+                       uri = new Uri ("mono:///host/dir/subdir/file");
+                       Assert.IsTrue (uri.IsWellFormedOriginalString (), "3/IsWellFormedOriginalString");
+                       Assert.AreEqual (String.Empty, uri.Host, "3/Host");
+                       Assert.AreEqual ("/host/dir/subdir/file", uri.AbsolutePath, "3/AbsolutePath");
+                       Assert.AreEqual ("/host/dir/subdir/file", uri.LocalPath, "3/LocalPath");
+
+                       uri = new Uri ("mono:////host/dir/subdir/file");
+                       Assert.IsTrue (uri.IsWellFormedOriginalString (), "4/IsWellFormedOriginalString");
+                       Assert.AreEqual (String.Empty, uri.Host, "4/Host");
+                       Assert.AreEqual ("//host/dir/subdir/file", uri.AbsolutePath, "4/AbsolutePath");
+                       Assert.AreEqual ("//host/dir/subdir/file", uri.LocalPath, "4/LocalPath");
+
+                       // query and fragment
+                       uri = new Uri ("mono://host/dir/subdir/file?query#fragment");
+                       Assert.AreEqual ("/dir/subdir/file", uri.AbsolutePath, "qf.AbsolutePath");
+                       Assert.AreEqual ("?query", uri.Query, "qf.Query");
+                       Assert.AreEqual ("#fragment", uri.Fragment, "qf.Fragment");
+
+                       // special characters
+                       uri = new Uri ("mono://host/<>%\"{}|\\^`;/:@&=+$,[]#abc");
+                       Assert.AreEqual ("/%3C%3E%25%22%7B%7D%7C/%5E%60;/:@&=+$,%5B%5D", uri.AbsolutePath, "Special");
+               }
+
+               [Test]
+               public void DriveAndForwardSlashes_Segments ()
+               {
+                       Uri uri = new Uri ("mono:c:\\dir\\subdir\\file");
+                       string [] segments = uri.Segments;
+                       Assert.AreEqual (4, segments.Length, "segments");
+                       // make the tests work on both Windows and Mac (wrt Silverlight)
+                       Assert.AreEqual ("c:/", segments [0].Replace ("%5C", "/"), "s[0]");
+                       Assert.AreEqual ("dir/", segments [1].Replace ("%5C", "/"), "s[1]");
+                       Assert.AreEqual ("subdir/", segments [2].Replace ("%5C", "/"), "s[2]");
+                       Assert.AreEqual ("file", segments [3], "s[3]");
+               }
+
+               [Test]
+               public void NewsScheme ()
+               {
+                       Uri uri = new Uri ("news:novell.mono.moonlight/uri?query");
+
+                       Assert.AreEqual ("novell.mono.moonlight/uri%3Fquery", uri.AbsolutePath, "AbsolutePath");
+                       Assert.AreEqual ("news:novell.mono.moonlight/uri%3Fquery", uri.AbsoluteUri, "AbsoluteUri");
+                       Assert.AreEqual (String.Empty, uri.Authority, "Authority");
+                       Assert.AreEqual (String.Empty, uri.DnsSafeHost, "DnsSafeHost");
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");
+                       Assert.AreEqual (String.Empty, uri.Host, "Host");
+                       Assert.AreEqual (UriHostNameType.Unknown, uri.HostNameType, "HostNameType");
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
+                       Assert.IsTrue (uri.IsDefaultPort, "IsDefaultPort");
+                       Assert.IsFalse (uri.IsFile, "IsFile");
+                       Assert.IsFalse (uri.IsLoopback, "IsLoopback");
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");
+                       Assert.AreEqual ("novell.mono.moonlight/uri?query", uri.LocalPath, "LocalPath");
+                       Assert.AreEqual ("news:novell.mono.moonlight/uri?query", uri.OriginalString, "OriginalString");
+                       Assert.AreEqual ("novell.mono.moonlight/uri%3Fquery", uri.PathAndQuery, "PathAndQuery");
+                       Assert.AreEqual (-1, uri.Port, "Port");
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");
+                       Assert.AreEqual ("news", uri.Scheme, "Scheme");
+                       Assert.AreEqual ("novell.mono.moonlight/", uri.Segments [0], "Segments [0]");
+                       Assert.AreEqual ("uri%3Fquery", uri.Segments [1], "Segments [1]");
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");
+
+                       // special escaped characters - they differs a bit from other URI
+                       uri = new Uri ("news:novell.mono.moonlight/<>%\"{}|\\^`;/?:@&=+$,[]#abc");
+                       Assert.AreEqual ("novell.mono.moonlight/%3C%3E%25%22%7B%7D%7C%5C%5E%60;/%3F:@&=+$,%5B%5D", uri.AbsolutePath, "Special");
+                       Assert.AreEqual ("#abc", uri.Fragment, "Special/Fragment");
+               }
+
+               [Test]
+               public void NntpScheme ()
+               {
+                       Uri uri = new Uri ("nntp://news.mono-project.com/novell.mono.moonlight/uri?query");
+
+                       Assert.AreEqual ("/novell.mono.moonlight/uri%3Fquery", uri.AbsolutePath, "AbsolutePath");
+                       Assert.AreEqual ("nntp://news.mono-project.com/novell.mono.moonlight/uri%3Fquery", uri.AbsoluteUri, "AbsoluteUri");
+                       Assert.AreEqual ("news.mono-project.com", uri.Authority, "Authority");
+                       Assert.AreEqual ("news.mono-project.com", uri.DnsSafeHost, "DnsSafeHost");
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");
+                       Assert.AreEqual ("news.mono-project.com", uri.Host, "Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "HostNameType");
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
+                       Assert.IsTrue (uri.IsDefaultPort, "IsDefaultPort");
+                       Assert.IsFalse (uri.IsFile, "IsFile");
+                       Assert.IsFalse (uri.IsLoopback, "IsLoopback");
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");
+                       Assert.AreEqual ("/novell.mono.moonlight/uri?query", uri.LocalPath, "LocalPath");
+                       Assert.AreEqual ("nntp://news.mono-project.com/novell.mono.moonlight/uri?query", uri.OriginalString, "OriginalString");
+                       Assert.AreEqual ("/novell.mono.moonlight/uri%3Fquery", uri.PathAndQuery, "PathAndQuery");
+                       Assert.AreEqual (119, uri.Port, "Port");
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");
+                       Assert.AreEqual ("nntp", uri.Scheme, "Scheme");
+                       Assert.AreEqual ("/", uri.Segments [0], "Segments [0]");
+                       Assert.AreEqual ("novell.mono.moonlight/", uri.Segments [1], "Segments [1]");
+                       Assert.AreEqual ("uri%3Fquery", uri.Segments [2], "Segments [2]");
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");
+
+                       // special escaped characters - they differs a bit from other URI
+                       uri = new Uri ("nntp://news.mono-project.com/novell.mono.moonlight/<>%\"{}|\\^`;/?:@&=+$,[]#abc");
+                       Assert.AreEqual ("/novell.mono.moonlight/%3C%3E%25%22%7B%7D%7C%5C%5E%60;/%3F:@&=+$,%5B%5D", uri.AbsolutePath, "Special");
+                       Assert.AreEqual ("#abc", uri.Fragment, "Special/Fragment");
+               }
+
+               [Test]
+               public void FtpScheme ()
+               {
+                       // user, password, custom port and a "query"
+                       Uri uri = new Uri ("ftp://user:password@ftp.mono-project.com:2121/mono.zip?latest-n-greatest");
+                       Assert.AreEqual ("/mono.zip%3Flatest-n-greatest", uri.AbsolutePath, "AbsolutePath");
+                       Assert.AreEqual ("ftp://user:password@ftp.mono-project.com:2121/mono.zip%3Flatest-n-greatest", uri.AbsoluteUri, "AbsoluteUri");
+                       Assert.AreEqual ("ftp.mono-project.com:2121", uri.Authority, "Authority");
+                       Assert.AreEqual ("ftp.mono-project.com", uri.DnsSafeHost, "DnsSafeHost");
+                       Assert.AreEqual (String.Empty, uri.Fragment, "Fragment");
+                       Assert.AreEqual ("ftp.mono-project.com", uri.Host, "Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "HostNameType");
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
+                       Assert.IsFalse (uri.IsDefaultPort, "IsDefaultPort");
+                       Assert.IsFalse (uri.IsFile, "IsFile");
+                       Assert.IsFalse (uri.IsLoopback, "IsLoopback");
+                       Assert.IsFalse (uri.IsUnc, "IsUnc");
+                       Assert.AreEqual ("/mono.zip?latest-n-greatest", uri.LocalPath, "LocalPath");
+                       Assert.AreEqual ("ftp://user:password@ftp.mono-project.com:2121/mono.zip?latest-n-greatest", uri.OriginalString, "OriginalString");
+                       Assert.AreEqual ("/mono.zip%3Flatest-n-greatest", uri.PathAndQuery, "PathAndQuery");
+                       Assert.AreEqual (2121, uri.Port, "Port");
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");
+                       Assert.AreEqual ("ftp", uri.Scheme, "Scheme");
+                       Assert.AreEqual ("/", uri.Segments [0], "Segments [0]");
+                       Assert.AreEqual ("mono.zip%3Flatest-n-greatest", uri.Segments [1], "Segments [1]");
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");
+                       Assert.AreEqual ("user:password", uri.UserInfo, "UserInfo");
+
+                       // special characters and fragment
+                       uri = new Uri ("ftp://ftp.mono-project.com/<>%\"{}|\\^`;/?:@&=+$,[]#abc");
+                       Assert.AreEqual ("/%3C%3E%25%22%7B%7D%7C/%5E%60;/%3F:@&=+$,%5B%5D", uri.AbsolutePath, "Special");
+                       Assert.AreEqual ("#abc", uri.Fragment, "Special/Fragment");
+               }
+
+               [Test]
+               public void FileScheme ()
+               {
+                       Uri uri = new Uri ("file://host/dir/subdir/file?this-is-not-a-query#but-this-is-a-fragment");
+                       Assert.AreEqual ("/dir/subdir/file%3Fthis-is-not-a-query", uri.AbsolutePath, "AbsolutePath");
+                       Assert.AreEqual ("file://host/dir/subdir/file%3Fthis-is-not-a-query#but-this-is-a-fragment", uri.AbsoluteUri, "AbsoluteUri");
+                       Assert.AreEqual ("host", uri.Authority, "Authority");
+                       Assert.AreEqual ("host", uri.DnsSafeHost, "DnsSafeHost");
+                       Assert.AreEqual ("#but-this-is-a-fragment", uri.Fragment, "Fragment");
+                       Assert.AreEqual ("host", uri.Host, "Host");
+                       Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "HostNameType");
+                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
+                       Assert.IsTrue (uri.IsDefaultPort, "IsDefaultPort");
+                       Assert.IsTrue (uri.IsFile, "IsFile");
+                       Assert.IsFalse (uri.IsLoopback, "IsLoopback");
+                       Assert.AreEqual (isWin32, uri.IsUnc, "IsUnc");
+                       Assert.AreEqual (isWin32 ? "\\\\host\\dir\\subdir\\file?this-is-not-a-query" : "/dir/subdir/file?this-is-not-a-query", uri.LocalPath, "LocalPath");
+                       Assert.AreEqual ("file://host/dir/subdir/file?this-is-not-a-query#but-this-is-a-fragment", uri.OriginalString, "OriginalString");
+                       Assert.AreEqual ("/dir/subdir/file%3Fthis-is-not-a-query", uri.PathAndQuery, "PathAndQuery");
+                       Assert.AreEqual (-1, uri.Port, "Port");
+                       Assert.AreEqual (String.Empty, uri.Query, "Query");
+                       Assert.AreEqual ("file", uri.Scheme, "Scheme");
+                       Assert.AreEqual ("/", uri.Segments [0], "Segments [0]");
+                       Assert.AreEqual ("dir/", uri.Segments [1], "Segments [1]");
+                       Assert.AreEqual ("subdir/", uri.Segments [2], "Segments [2]");
+                       Assert.AreEqual ("file%3Fthis-is-not-a-query", uri.Segments [3], "Segments [3]");
+                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");
+                       Assert.AreEqual (String.Empty, uri.UserInfo, "UserInfo");
+
+                       // special characters
+                       uri = new Uri ("file://host/<>%\"{}|\\^`;/?:@&=+$,[]#abc");
+                       Assert.AreEqual ("/%3C%3E%25%22%7B%7D%7C/%5E%60;/%3F:@&=+$,%5B%5D", uri.AbsolutePath, "Special");
+               }
+
+               [Test]
+               public void PathReduction_2e ()
+               {
+                       Uri uri = new Uri ("http://host/dir/%2e%2E/file");
+                       Assert.AreEqual ("/file", uri.AbsolutePath, "AbsolutePath");
+                       Assert.AreEqual ("http://host/file", uri.AbsoluteUri, "AbsoluteUri");
+                       Assert.AreEqual ("/", uri.Segments [0], "Segments [0]");
+                       Assert.AreEqual ("file", uri.Segments [1], "Segments [1]");
+               }
+
+               [Test]
+               public void ColonButNoPort ()
+               {
+                       Uri uri = new Uri ("http://host:");
+                       Assert.AreEqual ("http", uri.Scheme, "1.Scheme");
+                       Assert.AreEqual ("host", uri.Host, "1.Host");
+                       Assert.AreEqual (80, uri.Port, "1.Port");
+                       Assert.IsTrue (uri.IsDefaultPort, "1.IsDefaultPort");
+
+                       uri = new Uri ("ftp://host:/dir/file");
+                       Assert.AreEqual ("ftp", uri.Scheme, "2.Scheme");
+                       Assert.AreEqual ("host", uri.Host, "2.Host");
+                       Assert.AreEqual (21, uri.Port, "2.Port");
+                       Assert.IsTrue (uri.IsDefaultPort, "2.IsDefaultPort");
+               }
+
+               [Test]
+               public void IPv6SafeDnsName ()
+               {
+                       Uri uri = new Uri ("http://[1:2:3:4:5:6:7:8]");
+                       Assert.AreEqual (UriHostNameType.IPv6, uri.HostNameType, "1.HostNameType");
+                       Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", uri.Authority, "1.Authority");
+                       Assert.AreEqual ("0001:0002:0003:0004:0005:0006:0007:0008", uri.DnsSafeHost, "1.DnsSafeHost");
+                       Assert.AreEqual ("[0001:0002:0003:0004:0005:0006:0007:0008]", uri.Host, "1.Host");
+
+                       uri = new Uri ("http://[fe80::200:39ff:fe36:1a2d%4]/temp/example.htm");
+                       Assert.AreEqual (UriHostNameType.IPv6, uri.HostNameType, "1.HostNameType");
+                       Assert.AreEqual ("[FE80:0000:0000:0000:0200:39FF:FE36:1A2D]", uri.Authority, "2.Authority");
+                       Assert.AreEqual ("FE80:0000:0000:0000:0200:39FF:FE36:1A2D%4", uri.DnsSafeHost, "2.DnsSafeHost");
+                       Assert.AreEqual ("[FE80:0000:0000:0000:0200:39FF:FE36:1A2D]", uri.Host, "2.Host");
+               }
+
+               [Test]
+               public void RelativeEscapes ()
+               {
+                       Uri uri = new Uri ("%2e%2e/dir/%2e%2e/subdir/file?query#fragment", UriKind.Relative);
+                       Assert.AreEqual ("%2e%2e/dir/%2e%2e/subdir/file?query#fragment", uri.ToString (), "1.ToString");
+               }
+
+               [Test]
+               public void BadUri ()
+               {
+                       Assert2.Throws<UriFormatException> (delegate {
+                               new Uri ("a:b", UriKind.Absolute);
+                       }, "a:b - Absolute");
+
+                       Uri abs = new Uri ("http://novell.com", UriKind.Absolute);
+                       Assert2.Throws<UriFormatException> (delegate {
+                               new Uri (abs, "a:b");
+                       }, "a:b - Relative");
+               }
+
+               [Test]
+               public void MergeWithConfusingRelativeUri ()
+               {
+                       Uri abs = new Uri ("http://novell.com", UriKind.Absolute);
+
+                       // note: invalid scheme
+                       string srel = "http@ftp://mono-project.com/dir/file";
+                       Uri uri = new Uri (abs, srel);
+                       Assert.AreEqual ("http://novell.com/http@ftp://mono-project.com/dir/file", uri.ToString (), "1.ToString");
+
+                       Uri rel = new Uri (srel, UriKind.Relative);
+                       Assert.AreEqual ("http@ftp://mono-project.com/dir/file", rel.ToString (), "2.ToString");
+
+                       uri = new Uri (abs, rel);
+                       Assert.AreEqual ("http://novell.com/http@ftp://mono-project.com/dir/file", uri.ToString (), "3.ToString");
                }
-\r
        }\r
 }\r