diff --git a/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs b/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs index ca40b3d..62d04ca 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.2.*")] +[assembly: AssemblyVersion("1.0.3.*")] diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs index 796ac15..d4dae1e 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs @@ -3,6 +3,7 @@ using System.CodeDom; using System.CodeDom.Compiler; using System.Globalization; using System.IO; +using System.Reflection; using System.Text; using Microsoft.CSharp; @@ -51,11 +52,66 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool const string resourceLoaderType = "ResourceLoader"; var resourceLoaderField = new CodeMemberField(resourceLoaderType, "resourceLoader") { - Attributes = MemberAttributes.Private | MemberAttributes.Static | MemberAttributes.Final, - InitExpression = new CodeObjectCreateExpression(resourceLoaderType, new CodePrimitiveExpression(className)) + Attributes = MemberAttributes.Private | MemberAttributes.Static | MemberAttributes.Final }; targetClass.Members.Add(resourceLoaderField); + var constructor = new CodeTypeConstructor(); + + var executingAssemblyVar = new CodeVariableDeclarationStatement(typeof(string), "executingAssemblyName"); + var executingAssemblyInit = new CodeAssignStatement( + new CodeVariableReferenceExpression("executingAssemblyName"), + new CodeSnippetExpression("Windows.UI.Xaml.Application.Current.GetType().AssemblyQualifiedName")); + var executingAssemblySplit = new CodeVariableDeclarationStatement(typeof(string[]), "executingAssemblySplit"); + var executingAssemblyInit2 = new CodeAssignStatement( + new CodeVariableReferenceExpression("executingAssemblySplit"), + new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("executingAssemblyName"), "Split", new CodePrimitiveExpression(','))); + var executingAssemblyInit3 = new CodeAssignStatement( + new CodeVariableReferenceExpression("executingAssemblyName"), + new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("executingAssemblySplit"), new CodePrimitiveExpression(1))); + + var currentAssemblyVar = new CodeVariableDeclarationStatement(typeof(string), "currentAssemblyName"); + var currentAssemblyInit = new CodeAssignStatement( + new CodeVariableReferenceExpression("currentAssemblyName"), + new CodePropertyReferenceExpression(new CodeTypeOfExpression(className), "AssemblyQualifiedName")); + var currentAssemblySplit = new CodeVariableDeclarationStatement(typeof(string[]), "currentAssemblySplit"); + var currentAssemblyInit2 = new CodeAssignStatement( + new CodeVariableReferenceExpression("currentAssemblySplit"), + new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("currentAssemblyName"), "Split", new CodePrimitiveExpression(','))); + var currentAssemblyInit3 = new CodeAssignStatement( + new CodeVariableReferenceExpression("currentAssemblyName"), + new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("currentAssemblySplit"), new CodePrimitiveExpression(1))); + + var createResourceLoader = new CodeConditionStatement( + new CodeSnippetExpression("executingAssemblyName.Equals(currentAssemblyName)"), + new CodeStatement[] // true + { + new CodeAssignStatement( + new CodeFieldReferenceExpression(null, "resourceLoader"), + new CodeObjectCreateExpression(new CodeTypeReference("ResourceLoader"))) + }, + new CodeStatement[] // false + { + new CodeAssignStatement( + new CodeFieldReferenceExpression(null, "resourceLoader"), + new CodeObjectCreateExpression(new CodeTypeReference("ResourceLoader"), + new CodeSnippetExpression("currentAssemblyName + \"/Resources\""))) + }); + + constructor.Statements.Add(executingAssemblyVar); + constructor.Statements.Add(executingAssemblyInit); + constructor.Statements.Add(executingAssemblySplit); + constructor.Statements.Add(executingAssemblyInit2); + constructor.Statements.Add(executingAssemblyInit3); + constructor.Statements.Add(currentAssemblyVar); + constructor.Statements.Add(currentAssemblyInit); + constructor.Statements.Add(currentAssemblySplit); + constructor.Statements.Add(currentAssemblyInit2); + constructor.Statements.Add(currentAssemblyInit3); + constructor.Statements.Add(createResourceLoader); + + targetClass.Members.Add(constructor); + var resources = ResourceParser.Parse(); foreach (var item in resources) { diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs index 5b345cd..ab6cd83 100644 --- a/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs +++ b/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.2.*")] +[assembly: AssemblyVersion("1.0.3.*")] diff --git a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs similarity index 90% rename from RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs rename to RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs index d247abd..073894a 100644 --- a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs +++ b/RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs @@ -6,7 +6,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests { [TestClass] [DeploymentItem("Resources/Resources.resw")] - public class CodeGeneratorTests + public class CSharpCodeGeneratorTests { private string reswFileContents; private const string FilePath = "Resources.resw"; @@ -55,7 +55,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests [TestMethod] public void ResourceLoaderInitializedWithClassName() { - Assert.IsTrue(actual.Contains("new ResourceLoader(\"Resources\");")); + Assert.IsTrue(actual.Contains("new ResourceLoader(currentAssemblyName + \"/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 48b41e2..0d352fc 100644 --- a/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj +++ b/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj @@ -57,10 +57,11 @@ - + + diff --git a/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs new file mode 100644 index 0000000..2a08d65 --- /dev/null +++ b/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs @@ -0,0 +1,62 @@ +using System.IO; +using System.Linq; +using Microsoft.VisualBasic; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests +{ + [TestClass] + [DeploymentItem("Resources/Resources.resw")] + public class VisualBasicCodeGeneratorTests + { + private const string FilePath = "Resources.resw"; + private string actual; + private string reswFileContents; + private ICodeGenerator target; + + [TestInitialize] + public void Initialize() + { + reswFileContents = File.ReadAllText(FilePath); + + target = new CodeGeneratorFactory().Create(FilePath.Replace(".resw", string.Empty), "TestApp", reswFileContents, new VBCodeProvider()); + actual = target.GenerateCode(); + } + + [TestMethod] + public void GenerateCodeDoesNotReturnNull() + { + Assert.IsNotNull(actual); + } + + [TestMethod] + public void GeneratedCodeContainsPropertiesDefinedInResources() + { + var resourceItems = target.ResourceParser.Parse(); + + foreach (var item in resourceItems.Where(item => !item.Name.Contains("."))) + Assert.IsTrue(actual.Contains("Public Shared ReadOnly Property " + item.Name + "() As String")); + } + + [TestMethod] + public void GeneratedCodePropertiesContainsCommentsSimilarToValuesDefinedInResources() + { + var resourceItems = target.ResourceParser.Parse(); + + 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")); + } + + [TestMethod] + public void ResourceLoaderInitializedWithClassName() + { + Assert.IsTrue(actual.Contains("New ResourceLoader(currentAssemblyName + \"/Resources\")")); + } + } +} \ No newline at end of file