diff --git a/Generator/Configuration/GeneratorConfiguration.cs b/Generator/Configuration/GeneratorConfiguration.cs index 93da8e37e..9ff0be821 100644 --- a/Generator/Configuration/GeneratorConfiguration.cs +++ b/Generator/Configuration/GeneratorConfiguration.cs @@ -69,6 +69,9 @@ private void SetUnitTestDefaultsByName(string name) case "nunit": GeneratorUnitTestProviderType = typeof(NUnitTestConverter); break; + case "mbunit": + GeneratorUnitTestProviderType = typeof(MbUnitTestGeneratorProvider); + break; case "xunit": GeneratorUnitTestProviderType = typeof(XUnitTestGeneratorProvider); break; diff --git a/Generator/TechTalk.SpecFlow.Generator.csproj b/Generator/TechTalk.SpecFlow.Generator.csproj index 77d3c3544..9e91a1bdd 100644 --- a/Generator/TechTalk.SpecFlow.Generator.csproj +++ b/Generator/TechTalk.SpecFlow.Generator.csproj @@ -68,6 +68,7 @@ + diff --git a/Generator/UnitTestProvider/MbUnitTestGeneratorProvider.cs b/Generator/UnitTestProvider/MbUnitTestGeneratorProvider.cs new file mode 100644 index 000000000..3d91442db --- /dev/null +++ b/Generator/UnitTestProvider/MbUnitTestGeneratorProvider.cs @@ -0,0 +1,104 @@ +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Linq; + +namespace TechTalk.SpecFlow.Generator.UnitTestProvider +{ + public class MbUnitTestGeneratorProvider : IUnitTestGeneratorProvider + { + private const string TESTFIXTURE_ATTR = "MbUnit.Framework.TestFixtureAttribute"; + private const string TEST_ATTR = "MbUnit.Framework.TestAttribute"; + private const string CATEGORY_ATTR = "MbUnit.Framework.CategoryAttribute"; + private const string TESTSETUP_ATTR = "MbUnit.Framework.SetUpAttribute"; + private const string TESTFIXTURESETUP_ATTR = "MbUnit.Framework.FixtureSetUpAttribute"; + private const string TESTFIXTURETEARDOWN_ATTR = "MbUnit.Framework.FixtureTearDownAttribute"; + private const string TESTTEARDOWN_ATTR = "MbUnit.Framework.TearDownAttribute"; + private const string IGNORE_ATTR = "MbUnit.Framework.IgnoreAttribute"; + private const string DESCRIPTION_ATTR = "MbUnit.Framework.DescriptionAttribute"; + + public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description) + { + typeDeclaration.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TESTFIXTURE_ATTR))); + + SetDescription(typeDeclaration.CustomAttributes, title); + } + + private void SetDescription(CodeAttributeDeclarationCollection customAttributes, string description) + { + customAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(DESCRIPTION_ATTR), + new CodeAttributeArgument( + new CodePrimitiveExpression(description)))); + } + + private void SetCategories(CodeAttributeDeclarationCollection customAttributes, IEnumerable categories) + { + foreach (var category in categories) + { + customAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(CATEGORY_ATTR), + new CodeAttributeArgument( + new CodePrimitiveExpression(category)))); + } + } + + public void SetTestFixtureCategories(CodeTypeDeclaration typeDeclaration, IEnumerable categories) + { + SetCategories(typeDeclaration.CustomAttributes, categories); + } + + public void SetTest(CodeMemberMethod memberMethod, string title) + { + memberMethod.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TEST_ATTR))); + + SetDescription(memberMethod.CustomAttributes, title); + } + + public void SetTestCategories(CodeMemberMethod memberMethod, IEnumerable categories) + { + SetCategories(memberMethod.CustomAttributes, categories); + } + + public void SetTestSetup(CodeMemberMethod memberMethod) + { + memberMethod.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TESTSETUP_ATTR))); + } + + public void SetTestFixtureSetup(CodeMemberMethod memberMethod) + { + memberMethod.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TESTFIXTURESETUP_ATTR))); + } + + public void SetTestFixtureTearDown(CodeMemberMethod memberMethod) + { + memberMethod.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TESTFIXTURETEARDOWN_ATTR))); + } + + public void SetTestTearDown(CodeMemberMethod memberMethod) + { + memberMethod.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(TESTTEARDOWN_ATTR))); + } + + public void SetIgnore(CodeTypeMember codeTypeMember) + { + codeTypeMember.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(IGNORE_ATTR))); + } + } +} \ No newline at end of file diff --git a/Runtime/Configuration/RuntimeConfiguration.cs b/Runtime/Configuration/RuntimeConfiguration.cs index 92d95eddb..a82f3b70e 100644 --- a/Runtime/Configuration/RuntimeConfiguration.cs +++ b/Runtime/Configuration/RuntimeConfiguration.cs @@ -146,6 +146,9 @@ private void SetUnitTestDefaultsByName(string name) case "nunit": RuntimeUnitTestProviderType = typeof(NUnitRuntimeProvider); break; + case "mbunit": + RuntimeUnitTestProviderType = typeof(MbUnitRuntimeProvider); + break; case "xunit": RuntimeUnitTestProviderType = typeof(XUnitRuntimeProvider); break; diff --git a/Runtime/TechTalk.SpecFlow.csproj b/Runtime/TechTalk.SpecFlow.csproj index 4e6e51e8a..697d17ac9 100644 --- a/Runtime/TechTalk.SpecFlow.csproj +++ b/Runtime/TechTalk.SpecFlow.csproj @@ -80,6 +80,7 @@ + diff --git a/Runtime/UnitTestProvider/MbUnitRuntimeProvider.cs b/Runtime/UnitTestProvider/MbUnitRuntimeProvider.cs new file mode 100644 index 000000000..022422576 --- /dev/null +++ b/Runtime/UnitTestProvider/MbUnitRuntimeProvider.cs @@ -0,0 +1,37 @@ +using System; + +namespace TechTalk.SpecFlow.UnitTestProvider +{ + public class MbUnitRuntimeProvider : IUnitTestRuntimeProvider + { + private const string MSTEST_ASSEMBLY = "MbUnit"; + private const string ASSERT_TYPE = "MbUnit.Framework.Assert"; + + private Action assertInconclusive; + + #region IUnitTestRuntimeProvider Members + + public void TestInconclusive(string message) + { + if (assertInconclusive == null) + { + assertInconclusive = UnitTestRuntimeProviderHelper + .GetAssertMethod(MSTEST_ASSEMBLY, ASSERT_TYPE, "Inconclusive"); + } + + assertInconclusive(message); + } + + public void TestIgnore(string message) + { + TestInconclusive(message); // there is no dynamic "Ignore" in mstest + } + + public bool DelayedFixtureTearDown + { + get { return true; } + } + + #endregion + } +} \ No newline at end of file diff --git a/Tests/ParserTests/ParserTests.csproj b/Tests/ParserTests/ParserTests.csproj index 357bb12d6..13b494008 100644 --- a/Tests/ParserTests/ParserTests.csproj +++ b/Tests/ParserTests/ParserTests.csproj @@ -51,6 +51,7 @@ + diff --git a/Tests/ParserTests/SuccessfulMbUnitGenerationTest.cs b/Tests/ParserTests/SuccessfulMbUnitGenerationTest.cs new file mode 100644 index 000000000..ec2a39577 --- /dev/null +++ b/Tests/ParserTests/SuccessfulMbUnitGenerationTest.cs @@ -0,0 +1,183 @@ +using System; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.Globalization; +using System.IO; +using System.Text; +using Microsoft.CSharp; +using NUnit.Framework; +using TechTalk.SpecFlow.Generator; +using TechTalk.SpecFlow.Generator.UnitTestProvider; +using TechTalk.SpecFlow.Parser; +using TechTalk.SpecFlow.Parser.SyntaxElements; + +namespace ParserTests +{ + [TestFixture] + public class SuccessfulMbUnitGenerationTest + { + private void CompareWithExpectedResult(Feature feature, string expectedResultFileName) + { + string expected = TestFileHelper.ReadFile(expectedResultFileName); + string got = GenerateCodeFromFeature(feature); + + Assert.AreEqual(expected, got); + } + + private void GenerateCodeFromFeature(Feature feature, TextWriter writer) + { + var codeDomHelper = new CodeDomHelper(GenerationTargetLanguage.CSharp); + var mbUnitTestGeneratorProvider = new MbUnitTestGeneratorProvider(); + var converter = new SpecFlowUnitTestConverter(mbUnitTestGeneratorProvider, codeDomHelper, true); + CodeNamespace codeNamespace = converter.GenerateUnitTestFixture(feature, "TestClassName", "Target.Namespace"); + + var codeProvider = new CSharpCodeProvider(); + var options = new CodeGeneratorOptions(); + codeProvider.GenerateCodeFromNamespace(codeNamespace, writer, options); + } + + private void GenerateCodeFromFeature(Feature feature, string fileName) + { + using (var writer = new StreamWriter(fileName, false, Encoding.UTF8)) + { + GenerateCodeFromFeature(feature, writer); + } + } + + private string GenerateCodeFromFeature(Feature feature) + { + using (var writer = new Utf8StringWriter()) + { + GenerateCodeFromFeature(feature, writer); + return writer.ToString(); + } + } + + [Test] + public void CanGenerateButFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "but.feature")); + } + + [Test] + public void CanGenerateCommentsFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "comments.feature")); + } + + [Test] + public void CanGenerateFeatureheaderFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "featureheader.feature")); + } + + [Test, TestCaseSource(typeof (TestFileHelper), "GetTestFiles")] + public void CanGenerateFromFile(string fileName) + { + Console.WriteLine(fileName); + var parser = new SpecFlowLangParser(new CultureInfo("en-US")); + using (var reader = new StreamReader(fileName)) + { + Feature feature = parser.Parse(reader); + Assert.IsNotNull(feature); + + string generatedCode = GenerateCodeFromFeature(feature); + Assert.IsNotNull(generatedCode); + + // to regenerate the expected result file: + //GenerateCodeFromFeature(feature, fileName + ".cs"); + + //CompareWithExpectedResult(feature, fileName + ".cs"); + } + } + + [Test] + public void CanGenerateFromFiles() + { + foreach (string testFile in TestFileHelper.GetTestFiles()) + { + CanGenerateFromFile(testFile); + } + } + + [Test] + public void CanGenerateGivenWhenThenDuplicationFeatureFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "givenwhenthenduplication.feature")); + } + + [Test] + public void CanGenerateMixedGWTFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "mixedgivenwhenthen.feature")); + } + + [Test] + public void CanGenerateMultilineargumentFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "multilineargument.feature")); + } + + [Test] + public void CanGenerateMultilinetitleFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "multilinetitle.feature")); + } + + [Test] + public void CanGenerateScneriooutlineFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "scenariooutline.feature")); + } + + [Test] + public void CanGenerateSimpleFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "simple.feature")); + } + + [Test] + public void CanGenerateTableargumentFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "tableargument.feature")); + } + + [Test] + public void CanGenerateTagsFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "tags.feature")); + } + + [Test] + public void CanGenerateWhitespacesFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "whitespaces.feature")); + } + + [Test] + public void CanGeneratebackgroundFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "background.feature")); + } + + [Test] + public void CanGeneratebackgroundWithTitleFeature() + { + string folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "background_withtitle.feature")); + } + } +} \ No newline at end of file diff --git a/Tests/RuntimeTests/ConfigurationTest.cs b/Tests/RuntimeTests/ConfigurationTest.cs index d8e3e7e38..de6e8caec 100644 --- a/Tests/RuntimeTests/ConfigurationTest.cs +++ b/Tests/RuntimeTests/ConfigurationTest.cs @@ -18,9 +18,7 @@ public void CanLoadConfigFromConfigFile() } [Test] - public void CanLoadConfigFromString() - { - const string configString = @" + [TestCase(@" -"; +")] + public void CanLoadConfigFromString(string configString) + { + //const string configString = ; var runtimeConfig = RuntimeConfiguration.LoadFromConfigFile( ConfigurationSectionHandler.CreateFromXml(configString));