svn path=/trunk/mcs/; revision=104772
[mono.git] / mcs / class / System / Test / System / UriTest.cs
index 5a66f65462fa31e6d730f1ba06a841433855dd1f..5dce5632ebd4cfa3278eb4f3570db93d7aa959ef 100644 (file)
@@ -13,6 +13,7 @@
 using NUnit.Framework;
 using System;
 using System.IO;
+using System.Text;
 
 namespace MonoTests.System
 {
@@ -21,7 +22,7 @@ namespace MonoTests.System
        {
                protected bool isWin32 = false;
 
-               [SetUp]
+               [TestFixtureSetUp]
                public void GetReady () 
                {
                        isWin32 = (Path.DirectorySeparatorChar == '\\');
@@ -31,7 +32,7 @@ namespace MonoTests.System
                public void Constructors ()
                {
                        Uri uri = null;
-                       
+
                        /*
                        uri = new Uri ("http://www.ximian.com/foo" + ((char) 0xa9) + "/bar/index.cgi?a=1&b=" + ((char) 0xa9) + "left#fragm?ent2");
                        Print (uri);
@@ -65,7 +66,10 @@ namespace MonoTests.System
                        uri = new Uri ("http://www.contoso.com:1234");
                        Print (uri);
                        */
-                       
+
+                       uri = new Uri("  \r  \n http://test.com\r\n \r\r  ");
+                       AssertEquals ("#k0", "http://test.com/", uri.ToString());
+
                        uri = new Uri ("http://contoso.com?subject=uri");
                        AssertEquals ("#k1", "/", uri.AbsolutePath);
                        AssertEquals ("#k2", "http://contoso.com/?subject=uri", uri.AbsoluteUri);
@@ -103,6 +107,9 @@ namespace MonoTests.System
                        AssertEquals ("#m15", "mailto", uri.Scheme);
                        AssertEquals ("#m16", false, uri.UserEscaped);
                        AssertEquals ("#m17", "user:pwd", uri.UserInfo);
+
+                       uri = new Uri("myscheme://127.0.0.1:5");
+                       AssertEquals("#c1", "myscheme://127.0.0.1:5/", uri.ToString());
                        
                        uri = new Uri (@"\\myserver\mydir\mysubdir\myfile.ext");
                        AssertEquals ("#n1", "/mydir/mysubdir/myfile.ext", uri.AbsolutePath);
@@ -137,8 +144,7 @@ namespace MonoTests.System
                        AssertEquals ("#rel2b", false, uri.UserEscaped);
                        uri = new Uri (new Uri("http://www.contoso.com"), "http://www.xxx.com/Hello World.htm", false);
                        AssertEquals ("#rel3", "http://www.xxx.com/Hello%20World.htm", uri.AbsoluteUri);
-                       //uri = new Uri (new Uri("http://www.contoso.com"), "foo:8080/bar/Hello World.htm", false);
-                       //AssertEquals ("#rel4", "foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri);
+
                        uri = new Uri (new Uri("http://www.contoso.com"), "foo/bar/Hello World.htm?x=0:8", false);
                        AssertEquals ("#rel5", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);
                        uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "foo/bar/Hello World.htm?x=0:8", false);
@@ -148,25 +154,16 @@ namespace MonoTests.System
                        uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../foo/bar/Hello World.htm?x=0:8", false);
                        AssertEquals ("#rel8", "http://www.contoso.com/xxx/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);
                        uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../../../foo/bar/Hello World.htm?x=0:8", false);
+#if NET_2_0
+                       AssertEquals ("#rel9", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);
+#else
                        AssertEquals ("#rel9", "http://www.contoso.com/../foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);
+#endif
                        uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "./foo/bar/Hello World.htm?x=0:8", false);
                        AssertEquals ("#rel10", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);
 
-                       try {
-                               uri = new Uri (null, "http://www.contoso.com/index.htm", false);
-                               Fail ("#rel20");
-                       } catch (NullReferenceException) {
-                       }
-                       try {
-                               uri = new Uri (new Uri("http://www.contoso.com"), null, false);
-                               Fail ("#rel21");
-                       } catch (NullReferenceException) {
-                       }
-                       try {
-                               uri = new Uri (new Uri("http://www.contoso.com/foo/bar/index.html?x=0"), String.Empty, false);
-                               AssertEquals("#22", "http://www.contoso.com/foo/bar/index.html?x=0", uri.ToString ());
-                       } catch (NullReferenceException) {
-                       }
+                       uri = new Uri (new Uri("http://www.contoso.com/foo/bar/index.html?x=0"), String.Empty, false);
+                       AssertEquals("#22", "http://www.contoso.com/foo/bar/index.html?x=0", uri.ToString ());
 
                        uri = new Uri (new Uri("http://www.xxx.com"), "?x=0");
                        AssertEquals ("#rel30", "http://www.xxx.com/?x=0", uri.ToString());
@@ -174,6 +171,69 @@ namespace MonoTests.System
                        AssertEquals ("#rel31", "http://www.xxx.com/?x=0", uri.ToString());
                        uri = new Uri (new Uri("http://www.xxx.com/index.htm"), "#here");
                        AssertEquals ("#rel32", "http://www.xxx.com/index.htm#here", uri.ToString());
+#if NET_2_0
+                       uri = new Uri ("relative", UriKind.Relative);
+                       uri = new Uri ("relative/abc", UriKind.Relative);
+                       uri = new Uri ("relative", UriKind.RelativeOrAbsolute);
+
+                       Assert ("#rel33", !uri.IsAbsoluteUri);
+                       AssertEquals ("#rel34", uri.OriginalString, "relative");
+                       Assert ("#rel35", !uri.UserEscaped);
+#endif
+               }
+
+               [Test]
+               public void Constructor_DualHostPort ()
+               {
+                       string relative = "foo:8080/bar/Hello World.htm";
+                       Uri uri = new Uri (new Uri("http://www.contoso.com"), relative, false);
+                       AssertEquals ("AbsolutePath", "8080/bar/Hello%20World.htm", uri.AbsolutePath);
+                       AssertEquals ("AbsoluteUri", "foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri);
+                       AssertEquals ("Authority", String.Empty, uri.Authority);
+                       AssertEquals ("Fragment", String.Empty, uri.Fragment);
+                       AssertEquals ("Host", String.Empty, uri.Host);
+                       AssertEquals ("PathAndQuery", "8080/bar/Hello%20World.htm", uri.PathAndQuery);
+                       AssertEquals ("Port", -1, uri.Port);
+                       AssertEquals ("Query", String.Empty, uri.Query);
+                       AssertEquals ("Scheme", "foo", uri.Scheme);
+                       AssertEquals ("Query", String.Empty, uri.UserInfo);
+
+                       AssertEquals ("Segments[0]", "8080/", uri.Segments[0]);
+                       AssertEquals ("Segments[1]", "bar/", uri.Segments[1]);
+                       AssertEquals ("Segments[2]", "Hello%20World.htm", uri.Segments[2]);
+
+                       Assert ("IsDefaultPort", uri.IsDefaultPort);
+                       Assert ("IsFile", !uri.IsFile);
+                       Assert ("IsLoopback", !uri.IsLoopback);
+                       Assert ("IsUnc", !uri.IsUnc);
+                       Assert ("UserEscaped", !uri.UserEscaped);
+#if NET_2_0
+                       AssertEquals ("HostNameType", UriHostNameType.Unknown, uri.HostNameType);
+                       Assert ("IsAbsoluteUri", uri.IsAbsoluteUri);
+                       AssertEquals ("OriginalString", relative, uri.OriginalString);
+#else
+                       AssertEquals ("HostNameType", UriHostNameType.Basic, uri.HostNameType);
+#endif
+               }
+
+               [Test]
+#if NET_2_0
+               [ExpectedException (typeof (ArgumentNullException))]
+#else
+               [ExpectedException (typeof (NullReferenceException))]
+#endif
+               public void Constructor_NullStringBool ()
+               {
+                       new Uri (null, "http://www.contoso.com/index.htm", false);
+               }
+
+               [Test]
+#if ONLY_1_1
+               [ExpectedException (typeof (NullReferenceException))]
+#endif
+               public void Constructor_UriNullBool ()
+               {
+                       new Uri (new Uri ("http://www.contoso.com"), null, false);
                }
 
                // regression for bug #47573
@@ -181,7 +241,6 @@ namespace MonoTests.System
                public void RelativeCtor ()
                {
                        Uri b = new Uri ("http://a/b/c/d;p?q");
-//                     AssertEquals ("g:h", "g:h", new Uri (b, "g:h").ToString ()); this causes crash under MS.NET 1.1
                        AssertEquals ("#1", "http://a/g", new Uri (b, "/g").ToString ());
                        AssertEquals ("#2", "http://g/", new Uri (b, "//g").ToString ());
                        AssertEquals ("#3", "http://a/b/c/?y", new Uri (b, "?y").ToString ());
@@ -196,41 +255,213 @@ namespace MonoTests.System
                        AssertEquals ("#6", "?q=r;.%20a", u.Query);
                }
 
+#if NET_2_0
                [Test]
-               // some tests from bug 75144
-               public void LeadingSlashes ()
+               [ExpectedException (typeof (UriFormatException))]
+               public void RelativeCtor_11_Crasher ()
+               {
+                       Uri b = new Uri ("http://a/b/c/d;p?q");
+                       // this causes crash under MS.NET 1.1
+                       AssertEquals ("g:h", "g:h", new Uri (b, "g:h").ToString ());
+               }
+#endif
+
+               [Test]
+               [ExpectedException (typeof (UriFormatException))]
+               public void Bad_IPv6 ()
+               {
+                       new Uri ("http://0:0:0:0::127.1.2.3]/");
+               }
+
+               [Test]
+#if ONLY_1_1
+               [Category ("NotDotNet")]
+#endif
+               public void LeadingSlashes_ShouldFailOn1x ()
+               {
+                       // doesn't (but should) fail under 1.x
+                       AssertEquals ("#1", "file:///", new Uri ("file:///").ToString ());
+                       AssertEquals ("#2", "file:///", new Uri ("file://").ToString ());
+               }
+
+               [Test]
+#if ONLY_1_1
+               [Category ("NotWorking")]
+#endif
+               public void LeadingSlashes_BadResultsOn1x ()
                {
-                       Uri u;
-                       AssertEquals ("#1", "file:///", new Uri ("file:///").ToString());
-                       AssertEquals ("#2", "file:///", new Uri ("file://").ToString());
+                       // strange behaviours of 1.x - it's probably not worth to fix it
+                       // on Mono as 2.0 has been fixed
+                       Uri u = new Uri ("file:///foo/bar");
+#if NET_2_0
+                       AssertEquals ("#3a", String.Empty, u.Host);
+                       AssertEquals ("#3b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#3c", "file:///foo/bar", u.ToString ());
+                       AssertEquals ("#3d", false, u.IsUnc);
+#else
+                       // 1.x misinterpret the first path element as the host name
+                       AssertEquals ("#3a", "foo", u.Host);
+                       AssertEquals ("#3b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#3c", "file://foo/bar", u.ToString ());
+                       AssertEquals ("#3d", true, u.IsUnc);
+#endif
+                       u = new Uri ("mailto:/foo");
+#if NET_2_0
+                       AssertEquals ("#13a", String.Empty, u.Host);
+                       AssertEquals ("#13b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#13c", "mailto:/foo", u.ToString ());
+#else
+                       // 1.x misinterpret the first path element as the host name
+                       AssertEquals ("#13a", "foo", u.Host);
+                       AssertEquals ("#13b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#13c", "mailto:foo", u.ToString ());
+#endif
+                       u = new Uri ("mailto://foo");
+#if NET_2_0
+                       AssertEquals ("#14a", String.Empty, u.Host);
+                       AssertEquals ("#14b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#14c", "mailto://foo", u.ToString ());
+#else
+                       // 1.x misinterpret the first path element as the host name
+                       AssertEquals ("#14a", "foo", u.Host);
+                       AssertEquals ("#14b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#14c", "mailto://foo/", u.ToString ());
+#endif
+                       u = new Uri ("news:/");
+                       AssertEquals ("#18a", String.Empty, u.Host);
+#if NET_2_0
+                       AssertEquals ("#18b", UriHostNameType.Unknown, u.HostNameType);
+                       AssertEquals ("#18c", "news:/", u.ToString ());
+                       AssertEquals ("#18d", "/", u.AbsolutePath);
+                       AssertEquals ("#18e", "news:/", u.AbsoluteUri);
+#else
+                       AssertEquals ("#18b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#18c", "news:", u.ToString ());
+                       AssertEquals ("#18d", String.Empty, u.AbsolutePath);
+                       AssertEquals ("#18e", "news:", u.AbsoluteUri);
+#endif
+                       u = new Uri ("news:/foo");
+                       AssertEquals ("#19a", String.Empty, u.Host);
+#if NET_2_0
+                       AssertEquals ("#19b", UriHostNameType.Unknown, u.HostNameType);
+                       AssertEquals ("#19c", "news:/foo", u.ToString ());
+                       AssertEquals ("#19d", "/foo", u.AbsolutePath);
+                       AssertEquals ("#19e", "news:/foo", u.AbsoluteUri);
+#else
+                       AssertEquals ("#19b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#19c", "news:foo", u.ToString ());
+                       AssertEquals ("#19d", "foo", u.AbsolutePath);
+                       AssertEquals ("#19e", "news:foo", u.AbsoluteUri);
+#endif
+                       u = new Uri ("news://foo");
+#if NET_2_0
+                       AssertEquals ("#20a", String.Empty, u.Host);
+                       AssertEquals ("#20b", UriHostNameType.Unknown, u.HostNameType);
+                       AssertEquals ("#20c", "news://foo", u.ToString ());
+                       AssertEquals ("#20d", "//foo", u.AbsolutePath);
+                       AssertEquals ("#20e", "news://foo", u.AbsoluteUri);
+#else
+                       AssertEquals ("#20a", "foo", u.Host);
+                       AssertEquals ("#20b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#20c", "news://foo/", u.ToString ());
+                       AssertEquals ("#20d", "/", u.AbsolutePath);
+                       AssertEquals ("#20e", "news://foo/", u.AbsoluteUri);
+#endif
+                       u = new Uri ("news://foo/bar");
+#if NET_2_0
+                       AssertEquals ("#22a", String.Empty, u.Host);
+                       AssertEquals ("#22b", UriHostNameType.Unknown, u.HostNameType);
+                       AssertEquals ("#22c", "news://foo/bar", u.ToString ());
+                       AssertEquals ("#22d", "//foo/bar", u.AbsolutePath);
+                       AssertEquals ("#22e", "news://foo/bar", u.AbsoluteUri);
+#else
+                       AssertEquals ("#22a", "foo", u.Host);
+                       AssertEquals ("#22b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#22c", "news://foo/bar", u.ToString ());
+                       AssertEquals ("#22d", "/bar", u.AbsolutePath);
+                       AssertEquals ("#22e", "news://foo/bar", u.AbsoluteUri);
+#endif
+               }
 
-                       u = new Uri ("file:///foo/bar");
-                       AssertEquals ("#3", "file:///foo/bar", u.ToString());
-                       AssertEquals ("#4", false, u.IsUnc);
+               [Test]
+#if ONLY_1_1
+               [Category ("NotDotNet")] // does (but shouldn't) fail under 1.x
+#endif
+               public void LeadingSlashes_FailOn1x ()
+               {
+                       // 1.x throws an UriFormatException because it can't decode the host name
+                       Uri u = new Uri ("mailto:");
+                       AssertEquals ("#10a", String.Empty, u.Host);
+                       AssertEquals ("#10b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#10c", "mailto:", u.ToString ());
+
+                       // 1.x throws an UriFormatException because it can't decode the host name
+                       u = new Uri ("mailto:/");
+                       AssertEquals ("#12a", String.Empty, u.Host);
+                       AssertEquals ("#12b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#12c", "mailto:/", u.ToString ());
+
+                       // 1.x throws an UriFormatException because it cannot detect the format
+                       u = new Uri ("mailto:///foo");
+                       AssertEquals ("#15a", String.Empty, u.Host);
+                       AssertEquals ("#15b", UriHostNameType.Basic, u.HostNameType);
+                       AssertEquals ("#15c", "mailto:///foo", u.ToString ());
+
+                       // 1.x throws an UriFormatException because it cannot detect the format
+                       u = new Uri ("news:///foo");
+                       AssertEquals ("#21a", String.Empty, u.Host);
+#if NET_2_0
+                       AssertEquals ("#21b", UriHostNameType.Unknown, u.HostNameType);
+#else
+                       AssertEquals ("#21b", UriHostNameType.Basic, u.HostNameType);
+#endif
+                       AssertEquals ("#21c", "news:///foo", u.ToString ());
+                       AssertEquals ("#21d", "///foo", u.AbsolutePath);
+                       AssertEquals ("#21e", "news:///foo", u.AbsoluteUri);
+               }
 
-                       u = new Uri ("file://foo/bar");
-                       AssertEquals ("#5", "file://foo/bar", u.ToString());
-                       AssertEquals ("#6", true, u.IsUnc);
+               [Test]
+               // some tests from bug 75144
+               public void LeadingSlashes ()
+               {
+                       Uri u = new Uri ("file://foo/bar");
+                       AssertEquals ("#5a", "foo", u.Host);
+                       AssertEquals ("#5b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#5c", "file://foo/bar", u.ToString ());
+                       AssertEquals ("#5d", true, u.IsUnc);
 
                        u = new Uri ("file:////foo/bar");
-                       AssertEquals ("#7", "file://foo/bar", u.ToString());
-                       AssertEquals ("#8", true, u.IsUnc); 
+                       AssertEquals ("#7a", "foo", u.Host);
+                       AssertEquals ("#7b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#7c", "file://foo/bar", u.ToString ());
+                       AssertEquals ("#7d", true, u.IsUnc); 
 
                        AssertEquals ("#9", "file://foo/bar", new Uri ("file://///foo/bar").ToString());
 
-                       AssertEquals ("#10", "mailto:", new Uri ("mailto:").ToString());
-                       AssertEquals ("#11", "mailto:foo", new Uri ("mailto:foo").ToString());
-                       AssertEquals ("#12", "mailto:/", new Uri ("mailto:/").ToString());
-                       AssertEquals ("#13", "mailto:/foo", new Uri ("mailto:/foo").ToString());
-                       AssertEquals ("#14", "mailto://foo", new Uri ("mailto://foo").ToString());
-                       AssertEquals ("#15", "mailto:///foo", new Uri ("mailto:///foo").ToString());
+                       u = new Uri ("mailto:foo");
+                       AssertEquals ("#11a", "foo", u.Host);
+                       AssertEquals ("#11b", UriHostNameType.Dns, u.HostNameType);
+                       AssertEquals ("#11c", "mailto:foo", u.ToString ());
+
+                       u = new Uri ("news:");
+                       AssertEquals ("#16a", String.Empty, u.Host);
+#if NET_2_0
+                       AssertEquals ("#16b", UriHostNameType.Unknown, u.HostNameType);
+#else
+                       AssertEquals ("#16b", UriHostNameType.Basic, u.HostNameType);
+#endif
+                       AssertEquals ("#16c", "news:", u.ToString ());
 
-                       AssertEquals ("#16", "news:", new Uri ("news:").ToString());
-                       AssertEquals ("#17", "news:foo", new Uri ("news:foo").ToString());
-                       AssertEquals ("#18", "news:/", new Uri ("news:/").ToString());
-                       AssertEquals ("#19", "news:/foo", new Uri ("news:/foo").ToString());
-                       AssertEquals ("#20", "news://foo", new Uri ("news://foo").ToString());
-                       AssertEquals ("#21", "news:///foo", new Uri ("news:///foo").ToString());
+                       u = new Uri ("news:foo");
+                       AssertEquals ("#17a", String.Empty, u.Host);
+#if NET_2_0
+                       AssertEquals ("#17b", UriHostNameType.Unknown, u.HostNameType);
+#else
+                       AssertEquals ("#17b", UriHostNameType.Basic, u.HostNameType);
+#endif
+                       AssertEquals ("#17c", "news:foo", u.ToString ());
+                       AssertEquals ("#17d", "foo", u.AbsolutePath);
+                       AssertEquals ("#17e", "news:foo", u.AbsoluteUri);
                }
 
                [Test]
@@ -242,6 +473,9 @@ namespace MonoTests.System
 
                [Test]
                [ExpectedException (typeof (UriFormatException))]
+#if ONLY_1_1
+               [Category ("NotDotNet")] // doesn't fail under 1.x
+#endif
                public void HttpHostname2 ()
                {
                        new Uri ("http:a");
@@ -256,6 +490,9 @@ namespace MonoTests.System
 
                [Test]
                [ExpectedException (typeof (UriFormatException))]
+#if ONLY_1_1
+               [Category ("NotDotNet")] // doesn't fail under 1.x
+#endif
                public void HttpHostname4 ()
                {
                        new Uri ("http:/foo");
@@ -301,7 +538,7 @@ namespace MonoTests.System
                public void InvalidFile3 ()
                {
                        new Uri ("file:/foo");
-               }       
+               }
 
                [Test]
                [ExpectedException (typeof (UriFormatException))]
@@ -341,7 +578,6 @@ namespace MonoTests.System
                        }
                }
 
-
                [Test]
                public void LocalPath ()
                {
@@ -378,16 +614,104 @@ namespace MonoTests.System
                        AssertEquals ("#5c", "file", uri.Scheme);
                        AssertEquals ("#5d", "", uri.Host);
                        AssertEquals ("#5e", "c:/cygwin/tmp/hello.txt", uri.AbsolutePath);
+               }
+
+               [Test]
+               public void LocalPath_FileHost ()
+               {
                        // Hmm, they should be regarded just as a host name, since all URIs are base on absolute path.
-                       uri = new Uri("file://one_file.txt");
+                       Uri uri = new Uri("file://one_file.txt");
+#if NET_2_0
+                       AssertEquals("#6a", "file://one_file.txt/", uri.ToString());
+                       AssertEquals ("#6e", "/", uri.AbsolutePath);
+                       AssertEquals ("#6f", "/", uri.PathAndQuery);
+                       AssertEquals ("#6g", "file://one_file.txt/", uri.GetLeftPart (UriPartial.Path));
+#else
                        AssertEquals("#6a", "file://one_file.txt", uri.ToString());
+                       AssertEquals("#6e", "", uri.AbsolutePath);
+                       AssertEquals ("#6f", "", uri.PathAndQuery);
+                       AssertEquals ("#6g", "file://one_file.txt", uri.GetLeftPart (UriPartial.Path));
+#endif
                        if (isWin32)
                                AssertEquals("#6b", "\\\\one_file.txt", uri.LocalPath);
                        else
                                AssertEquals("#6b", "/", uri.LocalPath);
                        AssertEquals("#6c", "file", uri.Scheme);
                        AssertEquals("#6d", "one_file.txt", uri.Host);
-                       AssertEquals("#6e", "", uri.AbsolutePath);
+
+                       // same tests - but original Uri is now ending with a '/'
+
+                       uri = new Uri ("file://one_file.txt/");
+                       AssertEquals ("#7a", "file://one_file.txt/", uri.ToString ());
+                       AssertEquals ("#7e", "/", uri.AbsolutePath);
+                       AssertEquals ("#7f", "/", uri.PathAndQuery);
+                       AssertEquals ("#7g", "file://one_file.txt/", uri.GetLeftPart (UriPartial.Path));
+#if !TARGET_JVM
+                       if (isWin32)
+                               AssertEquals ("#7b", "\\\\one_file.txt\\", uri.LocalPath);
+                       else
+                               AssertEquals ("#7b", "/", uri.LocalPath);
+#endif
+                       AssertEquals ("#7c", "file", uri.Scheme);
+                       AssertEquals ("#7d", "one_file.txt", uri.Host);
+               }
+
+               [Test]
+               public void LocalPath_Escape ()
+               {
+                       // escape
+                       Uri uri = new Uri ("file:///tmp/a%20a");
+                       if (isWin32) {
+#if NET_2_0
+                               Assert ("#7a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/tmp/a a"));
+#else
+                               // actually MS.NET treats /// as \\ thus it fails here.
+                               Assert ("#7a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\tmp\\a a"));
+#endif
+                       } else
+                               AssertEquals ("#7b", "/tmp/a a", uri.LocalPath);
+
+                       uri = new Uri ("file:///tmp/foo%25bar");
+                       if (isWin32) {
+#if NET_2_0
+                               Assert ("#8a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/tmp/foo%bar"));
+                               Assert ("#8c:" + uri.ToString (), uri.ToString ().EndsWith ("//tmp/foo%25bar"));
+#else
+                               // actually MS.NET treats /// as \\ thus it fails here.
+                               Assert ("#8a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\tmp\\foo%bar"));
+                               // ditto, file://tmp/foo%25bar (bug in 1.x)
+                               Assert ("#8c:" + uri.ToString (), uri.ToString ().EndsWith ("//tmp/foo%bar"));
+#endif
+                       } else {
+                               AssertEquals ("#8b", "/tmp/foo%bar", uri.LocalPath);
+                               AssertEquals ("#8d", "file:///tmp/foo%25bar", uri.ToString ());
+                       }
+                       // bug #76643
+                       uri = new Uri ("file:///foo%25bar");
+                       if (isWin32) {
+#if NET_2_0
+                               Assert ("#9a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/foo%bar"));
+#else
+                               // actually MS.NET treats /// as \\ thus it fails here.
+                               Assert ("#9a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\foo%25bar"));
+#endif
+                               // ditto, file://tmp/foo%25bar (bug in 1.x)
+                               Assert ("#9c:" + uri.ToString (), uri.ToString ().EndsWith ("//foo%25bar"));
+                       } else {
+                               AssertEquals ("#9b", "/foo%bar", uri.LocalPath);
+                               AssertEquals ("#9d", "file:///foo%25bar", uri.ToString ());
+                       }
+               }
+
+               // Novell Bugzilla #320614
+               [Test]
+               public void QueryEscape ()
+               {
+                       Uri u1 = new Uri("http://localhost:8080/test.aspx?ReturnUrl=%2fSearchDoc%2fSearcher.aspx");
+                       Uri u2 = new Uri("http://localhost:8080/test.aspx?ReturnUrl=%252fSearchDoc%252fSearcher.aspx");
+                       
+                       AssertEquals ("QE1", u1.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=/SearchDoc/Searcher.aspx");
+                       AssertEquals ("QE2", u2.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=%2fSearchDoc%2fSearcher.aspx");
                }
                
                [Test]
@@ -419,8 +743,10 @@ namespace MonoTests.System
                [Category("NotDotNet")]
                public void UncFail ()
                {
-                       Uri uri = new Uri ("/home/user/dir/filename.ext");
-                       Assert ("#7", !uri.IsUnc);
+                       if (!isWin32) {
+                               Uri uri = new Uri ("/home/user/dir/filename.ext");
+                               Assert ("#7", !uri.IsUnc);
+                       }
                }
 
                [Test]
@@ -486,6 +812,15 @@ namespace MonoTests.System
                        } catch (ArgumentOutOfRangeException) {}
                }
 
+        [Test]
+        public void MoreHexEscape()
+        {
+            string url = "http://guyc-2003-sp/wiki/wiki%20document%20library/בד%20יקה.docx";
+            string escapedAbsolutePath = "/wiki/wiki%20document%20library/%D7%91%D7%93%20%D7%99%D7%A7%D7%94.docx";
+            Uri u = new Uri(url);
+            AssertEquals("Escaped non-english combo", escapedAbsolutePath, u.AbsolutePath);
+        }
+
                [Test]
                public void HexUnescape () 
                {
@@ -617,7 +952,7 @@ namespace MonoTests.System
                }
 
                [Test]
-               public void FragmentEscape ()
+               public void Fragment_Escape ()
                {
                        Uri u = new Uri("http://localhost/index.asp#main#start", false);
                        AssertEquals ("#1", u.Fragment, "#main%23start");
@@ -632,9 +967,29 @@ namespace MonoTests.System
                        AssertEquals ("#3", n.Fragment, "#main%23start");
                        
                        n = new Uri (b, "blah#main#start", true);
-                       AssertEquals ("#3", n.Fragment, "#main#start");
+                       AssertEquals ("#4", n.Fragment, "#main#start");
                }
-                       
+
+#if NET_2_0
+               [Test]
+               public void Fragment_RelativeUri ()
+               {
+                       Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
+                       Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
+                       Uri relativeUri = uri1.MakeRelativeUri (uri2);
+
+                       try {
+                               string fragment = relativeUri.Fragment;
+                               Fail ("#1: " + fragment);
+                       } catch (InvalidOperationException ex) {
+                               // This operation is not supported for a relative URI
+                               AssertEquals ("#2", typeof (InvalidOperationException), ex.GetType ());
+                               AssertNull ("#3", ex.InnerException);
+                               AssertNotNull ("#4", ex.Message);
+                       }
+               }
+#endif
+
                [Test]
                [ExpectedException(typeof(UriFormatException))]
                public void IncompleteSchemeDelimiter ()
@@ -699,6 +1054,10 @@ namespace MonoTests.System
                        AssertEquals ("#42", UriHostNameType.Unknown, Uri.CheckHostName ("::abcg"));
                        AssertEquals ("#43", UriHostNameType.Unknown, Uri.CheckHostName (":::"));
                        AssertEquals ("#44", UriHostNameType.Unknown, Uri.CheckHostName (":"));
+
+                       AssertEquals ("#45", UriHostNameType.Unknown, Uri.CheckHostName ("*"));
+                       AssertEquals ("#46", UriHostNameType.Unknown, Uri.CheckHostName ("*.go-mono.com"));
+                       AssertEquals ("#47", UriHostNameType.Unknown, Uri.CheckHostName ("www*.go-mono.com"));
                }
                
                [Test]
@@ -731,7 +1090,34 @@ namespace MonoTests.System
                        uri = new Uri("http://[1:0:0:0::1]:8080");
                        AssertEquals ("#13", false, uri.IsLoopback);
                }
-               
+
+               [Test]
+               public void IsLoopback_File ()
+               {
+                       Uri uri = new Uri ("file:///index.html");
+#if NET_2_0
+                       Assert ("file", uri.IsLoopback);
+#else
+                       Assert ("file", !uri.IsLoopback);
+#endif
+               }
+
+               [Test]
+               public void IsLoopback_Relative_Http ()
+               {
+                       string relative = "http:8080/bar/Hello World.htm";
+                       Uri uri = new Uri (new Uri ("http://www.contoso.com"), relative, false);
+                       Assert ("http", !uri.IsLoopback);
+               }
+
+               [Test]
+               public void IsLoopback_Relative_Unknown ()
+               {
+                       string relative = "foo:8080/bar/Hello World.htm";
+                       Uri uri = new Uri (new Uri ("http://www.contoso.com"), relative, false);
+                       Assert ("foo", !uri.IsLoopback);
+               }
+
                [Test]
                public void Equals1 ()
                {
@@ -753,6 +1139,14 @@ namespace MonoTests.System
                        Assert ("#2 known to fail with ms.net 1.x", !uri1.Equals (uri2));
                }
 
+               [Test]
+               public void Equals3 ()
+               {
+                       Uri uri1 = new Uri ("svn+ssh://atsushi@mono-cvs.ximian.com");
+                       Uri uri2 = new Uri ("svn+ssh://anonymous@mono-cvs.ximian.com");
+                       Assert (uri1.Equals (uri2));
+               }
+
                [Test]
                public void TestEquals2 ()
                {
@@ -763,15 +1157,39 @@ namespace MonoTests.System
 
                        a = new Uri ("mailto:user:pwd@go-mono.com?subject=uri");
                        b = new Uri ("MAILTO:USER:PWD@GO-MONO.COM?SUBJECT=URI");
-
+#if NET_2_0
+                       Assert ("#2", a != b);
+                       AssertEquals ("#2a", "mailto:user:pwd@go-mono.com?subject=uri", a.ToString ());
+                       AssertEquals ("#2b", "mailto:USER:PWD@go-mono.com?SUBJECT=URI", b.ToString ());
+#else
                        AssertEquals ("#2", a, b);
-
+#endif
                        a = new Uri ("http://www.go-mono.com/ports/");
                        b = new Uri ("http://www.go-mono.com/PORTS/");
 
                        Assert ("#3", !a.Equals (b));
                }
 
+               [Test]
+               public void CaseSensitivity ()
+               {
+                       Uri mailto = new Uri ("MAILTO:USER:PWD@GO-MONO.COM?SUBJECT=URI");
+                       AssertEquals ("#1", "mailto", mailto.Scheme);
+                       AssertEquals ("#2", "go-mono.com", mailto.Host);
+                       AssertEquals ("#3", "mailto:USER:PWD@go-mono.com?SUBJECT=URI", mailto.ToString ());
+
+                       Uri http = new Uri ("HTTP://GO-MONO.COM/INDEX.HTML");
+                       AssertEquals ("#4", "http", http.Scheme);
+                       AssertEquals ("#5", "go-mono.com", http.Host);
+                       AssertEquals ("#6", "http://go-mono.com/INDEX.HTML", http.ToString ());
+
+                       // IPv6 Address
+                       Uri ftp = new Uri ("FTP://[::ffFF:169.32.14.5]/");
+                       AssertEquals ("#7", "ftp", ftp.Scheme);
+                       AssertEquals ("#8", "[0000:0000:0000:0000:0000:FFFF:A920:0E05]", ftp.Host);
+                       AssertEquals ("#9", "ftp://[0000:0000:0000:0000:0000:FFFF:A920:0E05]/", ftp.ToString ());
+               }
+
                [Test]
                public void GetHashCodeTest () 
                {
@@ -781,11 +1199,76 @@ namespace MonoTests.System
                        uri2 = new Uri ("http://www.contoso.com/index.htm?x=1");
                        Assert ("#2", uri1.GetHashCode () != uri2.GetHashCode ());
                        uri2 = new Uri ("http://www.contoso.com:80/index.htm");
-                       AssertEquals ("#3", uri1.GetHashCode (), uri2.GetHashCode ());                  
+                       AssertEquals ("#3", uri1.GetHashCode (), uri2.GetHashCode ());
                        uri2 = new Uri ("http://www.contoso.com:8080/index.htm");
-                       Assert ("#4", uri1.GetHashCode () != uri2.GetHashCode ());                      
+                       Assert ("#4", uri1.GetHashCode () != uri2.GetHashCode ());
+               }
+
+#if NET_2_0
+               [Test]
+               public void RelativeEqualsTest()
+               {
+                       Uri uri1 = new Uri ("foo/bar", UriKind.Relative);
+                       Uri uri2 = new Uri ("foo/bar", UriKind.Relative);
+                       Uri uri3 = new Uri ("bar/man", UriKind.Relative);
+                       Uri uri4 = new Uri ("BAR/MAN", UriKind.Relative);
+                       Assert ("#1a", uri1 == uri2);
+                       Assert ("#1b", uri1.Equals(uri2));
+                       Assert ("#2a", uri1 != uri3);
+                       Assert ("#2b", !uri1.Equals(uri3));
+                       Assert ("#3a", uri1 == uri2);
+                       Assert ("#3b", uri1.Equals(uri2));
+                       Assert ("#4a", uri1 != uri3);
+                       Assert ("#4b", !uri1.Equals(uri3));
+                       Assert ("#5a", uri3 != uri4);
+                       Assert ("#5b", !uri3.Equals(uri4));
+               }
+
+               [Test]
+               [ExpectedException(typeof(InvalidOperationException))]
+               public void GetLeftPart_Partial1 ()
+               {
+                       Uri u = new Uri ("foo", UriKind.Relative);
+                       u.GetLeftPart (UriPartial.Scheme);
+               }
+
+               [ExpectedException(typeof(InvalidOperationException))]
+               [Test]
+               public void GetLeftPart_Partial2 ()
+               {
+                       Uri u = new Uri ("foo", UriKind.Relative);
+                       u.GetLeftPart (UriPartial.Authority);
+               }
+
+               [ExpectedException(typeof(InvalidOperationException))]
+               [Test]
+               public void GetLeftPart_Partial3 ()
+               {
+                       Uri u = new Uri ("foo", UriKind.Relative);
+                       u.GetLeftPart (UriPartial.Path);
+               }
+               
+               [Test]
+               public void TestPartialToString ()
+               {
+                       AssertEquals ("#1", new Uri ("foo", UriKind.Relative).ToString (), "foo");
+                       AssertEquals ("#2", new Uri ("foo#aa", UriKind.Relative).ToString (), "foo#aa");
+                       AssertEquals ("#3", new Uri ("foo?aa", UriKind.Relative).ToString (), "foo?aa");
+                       AssertEquals ("#4", new Uri ("foo#dingus?aa", UriKind.Relative).ToString (), "foo#dingus?aa");
+                       AssertEquals ("#4", new Uri ("foo?dingus#aa", UriKind.Relative).ToString (), "foo?dingus#aa");
                }
                
+               [Test]
+               public void RelativeGetHashCodeTest()
+               {
+                       Uri uri1 = new Uri ("foo/bar", UriKind.Relative);
+                       Uri uri2 = new Uri ("foo/bar", UriKind.Relative);
+                       Uri uri3 = new Uri ("bar/man", UriKind.Relative);
+                       AssertEquals ("#1", uri1.GetHashCode(), uri2.GetHashCode());
+                       Assert ("#2", uri1.GetHashCode() != uri3.GetHashCode());
+               }
+#endif
+
                [Test]
                public void MakeRelative ()
                {
@@ -802,7 +1285,7 @@ namespace MonoTests.System
                        AssertEquals ("#2", "../../index.htm", uri2.MakeRelative (uri1));
                        
                        AssertEquals ("#3", "../../bar/foo/index.htm", uri2.MakeRelative (uri3));
-                       AssertEquals ("#4", "../../foo/bar/index.htm", uri3.MakeRelative (uri2));                       
+                       AssertEquals ("#4", "../../foo/bar/index.htm", uri3.MakeRelative (uri2));
 
                        AssertEquals ("#5", "../foo2/index.htm", uri3.MakeRelative (uri4));
                        AssertEquals ("#6", "../foo/index.htm", uri4.MakeRelative (uri3));
@@ -847,9 +1330,27 @@ namespace MonoTests.System
 #endif
                }
 
+               [Test]
+               public void RelativeUri2 ()
+               {
+                       AssertEquals ("#1", "hoge:ext", new Uri (new Uri ("hoge:foo:bar:baz"), "hoge:ext").ToString ());
+                       if (isWin32) {
+                               AssertEquals ("#2-w", "file:///d:/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:///d:/myhost/ext").ToString ());
+                               AssertEquals ("#3-w", "file:///c:/localhost/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:myhost/ext").ToString ());
+                               AssertEquals ("#4-w", "uuid:ext", new Uri (new Uri ("file:///c:/localhost/bar"), "uuid:ext").ToString ());
+                               AssertEquals ("#5-w", "file:///c:/localhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:./ext").ToString ());
+                       } else {
+                               AssertEquals ("#2-u", "file:///d/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:///d/myhost/ext").ToString ());
+                               AssertEquals ("#3-u", "file:///c/localhost/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:myhost/ext").ToString ());
+                               AssertEquals ("#4-u", "uuid:ext", new Uri (new Uri ("file:///c/localhost/bar"), "uuid:ext").ToString ());
+                               AssertEquals ("#5-u", "file:///c/localhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:./ext").ToString ());
+                       }
+                       AssertEquals ("#6", "http://localhost/ext", new Uri (new Uri ("http://localhost/bar"), "http:./ext").ToString ());
+               }
+
                [Test]
                public void ToStringTest()
-               {                       
+               {
                        Uri uri = new Uri ("dummy://xxx");
                        AssertEquals ("#1", "dummy://xxx/", uri.ToString ());
                }
@@ -868,7 +1369,45 @@ namespace MonoTests.System
                        AssertEquals ("#09", false, Uri.CheckSchemeName ("+http"));
                        AssertEquals ("#10", true, Uri.CheckSchemeName ("htt+p6"));
                        // 0x00E1 -> ã
-                       AssertEquals ("#11", true, Uri.CheckSchemeName ("htt\u00E1+p6"));
+#if NET_2_0
+                       Assert ("#11", !Uri.CheckSchemeName ("htt\u00E1+p6"));
+#else
+                       Assert ("#11", Uri.CheckSchemeName ("htt\u00E1+p6"));
+#endif
+               }
+
+               [Test]
+               public void CheckSchemeName_FirstChar ()
+               {
+                       for (int i = 0; i < 256; i++) {
+                               string s = String.Format ("#{0}", i);
+                               char c = (char) i;
+                               bool b = Uri.CheckSchemeName (c.ToString ());
+#if NET_2_0
+                               bool valid = (((i >= 0x41) && (i <= 0x5A)) || ((i >= 0x61) && (i <= 0x7A)));
+                               AssertEquals (s, valid, b);
+#else
+                               AssertEquals (s, Char.IsLetter (c), b);
+#endif
+                       }
+               }
+
+               [Test]
+               public void CheckSchemeName_AnyOtherChar ()
+               {
+                       for (int i = 0; i < 256; i++) {
+                               string s = String.Format ("#{0}", i);
+                               char c = (char) i;
+                               string scheme = String.Format ("a+b-c.d{0}", c);
+                               bool b = Uri.CheckSchemeName (scheme);
+                               bool common = Char.IsDigit (c) || (c == '+') || (c == '-') || (c == '.');
+#if NET_2_0
+                               bool valid = (common || ((i >= 0x41) && (i <= 0x5A)) || ((i >= 0x61) && (i <= 0x7A)));
+                               AssertEquals (s, valid, b);
+#else
+                               AssertEquals (s, (Char.IsLetter (c) || common), b);
+#endif
+                       }
                }
 
                [Test]
@@ -883,9 +1422,9 @@ namespace MonoTests.System
                // MS.NET 1.x throws an IndexOutOfRangeException
                [Category("NotDotNet")]
 #endif
-               [Ignore("Bug #74144")]
                public void NoHostname2 ()
                {
+                       // bug 75144
                        Uri uri = new Uri ("file://");
                        AssertEquals ("#1", true, uri.IsFile);
                        AssertEquals ("#2", false, uri.IsUnc);
@@ -899,7 +1438,11 @@ namespace MonoTests.System
                        AssertEquals ("#10", UriHostNameType.Basic, uri.HostNameType);
                        AssertEquals ("#11", string.Empty, uri.Fragment);
                        AssertEquals ("#12", true, uri.IsDefaultPort);
-                       AssertEquals ("#13", true, uri.IsLoopback);
+#if NET_2_0
+                       Assert ("#13", uri.IsLoopback);
+#else
+                       Assert ("#13", !uri.IsLoopback);
+#endif
                        AssertEquals ("#14", "/", uri.PathAndQuery);
                        AssertEquals ("#15", false, uri.UserEscaped);
                        AssertEquals ("#16", string.Empty, uri.UserInfo);
@@ -915,7 +1458,6 @@ namespace MonoTests.System
                        string [] segments = uri.Segments;
                        AssertEquals ("#01", 1, segments.Length);
                        AssertEquals ("#02", "/", segments [0]);
-                       
                }
 
                [Test]
@@ -927,7 +1469,6 @@ namespace MonoTests.System
                        AssertEquals ("#02", "/", segments [0]);
                        AssertEquals ("#03", "dir/", segments [1]);
                        AssertEquals ("#04", "dummypage.html", segments [2]);
-                       
                }
 
                [Test]
@@ -939,19 +1480,25 @@ namespace MonoTests.System
                        AssertEquals ("#02", "/", segments [0]);
                        AssertEquals ("#03", "dir/", segments [1]);
                        AssertEquals ("#04", "dummypage/", segments [2]);
-                       
                }
 
                [Test]
+#if NET_2_0
+               [Category ("NotWorking")]
+#endif
                public void Segments4 ()
                {
                        Uri uri = new Uri ("file:///c:/hello");
                        string [] segments = uri.Segments;
                        AssertEquals ("#01", 3, segments.Length);
+#if NET_2_0
+                       AssertEquals ("#02", "/", segments [0]);
+                       AssertEquals ("#03", "c:/", segments[1]);
+#else
                        AssertEquals ("#02", "c:", segments [0]);
                        AssertEquals ("#03", "/", segments [1]);
+#endif
                        AssertEquals ("#04", "hello", segments [2]);
-                       
                }
 
                [Test]
@@ -1060,6 +1607,45 @@ namespace MonoTests.System
                        AssertEquals (path, "c:/tmp/foo/bar", fileUri.AbsolutePath);
                }
 
+#if NET_2_0
+               [Test]
+               public void TestEscapeDataString ()
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       
+                       for (int i = 0; i < 128; i++)
+                               sb.Append ((char) i);
+                       
+                       AssertEquals ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F",
+                                     Uri.EscapeDataString (sb.ToString ()));
+
+                       AssertEquals ("%C3%A1", Uri.EscapeDataString ("á"));
+               }
+               [Test]
+               public void TestEscapeUriString ()
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       for (int i = 0; i < 128; i++)
+                               sb.Append ((char) i);
+                       
+                       AssertEquals ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22#$%25&'()*+,-./0123456789:;%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F",
+                               Uri.EscapeUriString (sb.ToString ()));
+                       AssertEquals ("%C3%A1", Uri.EscapeDataString ("á"));
+               }
+#endif
+
+               //bnc #363320
+               [Test]
+               public void TestUTF8Strings ()
+               {
+                       string [] tests = {
+                               "file:///tmp/x (%232).jpg",
+                               "file:///tmp/ü (%232).jpg" };
+
+                       foreach (string test in tests)
+                               AssertEquals (test, new Uri (test).ToString ());
+               }
+
                // This test doesn't work on Linux, and arguably shouldn't work.
                // new Uri("file:///tmp/foo/bar").AbsolutePath returns "/tmp/foo/bar" 
                // on Linux, as anyone sane would expect.  It *doesn't* under .NET 1.1
@@ -1072,19 +1658,24 @@ namespace MonoTests.System
                // You are surrounded by conditional-compilation code, all alike.
                // You are likely to be eaten by a Grue...
                [Test]
-#if ONLY_1_1
-               [Category ("NotWorking")]
+#if !NET_2_0
+               [Category ("NotDotNet")]
 #endif
                public void UnixLocalPath_WTF ()
                {
                        // Empty path == localhost, in theory
                        string path = "file:///tmp/foo/bar";
                        Uri fileUri = new Uri( path );
-#if NET_2_0
+//#if NET_2_0
                        AssertEquals (path, "/tmp/foo/bar", fileUri.AbsolutePath);
-#else
-                       AssertEquals (path, "/foo/bar", fileUri.AbsolutePath);
-#endif
+//#else
+//                     AssertEquals (path, "/foo/bar", fileUri.AbsolutePath);
+//#endif
+
+                       // bug #76643
+                       string path2 = "file:///foo%25bar";
+                       fileUri = new Uri (path2);
+                       AssertEquals (path2, "file:///foo%25bar", fileUri.ToString ());
                }
 
                public static void Print (Uri uri)
@@ -1102,7 +1693,7 @@ namespace MonoTests.System
                        Console.WriteLine ("IsLoopback: " + uri.IsLoopback);
                        Console.WriteLine ("IsUnc: " + uri.IsUnc);
                        Console.WriteLine ("LocalPath: " + uri.LocalPath);
-                       Console.WriteLine ("PathAndQuery: " + uri.PathAndQuery);
+                       Console.WriteLine ("PathAndQuery        : " + uri.PathAndQuery);
                        Console.WriteLine ("Port: " + uri.Port);
                        Console.WriteLine ("Query: " + uri.Query);
                        Console.WriteLine ("Scheme: " + uri.Scheme);
@@ -1115,10 +1706,8 @@ namespace MonoTests.System
                                Console.WriteLine ("\tNo Segments");
                        else 
                                for (int i = 0; i < segments.Length; i++) 
-                                       Console.WriteLine ("\t" + segments[i]);                                 
+                                       Console.WriteLine ("\t" + segments[i]);
                        Console.WriteLine ("");
                }
-
        }
 }
-