2 // UriTest3.cs - Even more (2.0 specific) unit tests for System.Uri
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using NUnit.Framework;
35 namespace MonoTests.System {
38 public class UriTest3 {
40 private const string absolute = "http://www.mono-project.com/CAS";
41 private const string relative = "server.com/directory/";
44 public void Absolute_UriKind_Absolute ()
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");
53 public void Relative_UriKind_Relative ()
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
63 [ExpectedException (typeof (UriFormatException))]
64 public void Relative_UriKind_Absolute ()
66 new Uri (relative, UriKind.Absolute);
70 [ExpectedException (typeof (UriFormatException))]
71 public void Absolute_UriKind_Relative ()
73 new Uri (absolute, UriKind.Relative);
77 [Category ("NotWorking")]
78 public void TryCreate_String_UriKind_Uri ()
81 Assert.IsTrue (Uri.TryCreate (absolute, UriKind.Absolute, out uri), "absolute-Absolute");
82 Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-Absolute-AbsoluteUri");
84 Assert.IsTrue (Uri.TryCreate (absolute, UriKind.RelativeOrAbsolute, out uri), "absolute-RelativeOrAbsolute");
85 Assert.AreEqual (absolute, uri.AbsoluteUri, "absolute-RelativeOrAbsolute-AbsoluteUri");
87 Assert.IsFalse (Uri.TryCreate (absolute, UriKind.Relative, out uri), "absolute-Relative");
88 Assert.IsNull (uri, "absolute-Relative-uri");
90 Assert.IsFalse (Uri.TryCreate (relative, UriKind.Absolute, out uri), "relative-Absolute");
91 Assert.IsNull (uri, "relative-Relative-uri");
93 Assert.IsTrue (Uri.TryCreate (relative, UriKind.RelativeOrAbsolute, out uri), "relative-RelativeOrAbsolute");
94 Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
96 Assert.IsTrue (Uri.TryCreate (relative, UriKind.Relative, out uri), "relative-Relative");
97 Assert.AreEqual (relative, uri.OriginalString, "relative-RelativeOrAbsolute-OriginalString");
101 [Category ("NotWorking")]
102 public void TryCreate_Uri_String_Uri ()
104 Uri baseUri = new Uri (absolute);
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");
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");
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");
119 Assert.IsTrue (Uri.TryCreate (relativeUri, absolute, out uri), "relativeUri+absolute");
120 Assert.AreEqual (absolute, uri.OriginalString, "relativeUri+absolute+OriginalString");
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");
130 Assert.IsTrue (Uri.TryCreate (null, absolute, out uri), "null+absolute");
131 Assert.AreEqual (absolute, uri.OriginalString, "null+absolute+OriginalString");
135 [Category ("NotWorking")]
136 public void TryCreate_Uri_Uri_Uri ()
138 Uri baseUri = new Uri (absolute);
139 Uri relativeUri = new Uri (relative, UriKind.Relative);
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");
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");
150 Assert.IsFalse (Uri.TryCreate (relativeUri, relativeUri, out uri), "relativeUri+relativeUri");
151 Assert.IsNull (uri, "relativeUri+relativeUri+Uri");
153 Assert.IsFalse (Uri.TryCreate (relativeUri, baseUri, out uri), "relativeUri+baseUri");
154 Assert.IsNull (uri, "relativeUri+baseUri+Uri");
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");
164 [ExpectedException (typeof (NullReferenceException))]
165 public void TryCreate_Uri_UriNull_Uri ()
168 Uri.TryCreate (new Uri (absolute), (Uri) null, out uri);
172 public void IsWellFormedUriString_Null ()
174 Assert.IsFalse (Uri.IsWellFormedUriString (null, UriKind.Absolute), "null");
178 [Category ("NotWorking")]
179 public void IsWellFormedUriString_Http ()
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");
186 [ExpectedException (typeof (ArgumentException))]
187 public void IsWellFormedUriString_BadUriKind ()
189 Uri.IsWellFormedUriString ("http://www.go-mono.com/Main Page", (UriKind)Int32.MinValue);
193 public void Compare ()
197 Assert.AreEqual (0, Uri.Compare (u1, u2, UriComponents.AbsoluteUri, UriFormat.UriEscaped, StringComparison.CurrentCulture), "null-null");
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");
207 public void IsBaseOf ()
209 Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
210 Assert.IsTrue (http.IsBaseOf (http), "http-http");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
270 [ExpectedException (typeof (NullReferenceException))]
271 public void IsBaseOf_Null ()
273 Uri http = new Uri ("http://www.mono-project.com/Main_Page#FAQ?Edit");
274 http.IsBaseOf (null);
278 // LAMESPEC: see bug #78374.
279 public void OriginalStringRelative ()
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");
285 Uri a = new Uri ("http://www.mono-project.com:808/foo");
286 Uri b = new Uri (a, "../docs?queryyy#% %20%23%25bar");
289 // Assert.AreEqual ("http://www.mono-project.com:808/docs?queryyy#% %20%23%25bar", b.OriginalString, "#2");
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");
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");
302 public void UnescapeDataString ()
304 Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20folder/"));
305 Assert.AreEqual ("/new folder/", Uri.UnescapeDataString ("/new%20%66older/"));
306 Assert.AreEqual ("/new+folder/", Uri.UnescapeDataString ("/new+folder/"));