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));