From a22a11074003aea84d88d432456df6cc41aa4a7a Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 25 Sep 2011 18:30:45 +0100 Subject: [PATCH] Expand variables such as SolutionDir, ProjectDir in T4 include directives. --- .../Project/Src/TextTemplatingCustomTool.cs | 3 +- .../Project/Src/TextTemplatingHost.cs | 14 ++++++ .../Helpers/TestableTextTemplatingHost.cs | 11 ++++- .../Test/Src/TextTemplatingHostTests.cs | 45 +++++++++++++------ 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomTool.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomTool.cs index 8e4836fd0d..aa8f14f239 100644 --- a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomTool.cs +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomTool.cs @@ -16,7 +16,8 @@ namespace ICSharpCode.TextTemplating var appDomainFactory = new TextTemplatingAppDomainFactory(); string applicationBase = GetAssemblyBaseLocation(); var assemblyResolver = new TextTemplatingAssemblyResolver(project); - var host = new TextTemplatingHost(appDomainFactory, assemblyResolver, applicationBase); + var textTemplatingVariables = new TextTemplatingVariables(); + var host = new TextTemplatingHost(appDomainFactory, assemblyResolver, textTemplatingVariables, applicationBase); return host; } diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs index 2dfc6fa592..3029a6389a 100644 --- a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs @@ -11,15 +11,18 @@ namespace ICSharpCode.TextTemplating ITextTemplatingAppDomainFactory appDomainFactory; ITextTemplatingAppDomain templatingAppDomain; ITextTemplatingAssemblyResolver assemblyResolver; + ITextTemplatingVariables templatingVariables; string applicationBase; public TextTemplatingHost( ITextTemplatingAppDomainFactory appDomainFactory, ITextTemplatingAssemblyResolver assemblyResolver, + ITextTemplatingVariables templatingVariables, string applicationBase) { this.appDomainFactory = appDomainFactory; this.assemblyResolver = assemblyResolver; + this.templatingVariables = templatingVariables; this.applicationBase = applicationBase; } @@ -48,5 +51,16 @@ namespace ICSharpCode.TextTemplating { return assemblyResolver.Resolve(assemblyReference); } + + protected override string ResolvePath(string path) + { + path = ExpandPath(path); + return base.ResolvePath(path); + } + + string ExpandPath(string path) + { + return templatingVariables.Expand(path); + } } } diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingHost.cs index 6d0514d532..e60b150b35 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingHost.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingHost.cs @@ -10,11 +10,13 @@ namespace TextTemplating.Tests.Helpers { public FakeTextTemplatingAppDomainFactory FakeTextTemplatingAppDomainFactory; public FakeTextTemplatingAssemblyResolver FakeTextTemplatingAssemblyResolver; + public FakeTextTemplatingVariables FakeTextTemplatingVariables; public TestableTextTemplatingHost(string applicationBase) : this( new FakeTextTemplatingAppDomainFactory(), new FakeTextTemplatingAssemblyResolver(), + new FakeTextTemplatingVariables(), applicationBase) { } @@ -22,16 +24,23 @@ namespace TextTemplating.Tests.Helpers public TestableTextTemplatingHost( FakeTextTemplatingAppDomainFactory appDomainFactory, FakeTextTemplatingAssemblyResolver assemblyResolver, + FakeTextTemplatingVariables textTemplatingVariables, string applicationBase) - : base(appDomainFactory, assemblyResolver, applicationBase) + : base(appDomainFactory, assemblyResolver, textTemplatingVariables, applicationBase) { FakeTextTemplatingAppDomainFactory = appDomainFactory; FakeTextTemplatingAssemblyResolver = assemblyResolver; + FakeTextTemplatingVariables = textTemplatingVariables; } public string CallResolveAssemblyReference(string assemblyReference) { return base.ResolveAssemblyReference(assemblyReference); } + + public string CallResolvePath(string path) + { + return base.ResolvePath(path); + } } } diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs index 050165667f..8f4cc8c72f 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs @@ -13,9 +13,10 @@ namespace TextTemplating.Tests public class TextTemplatingHostTests { TestableTextTemplatingHost host; - FakeTextTemplatingAppDomainFactory textTemplatingAppDomainFactory; - FakeTextTemplatingAppDomain textTemplatingAppDomain; - FakeTextTemplatingAssemblyResolver assemblyResolver; + FakeTextTemplatingAppDomainFactory fakeTextTemplatingAppDomainFactory; + FakeTextTemplatingAppDomain fakeTextTemplatingAppDomain; + FakeTextTemplatingAssemblyResolver fakeAssemblyResolver; + FakeTextTemplatingVariables fakeTextTemplatingVariables; void CreateHost() { @@ -25,9 +26,15 @@ namespace TextTemplating.Tests void CreateHost(string applicationBase) { host = new TestableTextTemplatingHost(applicationBase); - textTemplatingAppDomainFactory = host.FakeTextTemplatingAppDomainFactory; - textTemplatingAppDomain = textTemplatingAppDomainFactory.FakeTextTemplatingAppDomain; - assemblyResolver = host.FakeTextTemplatingAssemblyResolver; + fakeTextTemplatingAppDomainFactory = host.FakeTextTemplatingAppDomainFactory; + fakeTextTemplatingAppDomain = fakeTextTemplatingAppDomainFactory.FakeTextTemplatingAppDomain; + fakeAssemblyResolver = host.FakeTextTemplatingAssemblyResolver; + fakeTextTemplatingVariables = host.FakeTextTemplatingVariables; + } + + void AddTemplateVariableValue(string variableName, string variableValue) + { + fakeTextTemplatingVariables.AddVariable(variableName, variableValue); } [Test] @@ -35,7 +42,7 @@ namespace TextTemplating.Tests { CreateHost(); AppDomain expectedAppDomain = AppDomain.CreateDomain("TextTemplatingHostTests"); - textTemplatingAppDomain.AppDomain = expectedAppDomain; + fakeTextTemplatingAppDomain.AppDomain = expectedAppDomain; AppDomain actualAppDomain = host.ProvideTemplatingAppDomain("test"); @@ -49,7 +56,7 @@ namespace TextTemplating.Tests host.ProvideTemplatingAppDomain("test"); host.Dispose(); - Assert.IsTrue(textTemplatingAppDomain.IsDisposeCalled); + Assert.IsTrue(fakeTextTemplatingAppDomain.IsDisposeCalled); } [Test] @@ -66,7 +73,7 @@ namespace TextTemplating.Tests host.ProvideTemplatingAppDomain("test"); host.ProvideTemplatingAppDomain("test"); - Assert.AreEqual(1, textTemplatingAppDomainFactory.CreateTextTemplatingAppDomainCallCount); + Assert.AreEqual(1, fakeTextTemplatingAppDomainFactory.CreateTextTemplatingAppDomainCallCount); } [Test] @@ -76,10 +83,10 @@ namespace TextTemplating.Tests host.ProvideTemplatingAppDomain("test"); host.Dispose(); - textTemplatingAppDomain.IsDisposeCalled = false; + fakeTextTemplatingAppDomain.IsDisposeCalled = false; host.Dispose(); - Assert.IsFalse(textTemplatingAppDomain.IsDisposeCalled); + Assert.IsFalse(fakeTextTemplatingAppDomain.IsDisposeCalled); } [Test] @@ -89,7 +96,7 @@ namespace TextTemplating.Tests CreateHost(applicationBase); host.ProvideTemplatingAppDomain("test"); - string actualApplicationBase = textTemplatingAppDomainFactory.ApplicationBasePassedToCreateTextTemplatingAppDomain; + string actualApplicationBase = fakeTextTemplatingAppDomainFactory.ApplicationBasePassedToCreateTextTemplatingAppDomain; Assert.AreEqual(applicationBase, actualApplicationBase); } @@ -99,17 +106,27 @@ namespace TextTemplating.Tests CreateHost(); host.CallResolveAssemblyReference("MyReference"); - Assert.AreEqual("MyReference", assemblyResolver.AssembyReferencePassedToResolve); + Assert.AreEqual("MyReference", fakeAssemblyResolver.AssembyReferencePassedToResolve); } [Test] public void ResolveAssemblyReference_PassedMyAssemblyReference_ReturnsFileNameReturnedFromAssemblyResolverResolveMethod() { CreateHost(); - assemblyResolver.ResolveReturnValue = @"d:\projects\references\MyReference.dll"; + fakeAssemblyResolver.ResolveReturnValue = @"d:\projects\references\MyReference.dll"; string result = host.CallResolveAssemblyReference("MyReference"); Assert.AreEqual(@"d:\projects\references\MyReference.dll", result); } + + [Test] + public void ResolvePath_PathContainsSolutionDirProperty_SolutionDirExpanded() + { + CreateHost(); + AddTemplateVariableValue("$(SolutionDir)", @"d:\projects\MySolution\"); + string path = host.CallResolvePath("$(SolutionDir)"); + + Assert.AreEqual(@"d:\projects\MySolution\", path); + } } }