1 //
2 // DataListItemTest.cs
3 //	- Unit tests for System.Web.UI.WebControls.DataListItem
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.Collections;
32 using System.ComponentModel;
33 using System.IO;
34 using System.Web;
35 using System.Web.UI;
36 using System.Web.UI.WebControls;
37 
38 using NUnit.Framework;
39 
40 namespace MonoTests.System.Web.UI.WebControls {
41 
42 	public class TestDataListItem : DataListItem {
43 
TestDataListItem(int index, ListItemType type)44 		public TestDataListItem (int index, ListItemType type)
45 			: base (index, type)
46 		{
47 		}
48 
49 
Render(bool extractRows, bool tableLayout)50 		public string Render (bool extractRows, bool tableLayout)
51 		{
52 			StringWriter sw = new StringWriter ();
53 			sw.NewLine = "\n";
54 			HtmlTextWriter writer = new HtmlTextWriter (sw);
55 			base.RenderItem (writer, extractRows, tableLayout);
56 			return writer.InnerWriter.ToString ();
57 		}
58 
SetType(ListItemType type)59 		public void SetType (ListItemType type)
60 		{
61 			base.SetItemType (type);
62 		}
63 	}
64 
65 	[TestFixture]
66 	public class DataListItemTest {
67 
BaseTests(TestDataListItem dli)68 		private void BaseTests (TestDataListItem dli)
69 		{
70 			Assert.IsNull (dli.DataItem, "DataItem");
71 			Assert.AreEqual (String.Empty, dli.Render (true, true), "Render-Empty-T-T");
72 			Assert.AreEqual (String.Empty, dli.Render (true, false), "Render-Empty-T-F");
73 			Assert.AreEqual (String.Empty, dli.Render (false, true), "Render-Empty-F-T");
74 			Assert.AreEqual ("<span></span>", dli.Render (false, false), "Render-Empty-F-F");
75 
76 			dli.DataItem = (object)Int32.MaxValue;
77 			Assert.AreEqual (Int32.MaxValue, dli.DataItem, "DataItem-Int32");
78 			Assert.AreEqual (String.Empty, dli.Render (true, true), "Render-Int32-T-T");
79 			Assert.AreEqual (String.Empty, dli.Render (true, false), "Render-Int32-T-F");
80 			Assert.AreEqual (String.Empty, dli.Render (false, true), "Render-Int32-F-T");
81 			Assert.AreEqual ("<span></span>", dli.Render (false, false), "Render-Int32-F-F");
82 
83 			dli.DataItem = (object)"mono";
84 			Assert.AreEqual ("mono", dli.DataItem, "DataItem-String");
85 			Assert.AreEqual (String.Empty, dli.Render (true, true), "Render-String-T-T");
86 			Assert.AreEqual (String.Empty, dli.Render (true, false), "Render-String-T-F");
87 			Assert.AreEqual (String.Empty, dli.Render (false, true), "Render-String-F-T");
88 			Assert.AreEqual ("<span></span>", dli.Render (false, false), "Render-String-F-F");
89 		}
90 
DataItemContainer(TestDataListItem dli, int index)91 		private void DataItemContainer (TestDataListItem dli, int index)
92 		{
93 			IDataItemContainer dic = (dli as IDataItemContainer);
94 			Assert.IsNull (dic.DataItem, "IDataItemContainer-DataItem");
95 			Assert.AreEqual (index, dic.DataItemIndex, "IDataItemContainer-DataItemIndex");
96 			Assert.AreEqual (index, dic.DisplayIndex, "IDataItemContainer-DisplayIndex");
97 		}
98 
99 		[Test]
AlternatingItem()100 		public void AlternatingItem ()
101 		{
102 			TestDataListItem dli = new TestDataListItem (0, ListItemType.AlternatingItem);
103 			Assert.AreEqual (0, dli.ItemIndex, "ItemIndex");
104 			Assert.AreEqual (ListItemType.AlternatingItem, dli.ItemType, "ItemType");
105 
106 			DataItemContainer (dli, 0);
107 			BaseTests (dli);
108 
109 			dli.SetType (ListItemType.EditItem);
110 			Assert.AreEqual (ListItemType.EditItem, dli.ItemType, "SetItemType");
111 		}
112 
113 		[Test]
EditItem()114 		public void EditItem ()
115 		{
116 			TestDataListItem dli = new TestDataListItem (Int32.MaxValue, ListItemType.EditItem);
117 			Assert.AreEqual (Int32.MaxValue, dli.ItemIndex, "ItemIndex");
118 			Assert.AreEqual (ListItemType.EditItem, dli.ItemType, "ItemType");
119 
120 			DataItemContainer (dli, Int32.MaxValue);
121 			BaseTests (dli);
122 
123 			dli.SetType (ListItemType.Footer);
124 			Assert.AreEqual (ListItemType.Footer, dli.ItemType, "SetItemType");
125 		}
126 
127 		[Test]
Footer()128 		public void Footer ()
129 		{
130 			TestDataListItem dli = new TestDataListItem (Int32.MinValue, ListItemType.Footer);
131 			Assert.AreEqual (Int32.MinValue, dli.ItemIndex, "ItemIndex");
132 			Assert.AreEqual (ListItemType.Footer, dli.ItemType, "ItemType");
133 
134 			DataItemContainer (dli, Int32.MinValue);
135 			BaseTests (dli);
136 
137 			dli.SetType (ListItemType.Header);
138 			Assert.AreEqual (ListItemType.Header, dli.ItemType, "SetItemType");
139 		}
140 
141 		[Test]
Header()142 		public void Header ()
143 		{
144 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Header);
145 			Assert.AreEqual (0, dli.ItemIndex, "ItemIndex");
146 			Assert.AreEqual (ListItemType.Header, dli.ItemType, "ItemType");
147 
148 			DataItemContainer (dli, 0);
149 			BaseTests (dli);
150 
151 			dli.SetType (ListItemType.Item);
152 			Assert.AreEqual (ListItemType.Item, dli.ItemType, "SetItemType");
153 		}
154 
155 		[Test]
Item()156 		public void Item ()
157 		{
158 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Item);
159 			Assert.AreEqual (0, dli.ItemIndex, "ItemIndex");
160 			Assert.AreEqual (ListItemType.Item, dli.ItemType, "ItemType");
161 
162 			DataItemContainer (dli, 0);
163 			BaseTests (dli);
164 
165 			dli.SetType (ListItemType.Pager);
166 			Assert.AreEqual (ListItemType.Pager, dli.ItemType, "SetItemType");
167 		}
168 
169 		[Test]
Pager()170 		public void Pager ()
171 		{
172 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Pager);
173 			Assert.AreEqual (0, dli.ItemIndex, "ItemIndex");
174 			Assert.AreEqual (ListItemType.Pager, dli.ItemType, "ItemType");
175 
176 			DataItemContainer (dli, 0);
177 			BaseTests (dli);
178 
179 			dli.SetType (ListItemType.SelectedItem);
180 			Assert.AreEqual (ListItemType.SelectedItem, dli.ItemType, "SetItemType");
181 		}
182 
183 		[Test]
SelectedItem()184 		public void SelectedItem ()
185 		{
186 			TestDataListItem dli = new TestDataListItem (1, ListItemType.SelectedItem);
187 			Assert.AreEqual (1, dli.ItemIndex, "ItemIndex");
188 			Assert.AreEqual (ListItemType.SelectedItem, dli.ItemType, "ItemType");
189 
190 			DataItemContainer (dli, 1);
191 			BaseTests (dli);
192 
193 			dli.SetType (ListItemType.Separator);
194 			Assert.AreEqual (ListItemType.Separator, dli.ItemType, "SetItemType");
195 		}
196 
197 		[Test]
Separator()198 		public void Separator ()
199 		{
200 			TestDataListItem dli = new TestDataListItem (-1, ListItemType.Separator);
201 			Assert.AreEqual (-1, dli.ItemIndex, "ItemIndex");
202 			Assert.AreEqual (ListItemType.Separator, dli.ItemType, "ItemType");
203 
204 			DataItemContainer (dli, -1);
205 			BaseTests (dli);
206 
207 			dli.SetType (ListItemType.AlternatingItem);
208 			Assert.AreEqual (ListItemType.AlternatingItem, dli.ItemType, "SetItemType");
209 		}
210 
211 		[Test]
Bad_ListItemType()212 		public void Bad_ListItemType ()
213 		{
214 			TestDataListItem dli = new TestDataListItem (0, (ListItemType)Int32.MinValue);
215 			Assert.AreEqual (0, dli.ItemIndex, "ItemIndex");
216 			Assert.AreEqual ((ListItemType)Int32.MinValue, dli.ItemType, "ItemType");
217 
218 			DataItemContainer (dli, 0);
219 			BaseTests (dli);
220 		}
221 
GetTable(string s)222 		private Table GetTable (string s)
223 		{
224 			LiteralControl lc = new LiteralControl (s);
225 			TableCell td = new TableCell ();
226 			td.Controls.Add (lc);
227 			TableRow tr = new TableRow ();
228 			tr.Cells.Add (td);
229 			Table t = new Table ();
230 			t.Rows.Add (tr);
231 			return t;
232 		}
233 
Adjust(string s)234 		private string Adjust (string s)
235 		{
236 			// right now Mono doesn't generate the exact same indentation/lines as MS implementation
237 			// and different fx versions have different casing for enums
238 			return s.Replace ("\n", "").Replace ("\t", "").ToLower ();
239 		}
240 
241 		[Test]
Controls_Table()242 		public void Controls_Table ()
243 		{
244 			string origHtml1 = "<tr>\n\t<td>mono</td>\n</tr>";
245 			string origHtml2 = "<tr>\n\t<td>mono</td>\n</tr>";
246 			string origHtml3 = "<table>\n\t<tr>\n\t\t<td>mono</td>\n\t</tr>\n</table>";
247 			string origHtml4 = "<span><table>\n\t<tr>\n\t\t<td>mono</td>\n\t</tr>\n</table></span>";
248 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Item);
249 			dli.Controls.Add (GetTable ("mono"));
250 
251 			string renderedHtml = dli.Render (true, true);
252 			Assert.AreEqual (origHtml1, renderedHtml, "Render-Empty-T-T");
253 
254 			renderedHtml = dli.Render (true, false);
255 			Assert.AreEqual (origHtml2, renderedHtml, "Render-Empty-T-F");
256 
257 			renderedHtml = dli.Render (false, true);
258 			Assert.AreEqual (Adjust (origHtml3), Adjust (renderedHtml), "Render-Empty-F-T");
259 
260 			renderedHtml = dli.Render (false, false);
261 			Assert.AreEqual (Adjust (origHtml4), Adjust (renderedHtml), "Render-Empty-F-F");
262 		}
263 
264 		[Test]
Controls_Table_Dual()265 		public void Controls_Table_Dual ()
266 		{
267 			string origHtml1 = "<tr>\n\t<td>mono</td>\n</tr>";
268 			string origHtml2 = "<tr>\n\t<td>mono</td>\n</tr>";
269 			string origHtml3 = "<table>\n\t<tr>\n\t\t<td>mono</td>\n\t</tr>\n</table><table>\n\t<tr>\n\t\t<td>monkey</td>\n\t</tr>\n</table>";
270 			string origHtml4 = "<span><table>\n\t<tr>\n\t\t<td>mono</td>\n\t</tr>\n</table><table>\n\t<tr>\n\t\t<td>monkey</td>\n\t</tr>\n</table></span>";
271 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Item);
272 			dli.Controls.Add (GetTable ("mono"));
273 			dli.Controls.Add (GetTable ("monkey"));
274 
275 			// the second table is ignored if extractRows is true
276 			string renderedHtml = dli.Render (true, true);
277 			Assert.AreEqual (origHtml1, renderedHtml, "Render-Empty-T-T");
278 
279 			renderedHtml = dli.Render (true, false);
280 			Assert.AreEqual (origHtml2, renderedHtml, "Render-Empty-T-F");
281 
282 			// but not if extractRows is false
283 			renderedHtml = dli.Render (false, true);
284 			Assert.AreEqual (Adjust (origHtml3), Adjust (renderedHtml), "Render-Empty-F-T");
285 
286 			renderedHtml = dli.Render (false, false);
287 			Assert.AreEqual (Adjust (origHtml4), Adjust (renderedHtml), "Render-Empty-F-F");
288 		}
289 
290 		[Test]
Controls_LiteralControl()291 		public void Controls_LiteralControl ()
292 		{
293 			TestDataListItem dli = new TestDataListItem (0, ListItemType.Item);
294 			LiteralControl lc = new LiteralControl ("mono");
295 			dli.Controls.Add (lc);
296 
297 			// there's no table here (but there are controls), so calling Render with true for
298 			// extractRows cause a NullReferenceException on MS implementation
299 			//Assert.AreEqual ("<tr>\n\t<td></td>\n<\tr>", dli.Render (true, true), "Render-Empty-T-T");
300 			//Assert.AreEqual ("<tr>\n\t<td></td>\n<\tr>", dli.Render (true, false), "Render-Empty-T-F");
301 			Assert.AreEqual ("mono", dli.Render (false, true), "Render-Empty-F-T");
302 			Assert.AreEqual ("<span>mono</span>", dli.Render (false, false), "Render-Empty-F-F");
303 		}
304 		[Test]
SupportsDisabledAttribute()305 		public void SupportsDisabledAttribute ()
306 		{
307 			var ver40 = new Version (4, 0);
308 			var ver35 = new Version (3, 5);
309 			var p = new TestDataListItem (0, ListItemType.Item);
310 			Assert.AreEqual (ver40, p.RenderingCompatibility, "#A1-1");
311 			Assert.IsFalse (p.SupportsDisabledAttribute, "#A1-2");
312 
313 			p.RenderingCompatibility = new Version (3, 5);
314 			Assert.AreEqual (ver35, p.RenderingCompatibility, "#A2-1");
315 			Assert.IsTrue (p.SupportsDisabledAttribute, "#A2-2");
316 		}
317 	}
318 }
319