2 // HtmlTextWriterTest.cs
3 // - Unit tests for System.Web.UI.HtmlTextWriter
6 // Sebastien Pouliot <sebastien@ximian.com>
7 // Ben Maurer <bmaurer@novell.com>
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
35 using HtwTag = System.Web.UI.HtmlTextWriterTag;
36 using HtwAttribute = System.Web.UI.HtmlTextWriterAttribute;
37 using HtwStyle = System.Web.UI.HtmlTextWriterStyle;
39 using NUnit.Framework;
41 namespace MonoTests.System.Web.UI {
44 public class HtmlTextWriterTest {
50 public void SetupTests ()
52 sw = new StringWriter ();
53 sw.NewLine = "\n"; // Keep sanity.
54 w = new HtmlTextWriter (sw);
58 public void DefaultConstFields ()
60 Assert.AreEqual ("=\"", HtmlTextWriter.EqualsDoubleQuoteString, "EqualsDoubleQuoteString");
65 public void WriteAttributes_NullValue ()
67 w.WriteAttribute ("name", null);
68 Assert.AreEqual (" name", w.InnerWriter.ToString ());
74 w.RenderBeginTag ("a");
77 Assert.AreEqual ("<a></a>", sw.ToString ());
81 public void WriteATagByKey ()
83 w.RenderBeginTag (HtwTag.A);
86 Assert.AreEqual ("<a></a>", sw.ToString ());
90 public void WriteDivTagByKey ()
92 w.RenderBeginTag (HtwTag.Div);
95 Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
99 public void WriteOptionTagByKey ()
101 w.RenderBeginTag (HtwTag.Option);
104 Assert.AreEqual ("<option>\n\n</option>", sw.ToString ());
108 public void WriteDivAndATagByKey ()
110 w.RenderBeginTag (HtwTag.Div);
111 w.RenderBeginTag (HtwTag.A);
115 Assert.AreEqual ("<div>\n\t<a></a>\n</div>", sw.ToString ());
119 public void NestedIndent ()
121 w.RenderBeginTag (HtwTag.Div);
122 w.RenderBeginTag (HtwTag.Div);
126 Assert.AreEqual ("<div>\n\t<div>\n\n\t</div>\n</div>", sw.ToString ());
130 public void WriteDivAndATagByKeyWithAttr ()
132 w.RenderBeginTag (HtwTag.Div);
134 w.AddAttribute (HtwAttribute.Href, "http://slashdot.org/");
135 w.RenderBeginTag (HtwTag.A);
138 Assert.AreEqual ("<div>\n\t<a href=\"http://slashdot.org/\"></a>\n</div>", sw.ToString ());
142 public void WriteDivTagWithStyle ()
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);
150 Assert.AreEqual ("<div id=\"foo\" style=\"color:red;font-weight:bold;align:left\">\n\n</div>", sw.ToString ());
154 public void EscapeJScript ()
156 w.AddAttribute (HtwAttribute.Onclick, "this.style.color = \"red\"");
157 w.RenderBeginTag (HtwTag.Div);
159 Assert.AreEqual ("<div onclick=\"this.style.color = "red"\">\n\n</div>", sw.ToString ());
163 public void EscapeUrl ()
165 w.AddAttribute (HtwAttribute.Href, "http://www.google.com/search?hl=en&q=i+love+nunit&btnG=Google+Search");
166 w.RenderBeginTag (HtwTag.A);
168 Assert.AreEqual ("<a href=\"http://www.google.com/search?hl=en&q=i+love+nunit&btnG=Google+Search\"></a>", sw.ToString ());
171 // Which attrs fall here
172 [Category ("NotWorking")]
174 public void NoEscapeAttrName ()
176 w.AddAttribute (HtwAttribute.Name, "cookies&cream");
177 w.RenderBeginTag (HtwTag.Div);
179 Assert.AreEqual ("<div name=\"cookies&cream\">\n\n</div>", sw.ToString ());
183 public void WriteInput ()
185 w.RenderBeginTag (HtwTag.Input);
187 Assert.AreEqual ("<input />", sw.ToString ());
190 public void WriteInputStringTag ()
192 w.RenderBeginTag ("input");
194 Assert.AreEqual ("<input />", sw.ToString ());
198 public void WriteDivStringTag ()
200 w.RenderBeginTag ("div");
202 Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
206 public void WriteUnknownTag ()
208 w.RenderBeginTag ("somerandomtag");
210 Assert.AreEqual ("<somerandomtag>\n\n</somerandomtag>", sw.ToString ());
214 public void WritePartialBlock ()
216 w.RenderBeginTag ("div");
217 Assert.AreEqual ("<div>\n", sw.ToString ());
221 public void WritePartialInline ()
223 w.RenderBeginTag ("a");
224 Assert.AreEqual ("<a>", sw.ToString ());
228 public void WritePartialSelfClosing ()
230 w.RenderBeginTag ("input");
231 Assert.AreEqual ("<input />", sw.ToString ());
235 [ExpectedException (typeof (InvalidOperationException))]
236 public void NoMatchingClose ()
242 public void AttributeAfterBegin ()
244 w.RenderBeginTag ("div");
245 w.AddAttribute ("class", "foo");
247 w.RenderBeginTag ("div");
250 Assert.AreEqual ("<div>\n\n</div><div class=\"foo\">\n\n</div>", sw.ToString ());
254 public void StyleAttribute ()
256 w.WriteStyleAttribute ("a", "b");
258 Assert.AreEqual ("a:b;", sw.ToString ());
262 [Category ("NotWorking")]
263 public void TagByNameGetsCaseChanged ()
265 w.RenderBeginTag ("InPuT");
266 Assert.AreEqual ("<input />", sw.ToString ());
270 public void EnsurePopWorks ()
272 w.RenderBeginTag (HtwTag.A);
273 w.RenderBeginTag (HtwTag.B);
277 Assert.AreEqual ("<a><b></b></a>", sw.ToString ());
281 public void AddAttributeTwice_SameValue ()
283 w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
284 w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
285 w.RenderBeginTag ("div");
288 Assert.AreEqual ("<div border=\"0\" border=\"0\">\n\n</div>", sw.ToString ());
292 public void AddAttributeTwice_DifferentValue ()
294 w.AddAttribute (HtmlTextWriterAttribute.Border, "0");
295 w.AddAttribute (HtmlTextWriterAttribute.Border, "1");
296 w.RenderBeginTag ("div");
299 Assert.AreEqual ("<div border=\"0\" border=\"1\">\n\n</div>", sw.ToString ());
303 public void AddStyleAttribute ()
305 w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundImage, "http://www.go-mono.com/");
306 w.RenderBeginTag ("div");
310 Assert.AreEqual ("<div style=\"background-image:url(http://www.go-mono.com/);\">\n\n</div>", sw.ToString ());
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 ());
318 public void AddStyleAttribute2 ()
320 w.AddStyleAttribute (HtmlTextWriterStyle.BackgroundColor, "Aqua");
321 w.RenderBeginTag ("div");
324 Assert.AreEqual ("<div style=\"background-color:Aqua;\">\n\n</div>", sw.ToString ());
328 public void WriteIndentation ()
330 w.RenderBeginTag (HtwTag.Div);
334 Assert.AreEqual ("<div>\n\tHello\n</div>", sw.ToString ());
338 public void WriteIndentation2 ()
340 w.RenderBeginTag (HtwTag.Div);
344 Assert.AreEqual ("<div>\n\t\n</div>", sw.ToString ());
348 public void WriteIndentation3 ()
350 w.RenderBeginTag (HtwTag.Div);
353 Assert.AreEqual ("<div>\n\n</div>", sw.ToString ());
358 public void WriteBreakTest ()
361 Assertion.AssertEquals ("WriteBreakTest01", "<br />", sw.ToString ());
365 class MyHttpTextWriter : HtmlTextWriter {
367 public MyHttpTextWriter(TextWriter tw) : base(tw) {
370 protected override bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key) {
373 case 1: Assert.AreEqual(HtmlTextWriterAttribute.Border, key);
375 case 2: Assert.AreEqual((HtmlTextWriterAttribute)(-1), key);
378 return base.OnAttributeRender (name, value, key);
384 public void TestOnAttributeRender() {
385 MyHttpTextWriter myw = new MyHttpTextWriter (sw);
387 myw.AddAttribute ("border", "0");
388 myw.AddAttribute ("BoRDeR", "0");
389 myw.AddAttribute ("error", "0");
390 myw.RenderBeginTag ("div");