Merge pull request #1222 from LogosBible/uri-trycreate
[mono.git] / mcs / class / System / Test / System / UriTest3.cs
index 7527a22ef59f6f2117714d21113586e23296df48..7ff8924d0daaed4c9091dbdcbba456fa6b3a0323 100644 (file)
@@ -26,8 +26,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
 using NUnit.Framework;
 
 using System;
@@ -40,6 +38,38 @@ namespace MonoTests.System
                private const string absolute = "http://www.mono-project.com/CAS";
                private const string relative = "server.com/directory/";
 
+               [Test] // .ctor (String, UriKind)
+               public void Constructor4_UriKind_Invalid ()
+               {
+                       try {
+                               new Uri ("http://www.contoso.com", (UriKind) 666);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentException ex) {
+                               // The value '666' passed for the UriKind parameter
+                               // is invalid
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsNotNull (ex.Message.IndexOf ("'666'") != -1, "#5:" + ex.Message);
+                               Assert.IsNotNull (ex.Message.IndexOf ("UriKind") != -1, "#6:" + ex.Message);
+                               Assert.IsNull (ex.ParamName, "#7");
+                       }
+               }
+
+               [Test] // .ctor (String, UriKind)
+               public void Constructor4_UriString_Null ()
+               {
+                       try {
+                               new Uri ((string) null, (UriKind) 666);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("uriString", ex.ParamName, "#5");
+                       }
+               }
+
                [Test]
                public void AbsoluteUri_RelativeUri ()
                {
@@ -62,19 +92,51 @@ namespace MonoTests.System
                public void Absolute_UriKind_Absolute ()
                {
                        Uri uri = new Uri (absolute, UriKind.Absolute);
-                       Assert.AreEqual ("www.mono-project.com", uri.DnsSafeHost, "DnsSafeHost");
-                       Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
-                       Assert.AreEqual (absolute, uri.OriginalString, "OriginalString");
+                       Assert.AreEqual ("www.mono-project.com", uri.DnsSafeHost, "#1");
+                       Assert.IsTrue (uri.IsAbsoluteUri, "#2");
+                       Assert.AreEqual (absolute, uri.OriginalString, "#3");
+                       Assert.AreEqual (absolute, uri.ToString (), "#4");
+                       Assert.IsFalse (uri.UserEscaped, "#5");
                }
 
                [Test]
                public void Relative_UriKind_Relative ()
                {
                        Uri uri = new Uri (relative, UriKind.Relative);
-                       Assert.IsFalse (uri.IsAbsoluteUri, "IsAbsoluteUri");
-                       Assert.AreEqual (relative, uri.OriginalString, "OriginalString");
-                       Assert.IsFalse (uri.UserEscaped, "UserEscaped");
-                       // using any other property would throw an InvalidOperationException
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#A1");
+                       Assert.AreEqual (relative, uri.OriginalString, "#A2");
+                       Assert.AreEqual (relative, uri.ToString (), "#A3");
+                       Assert.IsFalse (uri.UserEscaped, "#A4");
+
+                       uri = new Uri (string.Empty, UriKind.Relative);
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#B1");
+                       Assert.AreEqual (string.Empty, uri.OriginalString, "#B2");
+                       Assert.AreEqual (string.Empty, uri.ToString (), "#B3");
+                       Assert.IsFalse (uri.UserEscaped, "#B4");
+
+                       uri = new Uri ("foo/bar", UriKind.Relative);
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#C1");
+                       Assert.AreEqual ("foo/bar", uri.OriginalString, "#C2");
+                       Assert.AreEqual ("foo/bar", uri.ToString (), "#C3");
+                       Assert.IsFalse (uri.UserEscaped, "#C4");
+
+                       uri = new Uri ("/test.aspx", UriKind.Relative);
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#D1");
+                       Assert.AreEqual ("/test.aspx", uri.OriginalString, "#D2");
+                       Assert.AreEqual ("/test.aspx", uri.ToString (), "#D3");
+                       Assert.IsFalse (uri.UserEscaped, "#D4");
+
+                       uri = new Uri ("", UriKind.Relative);
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#E1");
+                       Assert.AreEqual ("", uri.OriginalString, "#E2");
+                       Assert.AreEqual ("", uri.ToString (), "#E3");
+                       Assert.IsFalse (uri.UserEscaped, "#E4");
+
+                       uri = new Uri ("a", UriKind.Relative);
+                       Assert.IsFalse (uri.IsAbsoluteUri, "#F1");
+                       Assert.AreEqual ("a", uri.OriginalString, "#F2");
+                       Assert.AreEqual ("a", uri.ToString (), "#F3");
+                       Assert.IsFalse (uri.UserEscaped, "#F4");
                }
 
                [Test]
@@ -91,52 +153,98 @@ namespace MonoTests.System
                        new Uri (absolute, UriKind.Relative);
                }
 
-               [Test]
-               [Category ("NotWorking")]
-               public void TryCreate_String_UriKind_Uri ()
+               [Test] // TryCreate (String, UriKind, Uri)
+               public void TryCreate1 ()
                {
-                       Uri uri = null;
+                       Uri uri;
+
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (absolute, UriKind.Absolute, out uri), "absolute-Absolute");
                        Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-Absolute-AbsoluteUri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (absolute, UriKind.RelativeOrAbsolute, out uri), "absolute-RelativeOrAbsolute");
                        Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-RelativeOrAbsolute-AbsoluteUri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsFalse (Uri.TryCreate (absolute, UriKind.Relative, out uri), "absolute-Relative");
                        Assert.IsNull (uri, "absolute-Relative-uri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsFalse (Uri.TryCreate (relative, UriKind.Absolute, out uri), "relative-Absolute");
                        Assert.IsNull (uri, "relative-Relative-uri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (relative, UriKind.RelativeOrAbsolute, out uri), "relative-RelativeOrAbsolute");
                        Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (relative, UriKind.Relative, out uri), "relative-Relative");
                        Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
+
+                       Assert.IsTrue (Uri.TryCreate ("http://mono-project.com/☕", UriKind.Absolute, out uri), "highunicode-Absolute");
+                       Assert.AreEqual("http://mono-project.com/%E2%98%95", uri.AbsoluteUri, "highunicode-Absolute-AbsoluteUri");
+
+                       string mixedCaseUri = "http://mOnO-proJECT.com";
+                       uri = new Uri (mixedCaseUri);
+                       Uri uri2;
+                       Assert.IsTrue (Uri.TryCreate (mixedCaseUri, UriKind.Absolute, out uri2), "mixedcasehost-absolute");
+                       Assert.AreEqual (uri.AbsoluteUri, uri2.AbsoluteUri, "mixedcasehost-absoluteuri-absoluteuri");
                }
 
-               [Test]
-               [Category ("NotWorking")]
-               public void TryCreate_Uri_String_Uri ()
+               [Test] // TryCreate (String, UriKind, Uri)
+               public void TryCreate1_UriKind_Invalid ()
+               {
+                       Uri relativeUri = new Uri (relative, UriKind.Relative);
+                       Uri uri = relativeUri;
+
+                       try {
+                               Uri.TryCreate (absolute, (UriKind) 666, out uri);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentException ex) {
+                               // The value '666' passed for the UriKind parameter
+                               // is invalid
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.IsNotNull (ex.Message.IndexOf ("'666'") != -1, "#A5:" + ex.Message);
+                               Assert.IsNotNull (ex.Message.IndexOf ("UriKind") != -1, "#A6:" + ex.Message);
+                               Assert.IsNull (ex.ParamName, "#A7");
+
+                               Assert.IsNotNull (uri, "#A8");
+                               Assert.AreSame (relativeUri, uri, "#A9");
+                       }
+
+                       Assert.IsFalse (Uri.TryCreate ((string) null, (UriKind) 666, out uri), "#B1");
+                       Assert.IsNull (uri, "#B2");
+               }
+
+               [Test] // TryCreate (Uri, String, Uri)
+               public void TryCreate2 ()
                {
                        Uri baseUri = new Uri (absolute);
-                       Uri uri = null;
+                       Uri uri;
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (baseUri, relative, out uri), "baseUri+relative");
                        Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relative+AbsoluteUri");
                        Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relative+OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (baseUri, absolute, out uri), "baseUri+absolute");
                        Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+absolute+AbsoluteUri");
                        Assert.AreEqual (absolute, uri.OriginalString, "baseUri+absolute+OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        Uri relativeUri = new Uri (relative, UriKind.Relative);
                        Assert.IsFalse (Uri.TryCreate (relativeUri, relative, out uri), "relativeUri+relative");
                        Assert.IsNull (uri, "relativeUri+relative+Uri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (relativeUri, absolute, out uri), "relativeUri+absolute");
                        Assert.AreEqual (absolute, uri.OriginalString, "relativeUri+absolute+OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        string n = null;
                        Assert.IsFalse (Uri.TryCreate (baseUri, n, out uri), "baseUri+null");
                        Assert.IsNull (uri, "baseUri+null+Uri");
@@ -145,65 +253,90 @@ namespace MonoTests.System
                        Assert.IsFalse (Uri.TryCreate (null, relative, out uri), "null+relative");
                        Assert.IsNull (uri, "null+relative+Uri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (null, absolute, out uri), "null+absolute");
                        Assert.AreEqual (absolute, uri.OriginalString, "null+absolute+OriginalString");
                }
 
-               [Test]
-               [Category ("NotWorking")]
-               public void TryCreate_Uri_Uri_Uri ()
+               [Test] // TryCreate (Uri, Uri, Uri)
+               public void TryCreate3 ()
                {
                        Uri baseUri = new Uri (absolute);
                        Uri relativeUri = new Uri (relative, UriKind.Relative);
-                       Uri uri = null;
+                       Uri uri;
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (baseUri, relativeUri, out uri), "baseUri+relativeUri");
                        Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relativeUri+AbsoluteUri");
                        Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relativeUri+OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsTrue (Uri.TryCreate (baseUri, baseUri, out uri), "baseUri+baseUri");
                        Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+baseUri+AbsoluteUri");
                        Assert.AreEqual (absolute, uri.OriginalString, "baseUri+baseUri+OriginalString");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsFalse (Uri.TryCreate (relativeUri, relativeUri, out uri), "relativeUri+relativeUri");
                        Assert.IsNull (uri, "relativeUri+relativeUri+Uri");
 
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsFalse (Uri.TryCreate (relativeUri, baseUri, out uri), "relativeUri+baseUri");
                        Assert.IsNull (uri, "relativeUri+baseUri+Uri");
 
-                       // a null relativeUri throws a NullReferenceException (see next test)
+                       uri = new Uri ("http://dummy.com");
                        Assert.IsFalse (Uri.TryCreate (null, relativeUri, out uri), "null+relativeUri");
                        Assert.IsNull (uri, "null+relativeUri+Uri");
                        Assert.IsFalse (Uri.TryCreate (null, baseUri, out uri), "null+baseUri");
                        Assert.IsNull (uri, "null+baseUri+Uri");
                }
 
-               [Test]
-               [ExpectedException (typeof (NullReferenceException))]
-               public void TryCreate_Uri_UriNull_Uri ()
+               [Test] // TryCreate (Uri, Uri, out Uri)
+               public void TryCreate3_RelativeUri_Null ()
                {
                        Uri uri = null;
-                       Uri.TryCreate (new Uri (absolute), (Uri) null, out uri);
-               }
-
-               [Test]
-               public void IsWellFormedUriString_Null ()
-               {
-                       Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
+                       Uri baseUri = new Uri (absolute);
+                       try {
+                               Uri.TryCreate (baseUri, (Uri) null, out uri);
+#if NET_4_0
+                               Assert.IsNull (uri);
+#else
+                               Assert.Fail ("throw NRE under FX 2.0");
+#endif
+                       }
+                       catch (NullReferenceException) {
+#if NET_4_0
+                               Assert.Fail ("does not throw NRE under FX 4.0");
+#endif
+                       }
                }
 
                [Test]
-               public void IsWellFormedUriString_Http ()
+               public void IsWellFormedUriString ()
                {
                        Assert.IsFalse (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", UriKind.Absolute), "http/space");
                        Assert.IsTrue (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main%20Page", UriKind.Absolute), "http/%20");
+                       Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
+                       Assert.IsFalse (Uri.IsWellFormedUriString ("data", UriKind.Absolute), "data");
+                       Assert.IsTrue (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main_Page#1", UriKind.Absolute), "http/hex");
                }
 
                [Test]
-               [ExpectedException (typeof (ArgumentException))]
-               public void IsWellFormedUriString_BadUriKind ()
+               public void IsWellFormedUriString_UriKind_Invalid ()
                {
-                       Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", (UriKind)Int32.MinValue);
+                       try {
+                               Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page",
+                                       (UriKind) 666);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentException ex) {
+                               // The value '666' passed for the UriKind parameter
+                               // is invalid
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsNotNull (ex.Message.IndexOf ("'666'") != -1, "#5:" + ex.Message);
+                               Assert.IsNotNull (ex.Message.IndexOf ("UriKind") != -1, "#6:" + ex.Message);
+                               Assert.IsNull (ex.ParamName, "#7");
+                       }
                }
 
                [Test]
@@ -213,6 +346,13 @@ namespace MonoTests.System
                        Uri u2 = null;
                        Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null-null");
 
+                       u1 = new Uri ("http://www.go-mono.com");
+                       Assert.AreEqual (1, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "non-null - null");
+
+                       u1 = null;
+                       u2 = new Uri ("http://www.go-mono.com");
+                       Assert.AreEqual (-1, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null - non-null");
+
                        u1 = new Uri ("http://www.go-mono.com/Main Page");
                        u2 = new Uri ("http://www.go-mono.com/Main%20Page");
                        Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.CurrentCulture), "http/space-http/%20-unescaped");
@@ -284,11 +424,15 @@ namespace MonoTests.System
                }
 
                [Test]
-               [ExpectedException (typeof (NullReferenceException))]
                public void IsBaseOf_Null ()
                {
                        Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
-                       http.IsBaseOf (null);
+                       try {
+                               http.IsBaseOf (null);
+                               Assert.Fail ();
+                       }
+                       catch (ArgumentNullException) {
+                       }
                }
 
                [Test] 
@@ -306,6 +450,9 @@ namespace MonoTests.System
                        Uri uri11 = new Uri ("mailto:xxx@xxx.com?subject=hola");
                        Uri uri12 = new Uri ("mailto:xxx@mail.xxx.com?subject=hola");
                        Uri uri13 = new Uri ("mailto:xxx@xxx.com/foo/bar");
+                       Uri uri14 = new Uri ("http://www.contoso.com/test1/");
+                       Uri uri15 = new Uri ("http://www.contoso.com/");
+                       Uri uri16 = new Uri ("http://www.contoso.com/test");
 
                        AssertRelativeUri ("foo/bar/index.htm#fragment", uri1, uri2, "#A");
                        AssertRelativeUri ("../../index.htm?x=2", uri2, uri1, "#B");
@@ -337,39 +484,87 @@ namespace MonoTests.System
                        Assert.IsTrue (relativeUri.IsAbsoluteUri, "#N1");
                        Assert.AreEqual (uri5.ToString (), relativeUri.ToString (), "#N2");
                        Assert.AreEqual (uri5.OriginalString, relativeUri.OriginalString, "#N3");
+
+                       AssertRelativeUri ("../", uri14, uri15, "#O");
+                       AssertRelativeUri ("./", uri16, uri15, "#P");
+
+                       Uri a1 = new Uri ("http://something/something2/test/");
+                       Uri a2 = new Uri ("http://something/something2/");
+                       Uri a3 = new Uri ("http://something/something2/test");
+                       Uri a4 = new Uri ("http://something/something2");
+
+                       AssertRelativeUri ("../", a1, a2, "Q1");
+                       AssertRelativeUri ("../../something2", a1, a4, "Q2");
+                       AssertRelativeUri ("./", a3, a2, "Q3");
+                       AssertRelativeUri ("../something2", a3, a4, "Q4");
+
+                       Uri b1 = new Uri ("http://something/test/");
+                       Uri b2 = new Uri ("http://something/");
+                       Uri b3 = new Uri ("http://something/test");
+                       Uri b4 = new Uri ("http://something");
+                       
+                       AssertRelativeUri ("../", b1, b2, "R1");
+                       AssertRelativeUri ("../", b1, b4, "R2");
+                       AssertRelativeUri ("./", b3, b2, "R3");
+                       AssertRelativeUri ("./", b3, b4, "R4");
+
+                       Uri c1 = new Uri ("C:\\something\\something2\\test\\");
+                       Uri c2 = new Uri ("C:\\something\\something2\\");
+                       Uri c3 = new Uri ("C:\\something\\something2\\test");
+                       Uri c4 = new Uri ("C:\\something\\something2");
+                       
+                       AssertRelativeUri ("../", c1, c2, "S1");
+                       AssertRelativeUri ("../../something2", c1, c4, "S2");
+                       AssertRelativeUri ("./", c3, c2, "S3");
+                       AssertRelativeUri ("../something2", c3, c4, "S4");
+
+                       Uri d1 = new Uri ("C:\\something\\test\\");
+                       Uri d2 = new Uri ("C:\\something\\");
+                       Uri d3 = new Uri ("C:\\something\\test");
+                       Uri d4 = new Uri ("C:\\something");
+                       
+                       AssertRelativeUri ("../", d1, d2, "T1");
+                       AssertRelativeUri ("../../something", d1, d4, "T2");
+                       AssertRelativeUri ("./", d3, d2, "T3");
+                       AssertRelativeUri ("../something", d3, d4, "T4");
+
+                       Uri e1 = new Uri ("C:\\something\\");
+                       Uri e2 = new Uri ("C:\\");
+                       Uri e3 = new Uri ("C:\\something");
+                       
+                       AssertRelativeUri ("../", e1, e2, "U1");
+                       AssertRelativeUri ("./", e3, e2, "U2");
+                       AssertRelativeUri ("", e1, e1, "U3");
+                       AssertRelativeUri ("", e3, e3, "U4");
+                       AssertRelativeUri ("../something", e1, e3, "U5");
+                       AssertRelativeUri ("something/", e3, e1, "U6");
+                       AssertRelativeUri ("something", e2, e3, "U7");
                }
 
                [Test]
-               [Category ("NotDotNet")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
-               public void MakeRelativeUri_Uri_Null_Mono ()
+               public void MakeRelativeUri_Uri_Null ()
                {
                        Uri uri = new Uri ("http://test.com");
                        try {
                                uri.MakeRelativeUri ((Uri) null);
                                Assert.Fail ("#1");
-                       } catch (ArgumentNullException ex) {
+                       }
+#if NET_4_0
+                       catch (ArgumentNullException ex) {
                                Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
                                Assert.IsNull (ex.InnerException, "#3");
                                Assert.IsNotNull (ex.Message, "#4");
                                Assert.IsNotNull (ex.ParamName, "#5");
                                Assert.AreEqual ("uri", ex.ParamName, "#6");
                        }
-               }
-
-               [Test]
-               [Category ("NotWorking")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
-               public void MakeRelativeUri_Uri_Null_MS ()
-               {
-                       Uri uri = new Uri ("http://test.com");
-                       try {
-                               uri.MakeRelativeUri ((Uri) null);
-                               Assert.Fail ("#1");
-                       } catch (NullReferenceException) {
+#else
+                       catch (NullReferenceException) {
+                               // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
                        }
+#endif
                }
 
-               [Test]
-               // LAMESPEC: see bug #78374.
+               [Test] // LAMESPEC: see bug #321113
                public void OriginalStringRelative ()
                {
                        Uri k1 = new Uri ("http://www.mono-project.com");
@@ -378,18 +573,21 @@ namespace MonoTests.System
 
                        Uri a = new Uri ("http://www.mono-project.com:808/foo");
                        Uri b = new Uri (a, "../docs?queryyy#% %20%23%25bar");
+                       Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
 
-                       // it won't work.
-                       // Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
+                       Uri c = new Uri ("http://www.mono-project.com:808/foo");
+                       Uri d = new Uri (a, "../docs?queryyy#%20%23%25bar");
+                       Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#%20%23%25bar", d.OriginalString, "#3");
 
-                       Uri c = new Uri ("http://www.mono-project.com:909");
-                       Uri d = new Uri (c, "http://www.mono-project.com:606/docs");
-                       Assert.AreEqual ("http://www.mono-project.com:606/docs", d.OriginalString, "#3");
+                       Uri e = new Uri ("http://www.mono-project.com:909");
+                       Uri f = new Uri (e, "http://www.mono-project.com:606/docs");
+                       Assert.AreEqual ("http://www.mono-project.com:606/docs", f.OriginalString, "#4");
 
-                       Uri e = new Uri ("http://www.mono-project.com:303/foo");
-                       Uri f = new Uri (e, "?query");
+                       Uri g = new Uri ("http://www.mono-project.com:303/foo");
+                       Uri h = new Uri (g, "?query");
                        // it doesn't work. MS.NET also returns incorrect URI: ..303/?query
-                       // Assert.AreEqual ("http://www.mono-project.com:303/foo?query", e.OriginalString, "#4");
+                       // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=412604
+                       //Assert.AreEqual ("http://www.mono-project.com:303/foo?query", h.OriginalString, "#5");
                }
 
                [Test]
@@ -462,8 +660,52 @@ namespace MonoTests.System
                        Assert.IsFalse (relativeUri.IsAbsoluteUri, msg + "1");
                        Assert.AreEqual (expected, relativeUri.ToString (), msg + "2");
                        Assert.AreEqual (expected, relativeUri.OriginalString, msg + "3");
+                       Assert.IsFalse (relativeUri.UserEscaped, msg + "4");
+               }
+
+               [Test]
+               public void DontCheckHostWithCustomParsers ()
+               {
+                       UriParser.Register (new TolerantUriParser (), "assembly", 0);
+                       try {
+                               new Uri ("assembly://Spring.Core, Version=1.2.0.20001, Culture=neutral, "
+                                       + "PublicKeyToken=null/Spring.Objects.Factory.Xml/spring-objects-1.1.xsd");
+                       } catch (UriFormatException) {
+                               Assert.Fail ("Spring Uri is expected to work.");
+                       }
+               }
+
+               [Test]
+               public void ParseShortNameAsRelativeOrAbsolute ()
+               {
+                       new Uri ("x", UriKind.RelativeOrAbsolute);
+               }
+
+               private class TolerantUriParser : GenericUriParser
+               {
+                       private const GenericUriParserOptions DefaultOptions
+                               = GenericUriParserOptions.Default
+                               | GenericUriParserOptions.GenericAuthority
+                               | GenericUriParserOptions.AllowEmptyAuthority;
+                       
+                       public TolerantUriParser()
+                                                       : base(DefaultOptions)
+                       {
+                       }
+               }
+
+               [Test]
+               public void DomainLabelLength ()
+               {
+                       UriHostNameType type = Uri.CheckHostName ("3.141592653589793238462643383279502884197169399375105820974944592.com");
+                       Assert.AreEqual (UriHostNameType.Dns, type, "DomainLabelLength#1");
+                       type = Uri.CheckHostName ("3141592653589793238462643383279502884197169399375105820974944592.com");
+                       Assert.AreEqual (UriHostNameType.Unknown, type, "DomainLabelLength#2");
+                       type = Uri.CheckHostName ("3.1415926535897932384626433832795028841971693993751058209749445923.com");
+                       Assert.AreEqual (UriHostNameType.Unknown, type, "DomainLabelLength#2");
+                       type = Uri.CheckHostName ("3.141592653589793238462643383279502884197169399375105820974944592._om");
+                       Assert.AreEqual (UriHostNameType.Unknown, type, "DomainLabelLength#3");
                }
        }
 }
 
-#endif