diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/ClassNameExtractor.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/ClassNameExtractor.cs new file mode 100644 index 0000000..2ca4fe0 --- /dev/null +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/ClassNameExtractor.cs @@ -0,0 +1,16 @@ +using System.IO; + +namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool +{ + public static class ClassNameExtractor + { + public static string GetClassName(string wszInputFilePath) + { + if (!File.Exists(wszInputFilePath)) + throw new FileNotFoundException(); + + var fileInfo = new FileInfo(wszInputFilePath); + return fileInfo.Name.Replace(fileInfo.Extension, string.Empty); + } + } +} diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs index d14a5bd..9e87c70 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs @@ -10,13 +10,15 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool { public class CodeDomCodeGenerator : CodeGenerator { + private readonly string className; private readonly CodeNamespace codeNamespace; private readonly CodeCompileUnit compileUnit; private readonly CodeDomProvider provider; - public CodeDomCodeGenerator(IResourceParser resourceParser, string defaultNamespace, CodeDomProvider codeDomProvider = null) + public CodeDomCodeGenerator(IResourceParser resourceParser, string className, string defaultNamespace, CodeDomProvider codeDomProvider = null) : base(resourceParser, defaultNamespace) { + this.className = className; compileUnit = new CodeCompileUnit(); provider = codeDomProvider ?? new CSharpCodeProvider(); codeNamespace = new CodeNamespace(defaultNamespace); @@ -39,7 +41,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool codeNamespace.Imports.Add(new CodeNamespaceImport("Windows.ApplicationModel.Resources")); - var targetClass = new CodeTypeDeclaration("Resources") + var targetClass = new CodeTypeDeclaration(className) { IsClass = true, IsPartial = true, diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeGeneratorFactory.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeGeneratorFactory.cs index fedb0aa..5ad3ace 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeGeneratorFactory.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeGeneratorFactory.cs @@ -4,9 +4,9 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool { public class CodeGeneratorFactory { - public ICodeGenerator Create(string defaultNamespace, string inputFileContents, CodeDomProvider codeDomProvider = null) + public ICodeGenerator Create(string className, string defaultNamespace, string inputFileContents, CodeDomProvider codeDomProvider = null) { - return new CodeDomCodeGenerator(new ResourceParser(inputFileContents), defaultNamespace, codeDomProvider); + return new CodeDomCodeGenerator(new ResourceParser(inputFileContents), className, defaultNamespace, codeDomProvider); } } } diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/ReswCodeGen.CustomTool.csproj b/RESW File Code Generator/ReswCodeGen.CustomTool/ReswCodeGen.CustomTool.csproj index b943b7a..bebaa1c 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/ReswCodeGen.CustomTool.csproj +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/ReswCodeGen.CustomTool.csproj @@ -40,6 +40,7 @@ False + False @@ -52,6 +53,7 @@ + diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/ReswFileCodeGenerator.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/ReswFileCodeGenerator.cs index b0d226b..26ab725 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/ReswFileCodeGenerator.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/ReswFileCodeGenerator.cs @@ -21,16 +21,17 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool public abstract int DefaultExtension(out string pbstrDefaultExtension); public virtual int Generate(string wszInputFilePath, - string bstrInputFileContents, - string wszDefaultNamespace, - IntPtr[] rgbOutputFileContents, - out uint pcbOutput, - IVsGeneratorProgress pGenerateProgress) + string bstrInputFileContents, + string wszDefaultNamespace, + IntPtr[] rgbOutputFileContents, + out uint pcbOutput, + IVsGeneratorProgress pGenerateProgress) { try { + var className = ClassNameExtractor.GetClassName(wszInputFilePath); var factory = new CodeGeneratorFactory(); - var codeGenerator = factory.Create(wszDefaultNamespace, bstrInputFileContents, codeDomProvider); + var codeGenerator = factory.Create(className, wszDefaultNamespace, bstrInputFileContents, codeDomProvider); var code = codeGenerator.GenerateCode(); var data = Encoding.UTF8.GetBytes(code); diff --git a/RESW File Code Generator/ReswCodeGen.Tests/ClassNameExtractorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/ClassNameExtractorTests.cs new file mode 100644 index 0000000..04dcf31 --- /dev/null +++ b/RESW File Code Generator/ReswCodeGen.Tests/ClassNameExtractorTests.cs @@ -0,0 +1,33 @@ +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests +{ + [TestClass] + [DeploymentItem("Resources/Resources.resw")] + public class ClassNameExtractorTests + { + private const string ClassName = "Resources.resw"; + + [TestMethod] + public void DoesNotReturnNull() + { + var actual = ClassNameExtractor.GetClassName(ClassName); + Assert.IsNotNull(actual); + } + + [TestMethod] + public void ReturnsFileNameWithoutExtension() + { + var actual = ClassNameExtractor.GetClassName(ClassName); + Assert.AreEqual("Resources", actual); + } + + [TestMethod] + [ExpectedException(typeof(FileNotFoundException))] + public void ThrowsFileNotFoundException() + { + ClassNameExtractor.GetClassName("C:\\Test\\Resources\\Strings.resw"); + } + } +} diff --git a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorFactoryTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorFactoryTests.cs index 31a7f7e..badfd58 100644 --- a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorFactoryTests.cs +++ b/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorFactoryTests.cs @@ -8,6 +8,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests public class CodeGeneratorFactoryTests { private string reswFileContents; + private const string ClassName = "C:\\Test\\Resources\\Strings.resw"; [TestInitialize] public void Initialize() @@ -19,7 +20,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests public void CodeGeneratorFactoryReturnsValidInstance() { var target = new CodeGeneratorFactory(); - var actual = target.Create("TestApp", reswFileContents); + var actual = target.Create(ClassName, "TestApp", reswFileContents); Assert.IsNotNull(actual); } } diff --git a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs index 38bf893..e1fd066 100644 --- a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs +++ b/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using System.IO; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -6,32 +5,34 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests { [TestClass] - [DeploymentItem("Resources/Valid/Resources.resw")] + [DeploymentItem("Resources/Resources.resw")] public class CodeGeneratorTests { private string reswFileContents; + private const string FilePath = "Resources.resw"; + private string actual; + private ICodeGenerator target; [TestInitialize] public void Initialize() { - reswFileContents = File.ReadAllText("Resources.resw"); + reswFileContents = File.ReadAllText(FilePath); + + target = new CodeGeneratorFactory().Create(FilePath, "TestApp", reswFileContents); + actual = target.GenerateCode(); } [TestMethod] public void GenerateCodeDoesNotReturnNull() { - var target = new CodeGeneratorFactory().Create("TestApp", reswFileContents); - var actual = target.GenerateCode(); Assert.IsNotNull(actual); } [TestMethod] public void GeneratedCodeContainsPropertiesDefinedInResources() { - var target = new CodeGeneratorFactory().Create("TestApp", reswFileContents); var resourceItems = target.ResourceParser.Parse(); - var actual = target.GenerateCode(); - + foreach (var item in resourceItems.Where(item => !item.Name.Contains("."))) Assert.IsTrue(actual.Contains("public static string " + item.Name)); } @@ -39,12 +40,16 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests [TestMethod] public void GeneratedCodePropertiesContainsCommentsSimilarToValuesDefinedInResources() { - var target = new CodeGeneratorFactory().Create("TestApp", reswFileContents); var resourceItems = target.ResourceParser.Parse(); - var actual = target.GenerateCode(); - + foreach (var item in resourceItems.Where(item => !item.Name.Contains("."))) Assert.IsTrue(actual.Contains("Localized resource similar to \"" + item.Value + "\"")); } + + [TestMethod] + public void ClassNameEqualsFileNameWithoutExtension() + { + Assert.IsTrue(actual.Contains("class Resources")); + } } } \ No newline at end of file diff --git a/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj b/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj index dba6357..48b41e2 100644 --- a/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj +++ b/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj @@ -55,6 +55,7 @@ +