2007-09-29 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / System / Test / System / UriTest3.cs
1 //
2 // UriTest3.cs - Even more (2.0 specific) unit tests for System.Uri
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30
31 using NUnit.Framework;
32
33 using System;
34
35 namespace MonoTests.System
36 {
37         [TestFixture]
38         public class UriTest3
39         {
40                 private const string absolute = "http://www.mono-project.com/CAS";
41                 private const string relative = "server.com/directory/";
42
43                 [Test]
44                 public void AbsoluteUri_RelativeUri ()
45                 {
46                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
47                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
48                         Uri relativeUri = uri1.MakeRelativeUri (uri2);
49
50                         try {
51                                 string result = relativeUri.AbsoluteUri;
52                                 Assert.Fail ("#1: " + result);
53                         } catch (InvalidOperationException ex) {
54                                 // This operation is not supported for a relative URI
55                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
56                                 Assert.IsNull (ex.InnerException, "#3");
57                                 Assert.IsNotNull (ex.Message, "#4");
58                         }
59                 }
60
61                 [Test]
62                 public void Absolute_UriKind_Absolute ()
63                 {
64                         Uri uri = new Uri (absolute, UriKind.Absolute);
65                         Assert.AreEqual ("www.mono-project.com", uri.DnsSafeHost, "DnsSafeHost");
66                         Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
67                         Assert.AreEqual (absolute, uri.OriginalString, "OriginalString");
68                 }
69
70                 [Test]
71                 public void Relative_UriKind_Relative ()
72                 {
73                         Uri uri = new Uri (relative, UriKind.Relative);
74                         Assert.IsFalse (uri.IsAbsoluteUri, "IsAbsoluteUri");
75                         Assert.AreEqual (relative, uri.OriginalString, "OriginalString");
76                         Assert.IsFalse (uri.UserEscaped, "UserEscaped");
77                         // using any other property would throw an InvalidOperationException
78                 }
79
80                 [Test]
81                 [ExpectedException (typeof (UriFormatException))]
82                 public void Relative_UriKind_Absolute ()
83                 {
84                         new Uri (relative, UriKind.Absolute);
85                 }
86
87                 [Test]
88                 [ExpectedException (typeof (UriFormatException))]
89                 public void Absolute_UriKind_Relative ()
90                 {
91                         new Uri (absolute, UriKind.Relative);
92                 }
93
94                 [Test]
95                 [Category ("NotWorking")]
96                 public void TryCreate_String_UriKind_Uri ()
97                 {
98                         Uri uri = null;
99                         Assert.IsTrue (Uri.TryCreate (absolute, UriKind.Absolute, out uri), "absolute-Absolute");
100                         Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-Absolute-AbsoluteUri");
101
102                         Assert.IsTrue (Uri.TryCreate (absolute, UriKind.RelativeOrAbsolute, out uri), "absolute-RelativeOrAbsolute");
103                         Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-RelativeOrAbsolute-AbsoluteUri");
104
105                         Assert.IsFalse (Uri.TryCreate (absolute, UriKind.Relative, out uri), "absolute-Relative");
106                         Assert.IsNull (uri, "absolute-Relative-uri");
107
108                         Assert.IsFalse (Uri.TryCreate (relative, UriKind.Absolute, out uri), "relative-Absolute");
109                         Assert.IsNull (uri, "relative-Relative-uri");
110
111                         Assert.IsTrue (Uri.TryCreate (relative, UriKind.RelativeOrAbsolute, out uri), "relative-RelativeOrAbsolute");
112                         Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
113
114                         Assert.IsTrue (Uri.TryCreate (relative, UriKind.Relative, out uri), "relative-Relative");
115                         Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
116                 }
117
118                 [Test]
119                 [Category ("NotWorking")]
120                 public void TryCreate_Uri_String_Uri ()
121                 {
122                         Uri baseUri = new Uri (absolute);
123                         Uri uri = null;
124
125                         Assert.IsTrue (Uri.TryCreate (baseUri, relative, out uri), "baseUri+relative");
126                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relative+AbsoluteUri");
127                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relative+OriginalString");
128
129                         Assert.IsTrue (Uri.TryCreate (baseUri, absolute, out uri), "baseUri+absolute");
130                         Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+absolute+AbsoluteUri");
131                         Assert.AreEqual (absolute, uri.OriginalString, "baseUri+absolute+OriginalString");
132
133                         Uri relativeUri = new Uri (relative, UriKind.Relative);
134                         Assert.IsFalse (Uri.TryCreate (relativeUri, relative, out uri), "relativeUri+relative");
135                         Assert.IsNull (uri, "relativeUri+relative+Uri");
136
137                         Assert.IsTrue (Uri.TryCreate (relativeUri, absolute, out uri), "relativeUri+absolute");
138                         Assert.AreEqual (absolute, uri.OriginalString, "relativeUri+absolute+OriginalString");
139
140                         string n = null;
141                         Assert.IsFalse (Uri.TryCreate (baseUri, n, out uri), "baseUri+null");
142                         Assert.IsNull (uri, "baseUri+null+Uri");
143                         Assert.IsFalse (Uri.TryCreate (relativeUri, n, out uri), "relativeUri+null");
144                         Assert.IsNull (uri, "relativeUri+null+Uri");
145                         Assert.IsFalse (Uri.TryCreate (null, relative, out uri), "null+relative");
146                         Assert.IsNull (uri, "null+relative+Uri");
147
148                         Assert.IsTrue (Uri.TryCreate (null, absolute, out uri), "null+absolute");
149                         Assert.AreEqual (absolute, uri.OriginalString, "null+absolute+OriginalString");
150                 }
151
152                 [Test]
153                 [Category ("NotWorking")]
154                 public void TryCreate_Uri_Uri_Uri ()
155                 {
156                         Uri baseUri = new Uri (absolute);
157                         Uri relativeUri = new Uri (relative, UriKind.Relative);
158                         Uri uri = null;
159
160                         Assert.IsTrue (Uri.TryCreate (baseUri, relativeUri, out uri), "baseUri+relativeUri");
161                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relativeUri+AbsoluteUri");
162                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relativeUri+OriginalString");
163
164                         Assert.IsTrue (Uri.TryCreate (baseUri, baseUri, out uri), "baseUri+baseUri");
165                         Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+baseUri+AbsoluteUri");
166                         Assert.AreEqual (absolute, uri.OriginalString, "baseUri+baseUri+OriginalString");
167
168                         Assert.IsFalse (Uri.TryCreate (relativeUri, relativeUri, out uri), "relativeUri+relativeUri");
169                         Assert.IsNull (uri, "relativeUri+relativeUri+Uri");
170
171                         Assert.IsFalse (Uri.TryCreate (relativeUri, baseUri, out uri), "relativeUri+baseUri");
172                         Assert.IsNull (uri, "relativeUri+baseUri+Uri");
173
174                         // a null relativeUri throws a NullReferenceException (see next test)
175                         Assert.IsFalse (Uri.TryCreate (null, relativeUri, out uri), "null+relativeUri");
176                         Assert.IsNull (uri, "null+relativeUri+Uri");
177                         Assert.IsFalse (Uri.TryCreate (null, baseUri, out uri), "null+baseUri");
178                         Assert.IsNull (uri, "null+baseUri+Uri");
179                 }
180
181                 [Test]
182                 [ExpectedException (typeof (NullReferenceException))]
183                 public void TryCreate_Uri_UriNull_Uri ()
184                 {
185                         Uri uri = null;
186                         Uri.TryCreate (new Uri (absolute), (Uri) null, out uri);
187                 }
188
189                 [Test]
190                 public void IsWellFormedUriString_Null ()
191                 {
192                         Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
193                 }
194
195                 [Test]
196                 public void IsWellFormedUriString_Http ()
197                 {
198                         Assert.IsFalse (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", UriKind.Absolute), "http/space");
199                         Assert.IsTrue (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main%20Page", UriKind.Absolute), "http/%20");
200                 }
201
202                 [Test]
203                 [ExpectedException (typeof (ArgumentException))]
204                 public void IsWellFormedUriString_BadUriKind ()
205                 {
206                         Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", (UriKind)Int32.MinValue);
207                 }
208
209                 [Test]
210                 public void Compare ()
211                 {
212                         Uri u1 = null;
213                         Uri u2 = null;
214                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null-null");
215
216                         u1 = new Uri ("http://www.go-mono.com/Main Page");
217                         u2 = new Uri ("http://www.go-mono.com/Main%20Page");
218                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.CurrentCulture), "http/space-http/%20-unescaped");
219                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "http/space-http/%20-escaped");
220                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.CurrentCulture), "http/space-http/%20-safe");
221                 }
222
223                 [Test]
224                 public void IsBaseOf ()
225                 {
226                         Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
227                         Assert.IsTrue (http.IsBaseOf (http), "http-http");
228
229                         Uri u = new Uri ("http://www.mono-project.com/Main_Page#FAQ");
230                         Assert.IsTrue (u.IsBaseOf (http), "http-1a");
231                         Assert.IsTrue (http.IsBaseOf (u), "http-1b");
232
233                         u = new Uri ("http://www.mono-project.com/Main_Page");
234                         Assert.IsTrue (u.IsBaseOf (http), "http-2a");
235                         Assert.IsTrue (http.IsBaseOf (u), "http-2b");
236
237                         u = new Uri ("http://www.mono-project.com/");
238                         Assert.IsTrue (u.IsBaseOf (http), "http-3a");
239                         Assert.IsTrue (http.IsBaseOf (u), "http-3b");
240
241                         u = new Uri ("http://www.mono-project.com/Main_Page/");
242                         Assert.IsFalse (u.IsBaseOf (http), "http-4a");
243                         Assert.IsTrue (http.IsBaseOf (u), "http-4b");
244
245                         // docs says the UserInfo isn't evaluated, but...
246                         u = new Uri ("http://username:password@www.mono-project.com/Main_Page");
247                         Assert.IsFalse (u.IsBaseOf (http), "http-5a");
248                         Assert.IsFalse (http.IsBaseOf (u), "http-5b");
249
250                         // scheme case sensitive ? no
251                         u = new Uri ("HTTP://www.mono-project.com/Main_Page");
252                         Assert.IsTrue (u.IsBaseOf (http), "http-6a");
253                         Assert.IsTrue (http.IsBaseOf (u), "http-6b");
254
255                         // host case sensitive ? no
256                         u = new Uri ("http://www.Mono-Project.com/Main_Page");
257                         Assert.IsTrue (u.IsBaseOf (http), "http-7a");
258                         Assert.IsTrue (http.IsBaseOf (u), "http-7b");
259
260                         // path case sensitive ? no
261                         u = new Uri ("http://www.Mono-Project.com/MAIN_Page");
262                         Assert.IsTrue (u.IsBaseOf (http), "http-8a");
263                         Assert.IsTrue (http.IsBaseOf (u), "http-8b");
264
265                         // different scheme
266                         u = new Uri ("ftp://www.mono-project.com/Main_Page");
267                         Assert.IsFalse (u.IsBaseOf (http), "http-9a");
268                         Assert.IsFalse (http.IsBaseOf (u), "http-9b");
269
270                         // different host
271                         u = new Uri ("http://www.go-mono.com/Main_Page");
272                         Assert.IsFalse (u.IsBaseOf (http), "http-10a");
273                         Assert.IsFalse (http.IsBaseOf (u), "http-10b");
274
275                         // different port
276                         u = new Uri ("http://www.mono-project.com:8080/");
277                         Assert.IsFalse (u.IsBaseOf (http), "http-11a");
278                         Assert.IsFalse (http.IsBaseOf (u), "http-11b");
279
280                         // specify default port
281                         u = new Uri ("http://www.mono-project.com:80/");
282                         Assert.IsTrue (u.IsBaseOf (http), "http-12a");
283                         Assert.IsTrue (http.IsBaseOf (u), "http-12b");
284                 }
285
286                 [Test]
287                 [ExpectedException (typeof (NullReferenceException))]
288                 public void IsBaseOf_Null ()
289                 {
290                         Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
291                         http.IsBaseOf (null);
292                 }
293
294                 [Test] 
295                 public void MakeRelativeUri ()
296                 {
297                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
298                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
299                         Uri uri3 = new Uri ("http://www.contoso.com/bar/foo/index.htm?y=1");
300                         Uri uri4 = new Uri ("http://www.contoso.com/bar/foo2/index.htm?x=0");
301                         Uri uri5 = new Uri ("https://www.contoso.com/bar/foo/index.htm?y=1");
302                         Uri uri6 = new Uri ("http://www.contoso2.com/bar/foo/index.htm?x=0");
303                         Uri uri7 = new Uri ("http://www.contoso2.com/bar/foo/foobar.htm?z=0&y=5");
304                         Uri uri8 = new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9);
305                         Uri uri10 = new Uri ("mailto:xxx@xxx.com");
306                         Uri uri11 = new Uri ("mailto:xxx@xxx.com?subject=hola");
307                         Uri uri12 = new Uri ("mailto:xxx@mail.xxx.com?subject=hola");
308                         Uri uri13 = new Uri ("mailto:xxx@xxx.com/foo/bar");
309
310                         AssertRelativeUri ("foo/bar/index.htm#fragment", uri1, uri2, "#A");
311                         AssertRelativeUri ("../../index.htm?x=2", uri2, uri1, "#B");
312                         AssertRelativeUri ("../../bar/foo/index.htm?y=1", uri2, uri3, "#C");
313                         AssertRelativeUri ("../../foo/bar/index.htm#fragment", uri3, uri2, "#D");
314                         AssertRelativeUri ("../foo2/index.htm?x=0", uri3, uri4, "#E");
315                         AssertRelativeUri ("../foo/index.htm?y=1", uri4, uri3, "#F");
316                         AssertRelativeUri ("?x=0", uri6, uri6, "#G");
317                         AssertRelativeUri ("foobar.htm?z=0&y=5", uri6, uri7, "#H");
318                         AssertRelativeUri ("?subject=hola", uri10, uri11, "#I");
319                         AssertRelativeUri ("/foo/bar", uri10, uri13, "#J");
320
321                         Uri relativeUri = uri1.MakeRelativeUri (uri8);
322                         Assert.IsTrue (relativeUri.IsAbsoluteUri, "#K1");
323                         Assert.AreEqual (uri8.ToString (), relativeUri.ToString (), "#K2");
324                         Assert.AreEqual (uri8.OriginalString, relativeUri.OriginalString, "#K3");
325
326                         relativeUri = uri10.MakeRelativeUri (uri12);
327                         Assert.IsTrue (relativeUri.IsAbsoluteUri, "#L1");
328                         Assert.AreEqual (uri12.ToString (), relativeUri.ToString (), "#L2");
329                         Assert.AreEqual (uri12.OriginalString, relativeUri.OriginalString, "#L3");
330
331                         relativeUri = uri4.MakeRelativeUri (uri6);
332                         Assert.IsTrue (relativeUri.IsAbsoluteUri, "#M1");
333                         Assert.AreEqual (uri6.ToString (), relativeUri.ToString (), "#M2");
334                         Assert.AreEqual (uri6.OriginalString, relativeUri.OriginalString, "#M3");
335
336                         relativeUri = uri4.MakeRelativeUri (uri5);
337                         Assert.IsTrue (relativeUri.IsAbsoluteUri, "#N1");
338                         Assert.AreEqual (uri5.ToString (), relativeUri.ToString (), "#N2");
339                         Assert.AreEqual (uri5.OriginalString, relativeUri.OriginalString, "#N3");
340                 }
341
342                 [Test]
343                 [Category ("NotDotNet")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
344                 public void MakeRelativeUri_Uri_Null_Mono ()
345                 {
346                         Uri uri = new Uri ("http://test.com");
347                         try {
348                                 uri.MakeRelativeUri ((Uri) null);
349                                 Assert.Fail ("#1");
350                         } catch (ArgumentNullException ex) {
351                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
352                                 Assert.IsNull (ex.InnerException, "#3");
353                                 Assert.IsNotNull (ex.Message, "#4");
354                                 Assert.IsNotNull (ex.ParamName, "#5");
355                                 Assert.AreEqual ("uri", ex.ParamName, "#6");
356                         }
357                 }
358
359                 [Test]
360                 [Category ("NotWorking")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
361                 public void MakeRelativeUri_Uri_Null_MS ()
362                 {
363                         Uri uri = new Uri ("http://test.com");
364                         try {
365                                 uri.MakeRelativeUri ((Uri) null);
366                                 Assert.Fail ("#1");
367                         } catch (NullReferenceException) {
368                         }
369                 }
370
371                 [Test]
372                 // LAMESPEC: see bug #78374.
373                 public void OriginalStringRelative ()
374                 {
375                         Uri k1 = new Uri ("http://www.mono-project.com");
376                         Uri k2 = new Uri (k1, "docs");
377                         Assert.AreEqual ("http://www.mono-project.com/docs", k2.OriginalString, "#1");
378
379                         Uri a = new Uri ("http://www.mono-project.com:808/foo");
380                         Uri b = new Uri (a, "../docs?queryyy#% %20%23%25bar");
381
382                         // it won't work.
383                         // Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
384
385                         Uri c = new Uri ("http://www.mono-project.com:909");
386                         Uri d = new Uri (c, "http://www.mono-project.com:606/docs");
387                         Assert.AreEqual ("http://www.mono-project.com:606/docs", d.OriginalString, "#3");
388
389                         Uri e = new Uri ("http://www.mono-project.com:303/foo");
390                         Uri f = new Uri (e, "?query");
391                         // it doesn't work. MS.NET also returns incorrect URI: ..303/?query
392                         // Assert.AreEqual ("http://www.mono-project.com:303/foo?query", e.OriginalString, "#4");
393                 }
394
395                 [Test]
396                 public void PathAndQuery_RelativeUri ()
397                 {
398                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
399                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
400                         Uri relativeUri = uri1.MakeRelativeUri (uri2);
401
402                         try {
403                                 string result = relativeUri.PathAndQuery;
404                                 Assert.Fail ("#1: " + result);
405                         } catch (InvalidOperationException ex) {
406                                 // This operation is not supported for a relative URI
407                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
408                                 Assert.IsNull (ex.InnerException, "#3");
409                                 Assert.IsNotNull (ex.Message, "#4");
410                         }
411                 }
412
413                 [Test]
414                 public void Query_RelativeUri ()
415                 {
416                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
417                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
418                         Uri relativeUri = uri1.MakeRelativeUri (uri2);
419
420                         try {
421                                 string result = relativeUri.Query;
422                                 Assert.Fail ("#1: " + result);
423                         } catch (InvalidOperationException ex) {
424                                 // This operation is not supported for a relative URI
425                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
426                                 Assert.IsNull (ex.InnerException, "#3");
427                                 Assert.IsNotNull (ex.Message, "#4");
428                         }
429                 }
430
431                 [Test]
432                 public void Scheme_RelativeUri ()
433                 {
434                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
435                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
436                         Uri relativeUri = uri1.MakeRelativeUri (uri2);
437
438                         try {
439                                 string result = relativeUri.Scheme;
440                                 Assert.Fail ("#1: " + result);
441                         } catch (InvalidOperationException ex) {
442                                 // This operation is not supported for a relative URI
443                                 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
444                                 Assert.IsNull (ex.InnerException, "#3");
445                                 Assert.IsNotNull (ex.Message, "#4");
446                         }
447                 }
448
449                 [Test]
450                 public void UnescapeDataString ()
451                 {
452                         Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20folder/"));
453                         Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20%66older/"));
454                         Assert.AreEqual ("/new+folder/", Uri.UnescapeDataString ("/new+folder/"));
455                 }
456
457                 void AssertRelativeUri (string expected, Uri uri1, Uri uri2, string msg)
458                 {
459                         Uri relativeUri;
460                         relativeUri = uri1.MakeRelativeUri (uri2);
461                         
462                         Assert.IsFalse (relativeUri.IsAbsoluteUri, msg + "1");
463                         Assert.AreEqual (expected, relativeUri.ToString (), msg + "2");
464                         Assert.AreEqual (expected, relativeUri.OriginalString, msg + "3");
465                 }
466         }
467 }
468
469 #endif