Implemented using the filename of the specified .resw file as the generated class name

This commit is contained in:
Christian Resma Helle
2012-11-14 14:34:13 +01:00
parent ab6fc61125
commit 4972afb7f4
9 changed files with 83 additions and 22 deletions
@@ -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);
}
}
}
@@ -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,
@@ -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);
}
}
}
@@ -40,6 +40,7 @@
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.Shell.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration.Install" />
@@ -52,6 +53,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ClassNameExtractor.cs" />
<Compile Include="CodeDomCodeGenerator.cs" />
<Compile Include="CodeGenerator.cs" />
<Compile Include="CodeGeneratorFactory.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);
@@ -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");
}
}
}
@@ -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);
}
}
@@ -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"));
}
}
}
@@ -55,6 +55,7 @@
</Otherwise>
</Choose>
<ItemGroup>
<Compile Include="ClassNameExtractorTests.cs" />
<Compile Include="CodeGeneratorFactoryTests.cs" />
<Compile Include="CodeGeneratorTests.cs" />
<Compile Include="ResourceParserErrorHandlingTests.cs" />