diff --git a/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..13702edfba --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,16 @@ +// 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.Reflection; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("TextTemplating")] +[assembly: AssemblyDescription("Text Templating (T4) Addin for SharpDevelop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs new file mode 100644 index 0000000000..662c86e088 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomain.cs @@ -0,0 +1,12 @@ +// 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; + +namespace ICSharpCode.TextTemplating +{ + public interface ITextTemplatingAppDomain : IDisposable + { + AppDomain AppDomain { get; } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs new file mode 100644 index 0000000000..a6fde56036 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingAppDomainFactory.cs @@ -0,0 +1,12 @@ +// 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; + +namespace ICSharpCode.TextTemplating +{ + public interface ITextTemplatingAppDomainFactory + { + ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase); + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs new file mode 100644 index 0000000000..f7f8c94501 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.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.SharpDevelop.Project; + +namespace ICSharpCode.TextTemplating +{ + public interface ITextTemplatingCustomToolContext + { + FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName); + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs new file mode 100644 index 0000000000..6b123995ff --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingFileGenerator.cs @@ -0,0 +1,12 @@ +// 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; + +namespace ICSharpCode.TextTemplating +{ + public interface ITextTemplatingFileGenerator : IDisposable + { + void ProcessTemplate(); + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.cs new file mode 100644 index 0000000000..ce47ed5177 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingHost.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; + +namespace ICSharpCode.TextTemplating +{ + public interface ITextTemplatingHost : IDisposable + { + bool ProcessTemplate(string inputFile, string outputFile); + string OutputFile { get; } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs new file mode 100644 index 0000000000..cb4da2fb43 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomain.cs @@ -0,0 +1,34 @@ +// 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 System.Reflection; + +namespace ICSharpCode.TextTemplating +{ + [Serializable] + public class TextTemplatingAppDomain : ITextTemplatingAppDomain + { + AppDomain appDomain; + + public TextTemplatingAppDomain(string applicationBase) + { + AppDomainSetup setupInfo = new AppDomainSetup(); + setupInfo.ApplicationBase = applicationBase; + this.appDomain = AppDomain.CreateDomain("TextTemplatingAppDomain", null, setupInfo); + } + + public AppDomain AppDomain { + get { return this.appDomain; } + } + + public void Dispose() + { + if (this.appDomain != null) { + AppDomain.Unload(this.appDomain); + this.appDomain = null; + } + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs new file mode 100644 index 0000000000..b400557915 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAppDomainFactory.cs @@ -0,0 +1,15 @@ +// 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; + +namespace ICSharpCode.TextTemplating +{ + public class TextTemplatingAppDomainFactory : ITextTemplatingAppDomainFactory + { + public ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase) + { + return new TextTemplatingAppDomain(applicationBase); + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs new file mode 100644 index 0000000000..b483b79751 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs @@ -0,0 +1,23 @@ +// 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.Project; + +namespace ICSharpCode.TextTemplating +{ + public class TextTemplatingCustomToolContext : ITextTemplatingCustomToolContext + { + CustomToolContext context; + + public TextTemplatingCustomToolContext(CustomToolContext context) + { + this.context = context; + } + + public FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName) + { + return context.EnsureOutputFileIsInProject(baseItem, outputFileName); + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs new file mode 100644 index 0000000000..dde2ec5fa2 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs @@ -0,0 +1,69 @@ +// 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.SharpDevelop.Project; + +namespace ICSharpCode.TextTemplating +{ + public class TextTemplatingFileGenerator : ITextTemplatingFileGenerator + { + ITextTemplatingHost host; + FileProjectItem projectFile; + ITextTemplatingCustomToolContext context; + + public TextTemplatingFileGenerator( + ITextTemplatingHost host, + FileProjectItem projectFile, + ITextTemplatingCustomToolContext context) + { + this.host = host; + this.projectFile = projectFile; + this.context = context; + } + + public void Dispose() + { + host.Dispose(); + } + + public void ProcessTemplate() + { + GenerateOutputFileForTemplate(); + AddOutputFileToProjectIfRequired(); + } + + void GenerateOutputFileForTemplate() + { + string inputFileName = projectFile.FileName; + string outputFileName = GetOutputFileName(inputFileName); + host.ProcessTemplate(inputFileName, outputFileName); + } + + string GetOutputFileName(string inputFileName) + { + return Path.ChangeExtension(inputFileName, ".cs"); + } + + void AddOutputFileToProjectIfRequired() + { + context.EnsureOutputFileIsInProject(projectFile, host.OutputFile); + } + + +// internal static void LogicalSetData (string name, object value, +// System.CodeDom.Compiler.CompilerErrorCollection errors) +// { +// //FIXME: CallContext.LogicalSetData not implemented in Mono +// try { +// System.Runtime.Remoting.Messaging.CallContext.LogicalSetData (name, value); +// } catch (NotImplementedException) { +// errors.Add (new System.CodeDom.Compiler.CompilerError ( +// null, -1, -1, null, +// "Could not set " + name + " - CallContext.LogicalSetData not implemented in this Mono version" +// ) { IsWarning = true }); +// } +// } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs new file mode 100644 index 0000000000..f0a0cd7a92 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGeneratorCustomTool.cs @@ -0,0 +1,38 @@ +// 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.CodeDom.Compiler; +using System.IO; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.TextTemplating +{ + public class TextTemplatingFileGeneratorCustomTool : ICustomTool + { + public void GenerateCode(FileProjectItem item, CustomToolContext context) + { + using (var generator = CreateTextTemplatingFileGenerator(item, context)) { + generator.ProcessTemplate(); + } + } + + protected virtual ITextTemplatingFileGenerator CreateTextTemplatingFileGenerator( + FileProjectItem projectFile, + CustomToolContext context) + { + var appDomainFactory = new TextTemplatingAppDomainFactory(); + string applicationBase = GetAssemblyBaseLocation(); + var host = new TextTemplatingHost(appDomainFactory, applicationBase); + var textTemplatingCustomToolContext = new TextTemplatingCustomToolContext(context); + + return new TextTemplatingFileGenerator(host, projectFile, textTemplatingCustomToolContext); + } + + string GetAssemblyBaseLocation() + { + string location = GetType().Assembly.Location; + return Path.GetDirectoryName(location); + } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs new file mode 100644 index 0000000000..05cf8fd02e --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingHost.cs @@ -0,0 +1,42 @@ +// 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 Mono.TextTemplating; + +namespace ICSharpCode.TextTemplating +{ + public class TextTemplatingHost : TemplateGenerator, ITextTemplatingHost + { + ITextTemplatingAppDomainFactory appDomainFactory; + ITextTemplatingAppDomain templatingAppDomain; + string applicationBase; + + public TextTemplatingHost(ITextTemplatingAppDomainFactory appDomainFactory, string applicationBase) + { + this.appDomainFactory = appDomainFactory; + this.applicationBase = applicationBase; + } + + public void Dispose() + { + if (templatingAppDomain != null) { + templatingAppDomain.Dispose(); + templatingAppDomain = null; + } + } + + public override AppDomain ProvideTemplatingAppDomain(string content) + { + if (templatingAppDomain == null) { + CreateAppDomain(); + } + return templatingAppDomain.AppDomain; + } + + void CreateAppDomain() + { + templatingAppDomain = appDomainFactory.CreateTextTemplatingAppDomain(applicationBase); + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin new file mode 100644 index 0000000000..489c34a8f1 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj new file mode 100644 index 0000000000..a0e5eafc90 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj @@ -0,0 +1,84 @@ + + + + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF} + Debug + x86 + Library + ICSharpCode.TextTemplating + TextTemplating + v4.0 + False + False + 4 + false + ..\..\..\..\..\AddIns\Misc\TextTemplating\ + + + x86 + False + Auto + 4194304 + 4096 + + + true + Full + False + True + DEBUG;TRACE + Project + + + false + None + True + False + TRACE + + + + lib\Mono.TextTemplating.dll + + + + 3.5 + + + + + + Configuration\GlobalAssemblyInfo.cs + + + + + + + + + + + + + + + + + Always + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll b/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll new file mode 100644 index 0000000000..7d4c082510 Binary files /dev/null and b/src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll differ diff --git a/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..052d3702c1 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Configuration/AssemblyInfo.cs @@ -0,0 +1,16 @@ +// 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.Reflection; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("TextTemplating.Tests")] +[assembly: AssemblyDescription("Text Templating (T4) Addin Tests")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs new file mode 100644 index 0000000000..ba6c783124 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomain.cs @@ -0,0 +1,20 @@ +// 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 TextTemplating.Tests.Helpers +{ + public class FakeTextTemplatingAppDomain : ITextTemplatingAppDomain + { + public bool IsDisposeCalled; + + public AppDomain AppDomain { get; set; } + + public void Dispose() + { + IsDisposeCalled = true; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs new file mode 100644 index 0000000000..297aca7985 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingAppDomainFactory.cs @@ -0,0 +1,22 @@ +// 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 TextTemplating.Tests.Helpers +{ + public class FakeTextTemplatingAppDomainFactory : ITextTemplatingAppDomainFactory + { + public FakeTextTemplatingAppDomain FakeTextTemplatingAppDomain = new FakeTextTemplatingAppDomain(); + public int CreateTextTemplatingAppDomainCallCount; + public string ApplicationBasePassedToCreateTextTemplatingAppDomain; + + public ITextTemplatingAppDomain CreateTextTemplatingAppDomain(string applicationBase) + { + ApplicationBasePassedToCreateTextTemplatingAppDomain = applicationBase; + CreateTextTemplatingAppDomainCallCount++; + return FakeTextTemplatingAppDomain; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs new file mode 100644 index 0000000000..59a26fd62f --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.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 ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; + +namespace TextTemplating.Tests.Helpers +{ + public class FakeTextTemplatingCustomToolContext : ITextTemplatingCustomToolContext + { + public FileProjectItem BaseItemPassedToEnsureOutputFileIsInProject; + public string OutputFileNamePassedToEnsureOutputFileIsInProject; + public TestableFileProjectItem EnsureOutputFileIsInProjectReturnValue = new TestableFileProjectItem(@"d:\Projects\MyProject\template.tt"); + + public FileProjectItem EnsureOutputFileIsInProject(FileProjectItem baseItem, string outputFileName) + { + BaseItemPassedToEnsureOutputFileIsInProject = baseItem; + OutputFileNamePassedToEnsureOutputFileIsInProject = outputFileName; + + return EnsureOutputFileIsInProjectReturnValue; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.cs new file mode 100644 index 0000000000..f42fd98597 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingFileGenerator.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 ICSharpCode.TextTemplating; + +namespace TextTemplating.Tests.Helpers +{ + public class FakeTextTemplatingFileGenerator : ITextTemplatingFileGenerator + { + public bool IsProcessTemplateCalled; + public bool IsDisposeCalledAfterTemplateProcessed; + + public void ProcessTemplate() + { + IsProcessTemplateCalled = true; + } + + public void Dispose() + { + IsDisposeCalledAfterTemplateProcessed = IsProcessTemplateCalled; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.cs new file mode 100644 index 0000000000..eb76391a25 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingHost.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.TextTemplating; + +namespace TextTemplating.Tests.Helpers +{ + public class FakeTextTemplatingHost : ITextTemplatingHost + { + public string InputFilePassedToProcessTemplate; + public string OutputFilePassedToProcessTemplate; + public bool ProcessTemplateReturnValue = true; + public bool IsDisposeCalled; + + public bool ProcessTemplate(string inputFile, string outputFile) + { + InputFilePassedToProcessTemplate = inputFile; + OutputFilePassedToProcessTemplate = outputFile; + return ProcessTemplateReturnValue; + } + + public void Dispose() + { + IsDisposeCalled = true; + } + + public string OutputFile { get; set; } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs new file mode 100644 index 0000000000..2f5d839e78 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.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 ICSharpCode.SharpDevelop.Project; + +namespace TextTemplating.Tests.Helpers +{ + public class TestableFileProjectItem : FileProjectItem + { + string fileName; + + public TestableFileProjectItem(string fileName) + : base(null, ItemType.None) + { + this.fileName = fileName; + } + + public override string FileName { + get { return fileName; } + set { fileName = value; } + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.cs new file mode 100644 index 0000000000..9a0eda541e --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableTextTemplatingFileGeneratorCustomTool.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 ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; + +namespace TextTemplating.Tests.Helpers +{ + public class TestableTextTemplatingFileGeneratorCustomTool : TextTemplatingFileGeneratorCustomTool + { + public FileProjectItem ProjectFilePassedToCreateTextTemplatingFileGenerator; + public CustomToolContext ContextPassedToCreateTextTemplatingFileGenerator; + public FakeTextTemplatingFileGenerator FakeTextTemplatingFileGenerator = new FakeTextTemplatingFileGenerator(); + + protected override ITextTemplatingFileGenerator CreateTextTemplatingFileGenerator( + FileProjectItem projectFile, + CustomToolContext context) + { + ProjectFilePassedToCreateTextTemplatingFileGenerator = projectFile; + ContextPassedToCreateTextTemplatingFileGenerator = context; + + return FakeTextTemplatingFileGenerator; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs new file mode 100644 index 0000000000..e0f0555d0a --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs @@ -0,0 +1,73 @@ +// 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.Internal.Templates; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; +using NUnit.Framework; +using TextTemplating.Tests.Helpers; + +namespace TextTemplating.Tests +{ + [TestFixture] + public class TextTemplatingFileGeneratorCustomToolTests + { + TestableTextTemplatingFileGeneratorCustomTool customTool; + + void CreateCustomTool() + { + customTool = new TestableTextTemplatingFileGeneratorCustomTool(); + } + + IProject CreateProject() + { + return new MSBuildFileProject(@"d:\projects\test.csproj", "test"); + } + + FileProjectItem GenerateCodeWithProjectFile() + { + var file = new TestableFileProjectItem("test.tt"); + customTool.GenerateCode(file, null); + return file; + } + + [Test] + public void GenerateCode_ProjectFilePassed_ProjectFileUsedToCreateTextTemplatingFileGenerator() + { + CreateCustomTool(); + var file = GenerateCodeWithProjectFile(); + + Assert.AreEqual(file, customTool.ProjectFilePassedToCreateTextTemplatingFileGenerator); + } + + [Test] + public void GenerateCode_CustomToolContextPassed_CustomToolContextUsedToCreateTextTemplatingFileGenerator() + { + CreateCustomTool(); + IProject project = CreateProject(); + var context = new CustomToolContext(project); + customTool.GenerateCode(null, context); + + Assert.AreEqual(context, customTool.ContextPassedToCreateTextTemplatingFileGenerator); + } + + [Test] + public void GenerateCode_ProjectFilePassed_TemplateIsProcessed() + { + CreateCustomTool(); + GenerateCodeWithProjectFile(); + + Assert.IsTrue(customTool.FakeTextTemplatingFileGenerator.IsProcessTemplateCalled); + } + + [Test] + public void GenerateCode_ProjectFilePassed_TextTemplatingFileGeneratorIsDisposedAfterTemplateIsProcessed() + { + CreateCustomTool(); + GenerateCodeWithProjectFile(); + + Assert.IsTrue(customTool.FakeTextTemplatingFileGenerator.IsDisposeCalledAfterTemplateProcessed); + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs new file mode 100644 index 0000000000..37e7018555 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs @@ -0,0 +1,83 @@ +// 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.Project; +using ICSharpCode.TextTemplating; +using NUnit.Framework; +using TextTemplating.Tests.Helpers; + +namespace TextTemplating.Tests +{ + [TestFixture] + public class TextTemplatingFileGeneratorTests + { + TextTemplatingFileGenerator generator; + FakeTextTemplatingHost templatingHost; + FakeTextTemplatingCustomToolContext customToolContext; + + FileProjectItem ProcessTemplate(string fileName) + { + var projectFile = CreateGenerator(fileName); + generator.ProcessTemplate(); + + return projectFile; + } + + FileProjectItem CreateGenerator(string fileName) + { + templatingHost = new FakeTextTemplatingHost(); + var projectFile = new TestableFileProjectItem(fileName); + customToolContext = new FakeTextTemplatingCustomToolContext(); + + generator = new TextTemplatingFileGenerator(templatingHost, projectFile, customToolContext); + + return projectFile; + } + + [Test] + public void ProcessTemplate_TemplateFileInProjectPassed_TemplatingHostProcessesFile() + { + string fileName = @"d:\projects\MyProject\template.tt"; + ProcessTemplate(fileName); + + Assert.AreEqual(fileName, templatingHost.InputFilePassedToProcessTemplate); + } + + [Test] + public void ProcessTemplate_TemplateFileInProjectPassed_OutputFileNamePassedIsInputFileWithFileExtensionChangedToCSharpFileExtension() + { + ProcessTemplate(@"d:\projects\MyProject\template.tt"); + + string expectedOutputFileName = @"d:\projects\MyProject\template.cs"; + Assert.AreEqual(expectedOutputFileName, templatingHost.OutputFilePassedToProcessTemplate); + } + + [Test] + public void Dispose_TemplateHostUsedToCreateFileGenerator_TemplateHostIsDisposed() + { + CreateGenerator(@"d:\template.tt"); + generator.Dispose(); + + Assert.IsTrue(templatingHost.IsDisposeCalled); + } + + [Test] + public void ProcessTemplate_TemplateFileInProjectPassed_TemplateFileInProjectUsedWhenCheckingIfOutputFileExistsInProject() + { + var file = ProcessTemplate(@"d:\template.tt"); + + Assert.AreEqual(file, customToolContext.BaseItemPassedToEnsureOutputFileIsInProject); + } + + [Test] + public void ProcessTemplate_OutputFileNameChangedWhenTemplateProcessed_NewOutputFileNameIsUsedWhenCheckingIfOutputFileExistsInProject() + { + CreateGenerator(@"d:\template.tt"); + templatingHost.OutputFile = @"d:\changed-output.test"; + generator.ProcessTemplate(); + + Assert.AreEqual(@"d:\changed-output.test", customToolContext.OutputFileNamePassedToEnsureOutputFileIsInProject); + } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs new file mode 100644 index 0000000000..bc66d42de3 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingHostTests.cs @@ -0,0 +1,94 @@ +// 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; +using NUnit.Framework; +using TextTemplating.Tests.Helpers; + +namespace TextTemplating.Tests +{ + [TestFixture] + public class TextTemplatingHostTests + { + TextTemplatingHost host; + FakeTextTemplatingAppDomainFactory textTemplatingAppDomainFactory; + FakeTextTemplatingAppDomain textTemplatingAppDomain; + + void CreateHost() + { + CreateHost(String.Empty); + } + + void CreateHost(string applicationBase) + { + textTemplatingAppDomainFactory = new FakeTextTemplatingAppDomainFactory(); + textTemplatingAppDomain = textTemplatingAppDomainFactory.FakeTextTemplatingAppDomain; + host = new TextTemplatingHost(textTemplatingAppDomainFactory, applicationBase); + } + + [Test] + public void ProvideTemplatingAppDomain_PassedContentName_ReturnsDomainFromTextTemplatingAppDomainFactory() + { + CreateHost(); + AppDomain expectedAppDomain = AppDomain.CreateDomain("TextTemplatingHostTests"); + textTemplatingAppDomain.AppDomain = expectedAppDomain; + + AppDomain actualAppDomain = host.ProvideTemplatingAppDomain("test"); + + Assert.AreEqual(expectedAppDomain, actualAppDomain); + } + + [Test] + public void Dispose_DisposingHostAfterProvideTemplatingAppDomainCalled_DisposesTemplatingAppDomain() + { + CreateHost(); + host.ProvideTemplatingAppDomain("test"); + host.Dispose(); + + Assert.IsTrue(textTemplatingAppDomain.IsDisposeCalled); + } + + [Test] + public void Dispose_DisposingHostWhenProvideTemplatingAppDomainIsNotCalled_DoesNotThrowNullReferenceException() + { + CreateHost(); + Assert.DoesNotThrow(() => host.Dispose()); + } + + [Test] + public void ProvideTemplatingAppDomain_MethodCalledTwice_AppDomainCreatedOnce() + { + CreateHost(); + host.ProvideTemplatingAppDomain("test"); + host.ProvideTemplatingAppDomain("test"); + + Assert.AreEqual(1, textTemplatingAppDomainFactory.CreateTextTemplatingAppDomainCallCount); + } + + [Test] + public void Dispose_DisposeCalledTwiceHostAfterProvideTemplatingAppDomainCalled_DisposesTemplatingAppDomainOnce() + { + CreateHost(); + host.ProvideTemplatingAppDomain("test"); + host.Dispose(); + + textTemplatingAppDomain.IsDisposeCalled = false; + host.Dispose(); + + Assert.IsFalse(textTemplatingAppDomain.IsDisposeCalled); + } + + [Test] + public void ProvideTemplatingAppDomain_PassedContentName_HostApplicationBaseIsUsedAsAppDomainSetupApplicationBase() + { + string applicationBase = @"d:\sharpdevelop\addins\texttemplating"; + CreateHost(applicationBase); + host.ProvideTemplatingAppDomain("test"); + + string actualApplicationBase = textTemplatingAppDomainFactory.ApplicationBasePassedToCreateTextTemplatingAppDomain; + Assert.AreEqual(applicationBase, actualApplicationBase); + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj new file mode 100644 index 0000000000..09a6e946f9 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj @@ -0,0 +1,89 @@ + + + + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6} + Debug + x86 + Library + TextTemplating.Tests + TextTemplating.Tests + v4.0 + Properties + False + False + 4 + false + ..\..\..\..\..\..\bin\UnitTests\ + + + x86 + False + Auto + 4194304 + 4096 + + + true + Full + False + True + DEBUG;TRACE + Project + + + false + None + True + False + TRACE + + + + ..\Project\lib\Mono.TextTemplating.dll + + + ..\..\..\..\Tools\NUnit\nunit.framework.dll + + + + 3.5 + + + + + + Configuration\GlobalAssemblyInfo.cs + + + + + + + + + + + + + + + + + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + + + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF} + TextTemplating + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/TextTemplating.sln b/src/AddIns/Misc/TextTemplating/TextTemplating.sln new file mode 100644 index 0000000000..7d3ca24b52 --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/TextTemplating.sln @@ -0,0 +1,110 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +# SharpDevelop 4.1.0.7318-alpha +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTemplating", "Project\TextTemplating.csproj", "{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "..\..\..\Libraries\AvalonDock\AvalonDock\AvalonDock.csproj", "{87E61430-4243-45F2-B74E-0A4C096CEBF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "..\..\..\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "..\..\..\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTemplating.Tests", "Test\TextTemplating.Tests.csproj", "{5186325C-DD7F-4246-9BE7-3F384EFBF5A6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "..\..\..\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|x86.Build.0 = Debug|x86 + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|x86.ActiveCfg = Debug|x86 + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|x86.Build.0 = Release|x86 + {B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|x86.ActiveCfg = Release|x86 + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|x86.Build.0 = Debug|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|x86.ActiveCfg = Debug|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|x86.Build.0 = Release|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|x86.ActiveCfg = Release|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|Any CPU.Build.0 = Release|Any CPU + {87E61430-4243-45F2-B74E-0A4C096CEBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.Build.0 = Debug|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.Build.0 = Release|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.ActiveCfg = Release|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|x86.Build.0 = Debug|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|x86.Build.0 = Release|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|x86.ActiveCfg = Release|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|Any CPU.Build.0 = Release|Any CPU + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|x86.Build.0 = Debug|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|x86.ActiveCfg = Debug|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|Any CPU.Build.0 = Debug|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|x86.Build.0 = Release|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|x86.ActiveCfg = Release|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|Any CPU.Build.0 = Release|Any CPU + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}.Release|Any CPU.ActiveCfg = Release|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.Build.0 = Debug|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.Build.0 = Release|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.ActiveCfg = Release|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.Build.0 = Release|Any CPU + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.Build.0 = Debug|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.ActiveCfg = Debug|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.Build.0 = Release|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.ActiveCfg = Release|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.Build.0 = Release|Any CPU + {8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|x86.Build.0 = Debug|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|x86.ActiveCfg = Debug|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|Any CPU.Build.0 = Debug|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|x86.Build.0 = Release|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|x86.ActiveCfg = Release|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|Any CPU.Build.0 = Release|x86 + {5186325C-DD7F-4246-9BE7-3F384EFBF5A6}.Release|Any CPU.ActiveCfg = Release|x86 + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|x86.Build.0 = Debug|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|x86.ActiveCfg = Debug|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.Build.0 = Release|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.ActiveCfg = Release|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.Build.0 = Release|Any CPU + {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|x86.Build.0 = Debug|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|x86.ActiveCfg = Debug|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|x86.Build.0 = Release|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|x86.ActiveCfg = Release|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.Build.0 = Release|Any CPU + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection +EndGlobal