New test.
[mono.git] / mcs / class / System / Test / System / UriTest3.cs
1 //
2 // UriTest3.cs - Even more (2.0 specific) unit tests for System.Uri
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30
31 using NUnit.Framework;
32
33 using System;
34
35 namespace MonoTests.System {
36
37         [TestFixture]
38         public class UriTest3 {
39
40                 private const string absolute = "http://www.mono-project.com/CAS";
41                 private const string relative = "server.com/directory/";
42
43                 [Test]
44                 public void Absolute_UriKind_Absolute ()
45                 {
46                         Uri uri = new Uri (absolute, UriKind.Absolute);
47                         Assert.AreEqual ("www.mono-project.com", uri.DnsSafeHost, "DnsSafeHost");
48                         Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri");
49                         Assert.AreEqual (absolute, uri.OriginalString, "OriginalString");
50                 }
51
52                 [Test]
53                 public void Relative_UriKind_Relative ()
54                 {
55                         Uri uri = new Uri (relative, UriKind.Relative);
56                         Assert.IsFalse (uri.IsAbsoluteUri, "IsAbsoluteUri");
57                         Assert.AreEqual (relative, uri.OriginalString, "OriginalString");
58                         Assert.IsFalse (uri.UserEscaped, "UserEscaped");
59                         // using any other property would throw an InvalidOperationException
60                 }
61
62                 [Test]
63                 [ExpectedException (typeof (UriFormatException))]
64                 public void Relative_UriKind_Absolute ()
65                 {
66                         new Uri (relative, UriKind.Absolute);
67                 }
68
69                 [Test]
70                 [ExpectedException (typeof (UriFormatException))]
71                 public void Absolute_UriKind_Relative ()
72                 {
73                         new Uri (absolute, UriKind.Relative);
74                 }
75
76                 [Test]
77                 [Category ("NotWorking")]
78                 public void TryCreate_String_UriKind_Uri ()
79                 {
80                         Uri uri = null;
81                         Assert.IsTrue (Uri.TryCreate (absolute, UriKind.Absolute, out uri), "absolute-Absolute");
82                         Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-Absolute-AbsoluteUri");
83
84                         Assert.IsTrue (Uri.TryCreate (absolute, UriKind.RelativeOrAbsolute, out uri), "absolute-RelativeOrAbsolute");
85                         Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-RelativeOrAbsolute-AbsoluteUri");
86
87                         Assert.IsFalse (Uri.TryCreate (absolute, UriKind.Relative, out uri), "absolute-Relative");
88                         Assert.IsNull (uri, "absolute-Relative-uri");
89
90                         Assert.IsFalse (Uri.TryCreate (relative, UriKind.Absolute, out uri), "relative-Absolute");
91                         Assert.IsNull (uri, "relative-Relative-uri");
92
93                         Assert.IsTrue (Uri.TryCreate (relative, UriKind.RelativeOrAbsolute, out uri), "relative-RelativeOrAbsolute");
94                         Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
95
96                         Assert.IsTrue (Uri.TryCreate (relative, UriKind.Relative, out uri), "relative-Relative");
97                         Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
98                 }
99
100                 [Test]
101                 [Category ("NotWorking")]
102                 public void TryCreate_Uri_String_Uri ()
103                 {
104                         Uri baseUri = new Uri (absolute);
105                         Uri uri = null;
106
107                         Assert.IsTrue (Uri.TryCreate (baseUri, relative, out uri), "baseUri+relative");
108                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relative+AbsoluteUri");
109                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relative+OriginalString");
110
111                         Assert.IsTrue (Uri.TryCreate (baseUri, absolute, out uri), "baseUri+absolute");
112                         Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+absolute+AbsoluteUri");
113                         Assert.AreEqual (absolute, uri.OriginalString, "baseUri+absolute+OriginalString");
114
115                         Uri relativeUri = new Uri (relative, UriKind.Relative);
116                         Assert.IsFalse (Uri.TryCreate (relativeUri, relative, out uri), "relativeUri+relative");
117                         Assert.IsNull (uri, "relativeUri+relative+Uri");
118
119                         Assert.IsTrue (Uri.TryCreate (relativeUri, absolute, out uri), "relativeUri+absolute");
120                         Assert.AreEqual (absolute, uri.OriginalString, "relativeUri+absolute+OriginalString");
121
122                         string n = null;
123                         Assert.IsFalse (Uri.TryCreate (baseUri, n, out uri), "baseUri+null");
124                         Assert.IsNull (uri, "baseUri+null+Uri");
125                         Assert.IsFalse (Uri.TryCreate (relativeUri, n, out uri), "relativeUri+null");
126                         Assert.IsNull (uri, "relativeUri+null+Uri");
127                         Assert.IsFalse (Uri.TryCreate (null, relative, out uri), "null+relative");
128                         Assert.IsNull (uri, "null+relative+Uri");
129
130                         Assert.IsTrue (Uri.TryCreate (null, absolute, out uri), "null+absolute");
131                         Assert.AreEqual (absolute, uri.OriginalString, "null+absolute+OriginalString");
132                 }
133
134                 [Test]
135                 [Category ("NotWorking")]
136                 public void TryCreate_Uri_Uri_Uri ()
137                 {
138                         Uri baseUri = new Uri (absolute);
139                         Uri relativeUri = new Uri (relative, UriKind.Relative);
140                         Uri uri = null;
141
142                         Assert.IsTrue (Uri.TryCreate (baseUri, relativeUri, out uri), "baseUri+relativeUri");
143                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.AbsoluteUri, "baseUri+relativeUri+AbsoluteUri");
144                         Assert.AreEqual ("http://www.mono-project.com/server.com/directory/", uri.OriginalString, "baseUri+relativeUri+OriginalString");
145
146                         Assert.IsTrue (Uri.TryCreate (baseUri, baseUri, out uri), "baseUri+baseUri");
147                         Assert.AreEqual (absolute, uri.AbsoluteUri, "baseUri+baseUri+AbsoluteUri");
148                         Assert.AreEqual (absolute, uri.OriginalString, "baseUri+baseUri+OriginalString");
149
150                         Assert.IsFalse (Uri.TryCreate (relativeUri, relativeUri, out uri), "relativeUri+relativeUri");
151                         Assert.IsNull (uri, "relativeUri+relativeUri+Uri");
152
153                         Assert.IsFalse (Uri.TryCreate (relativeUri, baseUri, out uri), "relativeUri+baseUri");
154                         Assert.IsNull (uri, "relativeUri+baseUri+Uri");
155
156                         // a null relativeUri throws a NullReferenceException (see next test)
157                         Assert.IsFalse (Uri.TryCreate (null, relativeUri, out uri), "null+relativeUri");
158                         Assert.IsNull (uri, "null+relativeUri+Uri");
159                         Assert.IsFalse (Uri.TryCreate (null, baseUri, out uri), "null+baseUri");
160                         Assert.IsNull (uri, "null+baseUri+Uri");
161                 }
162
163                 [Test]
164                 [ExpectedException (typeof (NullReferenceException))]
165                 public void TryCreate_Uri_UriNull_Uri ()
166                 {
167                         Uri uri = null;
168                         Uri.TryCreate (new Uri (absolute), (Uri) null, out uri);
169                 }
170
171                 [Test]
172                 public void IsWellFormedUriString_Null ()
173                 {
174                         Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
175                 }
176
177                 [Test]
178                 [Category ("NotWorking")]
179                 public void IsWellFormedUriString_Http ()
180                 {
181                         Assert.IsFalse (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", UriKind.Absolute), "http/space");
182                         Assert.IsTrue (Uri.IsWellFormedUriString ("http://www.go-mono.com/Main%20Page", UriKind.Absolute), "http/%20");
183                 }
184
185                 [Test]
186                 [ExpectedException (typeof (ArgumentException))]
187                 public void IsWellFormedUriString_BadUriKind ()
188                 {
189                         Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", (UriKind)Int32.MinValue);
190                 }
191
192                 [Test]
193                 public void Compare ()
194                 {
195                         Uri u1 = null;
196                         Uri u2 = null;
197                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null-null");
198
199                         u1 = new Uri ("http://www.go-mono.com/Main Page");
200                         u2 = new Uri ("http://www.go-mono.com/Main%20Page");
201                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.CurrentCulture), "http/space-http/%20-unescaped");
202                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "http/space-http/%20-escaped");
203                         Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.CurrentCulture), "http/space-http/%20-safe");
204                 }
205
206                 [Test]
207                 public void IsBaseOf ()
208                 {
209                         Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
210                         Assert.IsTrue (http.IsBaseOf (http), "http-http");
211
212                         Uri u = new Uri ("http://www.mono-project.com/Main_Page#FAQ");
213                         Assert.IsTrue (u.IsBaseOf (http), "http-1a");
214                         Assert.IsTrue (http.IsBaseOf (u), "http-1b");
215
216                         u = new Uri ("http://www.mono-project.com/Main_Page");
217                         Assert.IsTrue (u.IsBaseOf (http), "http-2a");
218                         Assert.IsTrue (http.IsBaseOf (u), "http-2b");
219
220                         u = new Uri ("http://www.mono-project.com/");
221                         Assert.IsTrue (u.IsBaseOf (http), "http-3a");
222                         Assert.IsTrue (http.IsBaseOf (u), "http-3b");
223
224                         u = new Uri ("http://www.mono-project.com/Main_Page/");
225                         Assert.IsFalse (u.IsBaseOf (http), "http-4a");
226                         Assert.IsTrue (http.IsBaseOf (u), "http-4b");
227
228                         // docs says the UserInfo isn't evaluated, but...
229                         u = new Uri ("http://username:password@www.mono-project.com/Main_Page");
230                         Assert.IsFalse (u.IsBaseOf (http), "http-5a");
231                         Assert.IsFalse (http.IsBaseOf (u), "http-5b");
232
233                         // scheme case sensitive ? no
234                         u = new Uri ("HTTP://www.mono-project.com/Main_Page");
235                         Assert.IsTrue (u.IsBaseOf (http), "http-6a");
236                         Assert.IsTrue (http.IsBaseOf (u), "http-6b");
237
238                         // host case sensitive ? no
239                         u = new Uri ("http://www.Mono-Project.com/Main_Page");
240                         Assert.IsTrue (u.IsBaseOf (http), "http-7a");
241                         Assert.IsTrue (http.IsBaseOf (u), "http-7b");
242
243                         // path case sensitive ? no
244                         u = new Uri ("http://www.Mono-Project.com/MAIN_Page");
245                         Assert.IsTrue (u.IsBaseOf (http), "http-8a");
246                         Assert.IsTrue (http.IsBaseOf (u), "http-8b");
247
248                         // different scheme
249                         u = new Uri ("ftp://www.mono-project.com/Main_Page");
250                         Assert.IsFalse (u.IsBaseOf (http), "http-9a");
251                         Assert.IsFalse (http.IsBaseOf (u), "http-9b");
252
253                         // different host
254                         u = new Uri ("http://www.go-mono.com/Main_Page");
255                         Assert.IsFalse (u.IsBaseOf (http), "http-10a");
256                         Assert.IsFalse (http.IsBaseOf (u), "http-10b");
257
258                         // different port
259                         u = new Uri ("http://www.mono-project.com:8080/");
260                         Assert.IsFalse (u.IsBaseOf (http), "http-11a");
261                         Assert.IsFalse (http.IsBaseOf (u), "http-11b");
262
263                         // specify default port
264                         u = new Uri ("http://www.mono-project.com:80/");
265                         Assert.IsTrue (u.IsBaseOf (http), "http-12a");
266                         Assert.IsTrue (http.IsBaseOf (u), "http-12b");
267                 }
268
269                 [Test]
270                 [ExpectedException (typeof (NullReferenceException))]
271                 public void IsBaseOf_Null ()
272                 {
273                         Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
274                         http.IsBaseOf (null);
275                 }
276
277                 [Test]
278                 // LAMESPEC: see bug #78374.
279                 public void OriginalStringRelative ()
280                 {
281                         Uri k1 = new Uri ("http://www.mono-project.com");
282                         Uri k2 = new Uri (k1, "docs");
283                         Assert.AreEqual ("http://www.mono-project.com/docs", k2.OriginalString, "#1");
284
285                         Uri a = new Uri ("http://www.mono-project.com:808/foo");
286                         Uri b = new Uri (a, "../docs?queryyy#% %20%23%25bar");
287
288                         // it won't work.
289                         // Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
290
291                         Uri c = new Uri ("http://www.mono-project.com:909");
292                         Uri d = new Uri (c, "http://www.mono-project.com:606/docs");
293                         Assert.AreEqual ("http://www.mono-project.com:606/docs", d.OriginalString, "#3");
294
295                         Uri e = new Uri ("http://www.mono-project.com:303/foo");
296                         Uri f = new Uri (e, "?query");
297                         // it doesn't work. MS.NET also returns incorrect URI: ..303/?query
298                         // Assert.AreEqual ("http://www.mono-project.com:303/foo?query", e.OriginalString, "#4");
299                 }
300         }
301 }
302
303 #endif