1 //
2 // DynamicControlTest.cs
3 //
4 // Authors:
5 //      Marek Habersack <mhabersack@novell.com>
6 //
7 // Copyright (C) 2009 Novell Inc. http://novell.com
8 //
9 
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 using System;
31 using System.Collections;
32 using System.Collections.Generic;
33 using System.Collections.ObjectModel;
34 using System.Collections.Specialized;
35 using System.ComponentModel.DataAnnotations;
36 using System.Data.SqlClient;
37 using System.Data.Linq;
38 using System.Data.Linq.Mapping;
39 using System.Globalization;
40 using System.Linq;
41 using System.Net;
42 using System.Reflection;
43 using System.Security.Permissions;
44 using System.Security.Principal;
45 using System.Web;
46 using System.Web.UI;
47 using System.Web.DynamicData;
48 using System.Web.DynamicData.ModelProviders;
49 using System.Web.Routing;
50 using System.Web.UI.HtmlControls;
51 using System.Web.UI.WebControls;
52 using System.IO;
53 
54 using NUnit.Framework;
55 using MonoTests.stand_alone.WebHarness;
56 using MonoTests.SystemWeb.Framework;
57 using MonoTests.Common;
58 using MonoTests.DataSource;
59 using MonoTests.DataObjects;
60 
61 using MetaModel = System.Web.DynamicData.MetaModel;
62 using MetaTable = System.Web.DynamicData.MetaTable;
63 
64 namespace MonoTests.System.Web.DynamicData
65 {
66 	[TestFixture]
67 	public class DynamicControlTest
68 	{
69 		[SetUp]
PerTestSetUp()70 		public void PerTestSetUp ()
71 		{
72 			// This is ran before every test
73 			FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
74 			FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
75 		}
76 
77 		[TestFixtureSetUp]
SetUp()78 		public void SetUp ()
79 		{
80 			Type type = GetType ();
81 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx", "ListView_DynamicControl_01.aspx");
82 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs", "ListView_DynamicControl_01.aspx.cs");
83 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_02.aspx", "ListView_DynamicControl_02.aspx");
84 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_02.aspx.cs", "ListView_DynamicControl_02.aspx.cs");
85 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx", "ListView_DynamicControl_03.aspx");
86 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx.cs", "ListView_DynamicControl_03.aspx.cs");
87 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx", "ListView_DynamicControl_04.aspx");
88 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs", "ListView_DynamicControl_04.aspx.cs");
89 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_05.aspx", "ListView_DynamicControl_05.aspx");
90 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_05.aspx.cs", "ListView_DynamicControl_05.aspx.cs");
91 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_06.aspx", "ListView_DynamicControl_06.aspx");
92 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_06.aspx.cs", "ListView_DynamicControl_06.aspx.cs");
93 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_07.aspx", "ListView_DynamicControl_07.aspx");
94 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_07.aspx.cs", "ListView_DynamicControl_07.aspx.cs");
95 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_08.aspx", "ListView_DynamicControl_08.aspx");
96 			WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_08.aspx.cs", "ListView_DynamicControl_08.aspx.cs");
97 		}
98 
99 		[TestFixtureTearDown]
TearDown()100 		public void TearDown ()
101 		{
102 			FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
103 			FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
104 			WebTest.Unload ();
105 		}
106 
107 		[Test]
Defaults()108 		public void Defaults ()
109 		{
110 			var dc = new DynamicControl ();
111 
112 			Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#A1");
113 			Assert.AreEqual (null, dc.Column, "#A2");
114 			Assert.AreEqual (false, dc.ConvertEmptyStringToNull, "#A3");
115 			Assert.AreEqual (String.Empty, dc.CssClass, "#A4");
116 			Assert.AreEqual (String.Empty, dc.DataField, "#A5");
117 			Assert.AreEqual (String.Empty, dc.DataFormatString, "#A6");
118 			Assert.AreEqual (null, dc.FieldTemplate, "#A7");
119 			Assert.AreEqual (true, dc.HtmlEncode, "#A8");
120 			Assert.AreEqual (dc, ((IFieldTemplateHost)dc).FormattingOptions, "#A9");
121 			Assert.AreEqual (DataBoundControlMode.ReadOnly, dc.Mode, "#A10");
122 			Assert.AreEqual (String.Empty, dc.NullDisplayText, "#A11");
123 			// Throws NREX on .NET .... (why am I still surprised by this?)
124 			// Calls DynamicDataExtensions.FindMetaTable which is where the exception is thrown from
125 			// Assert.AreEqual (null, dc.Table, "#A12");
126 			Assert.AreEqual (String.Empty, dc.UIHint, "#A13");
127 			Assert.AreEqual (String.Empty, dc.ValidationGroup, "#A14");
128 		}
129 
130 		[Test]
ApplyFormatInEditMode()131 		public void ApplyFormatInEditMode ()
132 		{
133 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
134 			test.Invoker = PageInvoker.CreateOnLoad (ApplyFormatInEditMode_OnLoad);
135 			var p = test.Run ();
136 			Assert.IsNotNull (test.Response, "#X1");
137 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
138 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
139 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
140 		}
141 
ApplyFormatInEditMode_OnLoad(Page p)142 		static void ApplyFormatInEditMode_OnLoad (Page p)
143 		{
144 			var lc = p.FindControl ("ListView1") as ListView;
145 			Assert.IsNotNull (lc, "#A1");
146 
147 			var dc = lc.FindChild<DynamicControl> ("FirstName");
148 			Assert.IsNotNull (dc, "#B1-1");
149 			Assert.AreEqual ("FirstName", dc.ID, "#B1-2");
150 			Assert.AreEqual (false, dc.Column.ApplyFormatInEditMode, "#B1-3");
151 			Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#B1-4");
152 
153 			dc = lc.FindChild<DynamicControl> ("Active");
154 			Assert.IsNotNull (dc, "#C1");
155 			Assert.AreEqual ("Active", dc.ID, "#C1-1");
156 			Assert.AreEqual (true, dc.Column.ApplyFormatInEditMode, "#C1-2");
157 			Assert.AreEqual (true, dc.ApplyFormatInEditMode, "#C1-3");
158 
159 			dc.ApplyFormatInEditMode = false;
160 			Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#C1-4");
161 			Assert.AreEqual (true, dc.Column.ApplyFormatInEditMode, "#C1-5");
162 		}
163 
164 		[Test]
Column()165 		public void Column ()
166 		{
167 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
168 			test.Invoker = PageInvoker.CreateOnLoad (Column_OnLoad);
169 			var p = test.Run ();
170 			Assert.IsNotNull (test.Response, "#X1");
171 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
172 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
173 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
174 		}
175 
Column_OnLoad(Page p)176 		static void Column_OnLoad (Page p)
177 		{
178 			var lc = p.FindControl ("ListView1") as ListView;
179 			Assert.IsNotNull (lc, "#A1");
180 
181 			var dc = lc.FindChild<DynamicControl> ("FirstName");
182 			Assert.IsNotNull (dc, "#A1-1");
183 			Assert.IsNotNull (dc.Column, "#B1");
184 
185 			// Safe not to check for GetModel's return value - it throws if model isn't found, same
186 			// goes for GetTable and GetColumn
187 			MetaTable table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("EmployeeTable");
188 			MetaColumn column = table.GetColumn ("FirstName");
189 			Assert.AreEqual (column, dc.Column, "#B1-1");
190 			Assert.AreEqual (dc.Column.Table, dc.Table, "#B1-2");
191 
192 			dc.Column = column;
193 			Assert.AreEqual (column, dc.Column, "#C1-3");
194 
195 			column = table.GetColumn ("Active");
196 			dc.Column = column;
197 			Assert.AreEqual (column, dc.Column, "#C1-4");
198 
199 			// Talk about consistency...
200 			table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("SeasonalEmployeeTable");
201 			column = table.GetColumn ("FirstName");
202 			dc.Column = column;
203 
204 			Assert.AreNotEqual (dc.Column.Table, dc.Table, "#C1-5");
205 		}
206 
207 		[Test]
ConvertEmptyStringToNull()208 		public void ConvertEmptyStringToNull ()
209 		{
210 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
211 			test.Invoker = PageInvoker.CreateOnLoad (ConvertEmptyStringToNull_OnLoad);
212 			var p = test.Run ();
213 			Assert.IsNotNull (test.Response, "#X1");
214 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
215 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
216 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
217 		}
218 
ConvertEmptyStringToNull_OnLoad(Page p)219 		static void ConvertEmptyStringToNull_OnLoad (Page p)
220 		{
221 			var lc = p.FindControl ("ListView1") as ListView;
222 			Assert.IsNotNull (lc, "#A1");
223 
224 			var dc = lc.FindChild<DynamicControl> ("FirstName");
225 			Assert.IsNotNull (dc, "#B1-1");
226 			Assert.AreEqual ("FirstName", dc.ID, "#B1-2");
227 			Assert.AreEqual (true, dc.Column.ConvertEmptyStringToNull, "#B1-3");
228 			Assert.AreEqual (true, dc.ConvertEmptyStringToNull, "#B1-4");
229 
230 			dc = lc.FindChild<DynamicControl> ("LastName");
231 			Assert.IsNotNull (dc, "#C1");
232 			Assert.AreEqual (true, dc.ConvertEmptyStringToNull, "#C1-1");
233 
234 			dc.ConvertEmptyStringToNull = false;
235 			Assert.AreEqual (false, dc.ConvertEmptyStringToNull, "#C1-2");
236 			Assert.AreEqual (true, dc.Column.ConvertEmptyStringToNull, "#C1-3");
237 		}
238 
239 		[Test]
CssClass()240 		public void CssClass ()
241 		{
242 			var dc = new DynamicControl ();
243 			dc.CssClass = "MyCssClass";
244 			Assert.AreEqual ("MyCssClass", dc.CssClass, "#A1");
245 
246 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
247 			test.Invoker = PageInvoker.CreateOnLoad (CssClass_OnLoad);
248 			var p = test.Run ();
249 			Assert.IsNotNull (test.Response, "#X1");
250 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
251 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
252 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
253 
254 			string html = @"<span class=""activeCssClass"">
255 
256 <span class=""field"">Active</span>:";
257 			Assert.IsTrue (p.IndexOf (html.Replace ("\r\n", "\n")) != -1, "#Y1");
258 		}
259 
CssClass_OnLoad(Page p)260 		static void CssClass_OnLoad (Page p)
261 		{
262 			var lc = p.FindControl ("ListView1") as ListView;
263 			Assert.IsNotNull (lc, "#B1");
264 
265 			var dc = lc.FindChild<PokerDynamicControl> ("Active");
266 			Assert.IsNotNull (dc, "#C1");
267 			Assert.AreEqual ("Active", dc.DataField, "#C1-1");
268 			Assert.AreEqual ("activeCssClass", dc.CssClass, "#C1-2");
269 		}
270 
271 		[Test]
DataField()272 		public void DataField ()
273 		{
274 			var dc = new DynamicControl ();
275 
276 			Assert.AreEqual (String.Empty, dc.DataField, "#A1");
277 			dc.DataField = "MyField";
278 			Assert.AreEqual ("MyField", dc.DataField, "#A2");
279 
280 			dc.DataField = "AnotherField";
281 			Assert.AreEqual ("AnotherField", dc.DataField, "#A3");
282 
283 			dc.DataField = String.Empty;
284 			Assert.AreEqual (String.Empty, dc.DataField, "#A4");
285 
286 			dc.DataField = null;
287 			Assert.AreEqual (String.Empty, dc.DataField, "#A5");
288 		}
289 
290 		[Test]
DataField_1()291 		public void DataField_1 ()
292 		{
293 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
294 			test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_1);
295 			var p = test.Run ();
296 			Assert.IsNotNull (test.Response, "#X1");
297 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
298 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
299 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
300 		}
301 
DataField_OnLoad_1(Page p)302 		static void DataField_OnLoad_1 (Page p)
303 		{
304 			var lc = p.FindControl ("ListView1") as ListView;
305 			Assert.IsNotNull (lc, "#A1");
306 
307 			var dc = lc.FindChild<DynamicControl> ("FirstName");
308 			Assert.IsNotNull (dc, "#A1-1");
309 			Assert.IsNotNull (dc.DataField, "#A1-2");
310 			Assert.AreEqual ("FirstName", dc.DataField, "#A1-3");
311 
312 			// Column and Table aren't set on DataField assignment...
313 			dc.DataField = "Active";
314 			Assert.AreEqual ("Active", dc.DataField, "#B1");
315 			Assert.AreEqual ("FirstName", dc.Column.Name, "#B1-1");
316 
317 			dc.DataField = String.Empty;
318 			Assert.AreEqual (String.Empty, dc.DataField, "#C1");
319 			Assert.AreEqual ("FirstName", dc.Column.Name, "#C1-1");
320 
321 			dc.DataField = null;
322 			Assert.AreEqual (String.Empty, dc.DataField, "#D1");
323 			Assert.AreEqual ("FirstName", dc.Column.Name, "#D1-1");
324 		}
325 
326 		[Test]
DataField_2()327 		public void DataField_2 ()
328 		{
329 			var dc = new DynamicControl ();
330 
331 			dc.DataField = null;
332 			Assert.AreEqual (String.Empty, dc.DataField, "#A1");
333 
334 			var c = dc.Column;
335 			Assert.IsNull (c, "#A1-1");
336 
337 			dc.DataField = "MyField";
338 			Assert.AreEqual ("MyField", dc.DataField, "#B1");
339 
340 			c = dc.Column;
341 			Assert.IsNull (c, "#B1-1");
342 		}
343 
344 		[Test]
DataField_3()345 		public void DataField_3 ()
346 		{
347 			var test = new WebTest ("ListView_DynamicControl_05.aspx");
348 			test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_3);
349 			var p = test.Run ();
350 			Assert.IsNotNull (test.Response, "#X1");
351 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
352 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
353 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
354 		}
355 
DataField_OnLoad_3(Page p)356 		static void DataField_OnLoad_3 (Page p)
357 		{
358 			var lc = p.FindControl ("ListView1") as ListView;
359 			Assert.IsNotNull (lc, "#A1");
360 
361 			// System.InvalidOperationException : System.InvalidOperationException: The 'PokerDynamicControl' control 'FirstName' must have a DataField attribute.
362 			//   at System.Web.DynamicData.DynamicControl.ResolveColumn()
363 			//   at System.Web.DynamicData.DynamicControl.OnInit(EventArgs e)
364 
365 			Assert.Throws<InvalidOperationException> (() => {
366 				var c = lc.FindChild<DynamicControl> ("FirstName");
367 			}, "#A1");
368 		}
369 
370 		[Test]
DataField_4()371 		public void DataField_4 ()
372 		{
373 			var test = new WebTest ("ListView_DynamicControl_06.aspx");
374 			test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_4);
375 			var p = test.Run ();
376 			Assert.IsNotNull (test.Response, "#X1");
377 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
378 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
379 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
380 		}
381 
DataField_OnLoad_4(Page p)382 		static void DataField_OnLoad_4 (Page p)
383 		{
384 			var lc = p.FindControl ("ListView1") as ListView;
385 			Assert.IsNotNull (lc, "#A1");
386 
387 			// System.InvalidOperationException : System.InvalidOperationException: The table 'EmployeeTable' does not have a column named 'NoSuchColumn'.
388 			//   at System.Web.DynamicData.MetaTable.GetColumn(String columnName)
389 			//   at System.Web.DynamicData.DynamicControl.ResolveColumn()
390 			//   at System.Web.DynamicData.DynamicControl.OnInit(EventArgs e)
391 
392 			Assert.Throws<InvalidOperationException> (() => {
393 				var dc = lc.FindChild<DynamicControl> ("FirstName");
394 			}, "#A1");
395 		}
396 
397 		[Test]
DataField_5()398 		public void DataField_5 ()
399 		{
400 			var test = new WebTest ("ListView_DynamicControl_07.aspx");
401 			test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_5);
402 			var p = test.Run ();
403 			Assert.IsNotNull (test.Response, "#X1");
404 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
405 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
406 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
407 		}
408 
DataField_OnLoad_5(Page p)409 		static void DataField_OnLoad_5 (Page p)
410 		{
411 			var lc = p.FindControl ("ListView1") as ListView;
412 			Assert.IsNotNull (lc, "#A1");
413 
414 			// If Column is intialized before OnInit is run, the column is not resolved - no exception here.
415 			var dc = lc.FindChild<DynamicControl> ("FirstName");
416 			Assert.IsNotNull (dc, "#A1");
417 			Assert.AreEqual ("FirstName", dc.Column.Name, "#A1-1");
418 		}
419 
420 		[Test]
DataFormatString()421 		public void DataFormatString ()
422 		{
423 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
424 			test.Invoker = PageInvoker.CreateOnLoad (DataFormatString_OnLoad);
425 			var p = test.Run ();
426 			Assert.IsNotNull (test.Response, "#X1");
427 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
428 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
429 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
430 		}
431 
DataFormatString_OnLoad(Page p)432 		static void DataFormatString_OnLoad (Page p)
433 		{
434 			var lc = p.FindControl ("ListView1") as ListView;
435 			Assert.IsNotNull (lc, "#A1");
436 
437 			var dc = lc.FindChild<DynamicControl> ("FirstName");
438 			Assert.IsNotNull (dc, "#B1-1");
439 			Assert.AreEqual ("FirstName", dc.ID, "#B1-2");
440 			Assert.AreEqual (String.Empty, dc.Column.DataFormatString, "#B1-3");
441 			Assert.AreEqual (String.Empty, dc.DataFormatString, "#B1-4");
442 
443 			dc = lc.FindChild<DynamicControl> ("Active");
444 			Assert.IsNotNull (dc, "#C1");
445 			Assert.AreEqual ("Active", dc.ID, "#C1-1");
446 			Assert.AreEqual ("Boolean value: {0}", dc.Column.DataFormatString, "#C1-2");
447 			Assert.AreEqual ("Boolean value: {0}", dc.DataFormatString, "#C1-3");
448 
449 			dc.DataFormatString = String.Empty;
450 			Assert.AreEqual (String.Empty, dc.DataFormatString, "#C1-4");
451 			Assert.AreEqual ("Boolean value: {0}", dc.Column.DataFormatString, "#C1-5");
452 		}
453 
454 		[Test]
FieldTemplate()455 		public void FieldTemplate ()
456 		{
457 			var test = new WebTest ("ListView_DynamicControl_03.aspx");
458 			test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad);
459 			var p = test.Run ();
460 			Assert.IsNotNull (test.Response, "#X1");
461 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
462 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
463 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
464 		}
465 
FieldTemplate_OnLoad(Page p)466 		static void FieldTemplate_OnLoad (Page p)
467 		{
468 			var lc = p.FindControl ("ListView3") as ListView;
469 			Assert.IsNotNull (lc, "#A1");
470 
471 			int counter = 1;
472 			foreach (var entry in FieldTemplatePathTables.FieldTemplateReadOnlyColumns) {
473 				string columnName = entry.ColumnName;
474 				var dc = lc.FindChild<PokerDynamicControl> (columnName);
475 				Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1}", counter, columnName));
476 				Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
477 
478 				var templateControl = dc.FieldTemplate;
479 				var template = templateControl as FieldTemplateUserControl;
480 				if (entry.IsNull) {
481 					Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
482 					Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
483 				} else {
484 					Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName));
485 					Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName));
486 					Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName));
487 				}
488 
489 				counter++;
490 			}
491 		}
492 
493 		[Test]
FieldTemplate_1()494 		public void FieldTemplate_1 ()
495 		{
496 			var test = new WebTest ("ListView_DynamicControl_04.aspx");
497 			var p = test.Run ();
498 
499 			// Fake post-back
500 			var delegates = new PageDelegates ();
501 			delegates.PreRenderComplete = FieldTemplate_OnPreRenderComplete_1;
502 			test.Invoker = new PageInvoker (delegates);
503 			var fr = new FormRequest (test.Response, "form1");
504 #if TARGET_DOTNET
505 			fr.Controls.Add ("ListView4$ctrl0$editMe");
506 			fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
507 #else
508 			fr.Controls.Add ("ListView4$ctl01$editMe");
509 			fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
510 #endif
511 			test.Request = fr;
512 			p = test.Run ();
513 
514 			Assert.IsNotNull (test.Response, "#X1");
515 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
516 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
517 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
518 		}
519 
FieldTemplate_OnPreRenderComplete_1(Page p)520 		static void FieldTemplate_OnPreRenderComplete_1 (Page p)
521 		{
522 			var lc = p.FindControl ("ListView4") as ListView;
523 			Assert.IsNotNull (lc, "#A1");
524 
525 			int counter = 1;
526 			foreach (var entry in FieldTemplatePathTables.FieldTemplateEditColumns) {
527 				string columnName = entry.ColumnName;
528 				var dc = lc.FindChild<PokerDynamicControl> (columnName);
529 				Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
530 				Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
531 
532 				var templateControl = dc.FieldTemplate;
533 				var template = templateControl as FieldTemplateUserControl;
534 				if (entry.IsNull) {
535 					Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
536 					Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
537 				} else {
538 					Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName));
539 					Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName));
540 					Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName));
541 				}
542 
543 				counter++;
544 			}
545 		}
546 
547 		// This tests full type name templates
548 		[Test]
FieldTemplate_2()549 		public void FieldTemplate_2 ()
550 		{
551 			FieldTemplatePathTables.SetUp_FullTypeNameTemplates (this);
552 			var test = new WebTest ("ListView_DynamicControl_03.aspx");
553 			test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_2);
554 			var p = test.Run ();
555 			Assert.IsNotNull (test.Response, "#X1");
556 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
557 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
558 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
559 
560 		}
561 
FieldTemplate_OnLoad_2(Page p)562 		static void FieldTemplate_OnLoad_2 (Page p)
563 		{
564 			var lc = p.FindControl ("ListView3") as ListView;
565 			Assert.IsNotNull (lc, "#A1");
566 
567 			int counter = 1;
568 			foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultColumns) {
569 				string columnName = entry.ColumnName;
570 				var dc = lc.FindChild<PokerDynamicControl> (columnName);
571 				Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
572 				Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
573 
574 				var templateControl = dc.FieldTemplate;
575 				var template = templateControl as FieldTemplateUserControl;
576 				if (entry.IsNull) {
577 					Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
578 					Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
579 				} else {
580 					Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName));
581 					Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName));
582 					Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName));
583 				}
584 
585 				counter++;
586 			}
587 		}
588 
589 		// This tests short type name templates
590 		[Test]
FieldTemplate_3()591 		public void FieldTemplate_3 ()
592 		{
593 			try {
594 				FieldTemplatePathTables.SetUp_ShortTypeNameTemplates (this);
595 				var test = new WebTest ("ListView_DynamicControl_03.aspx");
596 				test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_3);
597 				var p = test.Run ();
598 				Assert.IsNotNull (test.Response, "#X1");
599 				Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
600 				Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
601 				Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
602 			} finally {
603 
604 			}
605 		}
606 
FieldTemplate_OnLoad_3(Page p)607 		static void FieldTemplate_OnLoad_3 (Page p)
608 		{
609 			var lc = p.FindControl ("ListView3") as ListView;
610 			Assert.IsNotNull (lc, "#A1");
611 
612 			int counter = 1;
613 			foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultShortColumns) {
614 				string columnName = entry.ColumnName;
615 				var dc = lc.FindChild<PokerDynamicControl> (columnName);
616 				Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
617 				Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
618 
619 				var templateControl = dc.FieldTemplate;
620 				var template = templateControl as FieldTemplateUserControl;
621 				if (entry.IsNull) {
622 					Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
623 					Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
624 				} else {
625 					Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName));
626 					Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName));
627 					Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName));
628 				}
629 
630 				counter++;
631 			}
632 		}
633 
634 		[Test]
GetAttribute()635 		public void GetAttribute ()
636 		{
637 			var dc = new DynamicControl ();
638 			Assert.AreEqual (String.Empty, dc.GetAttribute ("NoSuchAttribute"), "#A1");
639 
640 			dc.SetAttribute ("MyAttribute", "value");
641 			Assert.AreEqual ("value", dc.GetAttribute ("MyAttribute"), "#B1");
642 
643 			// Nice...
644 			Assert.Throws<KeyNotFoundException> (() => {
645 				dc.GetAttribute ("NoSuchAttribute");
646 			}, "#C1");
647 		}
648 
649 		[Test]
HtmlEncode()650 		public void HtmlEncode ()
651 		{
652 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
653 			test.Invoker = PageInvoker.CreateOnLoad (HtmlEncode_OnLoad);
654 			var p = test.Run ();
655 			Assert.IsNotNull (test.Response, "#X1");
656 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
657 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
658 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
659 		}
660 
HtmlEncode_OnLoad(Page p)661 		static void HtmlEncode_OnLoad (Page p)
662 		{
663 			var lc = p.FindControl ("ListView1") as ListView;
664 			Assert.IsNotNull (lc, "#A1");
665 
666 			var dc = lc.FindChild<DynamicControl> ("FirstName");
667 			Assert.IsNotNull (dc, "#A1-1");
668 			Assert.IsNotNull (dc.Column, "#A1-2");
669 
670 			Assert.AreEqual (true, dc.HtmlEncode, "#B1");
671 			Assert.AreEqual (dc.HtmlEncode, dc.Column.HtmlEncode, "#B1-1");
672 
673 			dc.HtmlEncode = false;
674 			Assert.AreEqual (false, dc.HtmlEncode, "#C1");
675 			Assert.AreNotEqual (dc.HtmlEncode, dc.Column.HtmlEncode, "#C1-1");
676 		}
677 
678 		[Test]
IFieldTemplateHost_FormattingOptions()679 		public void IFieldTemplateHost_FormattingOptions ()
680 		{
681 			var dc = new DynamicControl ();
682 
683 			Assert.IsNotNull (((IFieldTemplateHost)dc).FormattingOptions, "#A1");
684 			Assert.AreEqual (dc, ((IFieldTemplateHost)dc).FormattingOptions, "#A2");
685 		}
686 
687 		[Test]
Mode()688 		public void Mode ()
689 		{
690 			var dc = new DynamicControl (DataBoundControlMode.Edit);
691 			Assert.AreEqual (DataBoundControlMode.Edit, dc.Mode, "#A1");
692 
693 			dc.Mode = DataBoundControlMode.Insert;
694 			Assert.AreEqual (DataBoundControlMode.Insert, dc.Mode, "#A2");
695 
696 			dc.Mode = DataBoundControlMode.ReadOnly;
697 			Assert.AreEqual (DataBoundControlMode.ReadOnly, dc.Mode, "#A3");
698 		}
699 
700 		[Test]
NullDisplayText()701 		public void NullDisplayText ()
702 		{
703 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
704 			test.Invoker = PageInvoker.CreateOnLoad (NullDisplayText_OnLoad);
705 			var p = test.Run ();
706 			Assert.IsNotNull (test.Response, "#X1");
707 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
708 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
709 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
710 		}
711 
NullDisplayText_OnLoad(Page p)712 		static void NullDisplayText_OnLoad (Page p)
713 		{
714 			var lc = p.FindControl ("ListView1") as ListView;
715 			Assert.IsNotNull (lc, "#A1");
716 
717 			var dc = lc.FindChild<DynamicControl> ("FirstName");
718 			Assert.IsNotNull (dc, "#A1-1");
719 			Assert.IsNotNull (dc.Column, "#A1-2");
720 
721 			Assert.AreEqual (String.Empty, dc.NullDisplayText, "#B1");
722 			Assert.AreEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#B1-1");
723 
724 			dc.NullDisplayText = "Text";
725 			Assert.AreEqual ("Text", dc.NullDisplayText, "#C1");
726 			Assert.AreNotEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#C1-1");
727 
728 			dc = lc.FindChild<DynamicControl> ("LastName");
729 			Assert.IsNotNull (dc, "#D1");
730 			Assert.IsNotNull (dc.Column, "#D1-1");
731 			Assert.AreEqual ("No value for this column", dc.NullDisplayText, "#D1-2");
732 			Assert.AreEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#D1-3");
733 
734 			dc.NullDisplayText = String.Empty;
735 			Assert.AreEqual (String.Empty, dc.NullDisplayText, "#E1");
736 			Assert.AreNotEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#E1-1");
737 		}
738 
739 		[Test]
SetAttribute()740 		public void SetAttribute ()
741 		{
742 			var dc = new PokerDynamicControl ();
743 
744 			string html = dc.RenderToString ();
745 			Assert.IsNotNull (html, "#A1");
746 
747 			dc.SetAttribute ("MyAttribute", "Value");
748 			html = dc.RenderToString ();
749 			Assert.IsNotNull (html, "#B1");
750 			Assert.AreEqual ("Value", dc.GetAttribute ("MyAttribute"), "#B2");
751 
752 			dc.SetAttribute ("MyAttribute", "Another value");
753 			Assert.AreEqual ("Another value", dc.GetAttribute ("MyAttribute"), "#C1");
754 		}
755 
756 		[Test]
SetAttribute_1()757 		public void SetAttribute_1 ()
758 		{
759 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
760 			var delegates = new PageDelegates ();
761 			delegates.PreRenderComplete = SetAttribute_OnPreRenderComplete_1;
762 			test.Invoker = new PageInvoker (delegates);
763 
764 			var p = test.Run ();
765 			Assert.IsNotNull (test.Response, "#X1");
766 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
767 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
768 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
769 		}
770 
SetAttribute_OnPreRenderComplete_1(Page p)771 		static void SetAttribute_OnPreRenderComplete_1 (Page p)
772 		{
773 			// TODO: figure out how the attributes are used. They aren't rendered along with the control,
774 			// but obviously they must be used somewhere...
775 			var lc = p.FindControl ("ListView1") as ListView;
776 			Assert.IsNotNull (lc, "#A1");
777 
778 			var dc = lc.FindChild<PokerDynamicControl> ("FirstName");
779 			Assert.IsNotNull (dc, "#A1-1");
780 
781 			string html = dc.RenderToString ();
782 			Assert.IsFalse (String.IsNullOrEmpty (html), "#B1");
783 
784 			dc.SetAttribute ("MyAttribute", "value");
785 			html = dc.RenderToString ();
786 			Assert.IsFalse (String.IsNullOrEmpty (html), "#C1");
787 		}
788 
789 		[Test]
Table()790 		public void Table ()
791 		{
792 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
793 			test.Invoker = PageInvoker.CreateOnLoad (Table_OnLoad);
794 			var p = test.Run ();
795 			Assert.IsNotNull (test.Response, "#X1");
796 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
797 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
798 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
799 		}
800 
Table_OnLoad(Page p)801 		static void Table_OnLoad (Page p)
802 		{
803 			var lc = p.FindControl ("ListView1") as ListView;
804 			Assert.IsNotNull (lc, "#A1");
805 
806 			var dc = lc.FindChild<DynamicControl> ("FirstName");
807 			Assert.IsNotNull (dc, "#A1-1");
808 			Assert.IsNotNull (dc.Table, "#B1");
809 
810 			// Safe not to check for GetModel's return value - it throws if model isn't found, same
811 			// goes for GetTable
812 			MetaTable table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("EmployeeTable");
813 			Assert.AreEqual (table, dc.Table, "#B1-1");
814 			Assert.AreEqual (dc.Table, dc.Column.Table, "#B1-2");
815 		}
816 
817 		[Test]
UIHint()818 		public void UIHint ()
819 		{
820 			var test = new WebTest ("ListView_DynamicControl_01.aspx");
821 			test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad);
822 			var p = test.Run ();
823 			Assert.IsNotNull (test.Response, "#X1");
824 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
825 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
826 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
827 
828 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">LastName</span>: <span class=\"customFieldTemplate\">") != -1, "#Y1");
829 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">FirstName</span>: <span class=\"defaultTemplate\">") != -1, "#Y1-1");
830 		}
831 
UIHint_OnLoad(Page p)832 		static void UIHint_OnLoad (Page p)
833 		{
834 			var lc = p.FindControl ("ListView1") as ListView;
835 			Assert.IsNotNull (lc, "#A1");
836 
837 			var dc = lc.FindChild<DynamicControl> ("FirstName");
838 			Assert.IsNotNull (dc, "#B1");
839 			Assert.AreEqual ("FirstName", dc.DataField, "#B1-1");
840 
841 			// Changes below won't affect rendering - we're being called too late in the process
842 			// This is just to test if the property is settable, what are the defaults and whether
843 			// they can be overriden
844 
845 			// No UIHint attribute on the associated field, no explicit setting
846 			Assert.AreEqual (String.Empty, dc.UIHint, "#C1");
847 			dc.UIHint = "MyCustomUIHintTemplate_Text";
848 			Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#C1-1");
849 
850 			dc = lc.FindChild<DynamicControl> ("LastName");
851 			Assert.IsNotNull (dc, "#D1");
852 			Assert.AreEqual ("LastName", dc.DataField, "#D1-1");
853 
854 			// UIHint attribute found on the associated field
855 			Assert.AreEqual ("CustomFieldTemplate", dc.UIHint, "#D1-2");
856 			dc.UIHint = "MyCustomUIHintTemplate_Text";
857 			Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#D1-3");
858 
859 			dc.UIHint = null;
860 			Assert.AreEqual (String.Empty, dc.UIHint, "#E1");
861 		}
862 
863 		[Test]
UIHint_1()864 		public void UIHint_1 ()
865 		{
866 			var test = new WebTest ("ListView_DynamicControl_02.aspx");
867 			test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad_1);
868 			var p = test.Run ();
869 			Assert.IsNotNull (test.Response, "#X1");
870 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
871 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
872 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
873 
874 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">LastName</span>: <span class=\"myCustomUIHintTemplate_Text\">") != -1, "#Y1");
875 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">FirstName</span>: <span class=\"defaultTemplate\">") != -1, "#Y1-1");
876 		}
877 
UIHint_OnLoad_1(Page p)878 		static void UIHint_OnLoad_1 (Page p)
879 		{
880 			var lc = p.FindControl ("ListView2") as ListView;
881 			Assert.IsNotNull (lc, "#A1");
882 
883 			var dc = lc.FindChild<DynamicControl> ("FirstName2");
884 			Assert.IsNotNull (dc, "#B1");
885 			Assert.AreEqual ("FirstName", dc.DataField, "#B1-1");
886 
887 			// No UIHint attribute on the associated field, no explicit setting
888 			Assert.AreEqual (String.Empty, dc.UIHint, "#C1");
889 
890 			dc = lc.FindChild<DynamicControl> ("LastName2");
891 			Assert.IsNotNull (dc, "#D1");
892 			Assert.AreEqual ("LastName", dc.DataField, "#D1-1");
893 
894 			// UIHint attribute found on the associated field but overriden in the page
895 			Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#D1-2");
896 		}
897 
898 		[Test]
UIHint_2()899 		public void UIHint_2 ()
900 		{
901 			var test = new WebTest ("ListView_DynamicControl_08.aspx");
902 			test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad_2);
903 			var p = test.Run ();
904 			Assert.IsNotNull (test.Response, "#X1");
905 			Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
906 			Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
907 			Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
908 
909 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">LastName</span>: <span class=\"customFieldTemplate\">") != -1, "#Y1");
910 			Assert.IsTrue (p.IndexOf ("<span class=\"field\">FirstName</span>: <span class=\"defaultTemplate\">") != -1, "#Y1-1");
911 		}
912 
UIHint_OnLoad_2(Page p)913 		static void UIHint_OnLoad_2 (Page p)
914 		{
915 			var lc = p.FindControl ("ListView1") as ListView;
916 			Assert.IsNotNull (lc, "#A1");
917 
918 			// Invalid field template name
919 			var dc = lc.FindChild<DynamicControl> ("FirstName");
920 			Assert.IsNotNull (dc, "#B1");
921 			Assert.AreEqual ("NonExistingTemplate", dc.UIHint, "#B1-1");
922 
923 			// Falls back to the text template
924 			Assert.IsNotNull (dc.FieldTemplate, "#C1");
925 
926 			var ftuc = dc.FieldTemplate as FieldTemplateUserControl;
927 			Assert.IsNotNull (ftuc, "#C1-2");
928 			Assert.AreEqual ("~/DynamicData/FieldTemplates/Text.ascx", ftuc.AppRelativeVirtualPath, "#C1-3");
929 		}
930 
931 		[Test]
ValidationGroup()932 		public void ValidationGroup ()
933 		{
934 			// TODO: more complicated tests involving actual page and validation
935 			var dc = new DynamicControl ();
936 			dc.ValidationGroup = "Group1";
937 			Assert.AreEqual ("Group1", dc.ValidationGroup, "#A1");
938 		}
939 	}
940 }
941