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