From 8ff82585265299e5c3fde573af1b41997fe11855 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 12 Oct 2011 20:22:06 +0100 Subject: [PATCH] Create MvcTextTemplateHost in the same app domain as the T4 templating engine. --- .../AspNet.Mvc/Project/AspNet.Mvc.csproj | 7 ++++ .../Project/Src/CurrentAppDomain.cs | 19 +++++++++ .../Project/Src/CurrentAppDomainFactory.cs | 17 ++++++++ .../Src/IMvcTextTemplateHostAppDomain.cs | 18 +++++++++ .../IMvcTextTemplateHostAppDomainFactory.cs | 13 +++++++ .../Src/IMvcTextTemplateHostFactory.cs | 5 ++- .../Project/Src/MvcControllerFileGenerator.cs | 10 +++-- .../Project/Src/MvcFileGenerator.cs | 22 ++++++++--- .../Src/MvcTextTemplateAssemblyResolver.cs | 17 ++++++++ .../Src/MvcTextTemplateHostAppDomain.cs | 39 +++++++++++++++++++ .../MvcTextTemplateHostAppDomainFactory.cs | 24 ++++++++++++ .../Project/Src/MvcTextTemplateHostFactory.cs | 20 +++------- .../Project/Src/MvcViewFileGenerator.cs | 8 ++-- .../AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj | 3 ++ .../Helpers/FakeMvcTextTemplateAppDomain.cs | 30 ++++++++++++++ .../FakeMvcTextTemplateAppDomainFactory.cs | 18 +++++++++ .../Helpers/FakeMvcTextTemplateHostFactory.cs | 4 +- .../Src/MvcControllerFileGeneratorTests.cs | 28 ++++++++++++- .../MvcTextTemplateAssemblyResolverTests.cs | 31 +++++++++++++++ .../Test/Src/MvcViewFileGeneratorTests.cs | 28 ++++++++++++- 20 files changed, 332 insertions(+), 29 deletions(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomain.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomainFactory.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomain.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomainFactory.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateAssemblyResolver.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomain.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomainFactory.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomain.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomainFactory.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateAssemblyResolverTests.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index ccf634eec1..461b6574d2 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -61,6 +61,8 @@ + + @@ -73,8 +75,10 @@ + + @@ -101,9 +105,12 @@ + + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomain.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomain.cs new file mode 100644 index 0000000000..6910a796a3 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomain.cs @@ -0,0 +1,19 @@ +// 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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public class CurrentAppDomain : ITextTemplatingAppDomain + { + public AppDomain AppDomain { + get { return AppDomain.CurrentDomain; } + } + + public void Dispose() + { + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomainFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomainFactory.cs new file mode 100644 index 0000000000..79f055a30c --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/CurrentAppDomainFactory.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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + [Serializable] + public class CurrentAppDomainFactory : ITextTemplatingAppDomainFactory + { + public ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase) + { + return new CurrentAppDomain(); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomain.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomain.cs new file mode 100644 index 0000000000..6286660f2b --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomain.cs @@ -0,0 +1,18 @@ +// 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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public interface IMvcTextTemplateHostAppDomain : ITextTemplatingAppDomain + { + string ApplicationBase { get; } + + IMvcTextTemplateHost CreateMvcTextTemplateHost( + ITextTemplatingAppDomainFactory appDomainFactory, + ITextTemplatingAssemblyResolver assemblyResolver, + string applicationBase); + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomainFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomainFactory.cs new file mode 100644 index 0000000000..5312a4e0a0 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostAppDomainFactory.cs @@ -0,0 +1,13 @@ +// 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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public interface IMvcTextTemplateHostAppDomainFactory + { + IMvcTextTemplateHostAppDomain CreateAppDomain(); + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostFactory.cs index b6152ecbac..d848857926 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostFactory.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostFactory.cs @@ -3,11 +3,14 @@ using System; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; namespace ICSharpCode.AspNet.Mvc { public interface IMvcTextTemplateHostFactory { - IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject project); + IMvcTextTemplateHost CreateMvcTextTemplateHost( + IMvcProject project, + IMvcTextTemplateHostAppDomain appDomain); } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs index 70df3dc0eb..7349e2a403 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs @@ -9,12 +9,16 @@ namespace ICSharpCode.AspNet.Mvc public class MvcControllerFileGenerator : MvcFileGenerator, IMvcControllerFileGenerator { public MvcControllerFileGenerator() - : this(new MvcTextTemplateHostFactory()) + : this( + new MvcTextTemplateHostFactory(), + new MvcTextTemplateHostAppDomainFactory()) { } - public MvcControllerFileGenerator(IMvcTextTemplateHostFactory hostFactory) - : base(hostFactory) + public MvcControllerFileGenerator( + IMvcTextTemplateHostFactory hostFactory, + IMvcTextTemplateHostAppDomainFactory appDomainFactory) + : base(hostFactory, appDomainFactory) { this.Template = new MvcControllerTextTemplate(); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs index 5bb5ccf3f1..f203dff084 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs @@ -4,16 +4,21 @@ using System; using System.CodeDom.Compiler; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; namespace ICSharpCode.AspNet.Mvc { public abstract class MvcFileGenerator { IMvcTextTemplateHostFactory hostFactory; + IMvcTextTemplateHostAppDomainFactory appDomainFactory; - public MvcFileGenerator(IMvcTextTemplateHostFactory hostFactory) + public MvcFileGenerator( + IMvcTextTemplateHostFactory hostFactory, + IMvcTextTemplateHostAppDomainFactory appDomainFactory) { this.hostFactory = hostFactory; + this.appDomainFactory = appDomainFactory; } public MvcTextTemplateLanguage TemplateLanguage { get; set; } @@ -21,14 +26,21 @@ namespace ICSharpCode.AspNet.Mvc public void GenerateFile(MvcFileName fileName) { - using (IMvcTextTemplateHost host = CreateHost()) { - GenerateFile(host, fileName); + using (IMvcTextTemplateHostAppDomain appDomain = CreateAppDomain()) { + using (IMvcTextTemplateHost host = CreateHost(appDomain)) { + GenerateFile(host, fileName); + } } } - IMvcTextTemplateHost CreateHost() + IMvcTextTemplateHostAppDomain CreateAppDomain() { - return hostFactory.CreateMvcTextTemplateHost(Project); + return appDomainFactory.CreateAppDomain(); + } + + IMvcTextTemplateHost CreateHost(IMvcTextTemplateHostAppDomain appDomain) + { + return hostFactory.CreateMvcTextTemplateHost(Project, appDomain); } void GenerateFile(IMvcTextTemplateHost host, MvcFileName fileName) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateAssemblyResolver.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateAssemblyResolver.cs new file mode 100644 index 0000000000..9648bcfd59 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateAssemblyResolver.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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + [Serializable] + public class MvcTextTemplateAssemblyResolver : ITextTemplatingAssemblyResolver + { + public string Resolve(string assemblyReference) + { + return assemblyReference; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomain.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomain.cs new file mode 100644 index 0000000000..cec3079f0b --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomain.cs @@ -0,0 +1,39 @@ +// 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.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcTextTemplateHostAppDomain : TextTemplatingAppDomain, IMvcTextTemplateHostAppDomain + { + public MvcTextTemplateHostAppDomain(string applicationBase) + : base(applicationBase) + { + this.ApplicationBase = applicationBase; + } + + public string ApplicationBase { get; private set; } + + public IMvcTextTemplateHost CreateMvcTextTemplateHost( + ITextTemplatingAppDomainFactory appDomainFactory, + ITextTemplatingAssemblyResolver assemblyResolver, + string applicationBase) + { + Type type = typeof(MvcTextTemplateHost); + var args = new object[] { appDomainFactory, assemblyResolver, applicationBase }; + + return (MvcTextTemplateHost)AppDomain.CreateInstanceAndUnwrap( + type.Assembly.FullName, + type.FullName, + false, + BindingFlags.CreateInstance, + null, + args, + null, + null); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomainFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomainFactory.cs new file mode 100644 index 0000000000..b913c7d681 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostAppDomainFactory.cs @@ -0,0 +1,24 @@ +// 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.IO; +using ICSharpCode.TextTemplating; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcTextTemplateHostAppDomainFactory : IMvcTextTemplateHostAppDomainFactory + { + public IMvcTextTemplateHostAppDomain CreateAppDomain() + { + string applicationBase = GetAssemblyBaseLocation(); + return new MvcTextTemplateHostAppDomain(applicationBase); + } + + string GetAssemblyBaseLocation() + { + string location = GetType().Assembly.Location; + return Path.GetDirectoryName(location); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs index cbda853a3f..341ea427a2 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs @@ -2,26 +2,18 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.IO; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.TextTemplating; namespace ICSharpCode.AspNet.Mvc { public class MvcTextTemplateHostFactory : IMvcTextTemplateHostFactory { - public IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject mvcProject) + public IMvcTextTemplateHost CreateMvcTextTemplateHost( + IMvcProject mvcProject, + IMvcTextTemplateHostAppDomain appDomain) { - var appDomainFactory = new TextTemplatingAppDomainFactory(); - string applicationBase = GetAssemblyBaseLocation(); - var assemblyResolver = new TextTemplatingAssemblyResolver(mvcProject.Project); - return new MvcTextTemplateHost(appDomainFactory, assemblyResolver, applicationBase); - } - - string GetAssemblyBaseLocation() - { - string location = GetType().Assembly.Location; - return Path.GetDirectoryName(location); + var assemblyResolver = new MvcTextTemplateAssemblyResolver(); + var appDomainFactory = new CurrentAppDomainFactory(); + return appDomain.CreateMvcTextTemplateHost(appDomainFactory, assemblyResolver, appDomain.ApplicationBase); } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs index 49cad56610..f9ddfbfbae 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs @@ -13,14 +13,16 @@ namespace ICSharpCode.AspNet.Mvc public MvcViewFileGenerator() : this( new MvcTextTemplateHostFactory(), - new MvcTextTemplateRepository()) + new MvcTextTemplateRepository(), + new MvcTextTemplateHostAppDomainFactory()) { } public MvcViewFileGenerator( IMvcTextTemplateHostFactory hostFactory, - MvcTextTemplateRepository textTemplateRepository) - : base(hostFactory) + MvcTextTemplateRepository textTemplateRepository, + IMvcTextTemplateHostAppDomainFactory appDomainFactory) + : base(hostFactory, appDomainFactory) { this.textTemplateRepository = textTemplateRepository; 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 5bb9ecd6fa..3b92258e29 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -62,6 +62,8 @@ + + @@ -93,6 +95,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomain.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomain.cs new file mode 100644 index 0000000000..783c537edb --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomain.cs @@ -0,0 +1,30 @@ +// 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.AspNet.Mvc; +using ICSharpCode.TextTemplating; + +namespace AspNet.Mvc.Tests.Helpers +{ + public class FakeMvcTextTemplateAppDomain : IMvcTextTemplateHostAppDomain + { + public string ApplicationBase { get; set; } + public AppDomain AppDomain { get; set; } + + public IMvcTextTemplateHost CreateMvcTextTemplateHost( + ITextTemplatingAppDomainFactory appDomainFactory, + ITextTemplatingAssemblyResolver assemblyResolver, + string applicationBase) + { + return null; + } + + public bool IsDisposed; + + public void Dispose() + { + IsDisposed = true; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomainFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomainFactory.cs new file mode 100644 index 0000000000..fdbadd8592 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateAppDomainFactory.cs @@ -0,0 +1,18 @@ +// 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.AspNet.Mvc; + +namespace AspNet.Mvc.Tests.Helpers +{ + public class FakeMvcTextTemplateAppDomainFactory : IMvcTextTemplateHostAppDomainFactory + { + public FakeMvcTextTemplateAppDomain FakeAppDomain = new FakeMvcTextTemplateAppDomain(); + + public IMvcTextTemplateHostAppDomain CreateAppDomain() + { + return FakeAppDomain; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs index f27d9ad3e6..5b680ab722 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs @@ -10,11 +10,13 @@ namespace AspNet.Mvc.Tests.Helpers public class FakeMvcTextTemplateHostFactory : IMvcTextTemplateHostFactory { public IMvcProject ProjectPassedToCreateMvcTextTemplateHost; + public IMvcTextTemplateHostAppDomain AppDomainPassedToCreateMvcTextTemplateHost; public FakeMvcTextTemplateHost FakeMvcTextTemplateHost = new FakeMvcTextTemplateHost(); - public IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject project) + public IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject project, IMvcTextTemplateHostAppDomain appDomain) { ProjectPassedToCreateMvcTextTemplateHost = project; + AppDomainPassedToCreateMvcTextTemplateHost = appDomain; return FakeMvcTextTemplateHost; } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs index 7ebdf4f845..ed1e0e3461 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs @@ -16,12 +16,14 @@ namespace AspNet.Mvc.Tests FakeMvcProject projectUsedByGenerator; FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; + FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; void CreateGenerator() { fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; - generator = new MvcControllerFileGenerator(fakeHostFactory); + fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); + generator = new MvcControllerFileGenerator(fakeHostFactory, fakeAppDomainFactory); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -176,5 +178,29 @@ namespace AspNet.Mvc.Tests Assert.IsFalse(addActionMethods); } + + [Test] + public void GenerateFile_CSharpControllerTemplate_AppDomainIsDisposed() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + GenerateFile(); + bool disposed = fakeAppDomainFactory.FakeAppDomain.IsDisposed; + + Assert.IsTrue(disposed); + } + + [Test] + public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreatedWithAppDomain() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + GenerateFile(); + + IMvcTextTemplateHostAppDomain appDomain = fakeHostFactory.AppDomainPassedToCreateMvcTextTemplateHost; + FakeMvcTextTemplateAppDomain expectedAppDomain = fakeAppDomainFactory.FakeAppDomain; + + Assert.AreEqual(expectedAppDomain, appDomain); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateAssemblyResolverTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateAssemblyResolverTests.cs new file mode 100644 index 0000000000..19af044d65 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateAssemblyResolverTests.cs @@ -0,0 +1,31 @@ +// 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.AspNet.Mvc; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests +{ + [TestFixture] + public class MvcTextTemplateAssemblyResolverTests + { + MvcTextTemplateAssemblyResolver resolver; + + void CreateResolver() + { + resolver = new MvcTextTemplateAssemblyResolver(); + } + + [Test] + public void Resolve_FullPathToAssemblyPassed_ReturnsFullPathToAssembly() + { + CreateResolver(); + string expectedAssemblyPath = @"d:\projects\MyProject\bin\debug\MyProject.dll"; + + string resolvedAssemblyPath = resolver.Resolve(expectedAssemblyPath); + + Assert.AreEqual(expectedAssemblyPath, resolvedAssemblyPath); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs index 8116f6e037..9f2fb16137 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs @@ -17,6 +17,7 @@ namespace AspNet.Mvc.Tests MvcTextTemplateRepository templateRepository; FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHost fakeHost; + FakeMvcTextTemplateAppDomainFactory fakeAppDomainFactory; void CreateTemplateRepository(string templateRootDirectory) { @@ -33,7 +34,8 @@ namespace AspNet.Mvc.Tests { fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; - generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository); + fakeAppDomainFactory = new FakeMvcTextTemplateAppDomainFactory(); + generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository, fakeAppDomainFactory); projectUsedByGenerator = new FakeMvcProject(); generator.Project = projectUsedByGenerator; ProjectPassedToGeneratorIsCSharpProject(); @@ -267,5 +269,29 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(expectedFileName, fileName); } + + [Test] + public void GenerateFile_CSharpEmptyViewTemplate_AppDomainIsDisposed() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + GenerateFile(); + bool disposed = fakeAppDomainFactory.FakeAppDomain.IsDisposed; + + Assert.IsTrue(disposed); + } + + [Test] + public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreatedWithAppDomain() + { + CreateGenerator(); + ProjectPassedToGeneratorIsCSharpProject(); + GenerateFile(); + + IMvcTextTemplateHostAppDomain appDomain = fakeHostFactory.AppDomainPassedToCreateMvcTextTemplateHost; + FakeMvcTextTemplateAppDomain expectedAppDomain = fakeAppDomainFactory.FakeAppDomain; + + Assert.AreEqual(expectedAppDomain, appDomain); + } } }