2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[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 NullWriter () 
66                 {
67                         HtmlTextWriter htw = new HtmlTextWriter (null);
68                         Assert.IsNotNull (htw, "NullWriter");
69                         Assert.IsNull (htw.InnerWriter, "InnerWriter");
70                 }
71
72                 [Test]
73                 public void WriteAttributes_NullValue ()
74                 {
75                         w.WriteAttribute ("name", null);
76                         Assert.AreEqual (" name", w.InnerWriter.ToString ());
77                 }
78
79                 [Test]
80                 public void Write1 ()
81                 {
82                         w.RenderBeginTag ("a");
83                         w.RenderEndTag ();
84
85                         Assert.AreEqual ("<a></a>", sw.ToString ());
86                 }
87
88                 [Test]
89                 public void WriteATagByKey ()
90                 {
91                         w.RenderBeginTag (HtwTag.A);
92                         w.RenderEndTag ();
93
94                         Assert.AreEqual ("<a></a>", sw.ToString ());
95                 }
96
97                 [Test]
98                 public void WriteDivTagByKey ()
99                 {
100                         w.RenderBeginTag (HtwTag.Div);
101                         w.RenderEndTag ();
102
103                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
104                 }
105
106                 [Test]
107                 public void WriteOptionTagByKey ()
108                 {
109                         w.RenderBeginTag (HtwTag.Option);
110                         w.RenderEndTag ();
111
112                         Assert.AreEqual ("<option>\n\n</option>", sw.ToString ());
113                 }
114
115                 [Test]
116                 public void WriteDivAndATagByKey ()
117                 {
118                         w.RenderBeginTag (HtwTag.Div);
119                         w.RenderBeginTag (HtwTag.A);
120                         w.RenderEndTag ();
121                         w.RenderEndTag ();
122
123                         Assert.AreEqual ("<div>\n\t<a></a>\n</div>", sw.ToString ());
124                 }
125
126                 [Test]
127                 public void NestedIndent ()
128                 {
129                         w.RenderBeginTag (HtwTag.Div);
130                         w.RenderBeginTag (HtwTag.Div);
131                         w.RenderEndTag ();
132                         w.RenderEndTag ();
133
134                         Assert.AreEqual ("<div>\n\t<div>\n\n\t</div>\n</div>", sw.ToString ());
135                 }
136                 
137                 [Test]
138                 public void WriteDivAndATagByKeyWithAttr ()
139                 {
140                         w.RenderBeginTag (HtwTag.Div);
141
142                         w.AddAttribute (HtwAttribute.Href, "http://slashdot.org/");
143                         w.RenderBeginTag (HtwTag.A);
144                         w.RenderEndTag ();
145                         w.RenderEndTag ();
146                         Assert.AreEqual ("<div>\n\t<a href=\"http://slashdot.org/\"></a>\n</div>", sw.ToString ());
147                 }
148                 
149                 [Test]
150                 public void WriteDivTagWithStyle ()
151                 {
152                         w.AddAttribute ("id", "foo");
153                         w.AddAttribute ("style", "align:left");
154                         w.AddStyleAttribute (HtwStyle.Color, "red");
155                         w.AddStyleAttribute (HtwStyle.FontWeight, "bold");
156                         w.RenderBeginTag (HtwTag.Div);
157                         w.RenderEndTag ();
158                         Assert.AreEqual ("<div id=\"foo\" style=\"color:red;font-weight:bold;align:left\">\n\n</div>", sw.ToString ());
159                 }
160
161                 [Test]
162                 public void EscapeJScript ()
163                 {
164                         w.AddAttribute (HtwAttribute.Onclick, "this.style.color = \"red\"");
165                         w.RenderBeginTag (HtwTag.Div);
166                         w.RenderEndTag ();
167                         Assert.AreEqual ("<div onclick=\"this.style.color = &quot;red&quot;\">\n\n</div>", sw.ToString ());
168                 }
169
170                 [Test]
171                 public void EscapeUrl ()
172                 {
173                         w.AddAttribute (HtwAttribute.Href, "http://www.google.com/search?hl=en&q=i+love+nunit&btnG=Google+Search");
174                         w.RenderBeginTag (HtwTag.A);
175                         w.RenderEndTag ();
176                         Assert.AreEqual ("<a href=\"http://www.google.com/search?hl=en&amp;q=i+love+nunit&amp;btnG=Google+Search\"></a>", sw.ToString ());
177                 }
178
179                 // Which attrs fall here
180                 [Test]
181                 public void NoEscapeAttrName ()
182                 {
183                         w.AddAttribute (HtwAttribute.Name, "cookies&cream");
184                         w.RenderBeginTag (HtwTag.Div);
185                         w.RenderEndTag ();
186                         Assert.AreEqual ("<div name=\"cookies&cream\">\n\n</div>", sw.ToString ());
187                 }
188                 
189                 [Test]
190                 public void NoEscapeAttrName2 () {
191                         w.AddAttribute ("name", "cookies&cream");
192                         w.RenderBeginTag (HtwTag.Div);
193                         w.RenderEndTag ();
194                         Assert.AreEqual ("<div name=\"cookies&cream\">\n\n</div>", sw.ToString ());
195                 }
196                 
197                 [Test]
198                 public void NoEscapeAttrName3 () {
199                         w.AddAttribute (HtwAttribute.Name, "cookies&cream", true);
200                         w.RenderBeginTag (HtwTag.Div);
201                         w.RenderEndTag ();
202                         Assert.AreEqual ("<div name=\"cookies&amp;cream\">\n\n</div>", sw.ToString ());
203                 }
204                 
205                 [Test]
206                 public void NoEscapeAttrName4 () {
207                         w.AddAttribute ("NaMe", "cookies&cream");
208                         w.RenderBeginTag (HtwTag.Div);
209                         w.RenderEndTag ();
210                         Assert.AreEqual ("<div NaMe=\"cookies&cream\">\n\n</div>", sw.ToString ());
211                 }
212                 
213                 [Test]
214                 public void EscapeAttribute1 () {
215                         sw = new StringWriter ();
216                         sw.NewLine = "\n"; // Keep sanity.
217                         Poker w1 = new Poker (sw);
218
219                         w1.AddAttribute ("attr", "cookies&cream");
220                         w1.RenderBeginTag (HtwTag.Div);
221                         w1.RenderEndTag ();
222
223                         Assert.AreEqual ("cookies&amp;cream", w1.AttrValue_At_AddAttribute, "AttrValue_At_AddAttribute");
224                         Assert.AreEqual ("cookies&amp;cream", w1.AttrValue_At_OnAttributeRender, "AttrValue_At_OnAttributeRender");
225                         Assert.AreEqual ("<div attr=\"cookies&amp;cream\">\n\n</div>", sw.ToString ());
226                 }
227                 
228                 [Test]
229                 public void EscapeAttribute2 () {
230                         sw = new StringWriter ();
231                         sw.NewLine = "\n"; // Keep sanity.
232                         Poker w1 = new Poker (sw);
233
234                         w1.AddAttribute ("attr", "cookies&cream", false);
235                         w1.RenderBeginTag (HtwTag.Div);
236                         w1.RenderEndTag ();
237                         
238                         Assert.AreEqual ("cookies&cream", w1.AttrValue_At_AddAttribute, "AttrValue_At_AddAttribute");
239                         Assert.AreEqual ("cookies&cream", w1.AttrValue_At_OnAttributeRender, "AttrValue_At_OnAttributeRender");
240                         Assert.AreEqual ("<div attr=\"cookies&cream\">\n\n</div>", sw.ToString ());
241                 }
242                 
243                 [Test]
244                 public void EscapeAttribute3 () {
245                         sw = new StringWriter ();
246                         sw.NewLine = "\n"; // Keep sanity.
247                         Poker w1 = new Poker (sw);
248
249                         w1.AddAttribute ("attr", "cookies&cream", true);
250                         w1.RenderBeginTag (HtwTag.Div);
251                         w1.RenderEndTag ();
252                         
253                         Assert.AreEqual ("cookies&amp;cream", w1.AttrValue_At_AddAttribute, "AttrValue_At_AddAttribute");
254                         Assert.AreEqual ("cookies&amp;cream", w1.AttrValue_At_OnAttributeRender, "AttrValue_At_OnAttributeRender");
255                         Assert.AreEqual ("<div attr=\"cookies&amp;cream\">\n\n</div>", sw.ToString ());
256                 }       
257
258                 [Test]
259                 public void WriteInput ()
260                 {
261                         w.RenderBeginTag (HtwTag.Input);
262                         w.RenderEndTag ();
263                         Assert.AreEqual ("<input />", sw.ToString ());
264                 }
265                 [Test]
266                 public void WriteInputStringTag ()
267                 {
268                         w.RenderBeginTag ("input");
269                         w.RenderEndTag ();
270                         Assert.AreEqual ("<input />", sw.ToString ());
271                 }
272
273                 [Test]
274                 public void WriteDivStringTag ()
275                 {
276                         w.RenderBeginTag ("div");
277                         w.RenderEndTag ();
278                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
279                 }
280
281                 [Test]
282                 public void WriteUnknownTag ()
283                 {
284                         w.RenderBeginTag ("somerandomtag");
285                         w.RenderEndTag ();
286                         Assert.AreEqual ("<somerandomtag>\n\n</somerandomtag>", sw.ToString ());        
287                 }
288                 
289                 [Test]
290                 public void WritePartialBlock ()
291                 {
292                         w.RenderBeginTag ("div");
293                         Assert.AreEqual ("<div>\n", sw.ToString ());    
294                 }
295                 
296                 [Test]
297                 public void WritePartialInline ()
298                 {
299                         w.RenderBeginTag ("a");
300                         Assert.AreEqual ("<a>", sw.ToString ());        
301                 }
302
303                 [Test]
304                 public void WritePartialSelfClosing ()
305                 {
306                         w.RenderBeginTag ("input");
307                         Assert.AreEqual ("<input />", sw.ToString ());  
308                 }
309
310                 [Test]
311                 [ExpectedException (typeof (InvalidOperationException))]
312                 public void NoMatchingClose ()
313                 {
314                         w.RenderEndTag ();
315                 }
316                 
317                 [Test]
318                 public void AttributeAfterBegin ()
319                 {
320                         w.RenderBeginTag ("div");
321                         w.AddAttribute ("class", "foo");
322                         w.RenderEndTag ();
323                         w.RenderBeginTag ("div");
324                         w.RenderEndTag ();
325                         
326                         Assert.AreEqual ("<div>\n\n</div><div class=\"foo\">\n\n</div>", sw.ToString ());       
327                 }
328                 
329                 [Test]
330                 public void StyleAttribute ()
331                 {
332                         w.WriteStyleAttribute ("a", "b");
333                         
334                         Assert.AreEqual ("a:b;", sw.ToString ());       
335                 }
336
337                 [Test]
338                 public void TagByNameGetsCaseChanged ()
339                 {
340                         w.RenderBeginTag ("InPuT");
341                         Assert.AreEqual ("<input />", sw.ToString ());  
342                 }
343
344                 [Test]
345                 public void EnsurePopWorks ()
346                 {
347                         w.RenderBeginTag (HtwTag.A);
348                         w.RenderBeginTag (HtwTag.B);
349                         w.RenderEndTag ();
350                         w.RenderEndTag ();
351
352                         Assert.AreEqual ("<a><b></b></a>", sw.ToString ());
353                 }
354
355                 [Test]
356                 public void AddAttributeTwice_SameValue ()
357                 {
358                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
359                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
360                         w.RenderBeginTag ("div");
361                         w.RenderEndTag ();
362
363                         Assert.AreEqual ("<div border=\"0\" border=\"0\">\n\n</div>", sw.ToString ());
364                 }
365
366                 [Test]
367                 public void AddAttributeTwice_DifferentValue ()
368                 {
369                         w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
370                         w.AddAttribute (HtmlTextWriterAttribute.Border, "1");
371                         w.RenderBeginTag ("div");
372                         w.RenderEndTag ();
373
374                         Assert.AreEqual ("<div border=\"0\" border=\"1\">\n\n</div>", sw.ToString ());
375                 }
376
377                 [Test]
378                 public void AddStyleAttribute1 ()
379                 {
380                         w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, "http://www.go-mono.com/");
381                         w.RenderBeginTag ("div");
382                         w.RenderEndTag ();
383
384 #if NET_2_0
385                         Assert.AreEqual ("<div style=\"background-image:url(http://www.go-mono.com/);\">\n\n</div>", sw.ToString ());
386 #else
387                         // the url(...) is missing in fx 1.x
388                         Assert.AreEqual ("<div style=\"background-image:http://www.go-mono.com/;\">\n\n</div>", sw.ToString ());
389 #endif
390                 }
391
392                 [Test]
393                 public void AddStyleAttribute3 ()
394                 {
395                         sw = new StringWriter ();
396                         sw.NewLine = "\n"; // Keep sanity.
397                         Poker w1 = new Poker (sw);
398
399                         w1.AddStyleAttribute ("mystyle", "my value&space");
400                         w1.RenderBeginTag ("div");
401                         w1.RenderEndTag ();
402 #if NET_2_0
403                         Assert.AreEqual ("my value&space", w1.StyleValue_At_AddStyleAttribute, "StyleValue_At_AddStyleAttribute");
404                         Assert.AreEqual ("my value&amp;space", w1.StyleValue_At_OnStyleAttributeRender, "StyleValue_At_OnStyleAttributeRender");
405                         Assert.AreEqual ("<div style=\"mystyle:my value&amp;space;\">\n\n</div>", sw.ToString ());
406 #else
407                         Assert.AreEqual ("<div style=\"mystyle:my value&space;\">\n\n</div>", sw.ToString ());
408 #endif
409                 }
410
411                 [Test]
412                 public void WriteAttribute1 ()
413                 {
414                         w.WriteAttribute ("attr", "my value&space");
415                         Assert.AreEqual (" attr=\"my value&space\"", sw.ToString ());
416                 }
417
418                 [Test]
419                 public void WriteAttribute2 ()
420                 {
421                         w.WriteAttribute ("attr", "my value&space", false);
422                         Assert.AreEqual (" attr=\"my value&space\"", sw.ToString ());
423                 }
424
425                 [Test]
426                 public void WriteAttribute3 ()
427                 {
428                         w.WriteAttribute ("attr", "my value&space", true);
429                         Assert.AreEqual (" attr=\"my value&amp;space\"", sw.ToString ());
430                 }
431
432                 [Test]
433                 public void WriteStyleAttribute1 ()
434                 {
435                         w.WriteStyleAttribute ("mystyle", "my value&space");
436                         Assert.AreEqual ("mystyle:my value&space;", sw.ToString ());
437                 }
438
439                 [Test]
440                 public void WriteStyleAttribute2 ()
441                 {
442                         w.WriteStyleAttribute ("mystyle", "my value&space", false);
443                         Assert.AreEqual ("mystyle:my value&space;", sw.ToString ());
444                 }
445
446                 [Test]
447                 public void WriteStyleAttribute3 ()
448                 {
449                         w.WriteStyleAttribute ("mystyle", "my value&space", true);
450                         Assert.AreEqual ("mystyle:my value&amp;space;", sw.ToString ());
451                 }
452                 
453 #if NET_2_0
454                 [Test]
455                 public void WriteStyleAttribute_BackgroundImage1 () 
456                 {
457                         w.WriteStyleAttribute ("background-image", "http://www.mainsoft.com/space here?a=b&c=d");
458                         Assert.AreEqual ("background-image:http://www.mainsoft.com/space here?a=b&c=d;", sw.ToString ());
459                 }
460                 
461                 [Test]
462                 public void WriteStyleAttribute_BackgroundImage2 ()
463                 {
464                         w.WriteStyleAttribute ("BackGround-Image", "http://www.mainsoft.com/space here?a=b&c=d");
465                         Assert.AreEqual ("BackGround-Image:http://www.mainsoft.com/space here?a=b&c=d;", sw.ToString ());
466                 }
467                 
468                 [Test]
469                 public void AddStyleAttribute_BackgroundImage1 () 
470                 {
471                         sw = new StringWriter ();
472                         sw.NewLine = "\n"; // Keep sanity.
473                         Poker w1 = new Poker (sw);
474
475                         w1.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, "http://www.mainsoft.com/space here?a=b&c=d");
476                         w1.RenderBeginTag ("div");
477                         w1.RenderEndTag ();
478
479                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&c=d", w1.StyleValue_At_AddStyleAttribute, "StyleValue_At_AddStyleAttribute");
480                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&amp;c=d", w1.StyleValue_At_OnStyleAttributeRender, "StyleValue_At_OnStyleAttributeRender");
481                         Assert.AreEqual ("<div style=\"background-image:url(http://www.mainsoft.com/space%20here?a=b&amp;c=d);\">\n\n</div>", sw.ToString ());
482                 }
483
484                 [Test]
485                 public void AddStyleAttribute_BackgroundImage2 ()
486                 {
487                         sw = new StringWriter ();
488                         sw.NewLine = "\n"; // Keep sanity.
489                         Poker w1 = new Poker (sw);
490
491                         w1.AddStyleAttribute ("background-image", "http://www.mainsoft.com/space here?a=b&c=d");
492                         w1.RenderBeginTag ("div");
493                         w1.RenderEndTag ();
494
495                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&c=d", w1.StyleValue_At_AddStyleAttribute, "StyleValue_At_AddStyleAttribute");
496                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&amp;c=d", w1.StyleValue_At_OnStyleAttributeRender, "StyleValue_At_OnStyleAttributeRender");
497                         Assert.AreEqual ("<div style=\"background-image:url(http://www.mainsoft.com/space%20here?a=b&amp;c=d);\">\n\n</div>", sw.ToString ());
498                 }
499
500                 [Test]
501                 public void AddStyleAttribute_BackgroundImage3 ()
502                 {
503                         sw = new StringWriter ();
504                         sw.NewLine = "\n"; // Keep sanity.
505                         Poker w1 = new Poker (sw);
506                         
507                         w1.AddStyleAttribute ("BackGround-Image", "http://www.mainsoft.com/space here?a=b&c=d");
508                         w1.RenderBeginTag ("div");
509                         w1.RenderEndTag ();
510
511                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&c=d", w1.StyleValue_At_AddStyleAttribute, "StyleValue_At_AddStyleAttribute");
512                         Assert.AreEqual ("http://www.mainsoft.com/space here?a=b&amp;c=d", w1.StyleValue_At_OnStyleAttributeRender, "StyleValue_At_OnStyleAttributeRender");
513                         Assert.AreEqual ("<div style=\"BackGround-Image:url(http://www.mainsoft.com/space%20here?a=b&amp;c=d);\">\n\n</div>", sw.ToString ());
514                 }
515
516 #endif
517
518                 [Test]
519                 public void AddStyleAttribute2 ()
520                 {
521                         w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundColor, "Aqua");
522                         w.RenderBeginTag ("div");
523                         w.RenderEndTag ();
524
525                         Assert.AreEqual ("<div style=\"background-color:Aqua;\">\n\n</div>", sw.ToString ());
526                 }
527
528                 [Test]
529                 public void WriteIndentation ()
530                 {
531                         w.RenderBeginTag (HtwTag.Div);
532                         w.Write ("Hello");
533                         w.RenderEndTag ();
534
535                         Assert.AreEqual ("<div>\n\tHello\n</div>", sw.ToString ());
536                 }
537
538                 [Test]
539                 public void WriteIndentation2 ()
540                 {
541                         w.RenderBeginTag (HtwTag.Div);
542                         w.Write ("");
543                         w.RenderEndTag ();
544
545                         Assert.AreEqual ("<div>\n\t\n</div>", sw.ToString ());
546                 }
547
548                 [Test]
549                 public void WriteIndentation3 ()
550                 {
551                         w.RenderBeginTag (HtwTag.Div);
552                         w.RenderEndTag ();
553
554                         Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
555                 }
556
557 #if NET_2_0
558                 [Test]
559                 public void WriteBreakTest ()
560                 {
561                         w.WriteBreak ();
562                         Assert.AreEqual ("<br />", sw.ToString (), "WriteBreakTest01");
563                 }
564 #endif
565                 
566                 class MyHttpTextWriter : HtmlTextWriter {
567                         int i = 0;
568                         public MyHttpTextWriter(TextWriter tw) : base(tw) {
569         
570                         }
571                         protected override bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key) {
572                                 switch (i++) {
573                                 case 0:
574                                 case 1: Assert.AreEqual(HtmlTextWriterAttribute.Border, key);
575                                         break;
576                                 case 2: Assert.AreEqual((HtmlTextWriterAttribute)(-1), key);
577                                         break;
578                                 }
579                                 return base.OnAttributeRender (name, value, key);
580                         }
581         
582                 }
583
584                 class Poker : HtmlTextWriter
585                 {
586                         public string StyleValue_At_OnStyleAttributeRender;
587                         public string StyleValue_At_AddStyleAttribute;
588                         public string AttrValue_At_OnAttributeRender;
589                         public string AttrValue_At_AddAttribute;
590
591                         public Poker (TextWriter tw)
592                                 : base (tw)
593                         {
594                         }
595
596                         protected override bool OnAttributeRender (string name, string value, HtmlTextWriterAttribute key)
597                         {
598                                 AttrValue_At_OnAttributeRender = value;
599                                 return base.OnAttributeRender (name, value, key);
600                         }
601                         
602                         protected override bool OnStyleAttributeRender (string name, string value, HtmlTextWriterStyle key)
603                         {
604                                 StyleValue_At_OnStyleAttributeRender = value;
605                                 return base.OnStyleAttributeRender (name, value, key);
606                         }
607                         
608                         protected override void AddStyleAttribute (string name, string value, HtmlTextWriterStyle key)
609                         {
610                                 StyleValue_At_AddStyleAttribute = value;
611                                 base.AddStyleAttribute (name, value, key);
612                         }
613
614                         protected override void AddAttribute (string name, string value, HtmlTextWriterAttribute key)
615                         {
616                                 AttrValue_At_AddAttribute = value;
617                                 base.AddAttribute (name, value, key);
618                         }
619
620                 }
621                 
622                 [Test]
623                 public void TestOnAttributeRender() {
624                         MyHttpTextWriter myw = new MyHttpTextWriter (sw);
625                         
626                         myw.AddAttribute ("border", "0");
627                         myw.AddAttribute ("BoRDeR", "0");
628                         myw.AddAttribute ("error", "0");
629                         myw.RenderBeginTag ("div");
630                         myw.RenderEndTag ();
631                 }
632         }
633 }