2 // DynamicControlTest.cs
5 // Marek Habersack <mhabersack@novell.com>
7 // Copyright (C) 2009 Novell Inc. http://novell.com
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
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;
42 using System.Reflection;
43 using System.Security.Permissions;
44 using System.Security.Principal;
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;
54 using NUnit.Framework;
56 using MonoTests.stand_alone.WebHarness;
57 using MonoTests.SystemWeb.Framework;
58 using MonoTests.Common;
59 using MonoTests.DataSource;
60 using MonoTests.DataObjects;
62 using MetaModel = System.Web.DynamicData.MetaModel;
63 using MetaTable = System.Web.DynamicData.MetaTable;
65 namespace MonoTests.System.Web.DynamicData
68 public class DynamicControlTest
71 public void PerTestSetUp ()
73 // This is ran before every test
74 FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
75 FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
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");
100 [TestFixtureTearDown]
101 public void TearDown ()
103 FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
104 FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
109 public void Defaults ()
111 var dc = new DynamicControl ();
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");
132 public void ApplyFormatInEditMode ()
134 var test = new WebTest ("ListView_DynamicControl_01.aspx");
135 test.Invoker = PageInvoker.CreateOnLoad (ApplyFormatInEditMode_OnLoad);
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");
143 static void ApplyFormatInEditMode_OnLoad (Page p)
145 var lc = p.FindControl ("ListView1") as ListView;
146 Assert.IsNotNull (lc, "#A1");
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");
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");
160 dc.ApplyFormatInEditMode = false;
161 Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#C1-4");
162 Assert.AreEqual (true, dc.Column.ApplyFormatInEditMode, "#C1-5");
166 public void Column ()
168 var test = new WebTest ("ListView_DynamicControl_01.aspx");
169 test.Invoker = PageInvoker.CreateOnLoad (Column_OnLoad);
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");
177 static void Column_OnLoad (Page p)
179 var lc = p.FindControl ("ListView1") as ListView;
180 Assert.IsNotNull (lc, "#A1");
182 var dc = lc.FindChild<DynamicControl> ("FirstName");
183 Assert.IsNotNull (dc, "#A1-1");
184 Assert.IsNotNull (dc.Column, "#B1");
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");
194 Assert.AreEqual (column, dc.Column, "#C1-3");
196 column = table.GetColumn ("Active");
198 Assert.AreEqual (column, dc.Column, "#C1-4");
200 // Talk about consistency...
201 table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("SeasonalEmployeeTable");
202 column = table.GetColumn ("FirstName");
205 Assert.AreNotEqual (dc.Column.Table, dc.Table, "#C1-5");
209 public void ConvertEmptyStringToNull ()
211 var test = new WebTest ("ListView_DynamicControl_01.aspx");
212 test.Invoker = PageInvoker.CreateOnLoad (ConvertEmptyStringToNull_OnLoad);
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");
220 static void ConvertEmptyStringToNull_OnLoad (Page p)
222 var lc = p.FindControl ("ListView1") as ListView;
223 Assert.IsNotNull (lc, "#A1");
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");
231 dc = lc.FindChild<DynamicControl> ("LastName");
232 Assert.IsNotNull (dc, "#C1");
233 Assert.AreEqual (true, dc.ConvertEmptyStringToNull, "#C1-1");
235 dc.ConvertEmptyStringToNull = false;
236 Assert.AreEqual (false, dc.ConvertEmptyStringToNull, "#C1-2");
237 Assert.AreEqual (true, dc.Column.ConvertEmptyStringToNull, "#C1-3");
241 public void CssClass ()
243 var dc = new DynamicControl ();
244 dc.CssClass = "MyCssClass";
245 Assert.AreEqual ("MyCssClass", dc.CssClass, "#A1");
247 var test = new WebTest ("ListView_DynamicControl_01.aspx");
248 test.Invoker = PageInvoker.CreateOnLoad (CssClass_OnLoad);
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");
255 string html = @"<span class=""activeCssClass"">
257 <span class=""field"">Active</span>:";
258 Assert.IsTrue (p.IndexOf (html) != -1, "#Y1");
261 static void CssClass_OnLoad (Page p)
263 var lc = p.FindControl ("ListView1") as ListView;
264 Assert.IsNotNull (lc, "#B1");
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");
273 public void DataField ()
275 var dc = new DynamicControl ();
277 Assert.AreEqual (String.Empty, dc.DataField, "#A1");
278 dc.DataField = "MyField";
279 Assert.AreEqual ("MyField", dc.DataField, "#A2");
281 dc.DataField = "AnotherField";
282 Assert.AreEqual ("AnotherField", dc.DataField, "#A3");
284 dc.DataField = String.Empty;
285 Assert.AreEqual (String.Empty, dc.DataField, "#A4");
288 Assert.AreEqual (String.Empty, dc.DataField, "#A5");
292 public void DataField_1 ()
294 var test = new WebTest ("ListView_DynamicControl_01.aspx");
295 test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_1);
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");
303 static void DataField_OnLoad_1 (Page p)
305 var lc = p.FindControl ("ListView1") as ListView;
306 Assert.IsNotNull (lc, "#A1");
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");
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");
318 dc.DataField = String.Empty;
319 Assert.AreEqual (String.Empty, dc.DataField, "#C1");
320 Assert.AreEqual ("FirstName", dc.Column.Name, "#C1-1");
323 Assert.AreEqual (String.Empty, dc.DataField, "#D1");
324 Assert.AreEqual ("FirstName", dc.Column.Name, "#D1-1");
328 public void DataField_2 ()
330 var dc = new DynamicControl ();
333 Assert.AreEqual (String.Empty, dc.DataField, "#A1");
336 Assert.IsNull (c, "#A1-1");
338 dc.DataField = "MyField";
339 Assert.AreEqual ("MyField", dc.DataField, "#B1");
342 Assert.IsNull (c, "#B1-1");
346 public void DataField_3 ()
348 var test = new WebTest ("ListView_DynamicControl_05.aspx");
349 test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_3);
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");
357 static void DataField_OnLoad_3 (Page p)
359 var lc = p.FindControl ("ListView1") as ListView;
360 Assert.IsNotNull (lc, "#A1");
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)
366 AssertExtensions.Throws<InvalidOperationException> (() => {
367 var c = lc.FindChild<DynamicControl> ("FirstName");
372 public void DataField_4 ()
374 var test = new WebTest ("ListView_DynamicControl_06.aspx");
375 test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_4);
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");
383 static void DataField_OnLoad_4 (Page p)
385 var lc = p.FindControl ("ListView1") as ListView;
386 Assert.IsNotNull (lc, "#A1");
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)
393 AssertExtensions.Throws<InvalidOperationException> (() => {
394 var dc = lc.FindChild<DynamicControl> ("FirstName");
399 public void DataField_5 ()
401 var test = new WebTest ("ListView_DynamicControl_07.aspx");
402 test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_5);
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");
410 static void DataField_OnLoad_5 (Page p)
412 var lc = p.FindControl ("ListView1") as ListView;
413 Assert.IsNotNull (lc, "#A1");
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");
422 public void DataFormatString ()
424 var test = new WebTest ("ListView_DynamicControl_01.aspx");
425 test.Invoker = PageInvoker.CreateOnLoad (DataFormatString_OnLoad);
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");
433 static void DataFormatString_OnLoad (Page p)
435 var lc = p.FindControl ("ListView1") as ListView;
436 Assert.IsNotNull (lc, "#A1");
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");
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");
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");
456 public void FieldTemplate ()
458 var test = new WebTest ("ListView_DynamicControl_03.aspx");
459 test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad);
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");
467 static void FieldTemplate_OnLoad (Page p)
469 var lc = p.FindControl ("ListView3") as ListView;
470 Assert.IsNotNull (lc, "#A1");
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));
479 var templateControl = dc.FieldTemplate;
480 var template = templateControl as FieldTemplateUserControl;
482 Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
483 Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
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));
495 public void FieldTemplate_1 ()
497 var test = new WebTest ("ListView_DynamicControl_04.aspx");
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");
506 fr.Controls.Add ("ListView4$ctrl0$editMe");
507 fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
509 fr.Controls.Add ("ListView4$ctl01$editMe");
510 fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
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");
521 static void FieldTemplate_OnPreRenderComplete_1 (Page p)
523 var lc = p.FindControl ("ListView4") as ListView;
524 Assert.IsNotNull (lc, "#A1");
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));
533 var templateControl = dc.FieldTemplate;
534 var template = templateControl as FieldTemplateUserControl;
536 Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
537 Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
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));
548 // This tests full type name templates
550 public void FieldTemplate_2 ()
552 FieldTemplatePathTables.SetUp_FullTypeNameTemplates (this);
553 var test = new WebTest ("ListView_DynamicControl_03.aspx");
554 test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_2);
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");
563 static void FieldTemplate_OnLoad_2 (Page p)
565 var lc = p.FindControl ("ListView3") as ListView;
566 Assert.IsNotNull (lc, "#A1");
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));
575 var templateControl = dc.FieldTemplate;
576 var template = templateControl as FieldTemplateUserControl;
578 Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
579 Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
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));
590 // This tests short type name templates
592 public void FieldTemplate_3 ()
595 FieldTemplatePathTables.SetUp_ShortTypeNameTemplates (this);
596 var test = new WebTest ("ListView_DynamicControl_03.aspx");
597 test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_3);
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");
608 static void FieldTemplate_OnLoad_3 (Page p)
610 var lc = p.FindControl ("ListView3") as ListView;
611 Assert.IsNotNull (lc, "#A1");
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));
620 var templateControl = dc.FieldTemplate;
621 var template = templateControl as FieldTemplateUserControl;
623 Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName));
624 Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName));
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));
636 public void GetAttribute ()
638 var dc = new DynamicControl ();
639 Assert.AreEqual (String.Empty, dc.GetAttribute ("NoSuchAttribute"), "#A1");
641 dc.SetAttribute ("MyAttribute", "value");
642 Assert.AreEqual ("value", dc.GetAttribute ("MyAttribute"), "#B1");
645 AssertExtensions.Throws<KeyNotFoundException> (() => {
646 dc.GetAttribute ("NoSuchAttribute");
651 public void HtmlEncode ()
653 var test = new WebTest ("ListView_DynamicControl_01.aspx");
654 test.Invoker = PageInvoker.CreateOnLoad (HtmlEncode_OnLoad);
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");
662 static void HtmlEncode_OnLoad (Page p)
664 var lc = p.FindControl ("ListView1") as ListView;
665 Assert.IsNotNull (lc, "#A1");
667 var dc = lc.FindChild<DynamicControl> ("FirstName");
668 Assert.IsNotNull (dc, "#A1-1");
669 Assert.IsNotNull (dc.Column, "#A1-2");
671 Assert.AreEqual (true, dc.HtmlEncode, "#B1");
672 Assert.AreEqual (dc.HtmlEncode, dc.Column.HtmlEncode, "#B1-1");
674 dc.HtmlEncode = false;
675 Assert.AreEqual (false, dc.HtmlEncode, "#C1");
676 Assert.AreNotEqual (dc.HtmlEncode, dc.Column.HtmlEncode, "#C1-1");
680 public void IFieldTemplateHost_FormattingOptions ()
682 var dc = new DynamicControl ();
684 Assert.IsNotNull (((IFieldTemplateHost)dc).FormattingOptions, "#A1");
685 Assert.AreEqual (dc, ((IFieldTemplateHost)dc).FormattingOptions, "#A2");
691 var dc = new DynamicControl (DataBoundControlMode.Edit);
692 Assert.AreEqual (DataBoundControlMode.Edit, dc.Mode, "#A1");
694 dc.Mode = DataBoundControlMode.Insert;
695 Assert.AreEqual (DataBoundControlMode.Insert, dc.Mode, "#A2");
697 dc.Mode = DataBoundControlMode.ReadOnly;
698 Assert.AreEqual (DataBoundControlMode.ReadOnly, dc.Mode, "#A3");
702 public void NullDisplayText ()
704 var test = new WebTest ("ListView_DynamicControl_01.aspx");
705 test.Invoker = PageInvoker.CreateOnLoad (NullDisplayText_OnLoad);
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");
713 static void NullDisplayText_OnLoad (Page p)
715 var lc = p.FindControl ("ListView1") as ListView;
716 Assert.IsNotNull (lc, "#A1");
718 var dc = lc.FindChild<DynamicControl> ("FirstName");
719 Assert.IsNotNull (dc, "#A1-1");
720 Assert.IsNotNull (dc.Column, "#A1-2");
722 Assert.AreEqual (String.Empty, dc.NullDisplayText, "#B1");
723 Assert.AreEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#B1-1");
725 dc.NullDisplayText = "Text";
726 Assert.AreEqual ("Text", dc.NullDisplayText, "#C1");
727 Assert.AreNotEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#C1-1");
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");
735 dc.NullDisplayText = String.Empty;
736 Assert.AreEqual (String.Empty, dc.NullDisplayText, "#E1");
737 Assert.AreNotEqual (dc.NullDisplayText, dc.Column.NullDisplayText, "#E1-1");
741 public void SetAttribute ()
743 var dc = new PokerDynamicControl ();
745 string html = dc.RenderToString ();
746 Assert.IsNotNull (html, "#A1");
748 dc.SetAttribute ("MyAttribute", "Value");
749 html = dc.RenderToString ();
750 Assert.IsNotNull (html, "#B1");
751 Assert.AreEqual ("Value", dc.GetAttribute ("MyAttribute"), "#B2");
753 dc.SetAttribute ("MyAttribute", "Another value");
754 Assert.AreEqual ("Another value", dc.GetAttribute ("MyAttribute"), "#C1");
758 public void SetAttribute_1 ()
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);
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");
772 static void SetAttribute_OnPreRenderComplete_1 (Page p)
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");
779 var dc = lc.FindChild<PokerDynamicControl> ("FirstName");
780 Assert.IsNotNull (dc, "#A1-1");
782 string html = dc.RenderToString ();
783 Assert.IsFalse (String.IsNullOrEmpty (html), "#B1");
785 dc.SetAttribute ("MyAttribute", "value");
786 html = dc.RenderToString ();
787 Assert.IsFalse (String.IsNullOrEmpty (html), "#C1");
793 var test = new WebTest ("ListView_DynamicControl_01.aspx");
794 test.Invoker = PageInvoker.CreateOnLoad (Table_OnLoad);
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");
802 static void Table_OnLoad (Page p)
804 var lc = p.FindControl ("ListView1") as ListView;
805 Assert.IsNotNull (lc, "#A1");
807 var dc = lc.FindChild<DynamicControl> ("FirstName");
808 Assert.IsNotNull (dc, "#A1-1");
809 Assert.IsNotNull (dc.Table, "#B1");
811 // Safe not to check for GetModel's return value - it throws if model isn't found, same
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");
819 public void UIHint ()
821 var test = new WebTest ("ListView_DynamicControl_01.aspx");
822 test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad);
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");
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");
833 static void UIHint_OnLoad (Page p)
835 var lc = p.FindControl ("ListView1") as ListView;
836 Assert.IsNotNull (lc, "#A1");
838 var dc = lc.FindChild<DynamicControl> ("FirstName");
839 Assert.IsNotNull (dc, "#B1");
840 Assert.AreEqual ("FirstName", dc.DataField, "#B1-1");
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
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");
851 dc = lc.FindChild<DynamicControl> ("LastName");
852 Assert.IsNotNull (dc, "#D1");
853 Assert.AreEqual ("LastName", dc.DataField, "#D1-1");
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");
861 Assert.AreEqual (String.Empty, dc.UIHint, "#E1");
865 public void UIHint_1 ()
867 var test = new WebTest ("ListView_DynamicControl_02.aspx");
868 test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad_1);
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");
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");
879 static void UIHint_OnLoad_1 (Page p)
881 var lc = p.FindControl ("ListView2") as ListView;
882 Assert.IsNotNull (lc, "#A1");
884 var dc = lc.FindChild<DynamicControl> ("FirstName2");
885 Assert.IsNotNull (dc, "#B1");
886 Assert.AreEqual ("FirstName", dc.DataField, "#B1-1");
888 // No UIHint attribute on the associated field, no explicit setting
889 Assert.AreEqual (String.Empty, dc.UIHint, "#C1");
891 dc = lc.FindChild<DynamicControl> ("LastName2");
892 Assert.IsNotNull (dc, "#D1");
893 Assert.AreEqual ("LastName", dc.DataField, "#D1-1");
895 // UIHint attribute found on the associated field but overriden in the page
896 Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#D1-2");
900 public void UIHint_2 ()
902 var test = new WebTest ("ListView_DynamicControl_08.aspx");
903 test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad_2);
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");
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");
914 static void UIHint_OnLoad_2 (Page p)
916 var lc = p.FindControl ("ListView1") as ListView;
917 Assert.IsNotNull (lc, "#A1");
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");
924 // Falls back to the text template
925 Assert.IsNotNull (dc.FieldTemplate, "#C1");
927 var ftuc = dc.FieldTemplate as FieldTemplateUserControl;
928 Assert.IsNotNull (ftuc, "#C1-2");
929 Assert.AreEqual ("~/DynamicData/FieldTemplates/Text.ascx", ftuc.AppRelativeVirtualPath, "#C1-3");
933 public void ValidationGroup ()
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");