1 //
2 // TableRowTest.cs
3 //	- Unit tests for System.Web.UI.WebControls.TableRow
4 //
5 // Author:
6 //	Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 
30 using System;
31 using System.Drawing;
32 using System.IO;
33 using System.Web;
34 using System.Web.UI;
35 using System.Web.UI.WebControls;
36 
37 using NUnit.Framework;
38 
39 namespace MonoTests.System.Web.UI.WebControls {
40 
41 	public interface ITableRowTest {
42 
43 		// testing
44 		string Tag { get; }
45 		StateBag StateBag { get; }
Render()46 		string Render ();
GetStyle()47 		Style GetStyle ();
48 
49 		// TableRow
50 		AttributeCollection Attributes { get; }
51 		Color BackColor { get; set; }
52 		ControlCollection Controls { get; }
53 		TableCellCollection Cells { get; }
54 		Style ControlStyle { get; }
55 		HorizontalAlign HorizontalAlign { get; set; }
56 		VerticalAlign VerticalAlign { get; set; }
57 		TableRowSection TableSection { get; set; }
58 	}
59 
60 	public class TestTableRow : TableRow, ITableRowTest {
61 
62 		public string Tag {
63 			get { return base.TagName; }
64 		}
65 
66 		public StateBag StateBag {
67 			get { return base.ViewState; }
68 		}
69 
Render()70 		public string Render ()
71 		{
72 			StringWriter sw = new StringWriter ();
73 			sw.NewLine = "\n";
74 			HtmlTextWriter writer = new HtmlTextWriter (sw);
75 			base.Render (writer);
76 			return writer.InnerWriter.ToString ();
77 		}
78 
GetStyle()79 		public Style GetStyle ()
80 		{
81 			return base.CreateControlStyle ();
82 		}
83 	}
84 
85 	[TestFixture]
86 	public class TableRowTest {
87 
GetWriter()88 		private HtmlTextWriter GetWriter ()
89 		{
90 			StringWriter sw = new StringWriter ();
91 			sw.NewLine = "\n";
92 			return new HtmlTextWriter (sw);
93 		}
94 
GetNewTableRow()95 		public virtual TableRow GetNewTableRow ()
96 		{
97 			return new TableRow ();
98 		}
99 
GetNewTestTableRow()100 		public virtual ITableRowTest GetNewTestTableRow ()
101 		{
102 			return new TestTableRow ();
103 		}
104 
105 		[Test]
DefaultProperties()106 		public void DefaultProperties ()
107 		{
108 			ITableRowTest tr = GetNewTestTableRow ();
109 			Assert.AreEqual (0, tr.Attributes.Count, "Attributes.Count");
110 			Assert.AreEqual (0, tr.StateBag.Count, "ViewState.Count");
111 
112 			Assert.AreEqual (0, tr.Cells.Count, "Cells.Count");
113 			Assert.AreEqual (HorizontalAlign.NotSet, tr.HorizontalAlign, "HorizontalAlign");
114 			Assert.AreEqual (VerticalAlign.NotSet, tr.VerticalAlign, "VerticalAlign");
115 			Assert.AreEqual (TableRowSection.TableBody, tr.TableSection, "TableSection");
116 			Assert.AreEqual ("tr", tr.Tag, "TagName");
117 			Assert.AreEqual (0, tr.Attributes.Count, "Attributes.Count-2");
118 			Assert.AreEqual (0, tr.StateBag.Count, "ViewState.Count-2");
119 		}
120 
121 		[Test]
NullProperties()122 		public void NullProperties ()
123 		{
124 			ITableRowTest tr = GetNewTestTableRow ();
125 			tr.HorizontalAlign = HorizontalAlign.NotSet;
126 			Assert.AreEqual (HorizontalAlign.NotSet, tr.HorizontalAlign, "HorizontalAlign");
127 			tr.VerticalAlign = VerticalAlign.NotSet;
128 			Assert.AreEqual (VerticalAlign.NotSet, tr.VerticalAlign, "VerticalAlign");
129 			tr.TableSection = TableRowSection.TableBody;
130 			Assert.AreEqual (TableRowSection.TableBody, tr.TableSection, "TableSection");
131 			Assert.AreEqual (3, tr.StateBag.Count, "ViewState.Count-1");
132 			Assert.AreEqual (0, tr.Attributes.Count, "Attributes.Count");
133 		}
134 
135 		[Test]
CleanProperties()136 		public void CleanProperties ()
137 		{
138 			ITableRowTest tr = GetNewTestTableRow ();
139 			tr.HorizontalAlign = HorizontalAlign.Justify;
140 			Assert.AreEqual (HorizontalAlign.Justify, tr.HorizontalAlign, "HorizontalAlign");
141 			tr.VerticalAlign = VerticalAlign.Bottom;
142 			Assert.AreEqual (VerticalAlign.Bottom, tr.VerticalAlign, "VerticalAlign");
143 			Assert.AreEqual (0, tr.Attributes.Count, "Attributes.Count");
144 			Assert.AreEqual (2, tr.StateBag.Count, "ViewState.Count");
145 
146 			tr.HorizontalAlign = HorizontalAlign.NotSet;
147 			Assert.AreEqual (HorizontalAlign.NotSet, tr.HorizontalAlign, "HorizontalAlign");
148 			tr.VerticalAlign = VerticalAlign.NotSet;
149 			Assert.AreEqual (VerticalAlign.NotSet, tr.VerticalAlign, "VerticalAlign");
150 			tr.TableSection = TableRowSection.TableFooter;
151 			Assert.AreEqual (TableRowSection.TableFooter, tr.TableSection, "TableFooter");
152 			tr.TableSection = TableRowSection.TableHeader;
153 			Assert.AreEqual (TableRowSection.TableHeader, tr.TableSection, "TableHeader");
154 			tr.TableSection = TableRowSection.TableBody;
155 			Assert.AreEqual (TableRowSection.TableBody, tr.TableSection, "TableBody");
156 			Assert.AreEqual (3, tr.StateBag.Count, "ViewState.Count-1");
157 			Assert.AreEqual (0, tr.Attributes.Count, "Attributes.Count");
158 		}
159 
160 		[Test]
161 		// LAMESPEC: undocumented exception but similar to Image
162 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
HorizontalAlign_Invalid()163 		public void HorizontalAlign_Invalid ()
164 		{
165 			TableRow tr = GetNewTableRow ();
166 			tr.HorizontalAlign = (HorizontalAlign)Int32.MinValue;
167 		}
168 
169 		[Test]
170 		// LAMESPEC: undocumented exception but similar to Image
171 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
VerticalAlign_Invalid()172 		public void VerticalAlign_Invalid ()
173 		{
174 			TableRow tr = GetNewTableRow ();
175 			tr.VerticalAlign = (VerticalAlign)Int32.MinValue;
176 		}
177 		[Test]
178 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
TableSection_Invalid()179 		public void TableSection_Invalid ()
180 		{
181 			TableRow tr = GetNewTableRow ();
182 			tr.TableSection = (TableRowSection)Int32.MinValue;
183 		}
184 		[Test]
Render()185 		public void Render ()
186 		{
187 			ITableRowTest tr = GetNewTestTableRow ();
188 			string s = tr.Render ();
189 			Assert.AreEqual ("<tr>\n\n</tr>", s, "empty/default");
190 
191 			// case varies with fx versions
192 			tr.HorizontalAlign = HorizontalAlign.Left;
193 			s = tr.Render ();
194 			Assert.IsTrue ((s.ToLower ().IndexOf (" align=\"left\"") > 0), "HorizontalAlign.Left");
195 			tr.HorizontalAlign = HorizontalAlign.Center;
196 			s = tr.Render ();
197 			Assert.IsTrue ((s.ToLower ().IndexOf (" align=\"center\"") > 0), "HorizontalAlign.Center");
198 			tr.HorizontalAlign = HorizontalAlign.Right;
199 			s = tr.Render ();
200 			Assert.IsTrue ((s.ToLower ().IndexOf (" align=\"right\"") > 0), "HorizontalAlign.Justify");
201 			tr.HorizontalAlign = HorizontalAlign.Justify;
202 			s = tr.Render ();
203 			Assert.IsTrue ((s.ToLower ().IndexOf (" align=\"justify\"") > 0), "HorizontalAlign.Justify");
204 			tr.HorizontalAlign = HorizontalAlign.NotSet;
205 
206 			tr.VerticalAlign = VerticalAlign.Top;
207 			s = tr.Render ();
208 			Assert.IsTrue ((s.ToLower ().IndexOf (" valign=\"top\"") > 0), "VerticalAlign.Top");
209 			tr.VerticalAlign = VerticalAlign.Middle;
210 			s = tr.Render ();
211 			Assert.IsTrue ((s.ToLower ().IndexOf (" valign=\"middle\"") > 0), "VerticalAlign.Middle");
212 			tr.VerticalAlign = VerticalAlign.Bottom;
213 			s = tr.Render ();
214 			Assert.IsTrue ((s.ToLower ().IndexOf (" valign=\"bottom\"") > 0), "VerticalAlign.Bottom");
215 			tr.VerticalAlign = VerticalAlign.NotSet;
216 			// TableSection has no influence over the "row" rendering
217 			tr.TableSection = TableRowSection.TableFooter;
218 			s = tr.Render ();
219 			Assert.AreEqual ("<tr>\n\n</tr>", s, "TableRowSection.TableFooter");
220 			tr.TableSection = TableRowSection.TableHeader;
221 			s = tr.Render ();
222 			Assert.AreEqual ("<tr>\n\n</tr>", s, "TableRowSection.TableHeader");
223 			tr.TableSection = TableRowSection.TableBody;
224 			s = tr.Render ();
225 			Assert.AreEqual ("<tr>\n\n</tr>", s, "TableRowSection.TableBody");
226 		}
227 
228 		[Test]
Render_Style()229 		public void Render_Style ()
230 		{
231 			ITableRowTest tr = GetNewTestTableRow ();
232 			tr.BackColor = Color.Aqua;
233 			string s = tr.Render ();
234 			Assert.AreEqual ("<tr style=\"background-color:Aqua;\">\n\n</tr>", s, "direct");
235 
236 			TableItemStyle tis = new TableItemStyle ();
237 			tis.BackColor = Color.Red;
238 			tr.ControlStyle.CopyFrom (tis);
239 			s = tr.Render ();
240 			Assert.AreEqual ("<tr style=\"background-color:Red;\">\n\n</tr>", s, "CopyFrom");
241 		}
242 
243 		[Test]
CreateControlStyle()244 		public void CreateControlStyle ()
245 		{
246 			ITableRowTest tr = GetNewTestTableRow ();
247 			tr.HorizontalAlign = HorizontalAlign.Left;
248 			tr.VerticalAlign = VerticalAlign.Bottom;
249 
250 			TableItemStyle tis = (TableItemStyle)tr.GetStyle ();
251 			// is it live ?
252 			tis.HorizontalAlign = HorizontalAlign.Right;
253 			Assert.AreEqual (HorizontalAlign.Right, tr.HorizontalAlign, "HorizontalAlign-2");
254 			tis.VerticalAlign = VerticalAlign.Top;
255 			Assert.AreEqual (VerticalAlign.Top, tr.VerticalAlign, "VerticalAlign-2");
256 		}
257 
Adjust(string s)258 		private string Adjust (string s)
259 		{
260 			// right now Mono doesn't generate the exact same indentation/lines as MS implementation
261 			// and different fx versions have different casing for enums
262 			return s.Replace ("\n", "").Replace ("\t", "").ToLower ();
263 		}
264 
265 		[Test]
Cells()266 		public void Cells ()
267 		{
268 			ITableRowTest tr = GetNewTestTableRow ();
269 			Assert.AreEqual (0, tr.Cells.Count, "0");
270 			TableCell td = new TableCell ();
271 
272 			tr.Cells.Add (td);
273 			Assert.AreEqual (1, tr.Cells.Count, "c1");
274 			Assert.AreEqual (1, tr.Controls.Count, "k1");
275 			string s = tr.Render ();
276 			Assert.AreEqual (Adjust ("<tr>\n\t<td></td>\n</tr>"), Adjust (s), "td-1");
277 
278 			// change instance properties
279 			td.RowSpan = 1;
280 			s = tr.Render ();
281 			Assert.AreEqual (Adjust ("<tr>\n\t<td rowspan=\"1\"></td>\n</tr>"), Adjust (s), "td-1r");
282 
283 			// add it again (same instance)
284 			tr.Cells.Add (td);
285 			Assert.AreEqual (1, tr.Cells.Count, "c1bis");
286 			Assert.AreEqual (1, tr.Controls.Count, "k1bis");
287 			s = tr.Render ();
288 			Assert.AreEqual (Adjust ("<tr>\n\t<td rowspan=\"1\"></td>\n</tr>"), Adjust (s), "tr-1bis");
289 
290 			td = new TableCell ();
291 			td.VerticalAlign = VerticalAlign.Top;
292 			tr.Cells.Add (td);
293 			Assert.AreEqual (2, tr.Cells.Count, "c2");
294 			Assert.AreEqual (2, tr.Controls.Count, "k2");
295 			s = tr.Render ();
296 			Assert.AreEqual (Adjust ("<tr>\n\t<td rowspan=\"1\"></td><td valign=\"top\"></td>\n</tr>"), Adjust (s), "tr-2");
297 
298 			td = new TableCell ();
299 			td.HorizontalAlign = HorizontalAlign.Center;
300 			tr.Cells.Add (td);
301 			Assert.AreEqual (3, tr.Cells.Count, "c3");
302 			Assert.AreEqual (3, tr.Controls.Count, "k3");
303 			s = tr.Render ();
304 			Assert.AreEqual (Adjust ("<tr>\n\t<td rowspan=\"1\"></td><td valign=\"top\"></td><td align=\"center\"></td>\n</tr>"), Adjust (s), "tr-3");
305 
306 			tr.HorizontalAlign = HorizontalAlign.Right;
307 			s = tr.Render ();
308 			Assert.AreEqual (Adjust ("<tr align=\"right\">\n\t<td rowspan=\"1\"></td><td valign=\"top\"></td><td align=\"center\"></td>\n</tr>"), Adjust (s), "tr-3a");
309 		}
310 
311 		[Test]
312 		[ExpectedException (typeof (NullReferenceException))]
ControlsAdd_Null()313 		public void ControlsAdd_Null ()
314 		{
315 			GetNewTableRow ().Controls.Add (null);
316 		}
317 
318 		[Test]
319 		[ExpectedException (typeof (ArgumentException))]
ControlsAdd_LiteralControl()320 		public void ControlsAdd_LiteralControl ()
321 		{
322 			GetNewTableRow ().Controls.Add (new LiteralControl ("mono"));
323 		}
324 
325 		[Test]
ControlsAdd_TableCell()326 		public void ControlsAdd_TableCell ()
327 		{
328 			TableRow tr = GetNewTableRow ();
329 			tr.Controls.Add (new TableCell ());
330 			Assert.AreEqual (1, tr.Controls.Count, "Controls");
331 			Assert.AreEqual (1, tr.Cells.Count, "Cells");
332 		}
333 
334 		[Test]
ControlsAdd_TestTableRow()335 		public void ControlsAdd_TestTableRow ()
336 		{
337 			TableRow tr = GetNewTableRow ();
338 			tr.Controls.Add (new TestTableCell ());
339 			Assert.AreEqual (1, tr.Controls.Count, "Controls");
340 			Assert.AreEqual (1, tr.Cells.Count, "Cells");
341 		}
342 
343 		[Test]
344 		[ExpectedException (typeof (NullReferenceException))]
ControlsAddAt_Null()345 		public void ControlsAddAt_Null ()
346 		{
347 			GetNewTableRow ().Controls.AddAt (0, null);
348 		}
349 
350 		[Test]
351 		[ExpectedException (typeof (ArgumentException))]
352 		// note: for Table it's ArgumentOutOfRangeException
ControlsAddAt_Negative()353 		public void ControlsAddAt_Negative ()
354 		{
355 			GetNewTableRow ().Controls.AddAt (Int32.MinValue, new TableRow ());
356 		}
357 
358 		[Test]
359 		[ExpectedException (typeof (ArgumentException))]
ControlsAddAt_LiteralControl()360 		public void ControlsAddAt_LiteralControl ()
361 		{
362 			GetNewTableRow ().Controls.AddAt (0, new LiteralControl ("mono"));
363 		}
364 
365 		[Test]
ControlsAddAt_TableRow()366 		public void ControlsAddAt_TableRow ()
367 		{
368 			TableRow tr = GetNewTableRow ();
369 			tr.Controls.AddAt (0, new TableCell ());
370 			Assert.AreEqual (1, tr.Controls.Count, "Controls");
371 			Assert.AreEqual (1, tr.Cells.Count, "Cells");
372 		}
373 
374 		[Test]
ControlsAddAt_TestTableRow()375 		public void ControlsAddAt_TestTableRow ()
376 		{
377 			TableRow tr = GetNewTableRow ();
378 			tr.Controls.AddAt (0, new TestTableCell ());
379 			Assert.AreEqual (1, tr.Controls.Count, "Controls");
380 			Assert.AreEqual (1, tr.Cells.Count, "Cells");
381 		}
382 
383 		[Test]
384 		[ExpectedException (typeof (NullReferenceException))]
RenderBeginTag_Null()385 		public void RenderBeginTag_Null ()
386 		{
387 			TableRow tr = GetNewTableRow ();
388 			tr.RenderBeginTag (null);
389 		}
390 
391 		[Test]
RenderBeginTag_Empty()392 		public void RenderBeginTag_Empty ()
393 		{
394 			HtmlTextWriter writer = GetWriter ();
395 			TableRow tr = GetNewTableRow ();
396 			tr.RenderBeginTag (writer);
397 			string s = writer.InnerWriter.ToString ();
398 			Assert.AreEqual ("<tr>\n", s, "empty");
399 		}
400 
401 		[Test]
RenderBeginTag_HorizontalAlign()402 		public void RenderBeginTag_HorizontalAlign ()
403 		{
404 			HtmlTextWriter writer = GetWriter ();
405 			TableRow tr = GetNewTableRow ();
406 			tr.HorizontalAlign = HorizontalAlign.Center;
407 			tr.RenderBeginTag (writer);
408 			string s = writer.InnerWriter.ToString ();
409 			Assert.IsTrue (s.ToLower ().StartsWith ("<tr align=\"center\">"), "HorizontalAlign");
410 		}
411 
412 		[Test]
RenderBeginTag_Cells()413 		public void RenderBeginTag_Cells ()
414 		{
415 			HtmlTextWriter writer = GetWriter ();
416 			TableRow tr = GetNewTableRow ();
417 			tr.Cells.Add (new TableCell ());
418 			tr.RenderBeginTag (writer);
419 			string s = writer.InnerWriter.ToString ();
420 			Assert.AreEqual ("<tr>\n", s, "td");
421 		}
422 	}
423 }
424