2 // UriTest.cs - NUnit Test Cases for System.Uri
5 // Lawrence Pit (loz@cable.a2000.nl)
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
7 // Ben Maurer (bmaurer@users.sourceforge.net)
9 // (C) 2003 Martin Willemoes Hansen
10 // (C) 2003 Ben Maurer
13 using NUnit
.Framework
;
17 namespace MonoTests
.System
20 public class UriTest
: Assertion
22 protected bool isWin32
= false;
25 public void GetReady ()
27 isWin32
= (Path
.DirectorySeparatorChar
== '\\');
31 public void Constructors ()
36 uri = new Uri ("http://www.ximian.com/foo" + ((char) 0xa9) + "/bar/index.cgi?a=1&b=" + ((char) 0xa9) + "left#fragm?ent2");
39 uri = new Uri ("http://www.ximian.com/foo/xxx\"()-._;<=>@{|}~-,.`_^]\\[xx/" + ((char) 0xa9) + "/bar/index.cgi#fra+\">=@[gg]~gment2");
42 uri = new Uri("http://11.22.33.588:9090");
45 uri = new Uri("http://[11:22:33::88]:9090");
48 uri = new Uri("http://[::127.11.22.33]:8080");
51 uri = new Uri("http://[abcde::127.11.22.33]:8080");
56 uri = new Uri ("http://www.contoso.com:1234/foo/bar/");
59 uri = new Uri ("http://www.contoso.com:1234/foo/bar");
62 uri = new Uri ("http://www.contoso.com:1234/");
65 uri = new Uri ("http://www.contoso.com:1234");
69 uri
= new Uri ("http://contoso.com?subject=uri");
70 AssertEquals ("#k1", "/", uri
.AbsolutePath
);
71 AssertEquals ("#k2", "http://contoso.com/?subject=uri", uri
.AbsoluteUri
);
72 AssertEquals ("#k3", "contoso.com", uri
.Authority
);
73 AssertEquals ("#k4", "", uri
.Fragment
);
74 AssertEquals ("#k5", "contoso.com", uri
.Host
);
75 AssertEquals ("#k6", UriHostNameType
.Dns
, uri
.HostNameType
);
76 AssertEquals ("#k7", true, uri
.IsDefaultPort
);
77 AssertEquals ("#k8", false, uri
.IsFile
);
78 AssertEquals ("#k9", false, uri
.IsLoopback
);
79 AssertEquals ("#k10", false, uri
.IsUnc
);
80 AssertEquals ("#k11", "/", uri
.LocalPath
);
81 AssertEquals ("#k12", "/?subject=uri", uri
.PathAndQuery
);
82 AssertEquals ("#k13", 80, uri
.Port
);
83 AssertEquals ("#k14", "?subject=uri", uri
.Query
);
84 AssertEquals ("#k15", "http", uri
.Scheme
);
85 AssertEquals ("#k16", false, uri
.UserEscaped
);
86 AssertEquals ("#k17", "", uri
.UserInfo
);
88 uri
= new Uri ("mailto:user:pwd@contoso.com?subject=uri");
89 AssertEquals ("#m1", "", uri
.AbsolutePath
);
90 AssertEquals ("#m2", "mailto:user:pwd@contoso.com?subject=uri", uri
.AbsoluteUri
);
91 AssertEquals ("#m3", "contoso.com", uri
.Authority
);
92 AssertEquals ("#m4", "", uri
.Fragment
);
93 AssertEquals ("#m5", "contoso.com", uri
.Host
);
94 AssertEquals ("#m6", UriHostNameType
.Dns
, uri
.HostNameType
);
95 AssertEquals ("#m7", true, uri
.IsDefaultPort
);
96 AssertEquals ("#m8", false, uri
.IsFile
);
97 AssertEquals ("#m9", false, uri
.IsLoopback
);
98 AssertEquals ("#m10", false, uri
.IsUnc
);
99 AssertEquals ("#m11", "", uri
.LocalPath
);
100 AssertEquals ("#m12", "?subject=uri", uri
.PathAndQuery
);
101 AssertEquals ("#m13", 25, uri
.Port
);
102 AssertEquals ("#m14", "?subject=uri", uri
.Query
);
103 AssertEquals ("#m15", "mailto", uri
.Scheme
);
104 AssertEquals ("#m16", false, uri
.UserEscaped
);
105 AssertEquals ("#m17", "user:pwd", uri
.UserInfo
);
107 uri
= new Uri (@"\\myserver\mydir\mysubdir\myfile.ext");
108 AssertEquals ("#n1", "/mydir/mysubdir/myfile.ext", uri
.AbsolutePath
);
109 AssertEquals ("#n2", "file://myserver/mydir/mysubdir/myfile.ext", uri
.AbsoluteUri
);
110 AssertEquals ("#n3", "myserver", uri
.Authority
);
111 AssertEquals ("#n4", "", uri
.Fragment
);
112 AssertEquals ("#n5", "myserver", uri
.Host
);
113 AssertEquals ("#n6", UriHostNameType
.Dns
, uri
.HostNameType
);
114 AssertEquals ("#n7", true, uri
.IsDefaultPort
);
115 AssertEquals ("#n8", true, uri
.IsFile
);
116 AssertEquals ("#n9", false, uri
.IsLoopback
);
117 AssertEquals ("#n10", true, uri
.IsUnc
);
120 AssertEquals ("#n11", @"\\myserver\mydir\mysubdir\myfile.ext", uri
.LocalPath
);
122 // myserver never could be the part of Unix path.
123 AssertEquals ("#n11", "/mydir/mysubdir/myfile.ext", uri
.LocalPath
);
125 AssertEquals ("#n12", "/mydir/mysubdir/myfile.ext", uri
.PathAndQuery
);
126 AssertEquals ("#n13", -1, uri
.Port
);
127 AssertEquals ("#n14", "", uri
.Query
);
128 AssertEquals ("#n15", "file", uri
.Scheme
);
129 AssertEquals ("#n16", false, uri
.UserEscaped
);
130 AssertEquals ("#n17", "", uri
.UserInfo
);
132 uri
= new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", true);
133 AssertEquals ("#rel1a", "http://www.contoso.com/Hello World.htm", uri
.AbsoluteUri
);
134 AssertEquals ("#rel1b", true, uri
.UserEscaped
);
135 uri
= new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", false);
136 AssertEquals ("#rel2a", "http://www.contoso.com/Hello%20World.htm", uri
.AbsoluteUri
);
137 AssertEquals ("#rel2b", false, uri
.UserEscaped
);
138 uri
= new Uri (new Uri("http://www.contoso.com"), "http://www.xxx.com/Hello World.htm", false);
139 AssertEquals ("#rel3", "http://www.xxx.com/Hello%20World.htm", uri
.AbsoluteUri
);
140 //uri = new Uri (new Uri("http://www.contoso.com"), "foo:8080/bar/Hello World.htm", false);
141 //AssertEquals ("#rel4", "foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri);
142 uri
= new Uri (new Uri("http://www.contoso.com"), "foo/bar/Hello World.htm?x=0:8", false);
143 AssertEquals ("#rel5", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
144 uri
= new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "foo/bar/Hello World.htm?x=0:8", false);
145 AssertEquals ("#rel6", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
146 uri
= new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "/foo/bar/Hello World.htm?x=0:8", false);
147 AssertEquals ("#rel7", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
148 uri
= new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../foo/bar/Hello World.htm?x=0:8", false);
149 AssertEquals ("#rel8", "http://www.contoso.com/xxx/foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
150 uri
= new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../../../foo/bar/Hello World.htm?x=0:8", false);
151 AssertEquals ("#rel9", "http://www.contoso.com/../foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
152 uri
= new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "./foo/bar/Hello World.htm?x=0:8", false);
153 AssertEquals ("#rel10", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri
.AbsoluteUri
);
156 uri
= new Uri (null, "http://www.contoso.com/index.htm", false);
158 } catch (NullReferenceException
) {
161 uri
= new Uri (new Uri("http://www.contoso.com"), null, false);
163 } catch (NullReferenceException
) {
166 uri
= new Uri (new Uri("http://www.contoso.com/foo/bar/index.html?x=0"), String
.Empty
, false);
167 AssertEquals("#22", "http://www.contoso.com/foo/bar/index.html?x=0", uri
.ToString ());
168 } catch (NullReferenceException
) {
171 uri
= new Uri (new Uri("http://www.xxx.com"), "?x=0");
172 AssertEquals ("#rel30", "http://www.xxx.com/?x=0", uri
.ToString());
173 uri
= new Uri (new Uri("http://www.xxx.com/index.htm"), "?x=0");
174 AssertEquals ("#rel31", "http://www.xxx.com/?x=0", uri
.ToString());
175 uri
= new Uri (new Uri("http://www.xxx.com/index.htm"), "#here");
176 AssertEquals ("#rel32", "http://www.xxx.com/index.htm#here", uri
.ToString());
179 // regression for bug #47573
181 public void RelativeCtor ()
183 Uri b
= new Uri ("http://a/b/c/d;p?q");
184 // AssertEquals ("g:h", "g:h", new Uri (b, "g:h").ToString ()); this causes crash under MS.NET 1.1
185 AssertEquals ("#1", "http://a/g", new Uri (b
, "/g").ToString ());
186 AssertEquals ("#2", "http://g/", new Uri (b
, "//g").ToString ());
187 AssertEquals ("#3", "http://a/b/c/?y", new Uri (b
, "?y").ToString ());
188 Assert ("#4", new Uri (b
, "#s").ToString ().EndsWith ("#s"));
190 Uri u
= new Uri (b
, "/g?q=r");
191 AssertEquals ("#5", "http://a/g?q=r", u
.ToString ());
192 AssertEquals ("#6", "?q=r", u
.Query
);
194 u
= new Uri (b
, "/g?q=r;. a");
195 AssertEquals ("#5", "http://a/g?q=r;. a", u
.ToString ());
196 AssertEquals ("#6", "?q=r;.%20a", u
.Query
);
200 [ExpectedException (typeof (UriFormatException
))]
201 public void InvalidScheme ()
207 public void ConstructorsRejectRelativePath ()
209 string [] reluris
= new string [] {
211 "thisdir/childdir/file",
214 string [] winRelUris
= new string [] {
218 for (int i
= 0; i
< reluris
.Length
; i
++) {
220 new Uri (reluris
[i
]);
221 Fail ("Should be failed: " + reluris
[i
]);
222 } catch (UriFormatException
) {
227 for (int i
= 0; i
< winRelUris
.Length
; i
++) {
229 new Uri (winRelUris
[i
]);
230 Fail ("Should be failed: " + winRelUris
[i
]);
231 } catch (UriFormatException
) {
239 public void LocalPath ()
241 Uri uri
= new Uri ("c:\\tmp\\hello.txt");
242 AssertEquals ("#1a", "file:///c:/tmp/hello.txt", uri
.ToString ());
243 AssertEquals ("#1b", "c:\\tmp\\hello.txt", uri
.LocalPath
);
244 AssertEquals ("#1c", "file", uri
.Scheme
);
245 AssertEquals ("#1d", "", uri
.Host
);
246 AssertEquals ("#1e", "c:/tmp/hello.txt", uri
.AbsolutePath
);
248 uri
= new Uri ("file:////////cygwin/tmp/hello.txt");
249 AssertEquals ("#3a", "file://cygwin/tmp/hello.txt", uri
.ToString ());
251 AssertEquals ("#3b win32", "\\\\cygwin\\tmp\\hello.txt", uri
.LocalPath
);
253 AssertEquals ("#3b *nix", "/tmp/hello.txt", uri
.LocalPath
);
254 AssertEquals ("#3c", "file", uri
.Scheme
);
255 AssertEquals ("#3d", "cygwin", uri
.Host
);
256 AssertEquals ("#3e", "/tmp/hello.txt", uri
.AbsolutePath
);
258 uri
= new Uri ("file://mymachine/cygwin/tmp/hello.txt");
259 AssertEquals ("#4a", "file://mymachine/cygwin/tmp/hello.txt", uri
.ToString ());
261 AssertEquals ("#4b win32", "\\\\mymachine\\cygwin\\tmp\\hello.txt", uri
.LocalPath
);
263 AssertEquals ("#4b *nix", "/cygwin/tmp/hello.txt", uri
.LocalPath
);
264 AssertEquals ("#4c", "file", uri
.Scheme
);
265 AssertEquals ("#4d", "mymachine", uri
.Host
);
266 AssertEquals ("#4e", "/cygwin/tmp/hello.txt", uri
.AbsolutePath
);
268 uri
= new Uri ("file://///c:/cygwin/tmp/hello.txt");
269 AssertEquals ("#5a", "file:///c:/cygwin/tmp/hello.txt", uri
.ToString ());
270 AssertEquals ("#5b", "c:\\cygwin\\tmp\\hello.txt", uri
.LocalPath
);
271 AssertEquals ("#5c", "file", uri
.Scheme
);
272 AssertEquals ("#5d", "", uri
.Host
);
273 AssertEquals ("#5e", "c:/cygwin/tmp/hello.txt", uri
.AbsolutePath
);
274 // Hmm, they should be regarded just as a host name, since all URIs are base on absolute path.
275 uri
= new Uri("file://one_file.txt");
276 AssertEquals("#6a", "file://one_file.txt", uri
.ToString());
278 AssertEquals("#6b", "\\\\one_file.txt", uri
.LocalPath
);
280 AssertEquals("#6b", "/", uri
.LocalPath
);
281 AssertEquals("#6c", "file", uri
.Scheme
);
282 AssertEquals("#6d", "one_file.txt", uri
.Host
);
283 AssertEquals("#6e", "", uri
.AbsolutePath
);
287 public void UnixPath () {
289 AssertEquals ("#6a", "file:///cygwin/tmp/hello.txt", new Uri ("/cygwin/tmp/hello.txt").ToString ());
295 Uri uri
= new Uri ("http://www.contoso.com");
296 Assert ("#1", !uri
.IsUnc
);
298 uri
= new Uri ("news:123456@contoso.com");
299 Assert ("#2", !uri
.IsUnc
);
301 uri
= new Uri ("file://server/filename.ext");
302 Assert ("#3", uri
.IsUnc
);
304 uri
= new Uri (@"\\server\share\filename.ext");
305 Assert ("#6", uri
.IsUnc
);
307 uri
= new Uri (@"a:\dir\filename.ext");
308 Assert ("#8", !uri
.IsUnc
);
312 // [ExpectedException (typeof (UriFormatException))]
313 public void UncFail ()
315 Uri uri
= new Uri ("/home/user/dir/filename.ext");
316 Assert ("#7", !uri
.IsUnc
);
320 [Ignore ("Known to fail under MS runtime")]
324 Uri uri
= new Uri ("file:/filename.ext");
325 Assert ("#4", uri
.IsUnc
);
326 } catch (UriFormatException
) {
327 Fail ("#5: known to fail with ms.net");
332 public void FromHex ()
334 AssertEquals ("#1", 0, Uri
.FromHex ('0'));
335 AssertEquals ("#2", 9, Uri
.FromHex ('9'));
336 AssertEquals ("#3", 10, Uri
.FromHex ('a'));
337 AssertEquals ("#4", 15, Uri
.FromHex ('f'));
338 AssertEquals ("#5", 10, Uri
.FromHex ('A'));
339 AssertEquals ("#6", 15, Uri
.FromHex ('F'));
343 } catch (ArgumentException
) {}
347 } catch (ArgumentException
) {}
351 } catch (ArgumentException
) {}
356 public UriEx (string s
) : base (s
)
360 public string UnescapeString (string s
)
365 public static string UnescapeString (string uri
, string target
)
367 return new UriEx (uri
).UnescapeString (target
);
372 public void Unescape ()
374 AssertEquals ("#1", "#", UriEx
.UnescapeString ("file://localhost/c#", "%23"));
375 AssertEquals ("#2", "c#", UriEx
.UnescapeString ("file://localhost/c#", "c%23"));
376 AssertEquals ("#3", "\xA9", UriEx
.UnescapeString ("file://localhost/c#", "%A9"));
377 AssertEquals ("#1", "#", UriEx
.UnescapeString ("http://localhost/c#", "%23"));
378 AssertEquals ("#2", "c#", UriEx
.UnescapeString ("http://localhost/c#", "c%23"));
379 AssertEquals ("#3", "\xA9", UriEx
.UnescapeString ("http://localhost/c#", "%A9"));
383 public void HexEscape ()
385 AssertEquals ("#1","%20", Uri
.HexEscape (' '));
386 AssertEquals ("#2","%A9", Uri
.HexEscape ((char) 0xa9));
387 AssertEquals ("#3","%41", Uri
.HexEscape ('A'));
389 Uri
.HexEscape ((char) 0x0369);
391 } catch (ArgumentOutOfRangeException
) {}
395 public void HexUnescape ()
398 AssertEquals ("#1", ' ', Uri
.HexUnescape ("%20", ref i
));
399 AssertEquals ("#2", 3, i
);
401 AssertEquals ("#3", (char) 0xa9, Uri
.HexUnescape ("test%a9test", ref i
));
402 AssertEquals ("#4", 7, i
);
403 AssertEquals ("#5", 't', Uri
.HexUnescape ("test%a9test", ref i
));
404 AssertEquals ("#6", 8, i
);
406 AssertEquals ("#5", '%', Uri
.HexUnescape ("test%a", ref i
));
407 AssertEquals ("#6", 5, i
);
408 AssertEquals ("#7", '%', Uri
.HexUnescape ("testx%xx", ref i
));
409 AssertEquals ("#8", 6, i
);
413 public void IsHexDigit ()
415 Assert ("#1", Uri
.IsHexDigit ('a'));
416 Assert ("#2", Uri
.IsHexDigit ('f'));
417 Assert ("#3", !Uri
.IsHexDigit ('g'));
418 Assert ("#4", Uri
.IsHexDigit ('0'));
419 Assert ("#5", Uri
.IsHexDigit ('9'));
420 Assert ("#6", Uri
.IsHexDigit ('A'));
421 Assert ("#7", Uri
.IsHexDigit ('F'));
422 Assert ("#8", !Uri
.IsHexDigit ('G'));
426 public void IsHexEncoding ()
428 Assert ("#1", Uri
.IsHexEncoding ("test%a9test", 4));
429 Assert ("#2", !Uri
.IsHexEncoding ("test%a9test", 3));
430 Assert ("#3", Uri
.IsHexEncoding ("test%a9", 4));
431 Assert ("#4", !Uri
.IsHexEncoding ("test%a", 4));
435 public void GetLeftPart ()
437 Uri uri
= new Uri ("http://www.contoso.com/index.htm#main");
438 AssertEquals ("#1", "http://", uri
.GetLeftPart (UriPartial
.Scheme
));
439 AssertEquals ("#2", "http://www.contoso.com", uri
.GetLeftPart (UriPartial
.Authority
));
440 AssertEquals ("#3", "http://www.contoso.com/index.htm", uri
.GetLeftPart (UriPartial
.Path
));
442 uri
= new Uri ("mailto:user@contoso.com?subject=uri");
443 AssertEquals ("#4", "mailto:", uri
.GetLeftPart (UriPartial
.Scheme
));
444 AssertEquals ("#5", "", uri
.GetLeftPart (UriPartial
.Authority
));
445 AssertEquals ("#6", "mailto:user@contoso.com", uri
.GetLeftPart (UriPartial
.Path
));
447 uri
= new Uri ("nntp://news.contoso.com/123456@contoso.com");
448 AssertEquals ("#7", "nntp://", uri
.GetLeftPart (UriPartial
.Scheme
));
449 AssertEquals ("#8", "nntp://news.contoso.com", uri
.GetLeftPart (UriPartial
.Authority
));
450 AssertEquals ("#9", "nntp://news.contoso.com/123456@contoso.com", uri
.GetLeftPart (UriPartial
.Path
));
452 uri
= new Uri ("news:123456@contoso.com");
453 AssertEquals ("#10", "news:", uri
.GetLeftPart (UriPartial
.Scheme
));
454 AssertEquals ("#11", "", uri
.GetLeftPart (UriPartial
.Authority
));
455 AssertEquals ("#12", "news:123456@contoso.com", uri
.GetLeftPart (UriPartial
.Path
));
457 uri
= new Uri ("file://server/filename.ext");
458 AssertEquals ("#13", "file://", uri
.GetLeftPart (UriPartial
.Scheme
));
459 AssertEquals ("#14", "file://server", uri
.GetLeftPart (UriPartial
.Authority
));
460 AssertEquals ("#15", "file://server/filename.ext", uri
.GetLeftPart (UriPartial
.Path
));
462 uri
= new Uri (@"\\server\share\filename.ext");
463 AssertEquals ("#20", "file://", uri
.GetLeftPart (UriPartial
.Scheme
));
464 AssertEquals ("#21", "file://server", uri
.GetLeftPart (UriPartial
.Authority
));
465 AssertEquals ("#22", "file://server/share/filename.ext", uri
.GetLeftPart (UriPartial
.Path
));
467 uri
= new Uri ("http://www.contoso.com:8080/index.htm#main");
468 AssertEquals ("#23", "http://", uri
.GetLeftPart (UriPartial
.Scheme
));
469 AssertEquals ("#24", "http://www.contoso.com:8080", uri
.GetLeftPart (UriPartial
.Authority
));
470 AssertEquals ("#25", "http://www.contoso.com:8080/index.htm", uri
.GetLeftPart (UriPartial
.Path
));
474 [Ignore("Known to fail under MS runtime")]
475 public void GetLeftPart2 ()
478 Uri uri
= new Uri ("file:/filename.ext");
479 AssertEquals ("#16", "file://", uri
.GetLeftPart (UriPartial
.Scheme
));
480 AssertEquals ("#17", "", uri
.GetLeftPart (UriPartial
.Authority
));
481 AssertEquals ("#18", "file:///filename.ext", uri
.GetLeftPart (UriPartial
.Path
));
482 } catch (UriFormatException
) {
483 Fail ("#19: known to fail with ms.net (it's their own example!)");
488 public void CheckHostName ()
490 AssertEquals ("#1", UriHostNameType
.Unknown
, Uri
.CheckHostName (null));
491 AssertEquals ("#2", UriHostNameType
.Unknown
, Uri
.CheckHostName (""));
492 AssertEquals ("#3", UriHostNameType
.Unknown
, Uri
.CheckHostName ("^&()~`!@"));
493 AssertEquals ("#4", UriHostNameType
.Dns
, Uri
.CheckHostName ("x"));
494 AssertEquals ("#5", UriHostNameType
.IPv4
, Uri
.CheckHostName ("1.2.3.4"));
495 AssertEquals ("#6", UriHostNameType
.IPv4
, Uri
.CheckHostName ("0001.002.03.4"));
496 AssertEquals ("#7", UriHostNameType
.Dns
, Uri
.CheckHostName ("0001.002.03.256"));
497 AssertEquals ("#8", UriHostNameType
.Dns
, Uri
.CheckHostName ("9001.002.03.4"));
498 AssertEquals ("#9", UriHostNameType
.Dns
, Uri
.CheckHostName ("www.contoso.com"));
499 AssertEquals ("#10", UriHostNameType
.Unknown
, Uri
.CheckHostName (".www.contoso.com"));
500 AssertEquals ("#11: known to fail with ms.net: this is not a valid domain address", UriHostNameType
.Unknown
, Uri
.CheckHostName ("www.contoso.com."));
501 AssertEquals ("#12", UriHostNameType
.Dns
, Uri
.CheckHostName ("www.con-toso.com"));
502 AssertEquals ("#13", UriHostNameType
.Dns
, Uri
.CheckHostName ("www.con_toso.com"));
503 AssertEquals ("#14", UriHostNameType
.Unknown
, Uri
.CheckHostName ("www.con,toso.com"));
506 AssertEquals ("#15", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11:22:33:44:55:66:77:88"));
507 AssertEquals ("#16", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11::33:44:55:66:77:88"));
508 AssertEquals ("#17", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::22:33:44:55:66:77:88"));
509 AssertEquals ("#18", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11:22:33:44:55:66:77::"));
510 AssertEquals ("#19", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11::88"));
511 AssertEquals ("#20", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11::77:88"));
512 AssertEquals ("#21", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11:22::88"));
513 AssertEquals ("#22", UriHostNameType
.IPv6
, Uri
.CheckHostName ("11::"));
514 AssertEquals ("#23", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::88"));
515 AssertEquals ("#24", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::1"));
516 AssertEquals ("#25", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::"));
517 AssertEquals ("#26", UriHostNameType
.IPv6
, Uri
.CheckHostName ("0:0:0:0:0:0:127.0.0.1"));
518 AssertEquals ("#27", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::127.0.0.1"));
519 AssertEquals ("#28", UriHostNameType
.IPv6
, Uri
.CheckHostName ("::ffFF:169.32.14.5"));
520 AssertEquals ("#29", UriHostNameType
.IPv6
, Uri
.CheckHostName ("2001:03A0::/35"));
521 AssertEquals ("#30", UriHostNameType
.IPv6
, Uri
.CheckHostName ("[2001:03A0::/35]"));
523 AssertEquals ("#31", UriHostNameType
.Unknown
, Uri
.CheckHostName ("2001::03A0::/35"));
524 AssertEquals ("#32", UriHostNameType
.Unknown
, Uri
.CheckHostName ("2001:03A0::/35a"));
525 AssertEquals ("#33 known to fail with ms.net: this is not a valid IPv6 address.", UriHostNameType
.Unknown
, Uri
.CheckHostName ("2001::03A0:1.2.3.4"));
526 AssertEquals ("#34", UriHostNameType
.Unknown
, Uri
.CheckHostName ("::ffff:123.256.155.43"));
527 AssertEquals ("#35", UriHostNameType
.Unknown
, Uri
.CheckHostName (":127.0.0.1"));
528 AssertEquals ("#36 known to fail with ms.net: this is not a valid IPv6 address.", UriHostNameType
.Unknown
, Uri
.CheckHostName (":11:22:33:44:55:66:77:88"));
529 AssertEquals ("#37", UriHostNameType
.Unknown
, Uri
.CheckHostName ("::11:22:33:44:55:66:77:88"));
530 AssertEquals ("#38", UriHostNameType
.Unknown
, Uri
.CheckHostName ("11:22:33:44:55:66:77:88::"));
531 AssertEquals ("#39", UriHostNameType
.Unknown
, Uri
.CheckHostName ("11:22:33:44:55:66:77:88:"));
532 AssertEquals ("#40", UriHostNameType
.Unknown
, Uri
.CheckHostName ("::acbde"));
533 AssertEquals ("#41", UriHostNameType
.Unknown
, Uri
.CheckHostName ("::abce:"));
534 AssertEquals ("#42", UriHostNameType
.Unknown
, Uri
.CheckHostName ("::abcg"));
535 AssertEquals ("#43", UriHostNameType
.Unknown
, Uri
.CheckHostName (":::"));
536 AssertEquals ("#44", UriHostNameType
.Unknown
, Uri
.CheckHostName (":"));
540 public void IsLoopback ()
542 Uri uri
= new Uri("http://loopback:8080");
543 AssertEquals ("#1", true, uri
.IsLoopback
);
544 uri
= new Uri("http://localhost:8080");
545 AssertEquals ("#2", true, uri
.IsLoopback
);
546 uri
= new Uri("http://127.0.0.1:8080");
547 AssertEquals ("#3", true, uri
.IsLoopback
);
548 uri
= new Uri("http://127.0.0.001:8080");
549 AssertEquals ("#4", true, uri
.IsLoopback
);
550 uri
= new Uri("http://[::1]");
551 AssertEquals ("#5", true, uri
.IsLoopback
);
552 uri
= new Uri("http://[::1]:8080");
553 AssertEquals ("#6", true, uri
.IsLoopback
);
554 uri
= new Uri("http://[::0001]:8080");
555 AssertEquals ("#7", true, uri
.IsLoopback
);
556 uri
= new Uri("http://[0:0:0:0::1]:8080");
557 AssertEquals ("#8", true, uri
.IsLoopback
);
558 uri
= new Uri("http://[0:0:0:0::127.0.0.1]:8080");
559 AssertEquals ("#9", true, uri
.IsLoopback
);
560 uri
= new Uri("http://[0:0:0:0::127.11.22.33]:8080");
561 AssertEquals ("#10: known to fail with ms.net", true, uri
.IsLoopback
);
562 uri
= new Uri("http://[::ffff:127.11.22.33]:8080");
563 AssertEquals ("#11: known to fail with ms.net", true, uri
.IsLoopback
);
564 uri
= new Uri("http://[::ff00:7f11:2233]:8080");
565 AssertEquals ("#12", false, uri
.IsLoopback
);
566 uri
= new Uri("http://[1:0:0:0::1]:8080");
567 AssertEquals ("#13", false, uri
.IsLoopback
);
571 public void Equals ()
573 Uri uri1
= new Uri ("http://www.contoso.com/index.htm#main");
574 Uri uri2
= new Uri ("http://www.contoso.com/index.htm#fragment");
575 Assert ("#1", uri1
.Equals (uri2
));
576 uri2
= new Uri ("http://www.contoso.com/index.htm?x=1");
577 Assert ("#2 known to fail with ms.net", !uri1
.Equals (uri2
));
578 Assert ("#3", !uri2
.Equals ("http://www.contoso.com/index.html?x=1"));
579 Assert ("#4: known to fail with ms.net", !uri1
.Equals ("http://www.contoso.com:8080/index.htm?x=1"));
583 public void TestEquals2 ()
585 Uri a
= new Uri ("http://www.go-mono.com");
586 Uri b
= new Uri ("http://www.go-mono.com");
588 AssertEquals ("#1", a
, b
);
590 a
= new Uri ("mailto:user:pwd@go-mono.com?subject=uri");
591 b
= new Uri ("MAILTO:USER:PWD@GO-MONO.COM?SUBJECT=URI");
593 AssertEquals ("#2", a
, b
);
595 a
= new Uri ("http://www.go-mono.com/ports/");
596 b
= new Uri ("http://www.go-mono.com/PORTS/");
598 Assert ("#3", !a
.Equals (b
));
602 public void GetHashCodeTest ()
604 Uri uri1
= new Uri ("http://www.contoso.com/index.htm#main");
605 Uri uri2
= new Uri ("http://www.contoso.com/index.htm#fragment");
606 AssertEquals ("#1", uri1
.GetHashCode (), uri2
.GetHashCode ());
607 uri2
= new Uri ("http://www.contoso.com/index.htm?x=1");
608 Assert ("#2", uri1
.GetHashCode () != uri2
.GetHashCode ());
609 uri2
= new Uri ("http://www.contoso.com:80/index.htm");
610 AssertEquals ("#3", uri1
.GetHashCode (), uri2
.GetHashCode ());
611 uri2
= new Uri ("http://www.contoso.com:8080/index.htm");
612 Assert ("#4", uri1
.GetHashCode () != uri2
.GetHashCode ());
616 public void MakeRelative ()
618 Uri uri1
= new Uri ("http://www.contoso.com/index.htm?x=2");
619 Uri uri2
= new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");
620 Uri uri3
= new Uri ("http://www.contoso.com/bar/foo/index.htm?y=1");
621 Uri uri4
= new Uri ("http://www.contoso.com/bar/foo2/index.htm?x=0");
622 Uri uri5
= new Uri ("https://www.contoso.com/bar/foo/index.htm?y=1");
623 Uri uri6
= new Uri ("http://www.contoso2.com/bar/foo/index.htm?x=0");
624 Uri uri7
= new Uri ("http://www.contoso2.com/bar/foo/foobar.htm?z=0&y=5");
625 Uri uri8
= new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9);
627 AssertEquals ("#1", "foo/bar/index.htm", uri1
.MakeRelative (uri2
));
628 AssertEquals ("#2", "../../index.htm", uri2
.MakeRelative (uri1
));
630 AssertEquals ("#3", "../../bar/foo/index.htm", uri2
.MakeRelative (uri3
));
631 AssertEquals ("#4", "../../foo/bar/index.htm", uri3
.MakeRelative (uri2
));
633 AssertEquals ("#5", "../foo2/index.htm", uri3
.MakeRelative (uri4
));
634 AssertEquals ("#6", "../foo/index.htm", uri4
.MakeRelative (uri3
));
636 AssertEquals ("#7", "https://www.contoso.com/bar/foo/index.htm?y=1",
637 uri4
.MakeRelative (uri5
));
639 AssertEquals ("#8", "http://www.contoso2.com/bar/foo/index.htm?x=0",
640 uri4
.MakeRelative (uri6
));
642 AssertEquals ("#9", "", uri6
.MakeRelative (uri6
));
643 AssertEquals ("#10", "foobar.htm", uri6
.MakeRelative (uri7
));
645 Uri uri10
= new Uri ("mailto:xxx@xxx.com");
646 Uri uri11
= new Uri ("mailto:xxx@xxx.com?subject=hola");
647 AssertEquals ("#11", "", uri10
.MakeRelative (uri11
));
649 Uri uri12
= new Uri ("mailto:xxx@mail.xxx.com?subject=hola");
650 AssertEquals ("#12", "mailto:xxx@mail.xxx.com?subject=hola", uri10
.MakeRelative (uri12
));
652 Uri uri13
= new Uri ("mailto:xxx@xxx.com/foo/bar");
653 AssertEquals ("#13", "/foo/bar", uri10
.MakeRelative (uri13
));
655 AssertEquals ("#14", "http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9, uri1
.MakeRelative (uri8
));
659 public void ToStringTest()
661 Uri uri
= new Uri ("dummy://xxx");
662 AssertEquals ("#1", "dummy://xxx/", uri
.ToString ());
666 public void CheckSchemeName ()
668 AssertEquals ("#01", false, Uri
.CheckSchemeName (null));
669 AssertEquals ("#02", false, Uri
.CheckSchemeName (""));
670 AssertEquals ("#03", true, Uri
.CheckSchemeName ("http"));
671 AssertEquals ("#04", true, Uri
.CheckSchemeName ("http-"));
672 AssertEquals ("#05", false, Uri
.CheckSchemeName ("6http-"));
673 AssertEquals ("#06", true, Uri
.CheckSchemeName ("http6-"));
674 AssertEquals ("#07", false, Uri
.CheckSchemeName ("http6,"));
675 AssertEquals ("#08", true, Uri
.CheckSchemeName ("http6."));
676 AssertEquals ("#09", false, Uri
.CheckSchemeName ("+http"));
677 AssertEquals ("#10", true, Uri
.CheckSchemeName ("htt+p6"));
678 // 0x00E1 -> ã
679 AssertEquals ("#11", true, Uri
.CheckSchemeName ("htt\u00E1+p6"));
683 [ExpectedException (typeof (UriFormatException
))]
684 public void NoHostname ()
686 Uri uri
= new Uri ("http://");
690 [ExpectedException (typeof (UriFormatException
))]
691 [Ignore ("MS throws an IndexOutOfRangeException. Bug?")]
692 public void NoHostname2 ()
694 Uri uri
= new Uri ("file://");
698 public void Segments1 ()
700 Uri uri
= new Uri ("http://localhost/");
701 string [] segments
= uri
.Segments
;
702 AssertEquals ("#01", 1, segments
.Length
);
703 AssertEquals ("#02", "/", segments
[0]);
708 public void Segments2 ()
710 Uri uri
= new Uri ("http://localhost/dir/dummypage.html");
711 string [] segments
= uri
.Segments
;
712 AssertEquals ("#01", 3, segments
.Length
);
713 AssertEquals ("#02", "/", segments
[0]);
714 AssertEquals ("#03", "dir/", segments
[1]);
715 AssertEquals ("#04", "dummypage.html", segments
[2]);
720 public void Segments3 ()
722 Uri uri
= new Uri ("http://localhost/dir/dummypage/");
723 string [] segments
= uri
.Segments
;
724 AssertEquals ("#01", 3, segments
.Length
);
725 AssertEquals ("#02", "/", segments
[0]);
726 AssertEquals ("#03", "dir/", segments
[1]);
727 AssertEquals ("#04", "dummypage/", segments
[2]);
732 public void Segments4 ()
734 Uri uri
= new Uri ("file:///c:/hello");
735 string [] segments
= uri
.Segments
;
736 AssertEquals ("#01", 3, segments
.Length
);
737 AssertEquals ("#02", "c:", segments
[0]);
738 AssertEquals ("#03", "/", segments
[1]);
739 AssertEquals ("#04", "hello", segments
[2]);
744 public void Segments5 ()
746 Uri uri
= new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9);
747 string [] segments
= uri
.Segments
;
748 AssertEquals ("#01", 4, segments
.Length
);
749 AssertEquals ("#02", "/", segments
[0]);
750 AssertEquals ("#03", "bar/", segments
[1]);
751 AssertEquals ("#04", "foo/", segments
[2]);
752 AssertEquals ("#05", "foobar.htm", segments
[3]);
756 [ExpectedException (typeof (UriFormatException
))]
757 public void EmptyScheme ()
763 public void InvalidPortsThatWorkWithMS ()
765 new Uri ("http://www.contoso.com:12345678/foo/bar/");
766 // UInt32.MaxValue gives port == -1 !!!
767 new Uri ("http://www.contoso.com:4294967295/foo/bar/");
768 // ((uint) Int32.MaxValue + (uint) 1) gives port == -2147483648 !!!
769 new Uri ("http://www.contoso.com:2147483648/foo/bar/");
774 public UriEx2 (string s
) : base (s
)
778 protected override void Parse ()
784 public void ParseOverride ()
786 // If this does not override base's Parse(), it will
787 // fail since this argument is not Absolute URI.
788 UriEx2 ex
= new UriEx2 ("readme.txt");
792 public void UnixLocalPath ()
794 // This works--the location is not part of the absolute path
795 string path
= "file://localhost/tmp/foo/bar";
796 Uri fileUri
= new Uri( path
);
797 AssertEquals (path
, "/tmp/foo/bar", fileUri
.AbsolutePath
);
799 // Empty path == localhost, in theory
800 path
= "file:///tmp/foo/bar";
801 fileUri
= new Uri( path
);
802 AssertEquals (path
, "/tmp/foo/bar", fileUri
.AbsolutePath
);
804 // Empty path == localhost, in theory
805 path
= "file:///c:/tmp/foo/bar";
806 fileUri
= new Uri( path
);
807 AssertEquals (path
, "c:/tmp/foo/bar", fileUri
.AbsolutePath
);
810 public static void Print (Uri uri
)
812 Console
.WriteLine ("ToString: " + uri
.ToString ());
814 Console
.WriteLine ("AbsolutePath: " + uri
.AbsolutePath
);
815 Console
.WriteLine ("AbsoluteUri: " + uri
.AbsoluteUri
);
816 Console
.WriteLine ("Authority: " + uri
.Authority
);
817 Console
.WriteLine ("Fragment: " + uri
.Fragment
);
818 Console
.WriteLine ("Host: " + uri
.Host
);
819 Console
.WriteLine ("HostNameType: " + uri
.HostNameType
);
820 Console
.WriteLine ("IsDefaultPort: " + uri
.IsDefaultPort
);
821 Console
.WriteLine ("IsFile: " + uri
.IsFile
);
822 Console
.WriteLine ("IsLoopback: " + uri
.IsLoopback
);
823 Console
.WriteLine ("IsUnc: " + uri
.IsUnc
);
824 Console
.WriteLine ("LocalPath: " + uri
.LocalPath
);
825 Console
.WriteLine ("PathAndQuery: " + uri
.PathAndQuery
);
826 Console
.WriteLine ("Port: " + uri
.Port
);
827 Console
.WriteLine ("Query: " + uri
.Query
);
828 Console
.WriteLine ("Scheme: " + uri
.Scheme
);
829 Console
.WriteLine ("UserEscaped: " + uri
.UserEscaped
);
830 Console
.WriteLine ("UserInfo: " + uri
.UserInfo
);
832 Console
.WriteLine ("Segments:");
833 string [] segments
= uri
.Segments
;
834 if (segments
== null)
835 Console
.WriteLine ("\tNo Segments");
837 for (int i
= 0; i
< segments
.Length
; i
++)
838 Console
.WriteLine ("\t" + segments
[i
]);
839 Console
.WriteLine ("");