fixed tests
[mono.git] / mcs / class / System.Web / Test / System.Web.UI / HtmlTextWriterTest.cs
1 //
2 // HtmlTextWriterTest.cs
3 //      - Unit tests for System.Web.UI.HtmlTextWriter
4 //
5 // Authors:
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //      Ben Maurer <bmaurer@novell.com>
8 //
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System;
32 using System.IO;
33 using System.Web.UI;
34
35 using HtwTag = System.Web.UI.HtmlTextWriterTag;
36 using HtwAttribute = System.Web.UI.HtmlTextWriterAttribute;
37 using HtwStyle = System.Web.UI.HtmlTextWriterStyle;
38
39 using NUnit.Framework;
40
41 namespace MonoTests.System.Web.UI {
42
43         [TestFixture]
44         public class HtmlTextWriterTest {
45
46                 StringWriter sw;
47                 HtmlTextWriter w;
48
49                 [SetUp]
50                 public void SetupTests ()
51                 {
52                         sw = new StringWriter ();
53                         sw.NewLine = "\n"; // Keep sanity.
54                         w = new HtmlTextWriter (sw);
55                 }
56                 
57                 [Test]
58                 public void DefaultConstFields ()
59                 {
60                         Assert.AreEqual ("=\"", HtmlTextWriter.EqualsDoubleQuoteString, "EqualsDoubleQuoteString");
61                         // add more
62                 }
63
64                 [Test]
65                 public void WriteAttributes_NullValue ()
66                 {
67                         w.WriteAttribute ("name", null);
68                         Assert.AreEqual (" name", w.InnerWriter.ToString ());
69                 }
70
71                 [Test]
72                 public void Write1 ()
73                 {
74                         w.RenderBeginTag ("a");
75                         w.RenderEndTag ();
76
77                         Assert.AreEqual ("<a></a>", sw.ToString ());
78                 }
79
80                 [Test]
81                 public void WriteATagByKey ()
82                 {
83                         w.RenderBeginTag (HtwTag.A);
84                         w.RenderEndTag ();
85
86                         Assert.AreEqual ("<a></a>", sw.ToString ());
87                 }
88
89                 [Test]
90                 public void WriteDivTagByKey ()
91                 {
92                         w.RenderBeginTag (HtwTag.Div);
93                         w.RenderEndTag ();
94
95                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
96                 }
97
98                 [Test]
99                 public void WriteOptionTagByKey ()
100                 {
101                         w.RenderBeginTag (HtwTag.Option);
102                         w.RenderEndTag ();
103
104                         Assert.AreEqual ("<option>\n\n</option>", sw.ToString ());
105                 }
106
107                 [Test]
108                 public void WriteDivAndATagByKey ()
109                 {
110                         w.RenderBeginTag (HtwTag.Div);
111                         w.RenderBeginTag (HtwTag.A);
112                         w.RenderEndTag ();
113                         w.RenderEndTag ();
114
115                         Assert.AreEqual ("<div>\n\t<a></a>\n</div>", sw.ToString ());
116                 }
117
118                 [Test]
119                 public void NestedIndent ()
120                 {
121                         w.RenderBeginTag (HtwTag.Div);
122                         w.RenderBeginTag (HtwTag.Div);
123                         w.RenderEndTag ();
124                         w.RenderEndTag ();
125
126                         Assert.AreEqual ("<div>\n\t<div>\n\n\t</div>\n</div>", sw.ToString ());
127                 }
128                 
129                 [Test]
130                 public void WriteDivAndATagByKeyWithAttr ()
131                 {
132                         w.RenderBeginTag (HtwTag.Div);
133
134                         w.AddAttribute (HtwAttribute.Href, "http://slashdot.org/");
135                         w.RenderBeginTag (HtwTag.A);
136                         w.RenderEndTag ();
137                         w.RenderEndTag ();
138                         Assert.AreEqual ("<div>\n\t<a href=\"http://slashdot.org/\"></a>\n</div>", sw.ToString ());
139                 }
140                 
141                 [Test]
142                 public void WriteDivTagWithStyle ()
143                 {
144                         w.AddAttribute ("id", "foo");
145                         w.AddAttribute ("style", "align:left");
146                         w.AddStyleAttribute (HtwStyle.Color, "red");
147                         w.AddStyleAttribute (HtwStyle.FontWeight, "bold");
148                         w.RenderBeginTag (HtwTag.Div);
149                         w.RenderEndTag ();
150                         Assert.AreEqual ("<div id=\"foo\" style=\"color:red;font-weight:bold;align:left\">\n\n</div>", sw.ToString ());
151                 }
152
153                 [Test]
154                 public void EscapeJScript ()
155                 {
156                         w.AddAttribute (HtwAttribute.Onclick, "this.style.color = \"red\"");
157                         w.RenderBeginTag (HtwTag.Div);
158                         w.RenderEndTag ();
159                         Assert.AreEqual ("<div onclick=\"this.style.color = &quot;red&quot;\">\n\n</div>", sw.ToString ());
160                 }
161
162                 [Test]
163                 public void EscapeUrl ()
164                 {
165                         w.AddAttribute (HtwAttribute.Href, "http://www.google.com/search?hl=en&q=i+love+nunit&btnG=Google+Search");
166                         w.RenderBeginTag (HtwTag.A);
167                         w.RenderEndTag ();
168                         Assert.AreEqual ("<a href=\"http://www.google.com/search?hl=en&amp;q=i+love+nunit&amp;btnG=Google+Search\"></a>", sw.ToString ());
169                 }
170
171                 // Which attrs fall here
172                 [Category ("NotWorking")]
173                 [Test]
174                 public void NoEscapeAttrName ()
175                 {
176                         w.AddAttribute (HtwAttribute.Name, "cookies&cream");
177                         w.RenderBeginTag (HtwTag.Div);
178                         w.RenderEndTag ();
179                         Assert.AreEqual ("<div name=\"cookies&cream\">\n\n</div>", sw.ToString ());
180                 }       
181
182                 [Test]
183                 public void WriteInput ()
184                 {
185                         w.RenderBeginTag (HtwTag.Input);
186                         w.RenderEndTag ();
187                         Assert.AreEqual ("<input />", sw.ToString ());
188                 }
189                 [Test]
190                 public void WriteInputStringTag ()
191                 {
192                         w.RenderBeginTag ("input");
193                         w.RenderEndTag ();
194                         Assert.AreEqual ("<input />", sw.ToString ());
195                 }
196
197                 [Test]
198                 public void WriteDivStringTag ()
199                 {
200                         w.RenderBeginTag ("div");
201                         w.RenderEndTag ();
202                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
203                 }
204
205                 [Test]
206                 public void WriteUnknownTag ()
207                 {
208                         w.RenderBeginTag ("somerandomtag");
209                         w.RenderEndTag ();
210                         Assert.AreEqual ("<somerandomtag>\n\n</somerandomtag>", sw.ToString ());        
211                 }
212                 
213                 [Test]
214                 public void WritePartialBlock ()
215                 {
216                         w.RenderBeginTag ("div");
217                         Assert.AreEqual ("<div>\n", sw.ToString ());    
218                 }
219                 
220                 [Test]
221                 public void WritePartialInline ()
222                 {
223                         w.RenderBeginTag ("a");
224                         Assert.AreEqual ("<a>", sw.ToString ());        
225                 }
226
227                 [Test]
228                 public void WritePartialSelfClosing ()
229                 {
230                         w.RenderBeginTag ("input");
231                         Assert.AreEqual ("<input />", sw.ToString ());  
232                 }
233
234                 [Test]
235                 [ExpectedException (typeof (InvalidOperationException))]
236                 public void NoMatchingClose ()
237                 {
238                         w.RenderEndTag ();
239                 }
240                 
241                 [Test]
242                 public void AttributeAfterBegin ()
243                 {
244                         w.RenderBeginTag ("div");
245                         w.AddAttribute ("class", "foo");
246                         w.RenderEndTag ();
247                         w.RenderBeginTag ("div");
248                         w.RenderEndTag ();
249                         
250                         Assert.AreEqual ("<div>\n\n</div><div class=\"foo\">\n\n</div>", sw.ToString ());       
251                 }
252                 
253                 [Test]
254                 public void StyleAttribute ()
255                 {
256                         w.WriteStyleAttribute ("a", "b");
257                         
258                         Assert.AreEqual ("a:b;", sw.ToString ());       
259                 }
260
261                 [Test]
262                 [Category ("NotWorking")]
263                 public void TagByNameGetsCaseChanged ()
264                 {
265                         w.RenderBeginTag ("InPuT");
266                         Assert.AreEqual ("<input />", sw.ToString ());  
267                 }
268
269                 [Test]
270                 public void EnsurePopWorks ()
271                 {
272                         w.RenderBeginTag (HtwTag.A);
273                         w.RenderBeginTag (HtwTag.B);
274                         w.RenderEndTag ();
275                         w.RenderEndTag ();
276
277                         Assert.AreEqual ("<a><b></b></a>", sw.ToString ());
278                 }
279
280                 [Test]
281                 public void AddAttributeTwice_SameValue ()
282                 {
283                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
284                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
285                         w.RenderBeginTag ("div");
286                         w.RenderEndTag ();
287
288                         Assert.AreEqual ("<div border=\"0\" border=\"0\">\n\n</div>", sw.ToString ());
289                 }
290
291                 [Test]
292                 public void AddAttributeTwice_DifferentValue ()
293                 {
294                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
295                         w.AddAttribute (HtmlTextWriterAttribute.Border, "1");
296                         w.RenderBeginTag ("div");
297                         w.RenderEndTag ();
298
299                         Assert.AreEqual ("<div border=\"0\" border=\"1\">\n\n</div>", sw.ToString ());
300                 }
301
302                 [Test]
303                 public void AddStyleAttribute ()
304                 {
305                         w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, "http://www.go-mono.com/");
306                         w.RenderBeginTag ("div");
307                         w.RenderEndTag ();
308
309 #if NET_2_0
310                         Assert.AreEqual ("<div style=\"background-image:url(http://www.go-mono.com/);\">\n\n</div>", sw.ToString ());
311 #else
312                         // the url(...) is missing in fx 1.x
313                         Assert.AreEqual ("<div style=\"background-image:http://www.go-mono.com/;\">\n\n</div>", sw.ToString ());
314 #endif
315                 }
316
317                 [Test]
318                 public void AddStyleAttribute2 ()
319                 {
320                         w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundColor, "Aqua");
321                         w.RenderBeginTag ("div");
322                         w.RenderEndTag ();
323
324                         Assert.AreEqual ("<div style=\"background-color:Aqua;\">\n\n</div>", sw.ToString ());
325                 }
326
327                 [Test]
328                 public void WriteIndentation ()
329                 {
330                         w.RenderBeginTag (HtwTag.Div);
331                         w.Write ("Hello");
332                         w.RenderEndTag ();
333
334                         Assert.AreEqual ("<div>\n\tHello\n</div>", sw.ToString ());
335                 }
336
337                 [Test]
338                 public void WriteIndentation2 ()
339                 {
340                         w.RenderBeginTag (HtwTag.Div);
341                         w.Write ("");
342                         w.RenderEndTag ();
343
344                         Assert.AreEqual ("<div>\n\t\n</div>", sw.ToString ());
345                 }
346
347                 [Test]
348                 public void WriteIndentation3 ()
349                 {
350                         w.RenderBeginTag (HtwTag.Div);
351                         w.RenderEndTag ();
352
353                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
354                 }
355
356 #if NET_2_0
357                 [Test]
358                 public void WriteBreakTest ()
359                 {
360                         w.WriteBreak ();
361                         Assertion.AssertEquals ("WriteBreakTest01", "<br />", sw.ToString ());
362                 }
363 #endif
364                 
365                 class MyHttpTextWriter : HtmlTextWriter {
366                         int i = 0;
367                         public MyHttpTextWriter(TextWriter tw) : base(tw) {
368         
369                         }
370                         protected override bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key) {
371                                 switch (i++) {
372                                 case 0:
373                                 case 1: Assert.AreEqual(HtmlTextWriterAttribute.Border, key);
374                                         break;
375                                 case 2: Assert.AreEqual((HtmlTextWriterAttribute)(-1), key);
376                                         break;
377                                 }
378                                 return base.OnAttributeRender (name, value, key);
379                         }
380         
381                 }
382                 
383                 [Test]
384                 public void TestOnAttributeRender() {
385                         MyHttpTextWriter myw = new MyHttpTextWriter (sw);
386                         
387                         myw.AddAttribute ("border", "0");
388                         myw.AddAttribute ("BoRDeR", "0");
389                         myw.AddAttribute ("error", "0");
390                         myw.RenderBeginTag ("div");
391                         myw.RenderEndTag ();
392                 }
393         }
394 }