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