Merge pull request #980 from StephenMcConnel/bug-18638
[mono.git] / mcs / class / System.Web.DynamicData / Test / System.Web.DynamicData / FieldTemplateFactoryTest.cs
1 //
2 // FieldTemplateFactoryTest.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 using MonoTests.ModelProviders;
62
63 using MetaModel = System.Web.DynamicData.MetaModel;
64 using MetaTable = System.Web.DynamicData.MetaTable;
65
66 namespace MonoTests.System.Web.DynamicData
67 {
68         [TestFixture]
69         public class FieldTemplateFactoryTest
70         {
71                 DynamicDataContainerModelProvider<TestDataContext> dynamicModelProvider;
72
73                 [TestFixtureSetUp]
74                 public void SetUp ()
75                 {
76                         Type type = GetType ();
77                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx", "ListView_DynamicControl_01.aspx");
78                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs", "ListView_DynamicControl_01.aspx.cs");
79                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx", "ListView_DynamicControl_03.aspx");
80                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx.cs", "ListView_DynamicControl_03.aspx.cs");
81                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx", "ListView_DynamicControl_04.aspx");
82                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs", "ListView_DynamicControl_04.aspx.cs");
83                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_09.aspx", "ListView_DynamicControl_09.aspx");
84                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_09.aspx.cs", "ListView_DynamicControl_09.aspx.cs");
85
86                         dynamicModelProvider = new DynamicDataContainerModelProvider<TestDataContext> ();
87                         Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
88                 }
89
90                 [TestFixtureTearDown]
91                 public void TearDown ()
92                 {
93                         FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
94                         FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
95                         WebTest.Unload ();
96                 }
97
98                 [SetUp]
99                 public void PerTestSetUp ()
100                 {
101                         // This is ran before every test
102                         FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
103                         FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
104                 }
105
106                 [Test]
107                 public void Defaults ()
108                 {
109                         var ftf = new FieldTemplateFactory ();
110
111                         Assert.AreEqual (null, ftf.Model, "#A1");
112                         Assert.AreEqual ("FieldTemplates/", ftf.TemplateFolderVirtualPath, "#A2");
113                 }
114
115                 [Test]
116                 public void Defaults_Initialized ()
117                 {
118                         MetaModel m = Utils.CommonInitialize ();
119                         var ftf = new FieldTemplateFactory ();
120                         string origFolderPath = ftf.TemplateFolderVirtualPath;
121
122                         // It seems the ftf.TemplateFolderVirtualPath call above initializes the property to the
123                         // "non-prefixed" value and all subsequent requests will return that value instead of one
124                         // prefixed with the model's path. That's why we need to recreate ftf here.
125                         ftf = new FieldTemplateFactory ();
126                         ftf.Initialize (m);
127                         Assert.AreEqual (m, ftf.Model, "#A1");
128                         Assert.AreEqual (VirtualPathUtility.Combine (m.DynamicDataFolderVirtualPath, origFolderPath), ftf.TemplateFolderVirtualPath, "#A2");
129                 }
130
131                 [Test]
132                 public void BuildVirtualPath ()
133                 {
134                         MetaModel m = Utils.CommonInitialize ();
135                         MetaTable t = m.Tables[TestDataContext.TableBaz];
136                         MetaColumn mc = t.GetColumn ("Column1");
137
138                         var ftf = new FieldTemplateFactory ();
139                         AssertExtensions.Throws<ArgumentNullException> (() => {
140                                 ftf.BuildVirtualPath (null, mc, DataBoundControlMode.ReadOnly);
141                         }, "#A1");
142
143                         AssertExtensions.Throws<ArgumentNullException> (() => {
144                                 ftf.BuildVirtualPath (String.Empty, mc, DataBoundControlMode.ReadOnly);
145                         }, "#A2");
146
147                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx.ascx", ftf.BuildVirtualPath ("Integer.ascx", mc, DataBoundControlMode.ReadOnly), "#B1");
148                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx", ftf.BuildVirtualPath ("Integer", mc, DataBoundControlMode.ReadOnly), "#B2");
149                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer_Edit.ascx", ftf.BuildVirtualPath ("Integer", mc, DataBoundControlMode.Edit), "#B3");
150                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer_Insert.ascx", ftf.BuildVirtualPath ("Integer", mc, DataBoundControlMode.Insert), "#B4");
151                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "NoSuchTemplate.ascx", ftf.BuildVirtualPath ("NoSuchTemplate", mc, DataBoundControlMode.ReadOnly), "#B5");
152                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx", ftf.BuildVirtualPath ("Integer", null, DataBoundControlMode.ReadOnly), "#B6");
153                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx", ftf.BuildVirtualPath ("Integer", mc, (DataBoundControlMode)10), "#B7");
154                 }
155
156                 [Test]
157                 public void BuildVirtualPath_1 ()
158                 {
159                         MetaModel m = Utils.CommonInitialize ();
160                         MetaTable t = m.Tables[TestDataContext.TableBaz];
161                         MetaColumn mc = t.GetColumn ("CustomUIHintColumn");
162
163                         var ftf = new FieldTemplateFactory ();
164
165                         // It seems MetaColumn.UIHint is ignored (or rather it suggests that column is not used at all)
166                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Test.ascx", ftf.BuildVirtualPath ("Test", mc, DataBoundControlMode.ReadOnly), "#A1");
167                 }
168
169                 [Test]
170                 public void CreateFieldTemplate ()
171                 {
172                         // This test is (sort of) bogus as the .NET code completely falls apart when invoked outside
173                         // real web request environment. Talk about code testability...
174                         //
175                         // Most of the exceptions thrown below come from methods other than CreateFieldTemplate
176                         MetaModel m = Utils.CommonInitialize ();
177                         MetaTable t = m.Tables[TestDataContext.TableBaz];
178                         MetaColumn mc = t.GetColumn ("Column1");
179
180                         var ftf = new FieldTemplateFactory ();
181
182                         // And here we go again...
183                         AssertExtensions.Throws<NullReferenceException> (() => {
184                                 ftf.CreateFieldTemplate (null, DataBoundControlMode.ReadOnly, "Integer.ascx");
185                         }, "#A1");
186
187 #if TARGET_DOTNET
188                         // Not going to emulate those on Mono. There are limits...
189
190                         // ...and again
191                         AssertExtensions.Throws<NullReferenceException> (() => {
192                                 ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, null);
193                         }, "#A2");
194
195                         // ...and again
196                         AssertExtensions.Throws<NullReferenceException> (() => {
197                                 ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, String.Empty);
198                         }, "#A3");
199
200                         // ...and again
201                         AssertExtensions.Throws<NullReferenceException> (() => {
202                                 ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
203                         }, "#A4");
204 #endif
205                 }
206
207                 [Test]
208                 public void CreateFieldTemplate_2 ()
209                 {
210                         var test = new WebTest ("ListView_DynamicControl_01.aspx");
211                         test.Invoker = PageInvoker.CreateOnLoad (CreateFieldTemplate_OnLoad_2);
212                         var p = test.Run ();
213                         Assert.IsNotNull (test.Response, "#X1");
214                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
215                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
216                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
217                 }
218
219                 static void CreateFieldTemplate_OnLoad_2 (Page p)
220                 {
221                         MetaModel m = MetaModel.Default;
222                         MetaTable t = m.GetTable ("EmployeeTable");
223                         MetaColumn mc = t.GetColumn ("FirstName");
224
225                         var ftf = new FieldTemplateFactory ();
226
227                         // Without this, the class will fail miserably by passing invalid virtual path to internal .NET's
228                         // mapping routines...
229                         ftf.Initialize (m);
230                         IFieldTemplate template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, null);
231                         Assert.IsNotNull (template, "#A1");
232
233                         var ftuc = template as FieldTemplateUserControl;
234                         Assert.IsNotNull (ftuc, "#A2");
235                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftuc.AppRelativeVirtualPath, "#A2-1");
236
237                         template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "Boolean");
238                         Assert.IsNotNull (template, "#B1");
239
240                         ftuc = template as FieldTemplateUserControl;
241                         Assert.IsNotNull (ftuc, "#B2");
242                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftuc.AppRelativeVirtualPath, "#B2-2");
243
244                         template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
245                         Assert.IsNotNull (template, "#D1");
246                         ftuc = template as FieldTemplateUserControl;
247                         Assert.IsNotNull (ftuc, "#D2");
248                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftuc.AppRelativeVirtualPath, "#D2-2");
249
250                         template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "MyCustomUIHintTemplate_Text");
251                         Assert.IsNotNull (template, "#E1");
252
253                         ftuc = template as FieldTemplateUserControl;
254                         Assert.IsNotNull (ftuc, "#E2");
255                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "MyCustomUIHintTemplate_Text.ascx", ftuc.AppRelativeVirtualPath, "#E2-2");
256
257                         mc = t.GetColumn ("FavoriteColor");
258                         AssertExtensions.Throws<HttpException> (() => {
259                                 template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "PlainControlTemplate");
260                         }, "#F1");
261
262                         mc = t.GetColumn ("FavoriteColor");
263                         template = ftf.CreateFieldTemplate (mc, DataBoundControlMode.ReadOnly, "CustomColor");
264                         Assert.IsNotNull (template, "#G1");
265                         ftuc = template as FieldTemplateUserControl;
266                         Assert.IsNotNull (ftuc, "#G2");
267                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "CustomColor.ascx", ftuc.AppRelativeVirtualPath, "#G2-2");
268                 }
269
270                 [Test]
271                 public void GetFieldTemplateVirtualPath ()
272                 {
273                         // This test is (sort of) bogus as the .NET code completely falls apart when invoked outside
274                         // real web request environment. Talk about code testability...
275                         //
276                         // Most of the exceptions thrown below come from methods other than CreateFieldTemplate
277                         MetaModel m = Utils.CommonInitialize ();
278                         MetaTable t = m.Tables[TestDataContext.TableBaz];
279                         MetaColumn mc = t.GetColumn ("Column1");
280
281                         var ftf = new FieldTemplateFactory ();
282
283                         // And here we go again...
284                         AssertExtensions.Throws<NullReferenceException> (() => {
285                                 ftf.GetFieldTemplateVirtualPath (null, DataBoundControlMode.ReadOnly, "Integer.ascx");
286                         }, "#A1");
287
288 #if TARGET_DOTNET
289                         // ...and again
290                         AssertExtensions.Throws<NullReferenceException> (() => {
291                                 ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
292                         }, "#A2");
293
294                         // ...and again
295                         AssertExtensions.Throws<NullReferenceException> (() => {
296                                 ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty);
297                         }, "#A3");
298
299                         // ...and again
300                         AssertExtensions.Throws<NullReferenceException> (() => {
301                                 ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
302                         }, "#A4");
303 #endif
304                 }
305
306                 [Test]
307                 public void GetFieldTemplateVirtualPath_02 ()
308                 {
309                         var test = new WebTest ("ListView_DynamicControl_01.aspx");
310                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_02);
311                         var p = test.Run ();
312                         Assert.IsNotNull (test.Response, "#X1");
313                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
314                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
315                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
316                 }
317
318                 static void GetFieldTemplateVirtualPath_OnLoad_02 (Page p)
319                 {
320                         MetaModel m = MetaModel.Default;
321                         MetaTable t = m.GetTable ("EmployeeTable");
322                         MetaColumn mc = t.GetColumn ("FirstName");
323
324                         var ftf = new FieldTemplateFactory ();
325
326                         // Without this, the class will fail miserably by passing invalid virtual path to internal .NET's
327                         // mapping routines...
328                         ftf.Initialize (m);
329                         string templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
330                         Assert.IsFalse (String.IsNullOrEmpty (templatePath), "#A1");
331                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#A1-1");
332
333                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean");
334                         Assert.IsNotNull (templatePath, "#B1");
335                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", templatePath, "#B1-2");
336
337                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
338                         Assert.IsNotNull (templatePath, "#D1");
339                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#D1-2");
340
341                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "MyCustomUIHintTemplate_Text");
342                         Assert.IsNotNull (templatePath, "#E1");
343                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "MyCustomUIHintTemplate_Text.ascx", templatePath, "#E1-2");
344
345                         mc = t.GetColumn ("LastName");
346                         Assert.AreEqual ("CustomFieldTemplate", mc.UIHint, "#F1");
347                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
348                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#F1-1");
349
350                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "CustomFieldTemplate");
351                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "CustomFieldTemplate.ascx", templatePath, "#F2");
352                 }
353
354                 [Test]
355                 public void GetFieldTemplateVirtualPath_03 ()
356                 {
357                         var test = new WebTest ("ListView_DynamicControl_09.aspx");
358                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_03);
359                         var p = test.Run ();
360                         Assert.IsNotNull (test.Response, "#X1");
361                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
362                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
363                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
364                 }
365
366                 static void GetFieldTemplateVirtualPath_OnLoad_03 (Page p)
367                 {
368                         MetaModel m = MetaModel.Default;
369                         MetaTable t = m.GetTable ("AssociatedFooTable");
370                         MetaColumn mc = t.GetColumn ("PrimaryKeyColumn2");
371
372                         Assert.AreEqual (typeof (MetaChildrenColumn), mc.GetType (), "#A1");
373
374                         var ftf = new FieldTemplateFactory ();
375                         ftf.Initialize (m);
376
377                         string templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
378                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#A2");
379
380                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
381                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", templatePath, "#A3");
382
383                         // When MetaColumn.DataTypeAttribute is not null (which will always be the case for string columns), column type is ignored
384                         mc = t.GetColumn ("ForeignKeyColumn1");
385                         Assert.AreEqual (typeof (MetaForeignKeyColumn), mc.GetType (), "#B1");
386                         Assert.IsNotNull (mc.DataTypeAttribute, "#B1-1");
387
388                         ftf = new FieldTemplateFactory ();
389                         ftf.Initialize (m);
390
391                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
392                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#B2");
393
394                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
395                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#B3");
396
397                         mc = t.GetColumn ("ForeignKeyColumn2");
398                         Assert.AreEqual (typeof (MetaForeignKeyColumn), mc.GetType (), "#C1");
399                         Assert.IsNull (mc.DataTypeAttribute, "#C1-1");
400
401                         ftf = new FieldTemplateFactory ();
402                         ftf.Initialize (m);
403
404                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
405                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#C2");
406
407                         templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
408                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "ForeignKey.ascx", templatePath, "#C3");
409                 }
410
411                 [Test]
412                 public void GetFieldTemplateVirtualPath_04 ()
413                 {
414                         var test = new WebTest ("ListView_DynamicControl_03.aspx");
415                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_04);
416                         var p = test.Run ();
417                         Assert.IsNotNull (test.Response, "#X1");
418                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
419                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
420                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
421                 }
422
423                 static void GetFieldTemplateVirtualPath_OnLoad_04 (Page p)
424                 {
425                         var lc = p.FindControl ("ListView3") as ListView;
426                         Assert.IsNotNull (lc, "#A1");
427
428                         int counter = 1;
429                         var ftf = new FieldTemplateFactory ();
430                         ftf.Initialize (MetaModel.Default);
431
432                         foreach (var entry in FieldTemplatePathTables.FieldTemplateReadOnlyColumns) {
433                                 string columnName = entry.ColumnName;
434                                 var dc = lc.FindChild<PokerDynamicControl> (columnName);
435                                 Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
436                                 Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
437
438                                 string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
439                                 if (entry.IsNull)
440                                         Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
441                                 else {
442                                         Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
443                                         Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
444                                 }
445
446                                 counter++;
447                         }
448                 }
449
450                 [Test]
451                 public void GetFieldTemplateVirtualPath_05 ()
452                 {
453                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
454                         var p = test.Run ();
455
456                         // Fake post-back
457                         var delegates = new PageDelegates ();
458                         delegates.PreRenderComplete = GetFieldTemplateVirtualPath_OnPreRenderComplete_05;
459                         test.Invoker = new PageInvoker (delegates);
460                         var fr = new FormRequest (test.Response, "form1");
461 #if TARGET_DOTNET
462                         fr.Controls.Add ("ListView4$ctrl0$editMe");
463                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
464 #else
465                         fr.Controls.Add ("ListView4$ctl01$editMe");
466                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
467 #endif
468                         test.Request = fr;
469                         p = test.Run ();
470
471                         Assert.IsNotNull (test.Response, "#X1");
472                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
473                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
474                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
475                 }
476
477                 static void GetFieldTemplateVirtualPath_OnPreRenderComplete_05 (Page p)
478                 {
479                         var lc = p.FindControl ("ListView4") as ListView;
480                         Assert.IsNotNull (lc, "#A1");
481
482                         var ftf = new FieldTemplateFactory ();
483                         ftf.Initialize (MetaModel.Default);
484                         int counter = 1;
485                         foreach (var entry in FieldTemplatePathTables.FieldTemplateEditColumns) {
486                                 string columnName = entry.ColumnName;
487                                 var dc = lc.FindChild<PokerDynamicControl> (columnName);
488                                 Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
489                                 Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
490
491                                 string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.Edit, null);
492                                 if (entry.IsNull)
493                                         Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
494                                 else {
495                                         Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
496                                         Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
497                                 }
498
499                                 counter++;
500                         }
501                 }
502
503                 // This tests full type name templates
504                 [Test]
505                 public void GetFieldTemplateVirtualPath_06 ()
506                 {
507                         FieldTemplatePathTables.SetUp_FullTypeNameTemplates (this);
508                         var test = new WebTest ("ListView_DynamicControl_03.aspx");
509                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_06);
510                         var p = test.Run ();
511                         Assert.IsNotNull (test.Response, "#X1");
512                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
513                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
514                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
515                 }
516
517                 static void GetFieldTemplateVirtualPath_OnLoad_06 (Page p)
518                 {
519                         var lc = p.FindControl ("ListView3") as ListView;
520                         Assert.IsNotNull (lc, "#A1");
521
522                         var ftf = new FieldTemplateFactory ();
523                         ftf.Initialize (MetaModel.Default);
524                         int counter = 1;
525                         foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultColumns) {
526                                 string columnName = entry.ColumnName;
527                                 var dc = lc.FindChild<PokerDynamicControl> (columnName);
528                                 Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
529                                 Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
530
531                                 string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
532                                 if (entry.IsNull)
533                                         Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
534                                 else {
535                                         Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
536                                         Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
537                                 }
538
539                                 counter++;
540                         }
541                 }
542
543                 // This tests short type name templates
544                 [Test]
545                 public void GetFieldTemplateVirtualPath_07 ()
546                 {
547                         FieldTemplatePathTables.SetUp_ShortTypeNameTemplates (this);
548                         var test = new WebTest ("ListView_DynamicControl_03.aspx");
549                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_07);
550                         var p = test.Run ();
551                         Assert.IsNotNull (test.Response, "#X1");
552                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
553                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
554                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
555                 }
556
557                 static void GetFieldTemplateVirtualPath_OnLoad_07 (Page p)
558                 {
559                         var lc = p.FindControl ("ListView3") as ListView;
560                         Assert.IsNotNull (lc, "#A1");
561
562                         var ftf = new FieldTemplateFactory ();
563                         ftf.Initialize (MetaModel.Default);
564                         int counter = 1;
565                         foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultShortColumns) {
566                                 string columnName = entry.ColumnName;
567                                 var dc = lc.FindChild<PokerDynamicControl> (columnName);
568                                 Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
569                                 Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
570
571                                 string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
572                                 if (entry.IsNull)
573                                         Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
574                                 else {
575                                         Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
576                                         Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
577                                 }
578
579                                 counter++;
580                         }
581                 }
582
583                 [Test]
584                 public void GetFieldTemplateVirtualPath_08 ()
585                 {
586                         var test = new WebTest ("ListView_DynamicControl_09.aspx");
587                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_08);
588                         var p = test.Run ();
589                         Assert.IsNotNull (test.Response, "#X1");
590                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
591                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
592                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
593                 }
594
595                 static void GetFieldTemplateVirtualPath_OnLoad_08 (Page p)
596                 {
597                         MetaModel m = MetaModel.Default;
598                         MetaTable t = m.GetTable ("AssociatedFooTable");
599                         MetaColumn mc = t.GetColumn ("PrimaryKeyColumn2");
600
601                         var ftf = new FieldTemplateFactory ();
602                         ftf.Initialize (m);
603
604                         // Ugh...
605                         AssertExtensions.Throws<NullReferenceException> (() => {
606                                 ftf.GetFieldTemplateVirtualPath (null, DataBoundControlMode.ReadOnly, "Integer.ascx");
607                         }, "#A1");
608
609
610                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A2");
611                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A3");
612                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A4");
613                 }
614
615                 [Test]
616                 public void GetFieldTemplateVirtualPath_09 ()
617                 {
618                         var test = new WebTest ("ListView_DynamicControl_09.aspx");
619                         test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_09);
620                         var p = test.Run ();
621                         Assert.IsNotNull (test.Response, "#X1");
622                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
623                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
624                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
625                 }
626
627                 static void GetFieldTemplateVirtualPath_OnLoad_09 (Page p)
628                 {
629                         MetaModel m = MetaModel.Default;
630                         MetaTable t = m.GetTable ("BazWithDataTypeAttributeTable");
631                         MetaColumn mc = t.GetColumn ("CustomColumn1");
632
633                         var ftf = new FieldTemplateFactory ();
634                         ftf.Initialize (m);
635
636                         // Custom type
637                         //   It appears that DataTypeAttribute's custom type name is passed to BuildVirtualPath
638                         AssertExtensions.Throws<InvalidOperationException> (() => {
639                                 string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
640                         }, "#A1");
641                         
642                         AssertExtensions.Throws<InvalidOperationException> (() => {
643                                 string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
644                         }, "#A1-1");
645                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A1-2");
646
647                         // Custom with UIHint attribute
648                         mc = t.GetColumn ("CustomColumn2");
649                         Assert.IsNotNull (mc.UIHint, "#A2");
650                         Assert.Greater (mc.UIHint.Length, 0, "#A2-1");
651
652                         // Proves that UIHint on the column is not used, just the uiHint argument
653                         AssertExtensions.Throws<InvalidOperationException> (() => {
654                                 string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
655                         }, "#A2-2");
656
657                         AssertExtensions.Throws<InvalidOperationException> (() => {
658                                 string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
659                         }, "#A2-3");
660                         
661                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A2-4");
662
663                         mc = t.GetColumn ("CustomColumn3");
664                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A3");
665                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A3-1");
666                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A3-2");
667                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A3-3");
668
669                         // Custom with UIHint attribute
670                         mc = t.GetColumn ("CustomColumn4");
671                         Assert.IsNotNull (mc.UIHint, "#A4");
672                         Assert.Greater (mc.UIHint.Length, 0, "#A4-1");
673
674                         // Proves that UIHint on the column is not used, just the uiHint argument
675                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A4-2");
676                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A4-3");
677                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A4-4");
678                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A4-5");
679
680                         // DateTime
681                         mc = t.GetColumn ("DateTimeColumn1");
682                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#B1");
683                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#B1-1");
684                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#B1-2");
685                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#B1-3");
686
687                         mc = t.GetColumn ("DateTimeColumn2");
688                         Assert.IsNotNull (mc.UIHint, "#B2");
689                         Assert.Greater (mc.UIHint.Length, 0, "#B2-1");
690                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#B2-3");
691                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#B2-4");
692                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#B2-5");
693                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#B2-6");
694
695                         // Date -> maps to Text.ascx, regardless of underlying type and uiHint passed
696                         mc = t.GetColumn ("DateColumn1");
697                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C1");
698                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C1-1");
699                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C1-2");
700                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#C1-3");
701
702                         mc = t.GetColumn ("DateColumn2");
703                         Assert.IsNotNull (mc.UIHint, "#C2");
704                         Assert.Greater (mc.UIHint.Length, 0, "#C2-1");
705                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C2-3");
706                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C2-4");
707                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C2-5");
708                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#C2-6");
709
710                         mc = t.GetColumn ("DateColumn3");
711                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C3");
712                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C3-1");
713                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C3-2");
714                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#C3-3");
715
716                         mc = t.GetColumn ("DateColumn4");
717                         Assert.IsNotNull (mc.UIHint, "#C4");
718                         Assert.Greater (mc.UIHint.Length, 0, "#C4-1");
719                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C4-3");
720                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C4-4");
721                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C4-5");
722                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#C4-6");
723
724                         // Time
725                         mc = t.GetColumn ("TimeColumn1");
726                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#D1");
727                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#D1-1");
728                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#D1-2");
729                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#D1-3");
730
731                         mc = t.GetColumn ("TimeColumn2");
732                         Assert.IsNotNull (mc.UIHint, "#D2");
733                         Assert.Greater (mc.UIHint.Length, 0, "#D2-1");
734                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#D2-3");
735                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#D2-4");
736                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#D2-5");
737                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#D2-6");
738
739                         // Duration
740                         mc = t.GetColumn ("DurationColumn1");
741                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#E1");
742                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#E1-1");
743                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#E1-2");
744                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#E1-3");
745
746                         mc = t.GetColumn ("DurationColumn2");
747                         Assert.IsNotNull (mc.UIHint, "#E2");
748                         Assert.Greater (mc.UIHint.Length, 0, "#E2-1");
749                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#E2-3");
750                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#E2-4");
751                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#E2-5");
752                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#E2-6");
753
754                         // PhoneNumber
755                         mc = t.GetColumn ("PhoneNumberColumn1");
756                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#F1");
757                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#F1-1");
758                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#F1-2");
759                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#F1-3");
760
761                         mc = t.GetColumn ("PhoneNumberColumn2");
762                         Assert.IsNotNull (mc.UIHint, "#F2");
763                         Assert.Greater (mc.UIHint.Length, 0, "#F2-1");
764                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#F2-3");
765                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#F2-4");
766                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#F2-5");
767                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#F2-6");
768
769                         // Currency
770                         mc = t.GetColumn ("CurrencyColumn1");
771                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#G1");
772                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#G1-1");
773                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#G1-2");
774                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#G1-3");
775
776                         mc = t.GetColumn ("CurrencyColumn2");
777                         Assert.IsNotNull (mc.UIHint, "#G2");
778                         Assert.Greater (mc.UIHint.Length, 0, "#G2-1");
779                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#G2-3");
780                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#G2-4");
781                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#G2-5");
782                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#G2-6");
783
784                         // Text
785                         mc = t.GetColumn ("TextColumn1");
786                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#H1");
787                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#H1-1");
788                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#H1-2");
789                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#H1-3");
790
791                         mc = t.GetColumn ("TextColumn2");
792                         Assert.IsNotNull (mc.UIHint, "#H2");
793                         Assert.Greater (mc.UIHint.Length, 0, "#H2-1");
794                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#H2-3");
795                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#H2-4");
796                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#H2-5");
797                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#H2-6");
798
799                         // Html
800                         mc = t.GetColumn ("HtmlColumn1");
801                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#I1");
802                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#I1-1");
803                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#I1-2");
804                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#I1-3");
805
806                         mc = t.GetColumn ("HtmlColumn2");
807                         Assert.IsNotNull (mc.UIHint, "#I2");
808                         Assert.Greater (mc.UIHint.Length, 0, "#I2-1");
809                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#I2-3");
810                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#I2-4");
811                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#I2-5");
812                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#I2-6");
813
814                         // MultilineText
815                         mc = t.GetColumn ("MultilineTextColumn1");
816                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#J1");
817                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#J1-1");
818                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#J1-2");
819                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#J1-3");
820
821                         mc = t.GetColumn ("MultilineTextColumn2");
822                         Assert.IsNotNull (mc.UIHint, "#J2");
823                         Assert.Greater (mc.UIHint.Length, 0, "#J2-1");
824                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#J2-3");
825                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#J2-4");
826                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#J2-5");
827                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#J2-6");
828
829                         // EmailAddress
830                         mc = t.GetColumn ("EmailAddressColumn1");
831                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#K1");
832                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#K1-1");
833                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#K1-2");
834                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#K1-3");
835
836                         mc = t.GetColumn ("EmailAddressColumn2");
837                         Assert.IsNotNull (mc.UIHint, "#K2");
838                         Assert.Greater (mc.UIHint.Length, 0, "#K2-1");
839                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#K2-3");
840                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#K2-4");
841                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#K2-5");
842                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#K2-6");
843
844                         // Password
845                         mc = t.GetColumn ("PasswordColumn1");
846                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#L1");
847                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#L1-1");
848                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#L1-2");
849                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#L1-3");
850
851                         mc = t.GetColumn ("PasswordColumn2");
852                         Assert.IsNotNull (mc.UIHint, "#L2");
853                         Assert.Greater (mc.UIHint.Length, 0, "#L2-1");
854                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#L2-3");
855                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#L2-4");
856                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#L2-5");
857                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#L2-6");
858
859                         // Url
860                         mc = t.GetColumn ("UrlColumn1");
861                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#M1");
862                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#M1-1");
863                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#M1-2");
864                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#M1-3");
865
866                         mc = t.GetColumn ("UrlColumn2");
867                         Assert.IsNotNull (mc.UIHint, "#M2");
868                         Assert.Greater (mc.UIHint.Length, 0, "#M2-1");
869                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#M2-3");
870                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#M2-4");
871                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#M2-5");
872                         Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#M2-6");
873                 }
874
875                 [Test]
876                 public void Initialize ()
877                 {
878                         MetaModel m = Utils.CommonInitialize ();
879
880                         var ftf = new FieldTemplateFactory ();
881                         Assert.IsNull (ftf.Model, "#A1");
882
883                         ftf.Initialize (null);
884                         Assert.IsNull (ftf.Model, "#A2");
885
886                         ftf.Initialize (m);
887                         Assert.IsNotNull (ftf.Model, "#A3");
888                         Assert.AreEqual (m, ftf.Model, "#A3-1");
889                 }
890
891                 [Test]
892                 public void Model ()
893                 {
894                         MetaModel m = Utils.CommonInitialize ();
895
896                         var ftf = new FieldTemplateFactory ();
897                         Assert.IsNull (ftf.Model, "#A1");
898
899                         ftf.Initialize (null);
900                         Assert.IsNull (ftf.Model, "#A2");
901
902                         ftf.Initialize (m);
903                         Assert.IsNotNull (ftf.Model, "#A3");
904                         Assert.AreEqual (m, ftf.Model, "#A3-1");
905                 }
906
907                 [Test]
908                 public void PreprocessMode ()
909                 {
910                         MetaModel m = Utils.CommonInitialize ();
911                         MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults];
912                         MetaColumn mc = t.GetColumn ("Column1");
913
914                         var ftf = new FieldTemplateFactory ();
915                         ftf.Initialize (m);
916
917                         AssertExtensions.Throws<NullReferenceException> (() => {
918                                 ftf.PreprocessMode (null, DataBoundControlMode.ReadOnly);
919                         }, "#A1");
920
921                         var mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
922                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#A2");
923
924                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
925                         Assert.AreEqual (DataBoundControlMode.Insert, mode, "#A2-1");
926
927                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
928                         Assert.AreEqual (DataBoundControlMode.Edit, mode, "#A2-2");
929
930                         mc = t.GetColumn ("PrimaryKeyColumn1");
931                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
932                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#B1");
933
934                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
935                         Assert.AreEqual (DataBoundControlMode.Insert, mode, "#B1-1");
936
937                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
938                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#B1-2");
939
940                         t = m.Tables[TestDataContext.TableAssociatedFoo];
941                         mc = t.GetColumn ("ForeignKeyColumn1");
942
943                         Assert.AreEqual (true, mc.IsForeignKeyComponent, "#C1");
944                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
945                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#C1-1");
946
947                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
948                         Assert.AreEqual (DataBoundControlMode.Insert, mode, "#C1-2");
949
950                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
951                         Assert.AreEqual (DataBoundControlMode.Edit, mode, "#C1-3");
952
953                         t = m.Tables[TestDataContext.TableBaz];
954                         mc = t.GetColumn ("GeneratedColumn1");
955
956                         Assert.AreEqual (true, mc.IsGenerated, "#D1");
957                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
958                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-1");
959
960                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
961                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-2");
962
963                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
964                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-3");
965
966                         t = m.Tables[TestDataContext.TableAssociatedFoo];
967                         mc = t.GetColumn ("PrimaryKeyColumn1");
968
969                         Assert.AreEqual (true, mc.IsForeignKeyComponent, "#D1");
970                         Assert.AreEqual (true, mc.IsPrimaryKey, "#D1-1");
971                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
972                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-2");
973
974                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
975                         Assert.AreEqual (DataBoundControlMode.Insert, mode, "#D1-3");
976
977                         mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
978                         Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-4");
979                 }
980
981                 [Test]
982                 public void TemplateFolderVirtualPath ()
983                 {
984                         MetaModel m = Utils.CommonInitialize ();
985                         var ftf = new FieldTemplateFactory ();
986                         string origFolderPath = ftf.TemplateFolderVirtualPath;
987
988                         ftf = new FieldTemplateFactory ();
989
990                         Assert.AreEqual ("FieldTemplates/", ftf.TemplateFolderVirtualPath, "#A1");
991                         ftf.TemplateFolderVirtualPath = "MyFolder";
992                         Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#A2");
993
994                         ftf.TemplateFolderVirtualPath = null;
995                         Assert.AreEqual ("FieldTemplates/", ftf.TemplateFolderVirtualPath, "#A3");
996
997                         ftf.TemplateFolderVirtualPath = String.Empty;
998                         Assert.AreEqual (String.Empty, ftf.TemplateFolderVirtualPath, "#A4");
999
1000                         ftf.Initialize (m);
1001                         Assert.AreEqual (String.Empty, ftf.TemplateFolderVirtualPath, "#A5");
1002
1003                         ftf.TemplateFolderVirtualPath = "MyFolder";
1004                         Assert.AreEqual (m.DynamicDataFolderVirtualPath + "MyFolder/", ftf.TemplateFolderVirtualPath, "#A6");
1005
1006                         ftf.TemplateFolderVirtualPath = null;
1007                         Assert.AreEqual (m.DynamicDataFolderVirtualPath + "FieldTemplates/", ftf.TemplateFolderVirtualPath, "#A7");
1008
1009                         ftf.TemplateFolderVirtualPath = String.Empty;
1010                         // Thrown from some internal method - no checks _again_
1011                         AssertExtensions.Throws<ArgumentNullException> (() => {
1012                                 string path = ftf.TemplateFolderVirtualPath;
1013                         }, "#A8");
1014
1015                         ftf = new FieldTemplateFactory ();
1016                         ftf.TemplateFolderVirtualPath = "MyFolder";
1017                         Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#B1");
1018                         ftf.Initialize (m);
1019                         Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#B2");
1020
1021                         ftf = new FieldTemplateFactory ();
1022                         ftf.Initialize (m);
1023                         Assert.AreEqual (m.DynamicDataFolderVirtualPath + origFolderPath, ftf.TemplateFolderVirtualPath, "#C1");
1024
1025                         ftf.TemplateFolderVirtualPath = "MyFolder";
1026                         Assert.AreEqual (m.DynamicDataFolderVirtualPath + "MyFolder/", ftf.TemplateFolderVirtualPath, "#C2");
1027
1028                         ftf = new FieldTemplateFactory ();
1029                         ftf.Initialize (m);
1030                         m.DynamicDataFolderVirtualPath = "~/MyPath";
1031                         Assert.AreEqual (m.DynamicDataFolderVirtualPath + "FieldTemplates/", ftf.TemplateFolderVirtualPath, "#D1");
1032
1033                         ftf = new FieldTemplateFactory ();
1034                         ftf.TemplateFolderVirtualPath = "MyFolder";
1035                         Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#E1");
1036
1037                         ftf.Initialize (m);
1038                         m.DynamicDataFolderVirtualPath = "~/MyPath";
1039                         Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#F1");
1040
1041                         ftf = new FieldTemplateFactory ();
1042                         ftf.Initialize (m);
1043                         ftf.TemplateFolderVirtualPath = String.Empty;
1044
1045                         AssertExtensions.Throws<ArgumentNullException> (() => {
1046                                 string path = ftf.TemplateFolderVirtualPath;
1047                         }, "#G1");
1048                 }
1049         }
1050 }