Merge branch 'master' of github.com:mono/mono
[mono.git] / mcs / class / System / Test / System / UriBuilderTest.cs
1 //
2 // UriBuilderTest.cs - NUnit Test Cases for System.UriBuilder
3 //
4 // Authors:
5 //   Lawrence Pit (loz@cable.a2000.nl)
6 //   Martin Willemoes Hansen (mwh@sysrq.dk)
7 //
8 // (C) 2003 Martin Willemoes Hansen
9 //
10
11 using NUnit.Framework;
12 using System;
13
14 namespace MonoTests.System
15 {
16         [TestFixture]
17         public class UriBuilderTest
18         {
19                 private UriBuilder b, b2, b3;
20                 
21                 [SetUp]
22                 public void GetReady()
23                 {
24                         b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html");
25                 }
26
27                 [Test] // ctor ()
28                 public void Constructor_Empty ()
29                 {
30                         b = new UriBuilder ();
31                         Assert.AreEqual ("http", b.Scheme, "#1");
32 #if NET_2_0
33                         Assert.AreEqual ("localhost", b.Host, "#2");
34 #else
35                         Assert.AreEqual ("loopback", b.Host, "#3");
36 #endif
37                         Assert.AreEqual (-1, b.Port, "#4");
38                         Assert.AreEqual (string.Empty, b.Query, "#5");
39                         Assert.AreEqual (string.Empty, b.Fragment, "#6");
40                 }
41
42                 [Test] // ctor (string)
43                 public void Constructor1 ()
44                 {
45                         b = new UriBuilder ("http://www.ximian.com:8001#test?name=50");
46                         Assert.AreEqual ("#test?name=50", b.Fragment, "#A1");
47                         Assert.AreEqual ("www.ximian.com", b.Host, "#A2");
48                         Assert.AreEqual (string.Empty, b.Password, "#A3");
49                         Assert.AreEqual ("/", b.Path, "#A4");
50                         Assert.AreEqual (8001, b.Port, "#A5");
51                         Assert.AreEqual (string.Empty, b.Query, "#A5");
52                         Assert.AreEqual ("http", b.Scheme, "#A6");
53                         Assert.AreEqual ("http://www.ximian.com:8001/#test?name=50", b.Uri.ToString (), "#A7");
54                         Assert.AreEqual (string.Empty, b.UserName, "#A8");
55
56                         b = new UriBuilder ("http://www.ximian.com?name=50#test");
57                         Assert.AreEqual ("#test", b.Fragment, "#B1");
58                         Assert.AreEqual ("www.ximian.com", b.Host, "#B2");
59                         Assert.AreEqual (string.Empty, b.Password, "#B3");
60                         Assert.AreEqual ("/", b.Path, "#B4");
61                         Assert.AreEqual (80, b.Port, "#B5");
62                         Assert.AreEqual ("?name=50", b.Query, "#B5");
63                         Assert.AreEqual ("http", b.Scheme, "#B6");
64 #if NET_2_0
65                         // our 1.0 behavior matches that of .NET 2.0
66                         Assert.AreEqual ("http://www.ximian.com/?name=50#test", b.Uri.ToString (), "#B7");
67 #endif
68                         Assert.AreEqual (string.Empty, b.UserName, "#B8");
69                 }
70
71                 [Test] // ctor (string)
72 #if ONLY_1_1
73                 [Category ("NotWorking")] // we always throw an ArgumentNullException
74 #endif
75                 public void Constructor1_Uri_Null ()
76                 {
77                         try {
78                                 new UriBuilder ((string) null);
79                                 Assert.Fail ("#1");
80 #if NET_2_0
81                         } catch (ArgumentNullException ex) {
82                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
83                                 Assert.IsNull (ex.InnerException, "#3");
84                                 Assert.IsNotNull (ex.Message, "#4");
85                                 Assert.IsNotNull (ex.ParamName, "#5");
86                                 Assert.AreEqual ("uriString", ex.ParamName, "#6");
87                         }
88 #else
89                         } catch (NullReferenceException) {
90                         }
91 #endif
92                 }
93
94                 [Test] // ctor (Uri)
95                 [ExpectedException (typeof (NullReferenceException))]
96                 public void Constructor2_Uri_Null ()
97                 {
98                         new UriBuilder ((Uri) null);
99                 }
100
101                 [Test]
102                 public void Constructor_5 ()
103                 {
104                         b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "#extras");
105                 }
106
107                 [Test]
108                 [ExpectedException (typeof (ArgumentException))]
109                 public void Constructor_5_BadExtraValue ()
110                 {
111                         b = new UriBuilder ("http", "www.ximian.com", 80, "foo/bar/index.html", "extras");
112                         // should have thrown an ArgumentException because extraValue must start with '?' or '#' character.
113                 }
114                 
115                 [Test]
116                 // This test does not make sense, will fix soon
117                 [Category ("NotWorking")] // bug #75144
118                 public void UserInfo ()
119                 {
120                         b = new UriBuilder ("mailto://myname:mypwd@contoso.com?subject=hello");
121 #if NET_2_0
122                         Assert.AreEqual (string.Empty, b.UserName, "#1");
123                         Assert.AreEqual (string.Empty, b.Password, "#2");
124 #else
125                         // NotWorking here for 1.x (bad behaviour in 1.x - may not be worth fixing)
126                         Assert.AreEqual ("myname", b.UserName, "#1");
127                         Assert.AreEqual ("mypwd", b.Password, "#2");
128 #endif                  
129                         b = new UriBuilder ("mailto", "contoso.com");
130                         b.UserName = "myname";
131                         b.Password = "mypwd";
132                         // NotWorking here for 2.0 - worth fixing
133                         Assert.AreEqual ("myname:mypwd", b.Uri.UserInfo, "#3");
134                 }
135
136                 [Test]
137                 public void Path ()
138                 {
139                         b.Path = ((char) 0xa9) + " 2002";
140                         Assert.AreEqual ("%C2%A9%202002", b.Path);
141                 }
142                 
143                 [Test]
144                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
145                 public void BadPort1 ()
146                 {
147                         b.Port = -12345;
148                 }
149 #if NET_2_0
150                 [Test]
151                 public void DefaultPort ()
152                 {
153                         b.Port = -1;
154                         Assert.AreEqual (-1, b.Port, "#1");
155                         Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.ToString (), "#2");
156                 }
157 #else
158                 [Test]
159                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
160                 public void BadPort3 ()
161                 {
162                         b.Port = -1;
163                 }
164 #endif
165                 [Test]
166                 public void Query ()
167                 {
168                         b.Query = ((char) 0xa9) + " 2002";
169                         Assert.AreEqual ("?\xA9 2002", b.Query, "#1");
170                         Assert.AreEqual (string.Empty, b.Fragment, "#2");
171                         b.Query = "?test";
172                         Assert.AreEqual ("??test", b.Query, "#3");
173                         b.Query = null;
174                         Assert.AreEqual (string.Empty, b.Query, "#4");
175                         b.Fragment = "test";
176                         Assert.AreEqual ("#test", b.Fragment, "#5");
177                         b.Query = "name";
178 #if NET_2_0
179                         Assert.AreEqual ("#test", b.Fragment, "#6");
180 #else
181                         Assert.AreEqual (string.Empty, b.Fragment, "#6");
182 #endif
183                         Assert.AreEqual ("?name", b.Query, "#7");
184                         b.Fragment = "run";
185                         Assert.AreEqual ("#run", b.Fragment, "#8");
186                         b.Query = null;
187 #if NET_2_0
188                         Assert.AreEqual ("#run", b.Fragment, "#9");
189 #else
190                         Assert.AreEqual (string.Empty, b.Fragment, "#9");
191 #endif
192                         Assert.AreEqual (string.Empty, b.Query, "#10");
193                 }
194                 
195                 [Test]
196                 public void Fragment ()
197                 {
198                         b.Fragment = ((char) 0xa9) + " 2002";
199                         Assert.AreEqual ("#\xA9 2002", b.Fragment, "#1");
200                         Assert.AreEqual (string.Empty, b.Query, "#2");
201                         b.Fragment = "#test";
202                         Assert.AreEqual ("##test", b.Fragment, "#3");
203                         b.Fragment = null;
204                         Assert.AreEqual (String.Empty, b.Fragment, "#4");
205                         b.Query = "name";
206                         Assert.AreEqual ("?name", b.Query, "#5");
207                         b.Fragment = null;
208 #if NET_2_0
209                         Assert.AreEqual ("?name", b.Query, "#6");
210 #else
211                         Assert.AreEqual (string.Empty, b.Query, "#6");
212 #endif
213                         Assert.AreEqual (string.Empty, b.Fragment, "#7");
214                 }
215                 
216                 [Test]
217                 public void Scheme ()
218                 {
219                         b.Scheme = "http";
220                         Assert.AreEqual ("http", b.Scheme, "#1");
221                         b.Scheme = "http:";
222                         Assert.AreEqual ("http", b.Scheme, "#2");
223                         b.Scheme = "http://";
224                         Assert.AreEqual ("http", b.Scheme, "#3");
225                         b.Scheme = "http://foo/bar";
226                         Assert.AreEqual ("http", b.Scheme, "#4");
227                         b.Scheme = "mailto:";
228                         Assert.AreEqual ("mailto", b.Scheme, "#5");
229                         b.Scheme = "unknown";
230                         Assert.AreEqual ("unknown", b.Scheme, "#6");
231                         b.Scheme = "unknown://";
232                         Assert.AreEqual ("unknown", b.Scheme, "#7");
233                 }
234                 
235                 [Test]
236 #if NET_2_0
237                 [Category ("NotWorking")] // equals changed in 2.0
238 #endif
239                 public void Equals ()
240                 {
241                         b = new UriBuilder ("http://", "www.ximian.com", 80, "foo/bar/index.html?item=1");
242                         b2 = new UriBuilder ("http", "www.ximian.com", 80, "/foo/bar/index.html", "?item=1");
243                         b3 = new UriBuilder (new Uri ("http://www.ximian.com/foo/bar/index.html?item=1"));
244 #if NET_2_0
245                         Assert.IsFalse (b.Equals (b2), "#1");
246                         Assert.IsFalse (b.Uri.Equals (b2.Uri), "#2");
247                         Assert.IsFalse (b.Equals (b3), "#3");
248                         Assert.IsFalse (b3.Equals (b), "#4");
249 #else
250                         Assert.IsTrue (b.Equals (b2), "#1");
251                         Assert.IsTrue (b.Uri.Equals (b2.Uri), "#2");
252                         Assert.IsTrue (b.Equals (b3), "#3");
253                         Assert.IsTrue (b3.Equals (b), "#4");
254 #endif
255                         Assert.IsTrue (b2.Equals (b3), "#5");
256                 }
257                 
258                 [Test]
259                 public void ToStringTest ()
260                 {
261                         Assert.AreEqual ("http://www.ximian.com:80/foo/bar/index.html", b.ToString (), "#1");
262                         Assert.AreEqual ("http://www.ximian.com/foo/bar/index.html", b.Uri.ToString (), "#2");
263                 }
264
265                 [Test]
266                 public void EmptyQuery () // bug 57082
267                 {
268                         b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", null);
269                         string noquery = "http://www.ximian.com/lalala/lelele.aspx";
270                         Assert.AreEqual (noquery, b.Uri.ToString (), "#1");
271                         b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?");
272                         Assert.AreEqual (noquery, b.Uri.ToString (), "#2");
273                         b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "??");
274                         Assert.AreEqual (noquery + "??", b.Uri.ToString (), "#3");
275                         b = new UriBuilder ("http", "www.ximian.com", 80, "/lalala/lelele.aspx", "?something");
276                         Assert.AreEqual (noquery + "?something", b.Uri.ToString (), "#4");
277                 }
278
279                 [Test] // bug #76501
280                 public void TestToString76501 ()
281                 {
282                         UriBuilder ub = new UriBuilder (
283                                 "http://mondomaine/trucmuche/login.aspx");
284                         ub.Query = ub.Query.TrimStart (new char [] {'?'}) + "&ticket=bla";
285                         Assert.IsTrue (ub.ToString ().IndexOf ("80//") < 0);
286                 }
287
288                 [Test]
289                 public void TestAppendFragment ()
290                 {
291                         UriBuilder uri = new UriBuilder ("http://www.mono-project.com/Main_Page");
292                         uri.Fragment = "Features";
293                         Assert.AreEqual ("#Features", uri.Fragment, "#1");
294                         Assert.AreEqual ("http://www.mono-project.com/Main_Page#Features", uri.Uri.ToString (), "#2");
295                 }
296         }
297 }
298