2003-03-19 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System / Test / System / UriTest.cs
1 //\r
2 // UriTest.cs - NUnit Test Cases for System.Uri\r
3 //\r
4 // Authors:\r
5 //   Lawrence Pit (loz@cable.a2000.nl)\r
6 //   Martin Willemoes Hansen (mwh@sysrq.dk)\r
7 //\r
8 // (C) 2003 Martin Willemoes Hansen\r
9 //\r
10 \r
11 using NUnit.Framework;\r
12 using System;\r
13 using System.IO;\r
14 \r
15 namespace MonoTests.System\r
16 {\r
17         [TestFixture]\r
18         public class UriTest\r
19         {\r
20                 protected bool isWin32 = false;\r
21 \r
22                 [SetUp]\r
23                 public void GetReady () \r
24                 {\r
25                         isWin32 = (Path.DirectorySeparatorChar == '\\');\r
26                 }\r
27 \r
28                 [Test]\r
29                 public void Constructors ()\r
30                 {\r
31                         Uri uri = null;\r
32                         \r
33                         /*\r
34                         uri = new Uri ("http://www.ximian.com/foo" + ((char) 0xa9) + "/bar/index.cgi?a=1&b=" + ((char) 0xa9) + "left#fragm?ent2");\r
35                         Print (uri);\r
36 \r
37                         uri = new Uri ("http://www.ximian.com/foo/xxx\"()-._;<=>@{|}~-,.`_^]\\[xx/" + ((char) 0xa9) + "/bar/index.cgi#fra+\">=@[gg]~gment2");\r
38                         Print (uri);\r
39 \r
40                         uri = new Uri("http://11.22.33.588:9090");\r
41                         Print (uri);\r
42 \r
43                         uri = new Uri("http://[11:22:33::88]:9090");\r
44                         Print (uri);\r
45                         \r
46                         uri = new Uri("http://[::127.11.22.33]:8080");\r
47                         Print (uri);\r
48                         \r
49                         uri = new Uri("http://[abcde::127.11.22.33]:8080");\r
50                         Print (uri);                    \r
51                         */\r
52                         \r
53                         /*\r
54                         uri = new Uri ("http://www.contoso.com:1234/foo/bar/");\r
55                         Print (uri);\r
56 \r
57                         uri = new Uri ("http://www.contoso.com:1234/foo/bar");\r
58                         Print (uri);\r
59                         \r
60                         uri = new Uri ("http://www.contoso.com:1234/");\r
61                         Print (uri);\r
62 \r
63                         uri = new Uri ("http://www.contoso.com:1234");\r
64                         Print (uri);\r
65                         */\r
66                         \r
67                         uri = new Uri ("http://contoso.com?subject=uri");\r
68                         Assertion.AssertEquals ("#k1", "/", uri.AbsolutePath);\r
69                         Assertion.AssertEquals ("#k2", "http://contoso.com/?subject=uri", uri.AbsoluteUri);\r
70                         Assertion.AssertEquals ("#k3", "contoso.com", uri.Authority);\r
71                         Assertion.AssertEquals ("#k4", "", uri.Fragment);\r
72                         Assertion.AssertEquals ("#k5", "contoso.com", uri.Host);\r
73                         Assertion.AssertEquals ("#k6", UriHostNameType.Dns, uri.HostNameType);\r
74                         Assertion.AssertEquals ("#k7", true, uri.IsDefaultPort);\r
75                         Assertion.AssertEquals ("#k8", false, uri.IsFile);\r
76                         Assertion.AssertEquals ("#k9", false, uri.IsLoopback);\r
77                         Assertion.AssertEquals ("#k10", false, uri.IsUnc);\r
78                         Assertion.AssertEquals ("#k11", "/", uri.LocalPath);\r
79                         Assertion.AssertEquals ("#k12", "/?subject=uri", uri.PathAndQuery);\r
80                         Assertion.AssertEquals ("#k13", 80, uri.Port);\r
81                         Assertion.AssertEquals ("#k14", "?subject=uri", uri.Query);\r
82                         Assertion.AssertEquals ("#k15", "http", uri.Scheme);\r
83                         Assertion.AssertEquals ("#k16", false, uri.UserEscaped);\r
84                         Assertion.AssertEquals ("#k17", "", uri.UserInfo);\r
85 \r
86                         uri = new Uri ("mailto:user:pwd@contoso.com?subject=uri");\r
87                         Assertion.AssertEquals ("#m1", "", uri.AbsolutePath);\r
88                         Assertion.AssertEquals ("#m2", "mailto:user:pwd@contoso.com?subject=uri", uri.AbsoluteUri);\r
89                         Assertion.AssertEquals ("#m3", "contoso.com", uri.Authority);\r
90                         Assertion.AssertEquals ("#m4", "", uri.Fragment);\r
91                         Assertion.AssertEquals ("#m5", "contoso.com", uri.Host);\r
92                         Assertion.AssertEquals ("#m6", UriHostNameType.Dns, uri.HostNameType);\r
93                         Assertion.AssertEquals ("#m7", true, uri.IsDefaultPort);\r
94                         Assertion.AssertEquals ("#m8", false, uri.IsFile);\r
95                         Assertion.AssertEquals ("#m9", false, uri.IsLoopback);\r
96                         Assertion.AssertEquals ("#m10", false, uri.IsUnc);\r
97                         Assertion.AssertEquals ("#m11", "", uri.LocalPath);\r
98                         Assertion.AssertEquals ("#m12", "?subject=uri", uri.PathAndQuery);\r
99                         Assertion.AssertEquals ("#m13", 25, uri.Port);\r
100                         Assertion.AssertEquals ("#m14", "?subject=uri", uri.Query);\r
101                         Assertion.AssertEquals ("#m15", "mailto", uri.Scheme);\r
102                         Assertion.AssertEquals ("#m16", false, uri.UserEscaped);\r
103                         Assertion.AssertEquals ("#m17", "user:pwd", uri.UserInfo);\r
104                         \r
105                         uri = new Uri (@"\\myserver\mydir\mysubdir\myfile.ext");\r
106                         Assertion.AssertEquals ("#n1", "/mydir/mysubdir/myfile.ext", uri.AbsolutePath);\r
107                         Assertion.AssertEquals ("#n2", "file://myserver/mydir/mysubdir/myfile.ext", uri.AbsoluteUri);\r
108                         Assertion.AssertEquals ("#n3", "myserver", uri.Authority);\r
109                         Assertion.AssertEquals ("#n4", "", uri.Fragment);\r
110                         Assertion.AssertEquals ("#n5", "myserver", uri.Host);\r
111                         Assertion.AssertEquals ("#n6", UriHostNameType.Dns, uri.HostNameType);\r
112                         Assertion.AssertEquals ("#n7", true, uri.IsDefaultPort);\r
113                         Assertion.AssertEquals ("#n8", true, uri.IsFile);\r
114                         Assertion.AssertEquals ("#n9", false, uri.IsLoopback);\r
115                         Assertion.AssertEquals ("#n10", true, uri.IsUnc);\r
116 \r
117                         if (isWin32)\r
118                                 Assertion.AssertEquals ("#n11", @"\\myserver\mydir\mysubdir\myfile.ext", uri.LocalPath);\r
119                         else\r
120                                 Assertion.AssertEquals ("#n11", "/myserver/mydir/mysubdir/myfile.ext", uri.LocalPath);\r
121 \r
122                         Assertion.AssertEquals ("#n12", "/mydir/mysubdir/myfile.ext", uri.PathAndQuery);\r
123                         Assertion.AssertEquals ("#n13", -1, uri.Port);\r
124                         Assertion.AssertEquals ("#n14", "", uri.Query);\r
125                         Assertion.AssertEquals ("#n15", "file", uri.Scheme);\r
126                         Assertion.AssertEquals ("#n16", false, uri.UserEscaped);\r
127                         Assertion.AssertEquals ("#n17", "", uri.UserInfo);\r
128                         \r
129                         uri = new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", true);\r
130                         Assertion.AssertEquals ("#rel1a", "http://www.contoso.com/Hello World.htm", uri.AbsoluteUri);\r
131                         Assertion.AssertEquals ("#rel1b", true, uri.UserEscaped);\r
132                         uri = new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", false);\r
133                         Assertion.AssertEquals ("#rel2a", "http://www.contoso.com/Hello%20World.htm", uri.AbsoluteUri);\r
134                         Assertion.AssertEquals ("#rel2b", false, uri.UserEscaped);\r
135                         uri = new Uri (new Uri("http://www.contoso.com"), "http://www.xxx.com/Hello World.htm", false);\r
136                         Assertion.AssertEquals ("#rel3", "http://www.xxx.com/Hello%20World.htm", uri.AbsoluteUri);\r
137                         //uri = new Uri (new Uri("http://www.contoso.com"), "foo:8080/bar/Hello World.htm", false);\r
138                         //Assertion.AssertEquals ("#rel4", "foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri);\r
139                         uri = new Uri (new Uri("http://www.contoso.com"), "foo/bar/Hello World.htm?x=0:8", false);\r
140                         Assertion.AssertEquals ("#rel5", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
141                         uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "foo/bar/Hello World.htm?x=0:8", false);\r
142                         Assertion.AssertEquals ("#rel6", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
143                         uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "/foo/bar/Hello World.htm?x=0:8", false);\r
144                         Assertion.AssertEquals ("#rel7", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
145                         uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../foo/bar/Hello World.htm?x=0:8", false);\r
146                         Assertion.AssertEquals ("#rel8", "http://www.contoso.com/xxx/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
147                         uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../../../foo/bar/Hello World.htm?x=0:8", false);\r
148                         Assertion.AssertEquals ("#rel9", "http://www.contoso.com/../foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
149                         uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "./foo/bar/Hello World.htm?x=0:8", false);\r
150                         Assertion.AssertEquals ("#rel10", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri);\r
151 \r
152                         try {\r
153                                 uri = new Uri (null, "http://www.contoso.com/index.htm", false);\r
154                                 Assertion.Fail ("#rel20");\r
155                         } catch (NullReferenceException) {\r
156                         }\r
157                         try {\r
158                                 uri = new Uri (new Uri("http://www.contoso.com"), null, false);\r
159                                 Assertion.Fail ("#rel21");\r
160                         } catch (NullReferenceException) {\r
161                         }\r
162                         try {\r
163                                 uri = new Uri (new Uri("http://www.contoso.com/foo/bar/index.html?x=0"), String.Empty, false);\r
164                                 Assertion.AssertEquals("#22", "http://www.contoso.com/foo/bar/index.html?x=0", uri.ToString ());\r
165                         } catch (NullReferenceException) {\r
166                         }                       \r
167                         try {\r
168                                 uri = new Uri ("http://www.contoso.com:12345678/foo/bar/");\r
169                                 Assertion.Fail ("#30: known to fail with ms.net, should have failed because of invalid port");\r
170                         } catch (UriFormatException) { }\r
171                 }\r
172                 \r
173                 [Test]\r
174                 public void LocalPath ()\r
175                 {\r
176                         Uri uri = new Uri ("c:\\tmp\\hello.txt");\r
177                         Assertion.AssertEquals ("#1a", "file:///c:/tmp/hello.txt", uri.ToString ());\r
178                         Assertion.AssertEquals ("#1b", "c:\\tmp\\hello.txt", uri.LocalPath);\r
179                         Assertion.AssertEquals ("#1c", "file", uri.Scheme);\r
180                         Assertion.AssertEquals ("#1d", "", uri.Host);\r
181                         Assertion.AssertEquals ("#1e", "c:/tmp/hello.txt", uri.AbsolutePath);\r
182                                         \r
183                         uri = new Uri ("file:////////cygwin/tmp/hello.txt");\r
184                         Assertion.AssertEquals ("#3a", "file://cygwin/tmp/hello.txt", uri.ToString ());\r
185                         if (isWin32)\r
186                                 Assertion.AssertEquals ("#3b win32", "\\\\cygwin\\tmp\\hello.txt", uri.LocalPath);\r
187                         else\r
188                                 Assertion.AssertEquals ("#3b *nix", "/cygwin/tmp/hello.txt", uri.LocalPath);\r
189                         Assertion.AssertEquals ("#3c", "file", uri.Scheme);\r
190                         Assertion.AssertEquals ("#3d", "cygwin", uri.Host);\r
191                         Assertion.AssertEquals ("#3e", "/tmp/hello.txt", uri.AbsolutePath);\r
192 \r
193                         uri = new Uri ("file://mymachine/cygwin/tmp/hello.txt");\r
194                         Assertion.AssertEquals ("#4a", "file://mymachine/cygwin/tmp/hello.txt", uri.ToString ());\r
195                         if (isWin32)\r
196                                 Assertion.AssertEquals ("#4b win32", "\\\\mymachine\\cygwin\\tmp\\hello.txt", uri.LocalPath);\r
197                         else\r
198                                 Assertion.AssertEquals ("#4b *nix", "/mymachine/cygwin/tmp/hello.txt", uri.LocalPath);\r
199                         Assertion.AssertEquals ("#4c", "file", uri.Scheme);\r
200                         Assertion.AssertEquals ("#4d", "mymachine", uri.Host);\r
201                         Assertion.AssertEquals ("#4e", "/cygwin/tmp/hello.txt", uri.AbsolutePath);\r
202                         \r
203                         uri = new Uri ("file://///c:/cygwin/tmp/hello.txt");\r
204                         Assertion.AssertEquals ("#5a", "file:///c:/cygwin/tmp/hello.txt", uri.ToString ());\r
205                         Assertion.AssertEquals ("#5b", "c:\\cygwin\\tmp\\hello.txt", uri.LocalPath);\r
206                         Assertion.AssertEquals ("#5c", "file", uri.Scheme);\r
207                         Assertion.AssertEquals ("#5d", "", uri.Host);\r
208                         Assertion.AssertEquals ("#5e", "c:/cygwin/tmp/hello.txt", uri.AbsolutePath);                    \r
209                 }\r
210                 \r
211                 [Test]\r
212                 public void Unc ()\r
213                 {\r
214                         Uri uri = new Uri ("http://www.contoso.com");\r
215                         Assertion.Assert ("#1", !uri.IsUnc);\r
216                         \r
217                         uri = new Uri ("news:123456@contoso.com");\r
218                         Assertion.Assert ("#2", !uri.IsUnc);\r
219 \r
220                         uri = new Uri ("file://server/filename.ext");\r
221                         Assertion.Assert ("#3", uri.IsUnc);\r
222 \r
223                         uri = new Uri (@"\\server\share\filename.ext");                 \r
224                         Assertion.Assert ("#6", uri.IsUnc);\r
225                 }\r
226 \r
227                 [Test]\r
228                 [Ignore ("Known to fail under MS runtime")]\r
229                 public void Unc2 ()\r
230                 {\r
231                         try {\r
232                                 Uri uri = new Uri ("file:/filename.ext");\r
233                                 Assertion.Assert ("#4", uri.IsUnc);\r
234                         } catch (UriFormatException) {\r
235                                 Assertion.Fail ("#5: known to fail with ms.net");\r
236                         }                       \r
237                 }\r
238                 \r
239                 [Test]\r
240                 public void FromHex () \r
241                 {\r
242                         Assertion.AssertEquals ("#1", 0, Uri.FromHex ('0'));\r
243                         Assertion.AssertEquals ("#2", 9, Uri.FromHex ('9'));\r
244                         Assertion.AssertEquals ("#3", 10, Uri.FromHex ('a'));\r
245                         Assertion.AssertEquals ("#4", 15, Uri.FromHex ('f'));\r
246                         Assertion.AssertEquals ("#5", 10, Uri.FromHex ('A'));\r
247                         Assertion.AssertEquals ("#6", 15, Uri.FromHex ('F'));\r
248                         try {\r
249                                 Uri.FromHex ('G');\r
250                                 Assertion.Fail ("#7");\r
251                         } catch (ArgumentException) {}\r
252                         try {\r
253                                 Uri.FromHex (' ');\r
254                                 Assertion.Fail ("#8");\r
255                         } catch (ArgumentException) {}\r
256                         try {\r
257                                 Uri.FromHex ('%');\r
258                                 Assertion.Fail ("#8");\r
259                         } catch (ArgumentException) {}\r
260                 }\r
261 \r
262                 [Test]\r
263                 public void HexEscape () \r
264                 {\r
265                         Assertion.AssertEquals ("#1","%20", Uri.HexEscape (' ')); \r
266                         Assertion.AssertEquals ("#2","%A9", Uri.HexEscape ((char) 0xa9)); \r
267                         Assertion.AssertEquals ("#3","%41", Uri.HexEscape ('A')); \r
268                         try {\r
269                                 Uri.HexEscape ((char) 0x0369);\r
270                                 Assertion.Fail ("#4");\r
271                         } catch (ArgumentOutOfRangeException) {}\r
272                 }\r
273 \r
274                 [Test]\r
275                 public void HexUnescape () \r
276                 {\r
277                         int i = 0;\r
278                         Assertion.AssertEquals ("#1", ' ', Uri.HexUnescape ("%20", ref i));\r
279                         Assertion.AssertEquals ("#2", 3, i);\r
280                         i = 4;\r
281                         Assertion.AssertEquals ("#3", (char) 0xa9, Uri.HexUnescape ("test%a9test", ref i));\r
282                         Assertion.AssertEquals ("#4", 7, i);\r
283                         Assertion.AssertEquals ("#5", 't', Uri.HexUnescape ("test%a9test", ref i));\r
284                         Assertion.AssertEquals ("#6", 8, i);\r
285                         i = 4;\r
286                         Assertion.AssertEquals ("#5", '%', Uri.HexUnescape ("test%a", ref i));\r
287                         Assertion.AssertEquals ("#6", 5, i);\r
288                         Assertion.AssertEquals ("#7", '%', Uri.HexUnescape ("testx%xx", ref i));\r
289                         Assertion.AssertEquals ("#8", 6, i);\r
290                 }\r
291 \r
292                 [Test]\r
293                 public void IsHexDigit () \r
294                 {\r
295                         Assertion.Assert ("#1", Uri.IsHexDigit ('a'));  \r
296                         Assertion.Assert ("#2", Uri.IsHexDigit ('f'));\r
297                         Assertion.Assert ("#3", !Uri.IsHexDigit ('g'));\r
298                         Assertion.Assert ("#4", Uri.IsHexDigit ('0'));\r
299                         Assertion.Assert ("#5", Uri.IsHexDigit ('9'));\r
300                         Assertion.Assert ("#6", Uri.IsHexDigit ('A'));\r
301                         Assertion.Assert ("#7", Uri.IsHexDigit ('F'));\r
302                         Assertion.Assert ("#8", !Uri.IsHexDigit ('G'));\r
303                 }\r
304 \r
305                 [Test]\r
306                 public void IsHexEncoding () \r
307                 {\r
308                         Assertion.Assert ("#1", Uri.IsHexEncoding ("test%a9test", 4));\r
309                         Assertion.Assert ("#2", !Uri.IsHexEncoding ("test%a9test", 3));\r
310                         Assertion.Assert ("#3", Uri.IsHexEncoding ("test%a9", 4));\r
311                         Assertion.Assert ("#4", !Uri.IsHexEncoding ("test%a", 4));\r
312                 }\r
313                 \r
314                 [Test]\r
315                 public void GetLeftPart ()\r
316                 {\r
317                         Uri uri = new Uri ("http://www.contoso.com/index.htm#main");\r
318                         Assertion.AssertEquals ("#1", "http://", uri.GetLeftPart (UriPartial.Scheme));\r
319                         Assertion.AssertEquals ("#2", "http://www.contoso.com", uri.GetLeftPart (UriPartial.Authority));\r
320                         Assertion.AssertEquals ("#3", "http://www.contoso.com/index.htm", uri.GetLeftPart (UriPartial.Path));\r
321                         \r
322                         uri = new Uri ("mailto:user@contoso.com?subject=uri");\r
323                         Assertion.AssertEquals ("#4", "mailto:", uri.GetLeftPart (UriPartial.Scheme));\r
324                         Assertion.AssertEquals ("#5", "", uri.GetLeftPart (UriPartial.Authority));\r
325                         Assertion.AssertEquals ("#6", "mailto:user@contoso.com", uri.GetLeftPart (UriPartial.Path));\r
326 \r
327                         uri = new Uri ("nntp://news.contoso.com/123456@contoso.com");\r
328                         Assertion.AssertEquals ("#7", "nntp://", uri.GetLeftPart (UriPartial.Scheme));\r
329                         Assertion.AssertEquals ("#8", "nntp://news.contoso.com", uri.GetLeftPart (UriPartial.Authority));\r
330                         Assertion.AssertEquals ("#9", "nntp://news.contoso.com/123456@contoso.com", uri.GetLeftPart (UriPartial.Path));                 \r
331                         \r
332                         uri = new Uri ("news:123456@contoso.com");\r
333                         Assertion.AssertEquals ("#10", "news:", uri.GetLeftPart (UriPartial.Scheme));\r
334                         Assertion.AssertEquals ("#11", "", uri.GetLeftPart (UriPartial.Authority));\r
335                         Assertion.AssertEquals ("#12", "news:123456@contoso.com", uri.GetLeftPart (UriPartial.Path));                   \r
336 \r
337                         uri = new Uri ("file://server/filename.ext");\r
338                         Assertion.AssertEquals ("#13", "file://", uri.GetLeftPart (UriPartial.Scheme));\r
339                         Assertion.AssertEquals ("#14", "file://server", uri.GetLeftPart (UriPartial.Authority));\r
340                         Assertion.AssertEquals ("#15", "file://server/filename.ext", uri.GetLeftPart (UriPartial.Path));                        \r
341 \r
342                         uri = new Uri (@"\\server\share\filename.ext");\r
343                         Assertion.AssertEquals ("#20", "file://", uri.GetLeftPart (UriPartial.Scheme));\r
344                         Assertion.AssertEquals ("#21", "file://server", uri.GetLeftPart (UriPartial.Authority));\r
345                         Assertion.AssertEquals ("#22", "file://server/share/filename.ext", uri.GetLeftPart (UriPartial.Path));\r
346                         \r
347                         uri = new Uri ("http://www.contoso.com:8080/index.htm#main");\r
348                         Assertion.AssertEquals ("#23", "http://", uri.GetLeftPart (UriPartial.Scheme));\r
349                         Assertion.AssertEquals ("#24", "http://www.contoso.com:8080", uri.GetLeftPart (UriPartial.Authority));\r
350                         Assertion.AssertEquals ("#25", "http://www.contoso.com:8080/index.htm", uri.GetLeftPart (UriPartial.Path));\r
351                 }\r
352                 \r
353                 [Test]\r
354                 [Ignore("Known to fail under MS runtime")]\r
355                 public void GetLeftPart2 ()\r
356                 {\r
357                         try {\r
358                                 Uri uri = new Uri ("file:/filename.ext");\r
359                                 Assertion.AssertEquals ("#16", "file://", uri.GetLeftPart (UriPartial.Scheme));\r
360                                 Assertion.AssertEquals ("#17", "", uri.GetLeftPart (UriPartial.Authority));\r
361                                 Assertion.AssertEquals ("#18", "file:///filename.ext", uri.GetLeftPart (UriPartial.Path));                      \r
362                         } catch (UriFormatException) {\r
363                                 Assertion.Fail ("#19: known to fail with ms.net (it's their own example!)");\r
364                         }                       \r
365                 }\r
366 \r
367                 [Test]\r
368                 public void CheckHostName ()\r
369                 {\r
370                         Assertion.AssertEquals ("#1", UriHostNameType.Unknown, Uri.CheckHostName (null));\r
371                         Assertion.AssertEquals ("#2", UriHostNameType.Unknown, Uri.CheckHostName (""));\r
372                         Assertion.AssertEquals ("#3", UriHostNameType.Unknown, Uri.CheckHostName ("^&()~`!@"));\r
373                         Assertion.AssertEquals ("#4", UriHostNameType.Dns, Uri.CheckHostName ("x"));\r
374                         Assertion.AssertEquals ("#5", UriHostNameType.IPv4, Uri.CheckHostName ("1.2.3.4"));\r
375                         Assertion.AssertEquals ("#6", UriHostNameType.IPv4, Uri.CheckHostName ("0001.002.03.4"));\r
376                         Assertion.AssertEquals ("#7", UriHostNameType.Dns, Uri.CheckHostName ("0001.002.03.256"));\r
377                         Assertion.AssertEquals ("#8", UriHostNameType.Dns, Uri.CheckHostName ("9001.002.03.4"));\r
378                         Assertion.AssertEquals ("#9", UriHostNameType.Dns, Uri.CheckHostName ("www.contoso.com"));\r
379                         Assertion.AssertEquals ("#10", UriHostNameType.Unknown, Uri.CheckHostName (".www.contoso.com"));\r
380                         Assertion.AssertEquals ("#11: known to fail with ms.net: this is not a valid domain address", UriHostNameType.Unknown, Uri.CheckHostName ("www.contoso.com.")); \r
381                         Assertion.AssertEquals ("#12", UriHostNameType.Dns, Uri.CheckHostName ("www.con-toso.com"));    \r
382                         Assertion.AssertEquals ("#13", UriHostNameType.Dns, Uri.CheckHostName ("www.con_toso.com"));    \r
383                         Assertion.AssertEquals ("#14", UriHostNameType.Unknown, Uri.CheckHostName ("www.con,toso.com"));        \r
384                         \r
385                         // test IPv6\r
386                         Assertion.AssertEquals ("#15", UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77:88"));\r
387                         Assertion.AssertEquals ("#16", UriHostNameType.IPv6, Uri.CheckHostName ("11::33:44:55:66:77:88"));\r
388                         Assertion.AssertEquals ("#17", UriHostNameType.IPv6, Uri.CheckHostName ("::22:33:44:55:66:77:88"));\r
389                         Assertion.AssertEquals ("#18", UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77::"));\r
390                         Assertion.AssertEquals ("#19", UriHostNameType.IPv6, Uri.CheckHostName ("11::88"));\r
391                         Assertion.AssertEquals ("#20", UriHostNameType.IPv6, Uri.CheckHostName ("11::77:88"));\r
392                         Assertion.AssertEquals ("#21", UriHostNameType.IPv6, Uri.CheckHostName ("11:22::88"));\r
393                         Assertion.AssertEquals ("#22", UriHostNameType.IPv6, Uri.CheckHostName ("11::"));\r
394                         Assertion.AssertEquals ("#23", UriHostNameType.IPv6, Uri.CheckHostName ("::88"));\r
395                         Assertion.AssertEquals ("#24", UriHostNameType.IPv6, Uri.CheckHostName ("::1"));\r
396                         Assertion.AssertEquals ("#25", UriHostNameType.IPv6, Uri.CheckHostName ("::"));\r
397                         Assertion.AssertEquals ("#26", UriHostNameType.IPv6, Uri.CheckHostName ("0:0:0:0:0:0:127.0.0.1"));\r
398                         Assertion.AssertEquals ("#27", UriHostNameType.IPv6, Uri.CheckHostName ("::127.0.0.1"));\r
399                         Assertion.AssertEquals ("#28", UriHostNameType.IPv6, Uri.CheckHostName ("::ffFF:169.32.14.5"));\r
400                         Assertion.AssertEquals ("#29", UriHostNameType.IPv6, Uri.CheckHostName ("2001:03A0::/35"));\r
401                         Assertion.AssertEquals ("#30", UriHostNameType.IPv6, Uri.CheckHostName ("[2001:03A0::/35]"));\r
402 \r
403                         Assertion.AssertEquals ("#31", UriHostNameType.Unknown, Uri.CheckHostName ("2001::03A0::/35"));\r
404                         Assertion.AssertEquals ("#32", UriHostNameType.Unknown, Uri.CheckHostName ("2001:03A0::/35a"));\r
405                         Assertion.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"));\r
406                         Assertion.AssertEquals ("#34", UriHostNameType.Unknown, Uri.CheckHostName ("::ffff:123.256.155.43"));\r
407                         Assertion.AssertEquals ("#35", UriHostNameType.Unknown, Uri.CheckHostName (":127.0.0.1"));\r
408                         Assertion.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"));\r
409                         Assertion.AssertEquals ("#37", UriHostNameType.Unknown, Uri.CheckHostName ("::11:22:33:44:55:66:77:88"));\r
410                         Assertion.AssertEquals ("#38", UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88::"));\r
411                         Assertion.AssertEquals ("#39", UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88:"));\r
412                         Assertion.AssertEquals ("#40", UriHostNameType.Unknown, Uri.CheckHostName ("::acbde"));\r
413                         Assertion.AssertEquals ("#41", UriHostNameType.Unknown, Uri.CheckHostName ("::abce:"));\r
414                         Assertion.AssertEquals ("#42", UriHostNameType.Unknown, Uri.CheckHostName ("::abcg"));\r
415                         Assertion.AssertEquals ("#43", UriHostNameType.Unknown, Uri.CheckHostName (":::"));\r
416                         Assertion.AssertEquals ("#44", UriHostNameType.Unknown, Uri.CheckHostName (":"));\r
417                 }\r
418                 \r
419                 [Test]\r
420                 public void IsLoopback ()\r
421                 {\r
422                         Uri uri = new Uri("http://loopback:8080");\r
423                         Assertion.AssertEquals ("#1", true, uri.IsLoopback);\r
424                         uri = new Uri("http://localhost:8080");\r
425                         Assertion.AssertEquals ("#2", true, uri.IsLoopback);\r
426                         uri = new Uri("http://127.0.0.1:8080");\r
427                         Assertion.AssertEquals ("#3", true, uri.IsLoopback);\r
428                         uri = new Uri("http://127.0.0.001:8080");\r
429                         Assertion.AssertEquals ("#4", true, uri.IsLoopback);\r
430                         uri = new Uri("http://[::1]");\r
431                         Assertion.AssertEquals ("#5", true, uri.IsLoopback);\r
432                         uri = new Uri("http://[::1]:8080");\r
433                         Assertion.AssertEquals ("#6", true, uri.IsLoopback);\r
434                         uri = new Uri("http://[::0001]:8080");\r
435                         Assertion.AssertEquals ("#7", true, uri.IsLoopback);\r
436                         uri = new Uri("http://[0:0:0:0::1]:8080");\r
437                         Assertion.AssertEquals ("#8", true, uri.IsLoopback);\r
438                         uri = new Uri("http://[0:0:0:0::127.0.0.1]:8080");\r
439                         Assertion.AssertEquals ("#9", true, uri.IsLoopback);\r
440                         uri = new Uri("http://[0:0:0:0::127.11.22.33]:8080");\r
441                         Assertion.AssertEquals ("#10: known to fail with ms.net", true, uri.IsLoopback);\r
442                         uri = new Uri("http://[::ffff:127.11.22.33]:8080");\r
443                         Assertion.AssertEquals ("#11: known to fail with ms.net", true, uri.IsLoopback);\r
444                         uri = new Uri("http://[::ff00:7f11:2233]:8080");\r
445                         Assertion.AssertEquals ("#12", false, uri.IsLoopback);\r
446                         uri = new Uri("http://[1:0:0:0::1]:8080");\r
447                         Assertion.AssertEquals ("#13", false, uri.IsLoopback);\r
448                 }\r
449                 \r
450                 [Test]\r
451                 public void Equals ()\r
452                 {\r
453                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm#main");\r
454                         Uri uri2 = new Uri ("http://www.contoso.com/index.htm#fragment");\r
455                         Assertion.Assert ("#1", uri1.Equals (uri2));\r
456                         uri2 = new Uri ("http://www.contoso.com/index.htm?x=1");\r
457                         Assertion.Assert ("#2 known to fail with ms.net", !uri1.Equals (uri2));\r
458                         Assertion.Assert ("#3", !uri2.Equals ("http://www.contoso.com/index.html?x=1"));\r
459                         Assertion.Assert ("#4: known to fail with ms.net", !uri1.Equals ("http://www.contoso.com:8080/index.htm?x=1"));\r
460                 }\r
461                 \r
462                 [Test]\r
463                 public void GetHashCodeTest () \r
464                 {\r
465                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm#main");\r
466                         Uri uri2 = new Uri ("http://www.contoso.com/index.htm#fragment");\r
467                         Assertion.AssertEquals ("#1", uri1.GetHashCode (), uri2.GetHashCode ());\r
468                         uri2 = new Uri ("http://www.contoso.com/index.htm?x=1");\r
469                         Assertion.Assert ("#2", uri1.GetHashCode () != uri2.GetHashCode ());\r
470                         uri2 = new Uri ("http://www.contoso.com:80/index.htm");\r
471                         Assertion.AssertEquals ("#3", uri1.GetHashCode (), uri2.GetHashCode ());                        \r
472                         uri2 = new Uri ("http://www.contoso.com:8080/index.htm");\r
473                         Assertion.Assert ("#4", uri1.GetHashCode () != uri2.GetHashCode ());                    \r
474                 }\r
475                 \r
476                 [Test]\r
477                 public void MakeRelative ()\r
478                 {\r
479                         Uri uri1 = new Uri ("http://www.contoso.com/index.htm?x=2");\r
480                         Uri uri2 = new Uri ("http://www.contoso.com/foo/bar/index.htm#fragment");\r
481                         Uri uri3 = new Uri ("http://www.contoso.com/bar/foo/index.htm?y=1");\r
482                         Uri uri4 = new Uri ("http://www.contoso.com/bar/foo2/index.htm?x=0");\r
483                         Uri uri5 = new Uri ("https://www.contoso.com/bar/foo/index.htm?y=1");\r
484                         Uri uri6 = new Uri ("http://www.contoso2.com/bar/foo/index.htm?x=0");\r
485                         Uri uri7 = new Uri ("http://www.contoso2.com/bar/foo/foobar.htm?z=0&y=5");\r
486                         Uri uri8 = new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9);\r
487 \r
488                         Assertion.AssertEquals ("#1", "foo/bar/index.htm", uri1.MakeRelative (uri2));\r
489                         Assertion.AssertEquals ("#2", "../../index.htm", uri2.MakeRelative (uri1));\r
490                         \r
491                         Assertion.AssertEquals ("#3", "../../bar/foo/index.htm", uri2.MakeRelative (uri3));\r
492                         Assertion.AssertEquals ("#4", "../../foo/bar/index.htm", uri3.MakeRelative (uri2));                     \r
493 \r
494                         Assertion.AssertEquals ("#5", "../foo2/index.htm", uri3.MakeRelative (uri4));\r
495                         Assertion.AssertEquals ("#6", "../foo/index.htm", uri4.MakeRelative (uri3));\r
496                         \r
497                         Assertion.AssertEquals ("#7", "https://www.contoso.com/bar/foo/index.htm?y=1", \r
498                                             uri4.MakeRelative (uri5));\r
499 \r
500                         Assertion.AssertEquals ("#8", "http://www.contoso2.com/bar/foo/index.htm?x=0", \r
501                                             uri4.MakeRelative (uri6));\r
502 \r
503                         Assertion.AssertEquals ("#9", "", uri6.MakeRelative (uri6));\r
504                         Assertion.AssertEquals ("#10", "foobar.htm", uri6.MakeRelative (uri7));\r
505                         \r
506                         Uri uri10 = new Uri ("mailto:xxx@xxx.com");\r
507                         Uri uri11 = new Uri ("mailto:xxx@xxx.com?subject=hola");\r
508                         Assertion.AssertEquals ("#11", "", uri10.MakeRelative (uri11));\r
509                         \r
510                         Uri uri12 = new Uri ("mailto:xxx@mail.xxx.com?subject=hola");\r
511                         Assertion.AssertEquals ("#12", "mailto:xxx@mail.xxx.com?subject=hola", uri10.MakeRelative (uri12));\r
512                                                 \r
513                         Uri uri13 = new Uri ("mailto:xxx@xxx.com/foo/bar");\r
514                         Assertion.AssertEquals ("#13", "/foo/bar", uri10.MakeRelative (uri13));\r
515                         \r
516                         Assertion.AssertEquals ("#14", "http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9, uri1.MakeRelative (uri8));\r
517                 }\r
518                 \r
519                 [Test]\r
520                 public void ToStringTest()\r
521                 {                       \r
522                         Uri uri = new Uri ("dummy://xxx");\r
523                         Assertion.AssertEquals ("#1", "dummy://xxx/", uri.ToString ());\r
524                 }\r
525 \r
526                 [Test]\r
527                 public void CheckSchemeName ()\r
528                 {\r
529                         Assertion.AssertEquals ("#01", false, Uri.CheckSchemeName (null));\r
530                         Assertion.AssertEquals ("#02", false, Uri.CheckSchemeName (""));\r
531                         Assertion.AssertEquals ("#03", true, Uri.CheckSchemeName ("http"));\r
532                         Assertion.AssertEquals ("#04", true, Uri.CheckSchemeName ("http-"));\r
533                         Assertion.AssertEquals ("#05", false, Uri.CheckSchemeName ("6http-"));\r
534                         Assertion.AssertEquals ("#06", true, Uri.CheckSchemeName ("http6-"));\r
535                         Assertion.AssertEquals ("#07", false, Uri.CheckSchemeName ("http6,"));\r
536                         Assertion.AssertEquals ("#08", true, Uri.CheckSchemeName ("http6."));\r
537                         Assertion.AssertEquals ("#09", false, Uri.CheckSchemeName ("+http"));\r
538                         Assertion.AssertEquals ("#10", true, Uri.CheckSchemeName ("htt+p6"));\r
539                         // 0x00E1 -> &atilde;\r
540                         Assertion.AssertEquals ("#11", true, Uri.CheckSchemeName ("htt\u00E1+p6"));\r
541                 }\r
542 \r
543                 [Test]\r
544                 [ExpectedException (typeof (UriFormatException))]\r
545                 public void NoHostname ()\r
546                 {\r
547                         Uri uri = new Uri ("http://");\r
548                 }\r
549 \r
550                 [Test]\r
551                 [ExpectedException (typeof (UriFormatException))]\r
552                 [Ignore ("MS throws an IndexOutOfRangeException. Bug?")]\r
553                 public void NoHostname2 ()\r
554                 {\r
555                         Uri uri = new Uri ("file://");\r
556                 }\r
557 \r
558                 [Test]\r
559                 public void Segments1 ()\r
560                 {\r
561                         Uri uri = new Uri ("http://localhost/");\r
562                         string [] segments = uri.Segments;\r
563                         Assertion.AssertEquals ("#01", 1, segments.Length);\r
564                         Assertion.AssertEquals ("#02", "/", segments [0]);\r
565                         \r
566                 }\r
567 \r
568                 [Test]\r
569                 public void Segments2 ()\r
570                 {\r
571                         Uri uri = new Uri ("http://localhost/dir/dummypage.html");\r
572                         string [] segments = uri.Segments;\r
573                         Assertion.AssertEquals ("#01", 3, segments.Length);\r
574                         Assertion.AssertEquals ("#02", "/", segments [0]);\r
575                         Assertion.AssertEquals ("#03", "dir/", segments [1]);\r
576                         Assertion.AssertEquals ("#04", "dummypage.html", segments [2]);\r
577                         \r
578                 }\r
579 \r
580                 [Test]\r
581                 public void Segments3 ()\r
582                 {\r
583                         Uri uri = new Uri ("http://localhost/dir/dummypage/");\r
584                         string [] segments = uri.Segments;\r
585                         Assertion.AssertEquals ("#01", 3, segments.Length);\r
586                         Assertion.AssertEquals ("#02", "/", segments [0]);\r
587                         Assertion.AssertEquals ("#03", "dir/", segments [1]);\r
588                         Assertion.AssertEquals ("#04", "dummypage/", segments [2]);\r
589                         \r
590                 }\r
591 \r
592                 [Test]\r
593                 public void Segments4 ()\r
594                 {\r
595                         Uri uri = new Uri ("file:///c:/hello");\r
596                         string [] segments = uri.Segments;\r
597                         Assertion.AssertEquals ("#01", 3, segments.Length);\r
598                         Assertion.AssertEquals ("#02", "c:", segments [0]);\r
599                         Assertion.AssertEquals ("#03", "/", segments [1]);\r
600                         Assertion.AssertEquals ("#04", "hello", segments [2]);\r
601                         \r
602                 }\r
603 \r
604                 public static void Print (Uri uri)\r
605                 {\r
606                         Console.WriteLine ("ToString: " + uri.ToString ());     \r
607 \r
608                         Console.WriteLine ("AbsolutePath: " + uri.AbsolutePath);\r
609                         Console.WriteLine ("AbsoluteUri: " + uri.AbsoluteUri);\r
610                         Console.WriteLine ("Authority: " + uri.Authority);\r
611                         Console.WriteLine ("Fragment: " + uri.Fragment);\r
612                         Console.WriteLine ("Host: " + uri.Host);\r
613                         Console.WriteLine ("HostNameType: " + uri.HostNameType);\r
614                         Console.WriteLine ("IsDefaultPort: " + uri.IsDefaultPort);\r
615                         Console.WriteLine ("IsFile: " + uri.IsFile);\r
616                         Console.WriteLine ("IsLoopback: " + uri.IsLoopback);\r
617                         Console.WriteLine ("IsUnc: " + uri.IsUnc);\r
618                         Console.WriteLine ("LocalPath: " + uri.LocalPath);\r
619                         Console.WriteLine ("PathAndQuery: " + uri.PathAndQuery);\r
620                         Console.WriteLine ("Port: " + uri.Port);\r
621                         Console.WriteLine ("Query: " + uri.Query);\r
622                         Console.WriteLine ("Scheme: " + uri.Scheme);\r
623                         Console.WriteLine ("UserEscaped: " + uri.UserEscaped);\r
624                         Console.WriteLine ("UserInfo: " + uri.UserInfo);\r
625 \r
626                         Console.WriteLine ("Segments:");\r
627                         string [] segments = uri.Segments;\r
628                         if (segments == null) \r
629                                 Console.WriteLine ("\tNo Segments");\r
630                         else \r
631                                 for (int i = 0; i < segments.Length; i++) \r
632                                         Console.WriteLine ("\t" + segments[i]);                                 \r
633                         Console.WriteLine ("");\r
634                 }\r
635 \r
636         }\r
637 }\r
638 \r