2 // UriTest3.cs - Even more (2.0 specific) unit tests for System.Uri
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
31 using NUnit.Framework;
35 namespace MonoTests.System
40 private const string absolute = "http://www.mono-project.com/CAS";
41 private const string relative = "server.com/directory/";
44 public void AbsoluteUri_RelativeUri ()
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);
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");
62 public void Absolute_UriKind_Absolute ()
64 Uri uri = new Uri (absolute, UriKind.Absolute);
65 Assert.AreEqual ("www.mono-project.com", uri.DnsSafeHost, "#1");
66 Assert.IsTrue (uri.IsAbsoluteUri, "#2");
67 Assert.AreEqual (absolute, uri.OriginalString, "#3");
68 Assert.AreEqual (absolute, uri.ToString (), "#4");
69 Assert.IsFalse (uri.UserEscaped, "#5");
73 public void Relative_UriKind_Relative ()
75 Uri uri = new Uri (relative, UriKind.Relative);
76 Assert.IsFalse (uri.IsAbsoluteUri, "#A1");
77 Assert.AreEqual (relative, uri.OriginalString, "#A2");
78 Assert.AreEqual (relative, uri.ToString (), "#A3");
79 Assert.IsFalse (uri.UserEscaped, "#A4");
81 uri = new Uri (string.Empty, UriKind.Relative);
82 Assert.IsFalse (uri.IsAbsoluteUri, "#B1");
83 Assert.AreEqual (string.Empty, uri.OriginalString, "#B2");
84 Assert.AreEqual (string.Empty, uri.ToString (), "#B3");
85 Assert.IsFalse (uri.UserEscaped, "#B4");
87 uri = new Uri ("foo/bar", UriKind.Relative);
88 Assert.IsFalse (uri.IsAbsoluteUri, "#C1");
89 Assert.AreEqual ("foo/bar", uri.OriginalString, "#C2");
90 Assert.AreEqual ("foo/bar", uri.ToString (), "#C3");
91 Assert.IsFalse (uri.UserEscaped, "#C4");
93 uri = new Uri ("/test.aspx", UriKind.Relative);
94 Assert.IsFalse (uri.IsAbsoluteUri, "#D1");
95 Assert.AreEqual ("/test.aspx", uri.OriginalString, "#D2");
96 Assert.AreEqual ("/test.aspx", uri.ToString (), "#D3");
97 Assert.IsFalse (uri.UserEscaped, "#D4");
101 [ExpectedException (typeof (UriFormatException))]
102 public void Relative_UriKind_Absolute ()
104 new Uri (relative, UriKind.Absolute);
108 [ExpectedException (typeof (UriFormatException))]
109 public void Absolute_UriKind_Relative ()
111 new Uri (absolute, UriKind.Relative);
115 public void TryCreate_String_UriKind_Uri ()
118 Assert.IsTrue (Uri.TryCreate (absolute, UriKind.Absolute, out uri), "absolute-Absolute");
119 Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-Absolute-AbsoluteUri");
121 Assert.IsTrue (Uri.TryCreate (absolute, UriKind.RelativeOrAbsolute, out uri), "absolute-RelativeOrAbsolute");
122 Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-RelativeOrAbsolute-AbsoluteUri");
124 Assert.IsFalse (Uri.TryCreate (absolute, UriKind.Relative, out uri), "absolute-Relative");
125 Assert.IsNull (uri, "absolute-Relative-uri");
127 Assert.IsFalse (Uri.TryCreate (relative, UriKind.Absolute, out uri), "relative-Absolute");
128 Assert.IsNull (uri, "relative-Relative-uri");
130 Assert.IsTrue (Uri.TryCreate (relative, UriKind.RelativeOrAbsolute, out uri), "relative-RelativeOrAbsolute");
131 Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
133 Assert.IsTrue (Uri.TryCreate (relative, UriKind.Relative, out uri), "relative-Relative");
134 Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
138 [Category ("NotWorking")]
139 public void TryCreate_Uri_String_Uri ()
141 Uri baseUri = new Uri (absolute);
144 Assert.IsTrue (Uri.TryCreate (baseUri, relative, out uri), "baseUri+relative");
145 Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relative+AbsoluteUri");
146 Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relative+OriginalString");
148 Assert.IsTrue (Uri.TryCreate (baseUri, absolute, out uri), "baseUri+absolute");
149 Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+absolute+AbsoluteUri");
150 Assert.AreEqual (absolute, uri.OriginalString, "baseUri+absolute+OriginalString");
152 Uri relativeUri = new Uri (relative, UriKind.Relative);
153 Assert.IsFalse (Uri.TryCreate (relativeUri, relative, out uri), "relativeUri+relative");
154 Assert.IsNull (uri, "relativeUri+relative+Uri");
156 Assert.IsTrue (Uri.TryCreate (relativeUri, absolute, out uri), "relativeUri+absolute");
157 Assert.AreEqual (absolute, uri.OriginalString, "relativeUri+absolute+OriginalString");
160 Assert.IsFalse (Uri.TryCreate (baseUri, n, out uri), "baseUri+null");
161 Assert.IsNull (uri, "baseUri+null+Uri");
162 Assert.IsFalse (Uri.TryCreate (relativeUri, n, out uri), "relativeUri+null");
163 Assert.IsNull (uri, "relativeUri+null+Uri");
164 Assert.IsFalse (Uri.TryCreate (null, relative, out uri), "null+relative");
165 Assert.IsNull (uri, "null+relative+Uri");
167 Assert.IsTrue (Uri.TryCreate (null, absolute, out uri), "null+absolute");
168 Assert.AreEqual (absolute, uri.OriginalString, "null+absolute+OriginalString");
172 [Category ("NotWorking")]
173 public void TryCreate_Uri_Uri_Uri ()
175 Uri baseUri = new Uri (absolute);
176 Uri relativeUri = new Uri (relative, UriKind.Relative);
179 Assert.IsTrue (Uri.TryCreate (baseUri, relativeUri, out uri), "baseUri+relativeUri");
180 Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relativeUri+AbsoluteUri");
181 Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relativeUri+OriginalString");
183 Assert.IsTrue (Uri.TryCreate (baseUri, baseUri, out uri), "baseUri+baseUri");
184 Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+baseUri+AbsoluteUri");
185 Assert.AreEqual (absolute, uri.OriginalString, "baseUri+baseUri+OriginalString");
187 Assert.IsFalse (Uri.TryCreate (relativeUri, relativeUri, out uri), "relativeUri+relativeUri");
188 Assert.IsNull (uri, "relativeUri+relativeUri+Uri");
190 Assert.IsFalse (Uri.TryCreate (relativeUri, baseUri, out uri), "relativeUri+baseUri");
191 Assert.IsNull (uri, "relativeUri+baseUri+Uri");
193 // a null relativeUri throws a NullReferenceException (see next test)
194 Assert.IsFalse (Uri.TryCreate (null, relativeUri, out uri), "null+relativeUri");
195 Assert.IsNull (uri, "null+relativeUri+Uri");
196 Assert.IsFalse (Uri.TryCreate (null, baseUri, out uri), "null+baseUri");
197 Assert.IsNull (uri, "null+baseUri+Uri");
201 [ExpectedException (typeof (NullReferenceException))]
202 public void TryCreate_Uri_UriNull_Uri ()
205 Uri.TryCreate (new Uri (absolute), (Uri) null, out uri);
209 public void IsWellFormedUriString_Null ()
211 Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
215 public void IsWellFormedUriString_Http ()
217 Assert.IsFalse (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", UriKind.Absolute), "http/space");
218 Assert.IsTrue (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main%20Page", UriKind.Absolute), "http/%20");
222 [ExpectedException (typeof (ArgumentException))]
223 public void IsWellFormedUriString_BadUriKind ()
225 Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", (UriKind)Int32.MinValue);
229 public void Compare ()
233 Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null-null");
235 u1 = new Uri ("http://www.go-mono.com/Main Page");
236 u2 = new Uri ("http://www.go-mono.com/Main%20Page");
237 Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.CurrentCulture), "http/space-http/%20-unescaped");
238 Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "http/space-http/%20-escaped");
239 Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.CurrentCulture), "http/space-http/%20-safe");
243 public void IsBaseOf ()
245 Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
246 Assert.IsTrue (http.IsBaseOf (http), "http-http");
248 Uri u = new Uri ("http://www.mono-project.com/Main_Page#FAQ");
249 Assert.IsTrue (u.IsBaseOf (http), "http-1a");
250 Assert.IsTrue (http.IsBaseOf (u), "http-1b");
252 u = new Uri ("http://www.mono-project.com/Main_Page");
253 Assert.IsTrue (u.IsBaseOf (http), "http-2a");
254 Assert.IsTrue (http.IsBaseOf (u), "http-2b");
256 u = new Uri ("http://www.mono-project.com/");
257 Assert.IsTrue (u.IsBaseOf (http), "http-3a");
258 Assert.IsTrue (http.IsBaseOf (u), "http-3b");
260 u = new Uri ("http://www.mono-project.com/Main_Page/");
261 Assert.IsFalse (u.IsBaseOf (http), "http-4a");
262 Assert.IsTrue (http.IsBaseOf (u), "http-4b");
264 // docs says the UserInfo isn't evaluated, but...
265 u = new Uri ("http://username:password@www.mono-project.com/Main_Page");
266 Assert.IsFalse (u.IsBaseOf (http), "http-5a");
267 Assert.IsFalse (http.IsBaseOf (u), "http-5b");
269 // scheme case sensitive ? no
270 u = new Uri ("HTTP://www.mono-project.com/Main_Page");
271 Assert.IsTrue (u.IsBaseOf (http), "http-6a");
272 Assert.IsTrue (http.IsBaseOf (u), "http-6b");
274 // host case sensitive ? no
275 u = new Uri ("http://www.Mono-Project.com/Main_Page");
276 Assert.IsTrue (u.IsBaseOf (http), "http-7a");
277 Assert.IsTrue (http.IsBaseOf (u), "http-7b");
279 // path case sensitive ? no
280 u = new Uri ("http://www.Mono-Project.com/MAIN_Page");
281 Assert.IsTrue (u.IsBaseOf (http), "http-8a");
282 Assert.IsTrue (http.IsBaseOf (u), "http-8b");
285 u = new Uri ("ftp://www.mono-project.com/Main_Page");
286 Assert.IsFalse (u.IsBaseOf (http), "http-9a");
287 Assert.IsFalse (http.IsBaseOf (u), "http-9b");
290 u = new Uri ("http://www.go-mono.com/Main_Page");
291 Assert.IsFalse (u.IsBaseOf (http), "http-10a");
292 Assert.IsFalse (http.IsBaseOf (u), "http-10b");
295 u = new Uri ("http://www.mono-project.com:8080/");
296 Assert.IsFalse (u.IsBaseOf (http), "http-11a");
297 Assert.IsFalse (http.IsBaseOf (u), "http-11b");
299 // specify default port
300 u = new Uri ("http://www.mono-project.com:80/");
301 Assert.IsTrue (u.IsBaseOf (http), "http-12a");
302 Assert.IsTrue (http.IsBaseOf (u), "http-12b");
306 [ExpectedException (typeof (NullReferenceException))]
307 public void IsBaseOf_Null ()
309 Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
310 http.IsBaseOf (null);
314 public void MakeRelativeUri ()
316 Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
317 Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
318 Uri uri3 = new Uri ("http://www.contoso.com/bar/foo/index.htm?y=1");
319 Uri uri4 = new Uri ("http://www.contoso.com/bar/foo2/index.htm?x=0");
320 Uri uri5 = new Uri ("https://www.contoso.com/bar/foo/index.htm?y=1");
321 Uri uri6 = new Uri ("http://www.contoso2.com/bar/foo/index.htm?x=0");
322 Uri uri7 = new Uri ("http://www.contoso2.com/bar/foo/foobar.htm?z=0&y=5");
323 Uri uri8 = new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9);
324 Uri uri10 = new Uri ("mailto:xxx@xxx.com");
325 Uri uri11 = new Uri ("mailto:xxx@xxx.com?subject=hola");
326 Uri uri12 = new Uri ("mailto:xxx@mail.xxx.com?subject=hola");
327 Uri uri13 = new Uri ("mailto:xxx@xxx.com/foo/bar");
329 AssertRelativeUri ("foo/bar/index.htm#fragment", uri1, uri2, "#A");
330 AssertRelativeUri ("../../index.htm?x=2", uri2, uri1, "#B");
331 AssertRelativeUri ("../../bar/foo/index.htm?y=1", uri2, uri3, "#C");
332 AssertRelativeUri ("../../foo/bar/index.htm#fragment", uri3, uri2, "#D");
333 AssertRelativeUri ("../foo2/index.htm?x=0", uri3, uri4, "#E");
334 AssertRelativeUri ("../foo/index.htm?y=1", uri4, uri3, "#F");
335 AssertRelativeUri ("?x=0", uri6, uri6, "#G");
336 AssertRelativeUri ("foobar.htm?z=0&y=5", uri6, uri7, "#H");
337 AssertRelativeUri ("?subject=hola", uri10, uri11, "#I");
338 AssertRelativeUri ("/foo/bar", uri10, uri13, "#J");
340 Uri relativeUri = uri1.MakeRelativeUri (uri8);
341 Assert.IsTrue (relativeUri.IsAbsoluteUri, "#K1");
342 Assert.AreEqual (uri8.ToString (), relativeUri.ToString (), "#K2");
343 Assert.AreEqual (uri8.OriginalString, relativeUri.OriginalString, "#K3");
345 relativeUri = uri10.MakeRelativeUri (uri12);
346 Assert.IsTrue (relativeUri.IsAbsoluteUri, "#L1");
347 Assert.AreEqual (uri12.ToString (), relativeUri.ToString (), "#L2");
348 Assert.AreEqual (uri12.OriginalString, relativeUri.OriginalString, "#L3");
350 relativeUri = uri4.MakeRelativeUri (uri6);
351 Assert.IsTrue (relativeUri.IsAbsoluteUri, "#M1");
352 Assert.AreEqual (uri6.ToString (), relativeUri.ToString (), "#M2");
353 Assert.AreEqual (uri6.OriginalString, relativeUri.OriginalString, "#M3");
355 relativeUri = uri4.MakeRelativeUri (uri5);
356 Assert.IsTrue (relativeUri.IsAbsoluteUri, "#N1");
357 Assert.AreEqual (uri5.ToString (), relativeUri.ToString (), "#N2");
358 Assert.AreEqual (uri5.OriginalString, relativeUri.OriginalString, "#N3");
362 [Category ("NotDotNet")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
363 public void MakeRelativeUri_Uri_Null_Mono ()
365 Uri uri = new Uri ("http://test.com");
367 uri.MakeRelativeUri ((Uri) null);
369 } catch (ArgumentNullException ex) {
370 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
371 Assert.IsNull (ex.InnerException, "#3");
372 Assert.IsNotNull (ex.Message, "#4");
373 Assert.IsNotNull (ex.ParamName, "#5");
374 Assert.AreEqual ("uri", ex.ParamName, "#6");
379 [Category ("NotWorking")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=299942
380 public void MakeRelativeUri_Uri_Null_MS ()
382 Uri uri = new Uri ("http://test.com");
384 uri.MakeRelativeUri ((Uri) null);
386 } catch (NullReferenceException) {
391 // LAMESPEC: see bug #78374.
392 public void OriginalStringRelative ()
394 Uri k1 = new Uri ("http://www.mono-project.com");
395 Uri k2 = new Uri (k1, "docs");
396 Assert.AreEqual ("http://www.mono-project.com/docs", k2.OriginalString, "#1");
398 Uri a = new Uri ("http://www.mono-project.com:808/foo");
399 Uri b = new Uri (a, "../docs?queryyy#% %20%23%25bar");
402 // Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
404 Uri c = new Uri ("http://www.mono-project.com:909");
405 Uri d = new Uri (c, "http://www.mono-project.com:606/docs");
406 Assert.AreEqual ("http://www.mono-project.com:606/docs", d.OriginalString, "#3");
408 Uri e = new Uri ("http://www.mono-project.com:303/foo");
409 Uri f = new Uri (e, "?query");
410 // it doesn't work. MS.NET also returns incorrect URI: ..303/?query
411 // Assert.AreEqual ("http://www.mono-project.com:303/foo?query", f.OriginalString, "#4");
415 public void PathAndQuery_RelativeUri ()
417 Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
418 Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
419 Uri relativeUri = uri1.MakeRelativeUri (uri2);
422 string result = relativeUri.PathAndQuery;
423 Assert.Fail ("#1: " + result);
424 } catch (InvalidOperationException ex) {
425 // This operation is not supported for a relative URI
426 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
427 Assert.IsNull (ex.InnerException, "#3");
428 Assert.IsNotNull (ex.Message, "#4");
433 public void Query_RelativeUri ()
435 Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
436 Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
437 Uri relativeUri = uri1.MakeRelativeUri (uri2);
440 string result = relativeUri.Query;
441 Assert.Fail ("#1: " + result);
442 } catch (InvalidOperationException ex) {
443 // This operation is not supported for a relative URI
444 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
445 Assert.IsNull (ex.InnerException, "#3");
446 Assert.IsNotNull (ex.Message, "#4");
451 public void Scheme_RelativeUri ()
453 Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");
454 Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
455 Uri relativeUri = uri1.MakeRelativeUri (uri2);
458 string result = relativeUri.Scheme;
459 Assert.Fail ("#1: " + result);
460 } catch (InvalidOperationException ex) {
461 // This operation is not supported for a relative URI
462 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
463 Assert.IsNull (ex.InnerException, "#3");
464 Assert.IsNotNull (ex.Message, "#4");
469 public void UnescapeDataString ()
471 Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20folder/"));
472 Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20%66older/"));
473 Assert.AreEqual ("/new+folder/", Uri.UnescapeDataString ("/new+folder/"));
476 void AssertRelativeUri (string expected, Uri uri1, Uri uri2, string msg)
479 relativeUri = uri1.MakeRelativeUri (uri2);
481 Assert.IsFalse (relativeUri.IsAbsoluteUri, msg + "1");
482 Assert.AreEqual (expected, relativeUri.ToString (), msg + "2");
483 Assert.AreEqual (expected, relativeUri.OriginalString, msg + "3");
484 Assert.IsFalse (relativeUri.UserEscaped, msg + "4");