From 4c7387b12909257f95e9dddf2f3e867af092b1a6 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 12 Oct 2011 21:54:44 +0100 Subject: [PATCH] Support ViewDataType in MvcTextTemplateHost. --- .../Src/AddMvcViewToProjectViewModel.cs | 11 ++++ .../AspNet.Mvc/Project/Src/IMvcClass.cs | 1 + .../AspNet.Mvc/Project/Src/IMvcProject.cs | 1 + .../Project/Src/IMvcTextTemplateHost.cs | 1 + .../Project/Src/IMvcViewFileGenerator.cs | 1 + .../AspNet.Mvc/Project/Src/MvcClass.cs | 16 +++++ .../Project/Src/MvcModelClassViewModel.cs | 4 ++ .../AspNet.Mvc/Project/Src/MvcProject.cs | 4 ++ .../Project/Src/MvcTextTemplateHost.cs | 28 +++++++++ .../Project/Src/MvcViewFileGenerator.cs | 3 + .../AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj | 2 + .../AspNet.Mvc/Test/Helpers/FakeClass.cs | 11 +++- .../AspNet.Mvc/Test/Helpers/FakeMvcClass.cs | 1 + .../AspNet.Mvc/Test/Helpers/FakeMvcProject.cs | 7 ++- .../Test/Helpers/FakeMvcTextTemplateHost.cs | 1 + .../Test/Helpers/FakeMvcViewFileGenerator.cs | 1 + .../Helpers/TestableMvcTextTemplateHost.cs | 26 ++++++++ .../Test/Helpers/TestableProject.cs | 10 ++++ .../Test/Helpers/TestableProjectContent.cs | 17 ++++++ .../Src/AddMvcViewToProjectViewModelTests.cs | 41 +++++++++++-- .../AspNet.Mvc/Test/Src/MvcClassTests.cs | 12 ++++ .../Test/Src/MvcModelClassViewModelTests.cs | 9 +++ .../AspNet.Mvc/Test/Src/MvcProjectTests.cs | 12 ++++ .../Test/Src/MvcTextTemplateHostTests.cs | 60 ++++++++++++++++++- .../Test/Src/MvcViewFileGeneratorTests.cs | 22 +++++++ 25 files changed, 293 insertions(+), 9 deletions(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableMvcTextTemplateHost.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProjectContent.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs index 84b32e3606..393bb2c424 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs @@ -240,6 +240,7 @@ namespace ICSharpCode.AspNet.Mvc viewGenerator.IsContentPage = IsContentPage; viewGenerator.MasterPageFile = GetMasterPageFile(); viewGenerator.ModelClassName = GetModelClassName(); + viewGenerator.ModelClassAssemblyLocation = GetModelClassAssemblyLocation(); viewGenerator.PrimaryContentPlaceHolderId = GetPrimaryContentPlaceHolderId(); viewGenerator.Project = selectedViewFolder.Project; viewGenerator.Template = selectedViewTemplate; @@ -264,6 +265,16 @@ namespace ICSharpCode.AspNet.Mvc return String.Empty; } + string GetModelClassAssemblyLocation() + { + if (IsStronglyTypedView) { + if (SelectedModelClass != null) { + return SelectedModelClass.AssemblyLocation; + } + } + return String.Empty; + } + string GetPrimaryContentPlaceHolderId() { if (IsContentPage) { diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs index 0f3d855a71..5845d4e0f0 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs @@ -11,5 +11,6 @@ namespace ICSharpCode.AspNet.Mvc string Name { get; } string Namespace { get; } string BaseClassFullName { get; } + string AssemblyLocation { get; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs index d9de2dddde..01c7ab4ded 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs @@ -12,6 +12,7 @@ namespace ICSharpCode.AspNet.Mvc { IProject Project { get; } string RootNamespace { get; } + string OutputAssemblyFullPath { get; } void Save(); MvcTextTemplateLanguage GetTemplateLanguage(); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs index 844070397d..4badab0105 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs @@ -15,6 +15,7 @@ namespace ICSharpCode.AspNet.Mvc string ViewName { get; set; } bool IsPartialView { get; set; } string ViewDataTypeName { get; set; } + string ViewDataTypeAssemblyLocation { get; set; } bool IsContentPage { get; set; } string MasterPageFile { get; set; } string PrimaryContentPlaceHolderID { get; set; } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs index a638038ef7..90a26770f7 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs @@ -10,6 +10,7 @@ namespace ICSharpCode.AspNet.Mvc { IMvcProject Project { get; set; } string ModelClassName { get; set; } + string ModelClassAssemblyLocation { get; set; } bool IsContentPage { get; set; } string MasterPageFile { get; set; } string PrimaryContentPlaceHolderId { get; set; } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs index fe366dff2c..81afdabdb2 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs @@ -3,6 +3,7 @@ using System; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AspNet.Mvc { @@ -39,5 +40,20 @@ namespace ICSharpCode.AspNet.Mvc } return String.Empty; } + + public string AssemblyLocation { + get { return GetAssemblyLocation(); } + } + + string GetAssemblyLocation() + { + IProject project = GetProject(); + return project.OutputAssemblyFullPath; + } + + IProject GetProject() + { + return c.ProjectContent.Project as IProject; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs index fbce7c30cc..52fb9e6db6 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs @@ -38,5 +38,9 @@ namespace ICSharpCode.AspNet.Mvc public string FullName { get { return mvcClass.FullName; } } + + public string AssemblyLocation { + get { return mvcClass.AssemblyLocation; } + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs index 8d974bb0b9..0a22a60478 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs @@ -28,6 +28,10 @@ namespace ICSharpCode.AspNet.Mvc get { return Project.RootNamespace; } } + public string OutputAssemblyFullPath { + get { return Project.OutputAssemblyFullPath; } + } + public void Save() { Project.Save(); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs index 4197490df4..461032fdd4 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Reflection; using ICSharpCode.TextTemplating; namespace ICSharpCode.AspNet.Mvc @@ -10,6 +11,8 @@ namespace ICSharpCode.AspNet.Mvc { string viewName = String.Empty; string viewDataTypeName = String.Empty; + string viewDataTypeAssemblyLocation = String.Empty; + Type viewDataType; string @namespace = String.Empty; string masterPageFile = String.Empty; string primaryContentPlaceHolderID = String.Empty; @@ -54,6 +57,31 @@ namespace ICSharpCode.AspNet.Mvc set { viewDataTypeName = UseEmptyStringIfNull(value); } } + public string ViewDataTypeAssemblyLocation { + get { return viewDataTypeAssemblyLocation; } + set { viewDataTypeAssemblyLocation = UseEmptyStringIfNull(value); } + } + + public Type ViewDataType { + get { + if (viewDataType == null) { + viewDataType = GetViewDataType(); + } + return viewDataType; + } + } + + Type GetViewDataType() + { + Assembly assembly = LoadAssemblyFrom(ViewDataTypeAssemblyLocation); + return assembly.GetType(ViewDataTypeName); + } + + protected virtual Assembly LoadAssemblyFrom(string fileName) + { + return Assembly.LoadFrom(fileName); + } + public string ControllerName { get { return controllerName.Name; } set { controllerName.Name = value; } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs index f9ddfbfbae..ab221bb583 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs @@ -27,12 +27,14 @@ namespace ICSharpCode.AspNet.Mvc this.textTemplateRepository = textTemplateRepository; ModelClassName = String.Empty; + ModelClassAssemblyLocation = String.Empty; MasterPageFile = String.Empty; PrimaryContentPlaceHolderId = String.Empty; Template = new MvcViewTextTemplate(); } public string ModelClassName { get; set; } + public string ModelClassAssemblyLocation { get; set; } public bool IsContentPage { get; set; } public string MasterPageFile { get; set; } public string PrimaryContentPlaceHolderId { get; set; } @@ -49,6 +51,7 @@ namespace ICSharpCode.AspNet.Mvc host.MasterPageFile = MasterPageFile; host.PrimaryContentPlaceHolderID = PrimaryContentPlaceHolderId; host.ViewDataTypeName = ModelClassName; + host.ViewDataTypeAssemblyLocation = ModelClassAssemblyLocation; var viewFileName = fileName as MvcViewFileName; host.IsPartialView = viewFileName.IsPartialView; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj index 3b92258e29..6a6c4125da 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -76,7 +76,9 @@ + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs index 33f2a06ef0..90f54ddbf1 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs @@ -8,9 +8,18 @@ namespace AspNet.Mvc.Tests.Helpers { public class FakeClass : DefaultClass { + public TestableProject TestableProject; + public FakeClass(string name) - : base(new DefaultCompilationUnit(new DefaultProjectContent()), name) + : this(name, new TestableProjectContent()) + { + + } + + public FakeClass(string name, TestableProjectContent projectContent) + : base(new DefaultCompilationUnit(projectContent), name) { + this.TestableProject = projectContent.TestableProject; } public FakeClass AddBaseClass(string name) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs index b3b43d2335..72779e8b39 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs @@ -23,5 +23,6 @@ namespace AspNet.Mvc.Tests.Helpers public string Name { get; set; } public string Namespace { get; set; } public string BaseClassFullName { get; set; } + public string AssemblyLocation { get; set; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs index edf8464a2c..58cfb43908 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs @@ -17,6 +17,7 @@ namespace AspNet.Mvc.Tests.Helpers } public string RootNamespace { get; set; } + public string OutputAssemblyFullPath { get; set; } public bool SaveCalled; @@ -44,16 +45,18 @@ namespace AspNet.Mvc.Tests.Helpers public List ModelClasses = new List(); - public void AddModelClassToProject(string @namespace, string name) + public FakeMvcClass AddModelClassToProject(string @namespace, string name) { var fakeClass = new FakeMvcClass(@namespace, name); ModelClasses.Add(fakeClass); + return fakeClass; } - public void AddModelClassToProject(string fullyQualifiedName) + public FakeMvcClass AddModelClassToProject(string fullyQualifiedName) { var fakeClass = new FakeMvcClass(fullyQualifiedName); ModelClasses.Add(fakeClass); + return fakeClass; } public int GetModelClassesCallCount; diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs index 9b46217d86..6cfeea9f0e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs @@ -39,6 +39,7 @@ namespace AspNet.Mvc.Tests.Helpers public bool AddActionMethods { get; set; } public bool IsPartialView { get; set; } public string ViewDataTypeName { get; set; } + public string ViewDataTypeAssemblyLocation { get; set; } public bool IsContentPage { get; set; } public string MasterPageFile { get; set; } public string PrimaryContentPlaceHolderID { get; set; } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs index 4ce3aac6b8..fb5003e580 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs @@ -11,6 +11,7 @@ namespace AspNet.Mvc.Tests.Helpers { public IMvcProject Project { get; set; } public string ModelClassName { get; set; } + public string ModelClassAssemblyLocation { get; set; } public bool IsContentPage { get; set; } public string MasterPageFile { get; set; } public string PrimaryContentPlaceHolderId { get; set; } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableMvcTextTemplateHost.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableMvcTextTemplateHost.cs new file mode 100644 index 0000000000..7a19a63d2d --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableMvcTextTemplateHost.cs @@ -0,0 +1,26 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Reflection; +using ICSharpCode.AspNet.Mvc; + +namespace AspNet.Mvc.Tests.Helpers +{ + public class TestableMvcTextTemplateHost : MvcTextTemplateHost + { + public TestableMvcTextTemplateHost() + : base(null, null, null) + { + } + + public Assembly AssemblyToReturnFromLoadAssemblyFrom; + public string FileNamePassedToLoadAssemblyFrom; + + protected override Assembly LoadAssemblyFrom(string fileName) + { + FileNamePassedToLoadAssemblyFrom = fileName; + return AssemblyToReturnFromLoadAssemblyFrom; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs index 7bab0f089b..eaa5350c50 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProject.cs @@ -12,6 +12,7 @@ namespace AspNet.Mvc.Tests.Helpers public class TestableProject : CompilableProject { string language = "C#"; + string outputAssemblyFullPath = String.Empty; public TestableProject(ProjectCreateInformation createInfo) : base(createInfo) @@ -63,5 +64,14 @@ namespace AspNet.Mvc.Tests.Helpers ProjectService.AddProjectItem(this, projectItem); return projectItem; } + + public override string OutputAssemblyFullPath { + get { return outputAssemblyFullPath; } + } + + public void SetOutputAssemblyFullPath(string path) + { + outputAssemblyFullPath = path; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProjectContent.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProjectContent.cs new file mode 100644 index 0000000000..40d8905129 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableProjectContent.cs @@ -0,0 +1,17 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace AspNet.Mvc.Tests.Helpers +{ + public class TestableProjectContent : DefaultProjectContent + { + public TestableProject TestableProject = TestableProject.CreateProject(); + + public override object Project { + get { return TestableProject; } + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs index 5d9c1ed440..9efd388f4e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs @@ -96,14 +96,14 @@ namespace AspNet.Mvc.Tests viewModel.SelectedViewEngine = GetViewEngineFromViewModel("Razor"); } - void AddModelClassToProject(string ns, string name) + FakeMvcClass AddModelClassToProject(string ns, string name) { - fakeProject.AddModelClassToProject(ns, name); + return fakeProject.AddModelClassToProject(ns, name); } - void AddModelClassToProject(string fullyQualifiedClassName) + FakeMvcClass AddModelClassToProject(string fullyQualifiedClassName) { - fakeProject.AddModelClassToProject(fullyQualifiedClassName); + return fakeProject.AddModelClassToProject(fullyQualifiedClassName); } [Test] @@ -1388,5 +1388,38 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(emptyTemplate, template); } + + [Test] + public void AddMvcView_ModelClassSelected_ModelClassAssemblyLocationIsSetInGenerator() + { + CreateViewModel(); + CSharpProjectSelected(); + FakeMvcClass fakeClass = AddModelClassToProject("ICSharpCode.MyProject.MyModel"); + fakeClass.AssemblyLocation = @"d:\projects\MyProject\bin\MyProject.dll"; + viewModel.IsStronglyTypedView = true; + viewModel.SelectedModelClass = viewModel.ModelClasses.First(); + viewModel.AddMvcView(); + + string assemblyLocation = fakeViewGenerator.ModelClassAssemblyLocation; + + Assert.AreEqual(@"d:\projects\MyProject\bin\MyProject.dll", assemblyLocation); + } + + [Test] + public void AddMvcView_ModelClassSelectedAndThenIsStrongTypedViewIsSetToFalse_ModelClassAssemblyLocationIsNotSetInGenerator() + { + CreateViewModel(); + CSharpProjectSelected(); + FakeMvcClass fakeClass = AddModelClassToProject("ICSharpCode.MyProject.MyModel"); + fakeClass.AssemblyLocation = @"d:\projects\MyProject\bin\MyProject.dll"; + viewModel.IsStronglyTypedView = true; + viewModel.SelectedModelClass = viewModel.ModelClasses.First(); + viewModel.IsStronglyTypedView = false; + viewModel.AddMvcView(); + + string assemblyLocation = fakeViewGenerator.ModelClassAssemblyLocation; + + Assert.AreEqual(String.Empty, assemblyLocation); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs index 63f4ea8f53..7f8866273c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs @@ -71,5 +71,17 @@ namespace AspNet.Mvc.Tests Assert.AreEqual("ICSharpCode.BaseClass", name); } + + [Test] + public void AssemblyLocation_ProjectHasOutputAssemblyPath_ReturnsProjectOutputAssemblyPath() + { + CreateClass("ICSharpCode.TestClass"); + string expectedOutputAssemblyLocation = @"d:\test\bin\debug\test.dll"; + fakeClass.TestableProject.SetOutputAssemblyFullPath(expectedOutputAssemblyLocation); + + string assemblyLocation = mvcClass.AssemblyLocation; + + Assert.AreEqual(expectedOutputAssemblyLocation, assemblyLocation); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs index 8e5076cf1b..a46896084e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs @@ -61,5 +61,14 @@ namespace AspNet.Mvc.Tests Assert.AreEqual("MyClass", text); } + + [Test] + public void AssemblyLocation_ClassHasAssemblyLocation_ReturnsClassAssemblyLocation() + { + CreateViewModel("Test.MyClass"); + fakeClass.AssemblyLocation = "TestAssemblyLocation"; + + Assert.AreEqual("TestAssemblyLocation", viewModel.AssemblyLocation); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs index f55a778cf9..25d013df86 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs @@ -256,5 +256,17 @@ namespace AspNet.Mvc.Tests MvcProjectFileAssert.AreEqual(expectedFileName, fileName); } + + [Test] + public void OutputAssemblyFullPath_ProjectOutputAssemblyIsSet_ReturnsProjectOutputAssemblyFullPath() + { + CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); + string expectedAssemblyPath = @"d:\projects\AspNetMvcProject\bin\MyProject.dll"; + testableProject.SetOutputAssemblyFullPath(expectedAssemblyPath); + + string assemblyPath = project.OutputAssemblyFullPath; + + Assert.AreEqual(expectedAssemblyPath, assemblyPath); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs index f6b45a271b..9510834d36 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc; using NUnit.Framework; @@ -10,11 +11,11 @@ namespace AspNet.Mvc.Tests [TestFixture] public class MvcTextTemplateHostTests { - MvcTextTemplateHost host; + TestableMvcTextTemplateHost host; void CreateHost() { - host = new MvcTextTemplateHost(null, null, null); + host = new TestableMvcTextTemplateHost(); } [Test] @@ -97,6 +98,16 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(String.Empty, typeName); } + [Test] + public void ViewDataTypeAssemblyLocation_SetToNull_ReturnsEmptyString() + { + CreateHost(); + host.ViewDataTypeAssemblyLocation = null; + string location = host.ViewDataTypeAssemblyLocation; + + Assert.AreEqual(String.Empty, location); + } + [Test] public void MasterPageFile_SetToNull_ReturnsEmptyString() { @@ -116,5 +127,50 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(String.Empty, id); } + + [Test] + public void ViewDataType_ViewDataTypeAssemblyLocationIsSet_ViewDataTypeAssemblyLocationUsedToLoadAssembly() + { + CreateHost(); + host.AssemblyToReturnFromLoadAssemblyFrom = typeof(String).Assembly; + string expectedFileName = @"d:\test\bin\test.dll"; + host.ViewDataTypeAssemblyLocation = expectedFileName; + host.ViewDataTypeName = "System.String"; + + Type type = host.ViewDataType; + + string fileName = host.FileNamePassedToLoadAssemblyFrom; + + Assert.AreEqual(expectedFileName, fileName); + } + + [Test] + public void ViewDataType_ViewDataTypeNameIsSystemString_StringTypeReturned() + { + CreateHost(); + host.AssemblyToReturnFromLoadAssemblyFrom = typeof(String).Assembly; + host.ViewDataTypeName = "System.String"; + + Type type = host.ViewDataType; + + Assert.AreEqual("System.String", type.FullName); + } + + [Test] + public void ViewDataType_CalledTwice_AssemblyLoadedOnlyOnce() + { + CreateHost(); + host.AssemblyToReturnFromLoadAssemblyFrom = typeof(String).Assembly; + host.ViewDataTypeName = "System.String"; + + host.ViewDataTypeAssemblyLocation = @"d:\test\bin\test.dll"; + + Type type = host.ViewDataType; + + host.FileNamePassedToLoadAssemblyFrom = null; + type = host.ViewDataType; + + Assert.IsNull(host.FileNamePassedToLoadAssemblyFrom); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs index 9f2fb16137..6aa9b4a642 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs @@ -293,5 +293,27 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(expectedAppDomain, appDomain); } + + [Test] + public void GenerateFile_ModelClassAssemblyLocationIsSet_MvcTextTemplateHostHasViewDataTypeAssemblyLocationSetToModelClassAssemblyLocation() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + generator.ModelClassAssemblyLocation = @"d:\projects\MyProject\bin\debug\MyProject.dll"; + GenerateFile(); + + string assemblyLocation = fakeHost.ViewDataTypeAssemblyLocation; + + Assert.AreEqual(@"d:\projects\MyProject\bin\debug\MyProject.dll", assemblyLocation); + } + + [Test] + public void ModelClassAssemblyLocation_DefaultValue_ReturnsEmptyString() + { + CreateGenerator(); + string assemblyLocation = generator.ModelClassAssemblyLocation; + + Assert.AreEqual(String.Empty, assemblyLocation); + } } }