From 0c0b268b7e538b25de1bba3bf71c25ed3bc18ca8 Mon Sep 17 00:00:00 2001 From: Xerxes Battiwalla Date: Fri, 4 Dec 2009 07:57:23 +1100 Subject: [PATCH 01/34] Implemented Context injection so that contexts could be shared across multiple scenario implementations --- Runtime/ScenarioContext.cs | 12 +- TechTalk.SpecFlow.sln | 7 ++ .../ContextInjection/ContextInjection.feature | 26 +++++ .../ContextInjection.feature.cs | 109 ++++++++++++++++++ .../FeatureWithADependentContextSteps.cs | 31 +++++ .../FeatureWithARecursiveContextSteps.cs | 31 +++++ .../FeatureWithASingleContextSteps.cs | 32 +++++ .../FeatureWithMultipleContextsSteps.cs | 34 ++++++ .../FeatureWithNoContextSteps.cs | 22 ++++ .../ContextInjection/NestedContext.cs | 17 +++ .../ContextInjection/SingleContext.cs | 7 ++ Tests/FeatureTests/FeatureTests.csproj | 92 +++++++++++++++ Tests/FeatureTests/Properties/AssemblyInfo.cs | 36 ++++++ 13 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 Tests/FeatureTests/ContextInjection/ContextInjection.feature create mode 100644 Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs create mode 100644 Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs create mode 100644 Tests/FeatureTests/ContextInjection/FeatureWithARecursiveContextSteps.cs create mode 100644 Tests/FeatureTests/ContextInjection/FeatureWithASingleContextSteps.cs create mode 100644 Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs create mode 100644 Tests/FeatureTests/ContextInjection/FeatureWithNoContextSteps.cs create mode 100644 Tests/FeatureTests/ContextInjection/NestedContext.cs create mode 100644 Tests/FeatureTests/ContextInjection/SingleContext.cs create mode 100644 Tests/FeatureTests/FeatureTests.csproj create mode 100644 Tests/FeatureTests/Properties/AssemblyInfo.cs diff --git a/Runtime/ScenarioContext.cs b/Runtime/ScenarioContext.cs index c4cb6a2f0..c0fd7d6b3 100644 --- a/Runtime/ScenarioContext.cs +++ b/Runtime/ScenarioContext.cs @@ -55,7 +55,17 @@ public object GetBindingInstance(Type bindingType) object value; if (!bindingInstances.TryGetValue(bindingType, out value)) { - value = Activator.CreateInstance(bindingType); + var ctors = bindingType.GetConstructors(); + if (bindingType.IsClass && ctors.Length == 0) + throw new MissingMethodException(String.Format("No public constructors found for type {0}", bindingType.FullName)); + + var parameters = new List(); + foreach (var param in ctors[0].GetParameters()) + { + parameters.Add(GetBindingInstance(param.ParameterType)); + } + + value = Activator.CreateInstance(bindingType, parameters.ToArray()); bindingInstances.Add(bindingType, value); } diff --git a/TechTalk.SpecFlow.sln b/TechTalk.SpecFlow.sln index 84db78353..3c3baa592 100644 --- a/TechTalk.SpecFlow.sln +++ b/TechTalk.SpecFlow.sln @@ -36,6 +36,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.Generator EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.Tools", "Tools\TechTalk.SpecFlow.Tools.csproj", "{87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeatureTests", "Tests\FeatureTests\FeatureTests.csproj", "{3FE793A8-E662-4026-B4EC-891324073235}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -81,6 +83,10 @@ Global {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Any CPU.Build.0 = Release|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -90,5 +96,6 @@ Global {F6740296-282C-4A0F-941E-A8FD1B1DAC2D} = {DCE0C3C4-5BC6-4A30-86BE-3FEFF4677A01} {70376361-0BE1-478D-8EEC-47BD1C768165} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} {F8FACCF0-5497-4C6B-861F-78D72FD9561B} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} + {3FE793A8-E662-4026-B4EC-891324073235} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} EndGlobalSection EndGlobal diff --git a/Tests/FeatureTests/ContextInjection/ContextInjection.feature b/Tests/FeatureTests/ContextInjection/ContextInjection.feature new file mode 100644 index 000000000..29e67a832 --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/ContextInjection.feature @@ -0,0 +1,26 @@ +Feature: Injecting context into step specifications + As a developer + I would like to have the system automatically inject an instance of any class as defined in the constructor of a step file + So that I don't have to rely on the global shared state and can define the contexts required for each scenario. + +Scenario: Feature with no context + Given a feature which requires no context + Then everything is dandy + +Scenario: Feature with a single context + Given a feature which requires a single context + Then the context is set + +Scenario: Feature with multiple contexts + Given a feature which requires multiple contexts + Then the contexts are set + +Scenario: Feature with recursive contexts + Given a feature which requires a recursive context + Then the context is set + And its sub-context is set + +Scenario: Feature with a dependent context + Given a feature which requires a single context + Then the context is set + And the context was created by the feature with a single context scenario \ No newline at end of file diff --git a/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs new file mode 100644 index 000000000..2856da539 --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs @@ -0,0 +1,109 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.21006.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FeatureTests.ContextInjection +{ + using TechTalk.SpecFlow; + + + [NUnit.Framework.TestFixtureAttribute()] + [NUnit.Framework.DescriptionAttribute("Injecting context into step specifications")] + public partial class InjectingContextIntoStepSpecificationsFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + [NUnit.Framework.TestFixtureSetUpAttribute()] + public virtual void FeatureSetup() + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Injecting context into step specifications", "As a developer\r\nI would like to have the system automatically inject an instance " + + "of any class as defined in the constructor of a step file\r\nSo that I don\'t have " + + "to rely on the global shared state and can define the contexts required for each" + + " scenario.", ((string[])(null))); + testRunner.OnFeatureStart(featureInfo); + } + + [NUnit.Framework.TestFixtureTearDownAttribute()] + public virtual void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioStart(scenarioInfo); + } + + [NUnit.Framework.TearDownAttribute()] + public virtual void ScenarioTearDown() + { + testRunner.OnScenarioEnd(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Feature with no context")] + public virtual void FeatureWithNoContext() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with no context", ((string[])(null))); + this.ScenarioSetup(scenarioInfo); + testRunner.Given("a feature which requires no context"); + testRunner.Then("everything is dandy"); + testRunner.CollectScenarioErrors(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Feature with a single context")] + public virtual void FeatureWithASingleContext() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with a single context", ((string[])(null))); + this.ScenarioSetup(scenarioInfo); + testRunner.Given("a feature which requires a single context"); + testRunner.Then("the context is set"); + testRunner.CollectScenarioErrors(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Feature with multiple contexts")] + public virtual void FeatureWithMultipleContexts() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with multiple contexts", ((string[])(null))); + this.ScenarioSetup(scenarioInfo); + testRunner.Given("a feature which requires multiple contexts"); + testRunner.Then("the contexts are set"); + testRunner.CollectScenarioErrors(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Feature with recursive contexts")] + public virtual void FeatureWithRecursiveContexts() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with recursive contexts", ((string[])(null))); + this.ScenarioSetup(scenarioInfo); + testRunner.Given("a feature which requires a recursive context"); + testRunner.Then("the context is set"); + testRunner.And("its sub-context is set"); + testRunner.CollectScenarioErrors(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Feature with a dependent context")] + public virtual void FeatureWithADependentContext() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with a dependent context", ((string[])(null))); + this.ScenarioSetup(scenarioInfo); + testRunner.Given("a feature which requires a single context"); + testRunner.Then("the context is set"); + testRunner.And("the context was created by the feature with a single context scenario"); + testRunner.CollectScenarioErrors(); + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs b/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs new file mode 100644 index 000000000..264e839c2 --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/FeatureWithADependentContextSteps.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TechTalk.SpecFlow; + +namespace FeatureTests.ContextInjection +{ + [Binding] + public class FeatureWithADependentContextSteps + { + private readonly SingleContext _context; + + public FeatureWithADependentContextSteps(SingleContext context) + { + _context = context; + } + + [Given("a feature which requires a dependent context")] + public void GivenAFeatureWhichRequiresADependentContext() + { + } + + [Then("the context was created by the feature with a single context scenario")] + public void ThenTheContextWasCreatedByTheFeatureWithASingleContextScenario() + { + Assert.That(_context.WasCreatedBy, Is.EqualTo("Feature With A Single Context")); + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/FeatureWithARecursiveContextSteps.cs b/Tests/FeatureTests/ContextInjection/FeatureWithARecursiveContextSteps.cs new file mode 100644 index 000000000..17508a14f --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/FeatureWithARecursiveContextSteps.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TechTalk.SpecFlow; + +namespace FeatureTests.ContextInjection +{ + [Binding] + public class FeatureWithARecursiveContextSteps + { + private readonly NestedContext _context; + + public FeatureWithARecursiveContextSteps(NestedContext context) + { + _context = context; + } + + [Given("a feature which requires a recursive context")] + public void GivenAFeatureWhichRequiresARecursiveContext() + { + } + + [Then("its sub-context is set")] + public void ThenItsSubContextIsSet() + { + Assert.That(_context.TheNestedContext, Is.Not.Null); + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/FeatureWithASingleContextSteps.cs b/Tests/FeatureTests/ContextInjection/FeatureWithASingleContextSteps.cs new file mode 100644 index 000000000..90adfaa1a --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/FeatureWithASingleContextSteps.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TechTalk.SpecFlow; + +namespace FeatureTests.ContextInjection +{ + [Binding] + public class FeatureWithASingleContextSteps + { + private readonly SingleContext _context; + + public FeatureWithASingleContextSteps(SingleContext context) + { + _context = context; + _context.WasCreatedBy = "Feature With A Single Context"; + } + + [Given("a feature which requires a single context")] + public void GivenAFeatureWhichRequiresASingleContext() + { + } + + [Then("the context is set")] + public void ThenTheContextIsSet() + { + Assert.That(_context, Is.Not.Null); + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs b/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs new file mode 100644 index 000000000..811fb6097 --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/FeatureWithMultipleContextsSteps.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TechTalk.SpecFlow; + +namespace FeatureTests.ContextInjection +{ + [Binding] + public class FeatureWithMultipleContextsSteps + { + private readonly SingleContext _context1; + private readonly SingleContext _context2; + + public FeatureWithMultipleContextsSteps(SingleContext context1, SingleContext context2) + { + _context1 = context1; + _context2 = context2; + } + + [Given("a feature which requires multiple contexts")] + public void GivenAFeatureWhichRequiresMultipleContexts() + { + } + + [Then("the contexts are set")] + public void ThenTheContextsAreSet() + { + Assert.That(_context1, Is.Not.Null); + Assert.That(_context2, Is.Not.Null); + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/FeatureWithNoContextSteps.cs b/Tests/FeatureTests/ContextInjection/FeatureWithNoContextSteps.cs new file mode 100644 index 000000000..8cebd4fea --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/FeatureWithNoContextSteps.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using TechTalk.SpecFlow; + +namespace FeatureTests.ContextInjection +{ + [Binding] + public class FeatureWithNoContextSteps + { + [Given("a feature which requires no context")] + public void GivenAFeatureWhichRequiresNoContext() + { + } + + [Then("everything is dandy")] + public void ThenEverythingIsDandy() + { + } + } +} diff --git a/Tests/FeatureTests/ContextInjection/NestedContext.cs b/Tests/FeatureTests/ContextInjection/NestedContext.cs new file mode 100644 index 000000000..d6485a316 --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/NestedContext.cs @@ -0,0 +1,17 @@ +namespace FeatureTests.ContextInjection +{ + public class NestedContext + { + private readonly SingleContext _context; + + public NestedContext(SingleContext context) + { + _context = context; + } + + public SingleContext TheNestedContext + { + get { return _context; } + } + } +} \ No newline at end of file diff --git a/Tests/FeatureTests/ContextInjection/SingleContext.cs b/Tests/FeatureTests/ContextInjection/SingleContext.cs new file mode 100644 index 000000000..f8c73811b --- /dev/null +++ b/Tests/FeatureTests/ContextInjection/SingleContext.cs @@ -0,0 +1,7 @@ +namespace FeatureTests.ContextInjection +{ + public class SingleContext + { + public string WasCreatedBy { get; set; } + } +} \ No newline at end of file diff --git a/Tests/FeatureTests/FeatureTests.csproj b/Tests/FeatureTests/FeatureTests.csproj new file mode 100644 index 000000000..120a43809 --- /dev/null +++ b/Tests/FeatureTests/FeatureTests.csproj @@ -0,0 +1,92 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3FE793A8-E662-4026-B4EC-891324073235} + Library + Properties + FeatureTests + FeatureTests + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\lib\nunit\nunit.framework.dll + True + + + ..\..\lib\mocking\Rhino.Mocks.dll + + + + + + + + + + + True + True + ContextInjection.feature + + + + + + + + + + + + + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F} + TechTalk.SpecFlow.Parser + + + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4} + TechTalk.SpecFlow + True + + + + + SpecFlowSingleFileGenerator + ContextInjection.feature.cs + + + SpecFlowSingleFileGenerator + ListArguments.feature.cs + + + + + \ No newline at end of file diff --git a/Tests/FeatureTests/Properties/AssemblyInfo.cs b/Tests/FeatureTests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ec26ae4c5 --- /dev/null +++ b/Tests/FeatureTests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FeatureTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ParserTests")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d5669f24-3655-4405-85c8-fa74909e84cc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] From 20461dc10709bc69b450a02be67ac9e16280279f Mon Sep 17 00:00:00 2001 From: jbandi Date: Thu, 11 Feb 2010 22:18:59 +0100 Subject: [PATCH 02/34] Using steps defined in other assemblies. Enable writing steps in VB. Cleaning up ContextInjection --- .../ConfigurationSectionHandler.cs | 31 +++++ Runtime/Configuration/RuntimeConfiguration.cs | 20 +++ Runtime/ObjectContainer.cs | 7 +- TechTalk.SpecFlow.sln | 14 +++ Tests/FeatureTests/App.config | 30 +++++ .../ContextInjection.feature.cs | 81 +++++++----- .../ExternalSteps/ExternalSteps.feature | 9 ++ .../ExternalSteps/ExternalSteps.feature.cs | 71 +++++++++++ .../ExternalSteps/ExternalStepsCS/CSSteps.cs | 19 +++ .../ExternalStepsCS/ExternalStepsCS.csproj | 69 +++++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++ .../ExternalStepsVB/ExternalStepsVB.vbproj | 113 +++++++++++++++++ .../My Project/Application.Designer.vb | 13 ++ .../My Project/Application.myapp | 10 ++ .../My Project/AssemblyInfo.vb | 35 ++++++ .../My Project/Resources.Designer.vb | 62 ++++++++++ .../ExternalStepsVB/My Project/Resources.resx | 117 ++++++++++++++++++ .../My Project/Settings.Designer.vb | 73 +++++++++++ .../My Project/Settings.settings | 7 ++ .../ExternalSteps/ExternalStepsVB/VBSteps.vb | 16 +++ Tests/FeatureTests/FeatureTests.csproj | 23 +++- Tests/RuntimeTests/App.config | 4 +- changelog.txt | 5 + 23 files changed, 827 insertions(+), 38 deletions(-) create mode 100644 Tests/FeatureTests/App.config create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalSteps.feature create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsCS/CSSteps.cs create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsCS/ExternalStepsCS.csproj create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsCS/Properties/AssemblyInfo.cs create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/ExternalStepsVB.vbproj create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.Designer.vb create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.myapp create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/AssemblyInfo.vb create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.Designer.vb create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.resx create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.Designer.vb create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.settings create mode 100644 Tests/FeatureTests/ExternalSteps/ExternalStepsVB/VBSteps.vb diff --git a/Runtime/Configuration/ConfigurationSectionHandler.cs b/Runtime/Configuration/ConfigurationSectionHandler.cs index dbd3b3e00..00fabc369 100644 --- a/Runtime/Configuration/ConfigurationSectionHandler.cs +++ b/Runtime/Configuration/ConfigurationSectionHandler.cs @@ -94,6 +94,14 @@ public TraceConfigElement Trace set { this["trace"] = value; } } + [ConfigurationProperty("stepAssemblies", IsDefaultCollection = false, IsRequired = false)] + [ConfigurationCollection(typeof(StepAssemblyCollection), AddItemName = "stepAssembly")] + public StepAssemblyCollection StepAssemblies + { + get { return (StepAssemblyCollection)this["stepAssemblies"]; } + set { this["stepAssemblies"] = value; } + } + static internal ConfigurationSectionHandler CreateFromXml(string xmlContent) { ConfigurationSectionHandler section = new ConfigurationSectionHandler(); @@ -229,4 +237,27 @@ public string Listener set { this["listener"] = value; } } } + + public class StepAssemblyCollection : ConfigurationElementCollection + { + protected override ConfigurationElement CreateNewElement() + { + return new StepAssemblyConfigElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((StepAssemblyConfigElement) element).File; + } + } + + public class StepAssemblyConfigElement : ConfigurationElement + { + [ConfigurationProperty("file", DefaultValue = null, IsRequired = false)] + public string File + { + get { return (string)this["file"]; } + set { this["file"] = value; } + } + } } diff --git a/Runtime/Configuration/RuntimeConfiguration.cs b/Runtime/Configuration/RuntimeConfiguration.cs index add2e289f..7eb6293e6 100644 --- a/Runtime/Configuration/RuntimeConfiguration.cs +++ b/Runtime/Configuration/RuntimeConfiguration.cs @@ -1,8 +1,11 @@ using System; +using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; +using System.Reflection; using TechTalk.SpecFlow.Tracing; using TechTalk.SpecFlow.UnitTestProvider; @@ -15,6 +18,8 @@ public partial class ConfigurationSectionHandler internal class RuntimeConfiguration { + private List _additionalStepAssemblies = new List(); + static public RuntimeConfiguration Current { get { return ObjectContainer.Configuration; } @@ -37,6 +42,13 @@ static public RuntimeConfiguration Current public bool TraceTimings { get; set; } public TimeSpan MinTracedDuration { get; set; } + public IEnumerable AdditionalStepAssemblies + { + get { + return _additionalStepAssemblies; + } + } + public RuntimeConfiguration() { ToolLanguage = string.IsNullOrEmpty(ConfigDefaults.ToolLanguage) ? @@ -103,6 +115,14 @@ public static RuntimeConfiguration LoadFromConfigFile(ConfigurationSectionHandle config.MinTracedDuration = configSection.Trace.MinTracedDuration; } + foreach(var element in configSection.StepAssemblies) + { + string stepAssemblyFileName = ((StepAssemblyConfigElement)element).File; + string fullPath = Path.GetFullPath(stepAssemblyFileName); + Assembly stepAssembly = Assembly.LoadFile(fullPath); + config._additionalStepAssemblies.Add(stepAssembly); + } + return config; } diff --git a/Runtime/ObjectContainer.cs b/Runtime/ObjectContainer.cs index 0a01ee14c..34f8eff82 100644 --- a/Runtime/ObjectContainer.cs +++ b/Runtime/ObjectContainer.cs @@ -1,4 +1,5 @@ using System; +using System.CodeDom.Compiler; using System.Collections.Generic; using System.Configuration; using System.Reflection; @@ -6,6 +7,7 @@ using TechTalk.SpecFlow.ErrorHandling; using TechTalk.SpecFlow.Tracing; using TechTalk.SpecFlow.UnitTestProvider; +using System.Linq; namespace TechTalk.SpecFlow { @@ -53,7 +55,10 @@ internal static ITestRunner EnsureTestRunner(Assembly callingAssembly) var result = new TestRunner(); List bindingAssemblies = new List(); - bindingAssemblies.Add(callingAssembly); //TODO: add more assemblies from config + bindingAssemblies.Add(callingAssembly); + + bindingAssemblies.AddRange(configuration.AdditionalStepAssemblies); + result.InitializeTestRunner(bindingAssemblies.ToArray()); return result; diff --git a/TechTalk.SpecFlow.sln b/TechTalk.SpecFlow.sln index 3c3baa592..f8a03a367 100644 --- a/TechTalk.SpecFlow.sln +++ b/TechTalk.SpecFlow.sln @@ -38,6 +38,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.Tools", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeatureTests", "Tests\FeatureTests\FeatureTests.csproj", "{3FE793A8-E662-4026-B4EC-891324073235}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ExternalStepsVB", "Tests\FeatureTests\ExternalSteps\ExternalStepsVB\ExternalStepsVB.vbproj", "{D3F6B835-B228-4DCF-B533-B6ED469A33B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExternalStepsCS", "Tests\FeatureTests\ExternalSteps\ExternalStepsCS\ExternalStepsCS.csproj", "{3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -87,6 +91,14 @@ Global {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Any CPU.Build.0 = Debug|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.ActiveCfg = Release|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.Build.0 = Release|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Any CPU.Build.0 = Release|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -97,5 +109,7 @@ Global {70376361-0BE1-478D-8EEC-47BD1C768165} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} {F8FACCF0-5497-4C6B-861F-78D72FD9561B} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} {3FE793A8-E662-4026-B4EC-891324073235} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} + {D3F6B835-B228-4DCF-B533-B6ED469A33B3} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} EndGlobalSection EndGlobal diff --git a/Tests/FeatureTests/App.config b/Tests/FeatureTests/App.config new file mode 100644 index 000000000..fe47acad7 --- /dev/null +++ b/Tests/FeatureTests/App.config @@ -0,0 +1,30 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs index 2856da539..f1f52ec1f 100644 --- a/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs +++ b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs @@ -1,14 +1,14 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.21006.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace FeatureTests.ContextInjection +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (http://www.specflow.org/). +// SpecFlow Version:1.2.0.0 +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace TechTalk.SpecFlow.FeatureTests.ContextInjection { using TechTalk.SpecFlow; @@ -20,6 +20,9 @@ public partial class InjectingContextIntoStepSpecificationsFeature private static TechTalk.SpecFlow.ITestRunner testRunner; +#line 1 "ContextInjection.feature" +#line hidden + [NUnit.Framework.TestFixtureSetUpAttribute()] public virtual void FeatureSetup() { @@ -54,9 +57,13 @@ public virtual void ScenarioTearDown() public virtual void FeatureWithNoContext() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with no context", ((string[])(null))); - this.ScenarioSetup(scenarioInfo); - testRunner.Given("a feature which requires no context"); - testRunner.Then("everything is dandy"); +#line 6 +this.ScenarioSetup(scenarioInfo); +#line 7 + testRunner.Given("a feature which requires no context"); +#line 8 + testRunner.Then("everything is dandy"); +#line hidden testRunner.CollectScenarioErrors(); } @@ -65,9 +72,13 @@ public virtual void FeatureWithNoContext() public virtual void FeatureWithASingleContext() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with a single context", ((string[])(null))); - this.ScenarioSetup(scenarioInfo); - testRunner.Given("a feature which requires a single context"); - testRunner.Then("the context is set"); +#line 10 +this.ScenarioSetup(scenarioInfo); +#line 11 + testRunner.Given("a feature which requires a single context"); +#line 12 + testRunner.Then("the context is set"); +#line hidden testRunner.CollectScenarioErrors(); } @@ -76,9 +87,13 @@ public virtual void FeatureWithASingleContext() public virtual void FeatureWithMultipleContexts() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with multiple contexts", ((string[])(null))); - this.ScenarioSetup(scenarioInfo); - testRunner.Given("a feature which requires multiple contexts"); - testRunner.Then("the contexts are set"); +#line 14 +this.ScenarioSetup(scenarioInfo); +#line 15 + testRunner.Given("a feature which requires multiple contexts"); +#line 16 + testRunner.Then("the contexts are set"); +#line hidden testRunner.CollectScenarioErrors(); } @@ -87,10 +102,15 @@ public virtual void FeatureWithMultipleContexts() public virtual void FeatureWithRecursiveContexts() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with recursive contexts", ((string[])(null))); - this.ScenarioSetup(scenarioInfo); - testRunner.Given("a feature which requires a recursive context"); - testRunner.Then("the context is set"); - testRunner.And("its sub-context is set"); +#line 18 +this.ScenarioSetup(scenarioInfo); +#line 19 + testRunner.Given("a feature which requires a recursive context"); +#line 20 + testRunner.Then("the context is set"); +#line 21 + testRunner.And("its sub-context is set"); +#line hidden testRunner.CollectScenarioErrors(); } @@ -99,10 +119,15 @@ public virtual void FeatureWithRecursiveContexts() public virtual void FeatureWithADependentContext() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Feature with a dependent context", ((string[])(null))); - this.ScenarioSetup(scenarioInfo); - testRunner.Given("a feature which requires a single context"); - testRunner.Then("the context is set"); - testRunner.And("the context was created by the feature with a single context scenario"); +#line 23 +this.ScenarioSetup(scenarioInfo); +#line 24 + testRunner.Given("a feature which requires a single context"); +#line 25 + testRunner.Then("the context is set"); +#line 26 + testRunner.And("the context was created by the feature with a single context scenario"); +#line hidden testRunner.CollectScenarioErrors(); } } diff --git a/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature new file mode 100644 index 000000000..f78ac1c99 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature @@ -0,0 +1,9 @@ +Feature: External Step Definitions + In order to modularize my solution + As a bdd enthusiast + I want to use step definitions from other assemblies + +Scenario: Steps defined in an external VB project and an external c-sharp project + Given I have external step definitions in a separate assembly referenced by this project + When I call those steps + Then the scenario should pass diff --git a/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs new file mode 100644 index 000000000..8389bf338 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs @@ -0,0 +1,71 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (http://www.specflow.org/). +// SpecFlow Version:1.2.0.0 +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace TechTalk.SpecFlow.FeatureTests.ExternalSteps +{ + using TechTalk.SpecFlow; + + + [NUnit.Framework.TestFixtureAttribute()] + [NUnit.Framework.DescriptionAttribute("External Step Definitions")] + public partial class ExternalStepDefinitionsFeature + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + +#line 1 "ExternalSteps.feature" +#line hidden + + [NUnit.Framework.TestFixtureSetUpAttribute()] + public virtual void FeatureSetup() + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "External Step Definitions", "In order to modularize my solution\r\nAs a bdd enthusiast\r\nI want to use step defin" + + "itions from other assemblies", ((string[])(null))); + testRunner.OnFeatureStart(featureInfo); + } + + [NUnit.Framework.TestFixtureTearDownAttribute()] + public virtual void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioStart(scenarioInfo); + } + + [NUnit.Framework.TearDownAttribute()] + public virtual void ScenarioTearDown() + { + testRunner.OnScenarioEnd(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Steps defined in an external VB project and an external c-sharp project")] + public virtual void StepsDefinedInAnExternalVBProjectAndAnExternalC_SharpProject() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Steps defined in an external VB project and an external c-sharp project", ((string[])(null))); +#line 6 +this.ScenarioSetup(scenarioInfo); +#line 7 + testRunner.Given("I have external step definitions in a separate assembly referenced by this projec" + + "t"); +#line 8 + testRunner.When("I call those steps"); +#line 9 + testRunner.Then("the scenario should pass"); +#line hidden + testRunner.CollectScenarioErrors(); + } + } +} diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/CSSteps.cs b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/CSSteps.cs new file mode 100644 index 000000000..2ac2bf7af --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/CSSteps.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TechTalk.SpecFlow; + +namespace ExternalStepsCS +{ + [Binding] + public class CSSteps + { + [Then("the scenario should pass")] + public void GivenAFeatureWhichRequiresADependentContext() + { + Assert.AreEqual(2,(int)ScenarioContext.Current["counter"]); + } + } +} diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/ExternalStepsCS.csproj b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/ExternalStepsCS.csproj new file mode 100644 index 000000000..cdde99650 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/ExternalStepsCS.csproj @@ -0,0 +1,69 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E} + Library + Properties + ExternalStepsCS + ExternalStepsCS + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\..\lib\nunit\nunit.framework.dll + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4} + TechTalk.SpecFlow + + + + + \ No newline at end of file diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/Properties/AssemblyInfo.cs b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..09c0f86a2 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsCS/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExternalStepsCS")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("ExternalStepsCS")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e3199977-e6e2-4c14-97da-4376e105c1e3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/ExternalStepsVB.vbproj b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/ExternalStepsVB.vbproj new file mode 100644 index 000000000..3b4b0fd39 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/ExternalStepsVB.vbproj @@ -0,0 +1,113 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {D3F6B835-B228-4DCF-B533-B6ED469A33B3} + Library + ExternalStepsVB + ExternalStepsVB + 512 + Windows + v3.5 + On + Binary + Off + On + + + true + full + true + true + bin\Debug\ + ExternalStepsVB.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + ExternalStepsVB.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4} + TechTalk.SpecFlow + + + + + \ No newline at end of file diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.Designer.vb b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.Designer.vb new file mode 100644 index 000000000..d4e7c6707 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:2.0.50727.4927 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.myapp b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.myapp new file mode 100644 index 000000000..758895def --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/AssemblyInfo.vb b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/AssemblyInfo.vb new file mode 100644 index 000000000..c2414cd00 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.Designer.vb b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.Designer.vb new file mode 100644 index 000000000..80f727dc5 --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:2.0.50727.4927 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ' + ' A strongly-typed resource class, for looking up localized strings, etc. + ' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ' + ' Returns the cached ResourceManager instance used by this class. + ' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ExternalStepsVB.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ' + ' Overrides the current thread's CurrentUICulture property for all + ' resource lookups using this strongly typed resource class. + ' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.resx b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.Designer.vb b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.Designer.vb new file mode 100644 index 000000000..ac249979b --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:2.0.50727.4927 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.ExternalStepsVB.My.MySettings + Get + Return Global.ExternalStepsVB.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.settings b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.settings new file mode 100644 index 000000000..85b890b3c --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/VBSteps.vb b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/VBSteps.vb new file mode 100644 index 000000000..299f1ac5d --- /dev/null +++ b/Tests/FeatureTests/ExternalSteps/ExternalStepsVB/VBSteps.vb @@ -0,0 +1,16 @@ +Imports TechTalk.SpecFlow + + _ +Public Class VBStepDefinitions + + _ + Public Function step1() + ScenarioContext.Current.Item("counter") = 1 + End Function + + <[When]("I call those steps")> _ + Public Function step2() + ScenarioContext.Current.Item("counter") += 1 + End Function + +End Class diff --git a/Tests/FeatureTests/FeatureTests.csproj b/Tests/FeatureTests/FeatureTests.csproj index 120a43809..5fa3e6187 100644 --- a/Tests/FeatureTests/FeatureTests.csproj +++ b/Tests/FeatureTests/FeatureTests.csproj @@ -8,10 +8,13 @@ {3FE793A8-E662-4026-B4EC-891324073235} Library Properties - FeatureTests - FeatureTests - v4.0 + TechTalk.SpecFlow.FeatureTests + TechTalk.SpecFlow.FeatureTests + v3.5 512 + true + + true @@ -39,7 +42,9 @@ ..\..\lib\mocking\Rhino.Mocks.dll - + + 3.5 + @@ -58,6 +63,11 @@ + + True + True + ExternalSteps.feature + @@ -72,13 +82,14 @@ + SpecFlowSingleFileGenerator ContextInjection.feature.cs - + SpecFlowSingleFileGenerator - ListArguments.feature.cs + ExternalSteps.feature.cs diff --git a/Tests/RuntimeTests/App.config b/Tests/RuntimeTests/App.config index 033c8c29a..695fd07a1 100644 --- a/Tests/RuntimeTests/App.config +++ b/Tests/RuntimeTests/App.config @@ -7,9 +7,7 @@ - + diff --git a/changelog.txt b/changelog.txt index 4f63de970..7ac47f5c2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,9 @@ +next release +New features: ++ Context injection in step definitions. Step definitions can get a context injected with constructor injection. See examples in Tests/FeatureTests/ContextInjection. ++ Using steps in other assemblies. This enables writing steps in VB. See examples in Tests/FeatureTests/ExternalSteps. + 1.2.0 - 2009/11/25 New features: From 9c1cd95917b8c4ed6b2dafcd0bcc6acc538fa18c Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 22 Feb 2010 10:12:01 +0100 Subject: [PATCH 03/34] fix small issue with line pragma disabling --- Generator/SpecFlowUnitTestConverter.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index e25dd186a..0544d38f9 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -512,6 +512,9 @@ private CodeExpression GetMultilineTextArgExpression(string multiLineTextArgumen private void AddLinePragmaInitial(CodeTypeDeclaration testType, Feature feature) { + if (allowDebugGeneratedFiles) + return; + testType.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", Path.GetFileName(feature.SourceFile)))); testType.Members.Add(new CodeSnippetTypeMember("#line hidden")); } From 3c70e8863aba0b1feb4aefbfebe539725e9d4702 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 22 Feb 2010 10:13:32 +0100 Subject: [PATCH 04/34] fix typo in VS template --- .../ItemTemplates/SpecFlowFeature/SpecFlowFeature1.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VsIntegration/ItemTemplates/SpecFlowFeature/SpecFlowFeature1.feature b/VsIntegration/ItemTemplates/SpecFlowFeature/SpecFlowFeature1.feature index 00293d8dd..ff9863b62 100644 --- a/VsIntegration/ItemTemplates/SpecFlowFeature/SpecFlowFeature1.feature +++ b/VsIntegration/ItemTemplates/SpecFlowFeature/SpecFlowFeature1.feature @@ -1,6 +1,6 @@ Feature: Addition In order to avoid silly mistakes - As a meth idiot + As a math idiot I want to be told the sum of two numbers @mytag From a7caca7b895f92b686741a75f6a4376e76cefdb7 Mon Sep 17 00:00:00 2001 From: KerryJ Date: Fri, 26 Feb 2010 17:58:22 +0200 Subject: [PATCH 05/34] Added XUnit support to for VS Addin --- .../Configuration/GeneratorConfiguration.cs | 9 +- Generator/SpecFlowGenerator.cs | 3 +- Generator/SpecFlowUnitTestConverter.cs | 6 +- .../ISpecFlowUnitTestConverter.cs | 8 + .../SpecFlowXUnitTestConverter.cs | 987 ++++++++++++++++++ Generator/TechTalk.SpecFlow.Generator.csproj | 3 + .../XUnitTestGeneratorProvider.cs | 140 +++ .../ConfigurationSectionHandler.cs | 21 + Runtime/Configuration/RuntimeConfiguration.cs | 5 +- Runtime/TechTalk.SpecFlow.csproj | 1 + .../UnitTestProvider/XUnitRuntimeProvider.cs | 29 + .../Bowling.Specflow/App.config | 21 + .../Bowling.Specflow/Bowling.Specflow.csproj | 95 ++ .../Bowling.Specflow/BowlingSteps.cs | 93 ++ .../Properties/AssemblyInfo.cs | 36 + ...coreCalculationAlternativesFeature.feature | 42 + ...eCalculationAlternativesFeature.feature.cs | 223 ++++ .../ScoreCalculationFeature.feature | 37 + .../ScoreCalculationFeature.feature.cs | 241 +++++ Samples/BowlingKata - XUnit/Bowling.sln | 26 + .../Bowling/Bowling.csproj | 59 ++ Samples/BowlingKata - XUnit/Bowling/Game.cs | 67 ++ .../Bowling/Properties/AssemblyInfo.cs | 36 + Tests/ParserTests/ParserTests.csproj | 1 + .../SuccessfulXUnitGenerationTest.cs | 185 ++++ 25 files changed, 2367 insertions(+), 7 deletions(-) create mode 100644 Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs create mode 100644 Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs create mode 100644 Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs create mode 100644 Runtime/UnitTestProvider/XUnitRuntimeProvider.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/App.config create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature create mode 100644 Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling.sln create mode 100644 Samples/BowlingKata - XUnit/Bowling/Bowling.csproj create mode 100644 Samples/BowlingKata - XUnit/Bowling/Game.cs create mode 100644 Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs create mode 100644 Tests/ParserTests/SuccessfulXUnitGenerationTest.cs diff --git a/Generator/Configuration/GeneratorConfiguration.cs b/Generator/Configuration/GeneratorConfiguration.cs index bb716e449..4a8784be3 100644 --- a/Generator/Configuration/GeneratorConfiguration.cs +++ b/Generator/Configuration/GeneratorConfiguration.cs @@ -14,6 +14,7 @@ public class GeneratorConfiguration //unit test framework settings public Type GeneratorUnitTestProviderType { get; set; } + public Type SpecFlowUnitTestConverterType { get; set; } // generator settings public bool AllowDebugGeneratedFiles { get; set; } @@ -70,10 +71,16 @@ private void SetUnitTestDefaultsByName(string name) { case "nunit": GeneratorUnitTestProviderType = typeof(NUnitTestConverter); + SpecFlowUnitTestConverterType = typeof(SpecFlowUnitTestConverter); break; + case "xunit": + GeneratorUnitTestProviderType = typeof(XUnitTestGeneratorProvider); + SpecFlowUnitTestConverterType = typeof(SpecFlowXUnitTestConverter); + break; case "mstest": GeneratorUnitTestProviderType = typeof(MsTestGeneratorProvider); - break; + SpecFlowUnitTestConverterType = typeof(SpecFlowUnitTestConverter); + break; default: GeneratorUnitTestProviderType = null; break; diff --git a/Generator/SpecFlowGenerator.cs b/Generator/SpecFlowGenerator.cs index 39a2c94f6..8e6e332d8 100644 --- a/Generator/SpecFlowGenerator.cs +++ b/Generator/SpecFlowGenerator.cs @@ -133,8 +133,7 @@ public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextR Feature feature = parser.Parse(inputReader, featureFile.GetFullPath(project)); IUnitTestGeneratorProvider generatorProvider = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.GeneratorUnitTestProviderType); - - SpecFlowUnitTestConverter testConverter = new SpecFlowUnitTestConverter(generatorProvider, project.GeneratorConfiguration.AllowDebugGeneratedFiles); + ISpecFlowUnitTestConverter testConverter = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.SpecFlowUnitTestConverterType, new object[] { generatorProvider, project.GeneratorConfiguration.AllowDebugGeneratedFiles}); var codeNamespace = testConverter.GenerateUnitTestFixture(feature, null, targetNamespace); return codeNamespace; diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index 0544d38f9..2c05cae3e 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -11,7 +11,7 @@ namespace TechTalk.SpecFlow.Generator { - public class SpecFlowUnitTestConverter + public class SpecFlowUnitTestConverter : ISpecFlowUnitTestConverter { private const string DEFAULT_NAMESPACE = "SpecFlowTests"; const string FIXTURE_FORMAT = "{0}Feature"; @@ -512,8 +512,8 @@ private CodeExpression GetMultilineTextArgExpression(string multiLineTextArgumen private void AddLinePragmaInitial(CodeTypeDeclaration testType, Feature feature) { - if (allowDebugGeneratedFiles) - return; + if (allowDebugGeneratedFiles) + return; testType.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", Path.GetFileName(feature.SourceFile)))); testType.Members.Add(new CodeSnippetTypeMember("#line hidden")); diff --git a/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs b/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs new file mode 100644 index 000000000..76b6dcf42 --- /dev/null +++ b/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs @@ -0,0 +1,8 @@ +using System; +namespace TechTalk.SpecFlow.Generator +{ + interface ISpecFlowUnitTestConverter + { + System.CodeDom.CodeNamespace GenerateUnitTestFixture(TechTalk.SpecFlow.Parser.SyntaxElements.Feature feature, string testClassName, string targetNamespace); + } +} diff --git a/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs b/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs new file mode 100644 index 000000000..a7aec9dc1 --- /dev/null +++ b/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs @@ -0,0 +1,987 @@ +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using TechTalk.SpecFlow.Generator.UnitTestProvider; +using TechTalk.SpecFlow.Parser.SyntaxElements; + +namespace TechTalk.SpecFlow.Generator +{ + public class SpecFlowXUnitTestConverter : ISpecFlowUnitTestConverter + { + private const string DEFAULT_NAMESPACE = "SpecFlowTests"; + private const string FEATURE_FORMAT = "{0}Feature"; + private const string TEST_FORMAT = "{0}"; + private const string IGNORE_TAG = "Ignore"; + + private const string XUNIT_NAMESPACE="Xunit"; + private const string SPECFLOW_NAMESPACE = "TechTalk.SpecFlow"; + + private const string ITESTRUNNER_TYPE = "ITestRunner"; + private const string TESTRUNNER_FIELD_NAME = "_testRunner"; + private const string TESTRUNNER_PROPERTY_NAME = "TestRunner"; + + private const string IUSEFIXTURE_TYPE = "IUseFixture"; + private const string FIXTURE_FORMAT = "{0}Fixture"; + private const string SETFIXTURE_METHOD_NAME = "SetFixture"; + private const string SETFIXTURE_METHOD_PARAMETER_NAME = "fixture"; + private const string FIXTURE_FIELD_NAME = "_fixture"; + + private const string IDISPOSABLE_TYPE = "IDisposable"; + private const string ISDISPOSED_FIELD_NAME = "_isDisposed"; + private const string DISPOSE_METHOD_NAME = "Dispose"; + private const string ISDISPOSING_PARAMETER_NAME = "isDisposing"; + + private const string ON_FEATUREEND_METHOD_NAME = "OnFeatureEnd"; + private const string FEATUREINFO_TYPE = "FeatureInfo"; + private const string BACKGROUND_NAME = "FeatureBackground"; + + private const string TESTRUNNERMANAGER_TYPE = "TechTalk.SpecFlow.TestRunnerManager"; + private const string SCENARIOINFO_TYPE = "TechTalk.SpecFlow.ScenarioInfo"; + private const string TABLE_TYPE = "TechTalk.SpecFlow.Table"; + + private readonly IUnitTestGeneratorProvider _testGeneratorProvider; + private readonly bool _allowDebugGeneratedFiles; + private CodeNamespace _codeNamespace; + + public SpecFlowXUnitTestConverter(IUnitTestGeneratorProvider testGeneratorProvider, bool allowDebugGeneratedFiles) + { + _testGeneratorProvider = testGeneratorProvider; + _allowDebugGeneratedFiles = allowDebugGeneratedFiles; + } + + public CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassName, string targetNamespace) + { + targetNamespace = targetNamespace ?? DEFAULT_NAMESPACE; + testClassName = testClassName ?? string.Format(FEATURE_FORMAT, feature.Title.ToIdentifier()); + + _codeNamespace = new CodeNamespace(targetNamespace); + + _codeNamespace.Imports.Add(new CodeNamespaceImport("System")); + _codeNamespace.Imports.Add(new CodeNamespaceImport("System.Globalization")); + _codeNamespace.Imports.Add(new CodeNamespaceImport(XUNIT_NAMESPACE)); + _codeNamespace.Imports.Add(new CodeNamespaceImport(SPECFLOW_NAMESPACE)); + + var testType = new CodeTypeDeclaration(testClassName) + { + IsPartial = true + }; + testType.TypeAttributes |= TypeAttributes.Public; + _codeNamespace.Types.Add(testType); + + AddLinePragmaInitial(testType, feature); + + _testGeneratorProvider.SetTestFixture(testType, feature.Title, feature.Description); + if (feature.Tags != null) + { + _testGeneratorProvider.SetTestFixtureCategories(testType, GetNonIgnoreTags(feature.Tags)); + if (feature.Tags.Any(t => t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase))) + { + _testGeneratorProvider.SetIgnore(testType); + } + } + + AdjustTypeForIUseFixture(testType, feature); + AdjustFeatureForIDisposable(testType); + + var testSetupMethod = GenerateTestSetup(testType); + if (feature.Background != null) + { + GenerateBackground(testType, testSetupMethod, feature.Background); + } + + GenerateTestTearDown(testType); + + foreach (var scenario in feature.Scenarios) + { + if (scenario is ScenarioOutline) + { + GenerateScenarioOutlineTest(testType, testSetupMethod, (ScenarioOutline)scenario, feature); + } + else + { + GenerateScenarioTest(testType, testSetupMethod, scenario, feature); + } + } + return _codeNamespace; + } + + private void AdjustTypeForIUseFixture(CodeTypeDeclaration testType, Feature feature) + { + string fixtureName = string.Format(FIXTURE_FORMAT, feature.Title.ToIdentifier()); + + GenerateFixture(feature, fixtureName); + + // Inherit IUseFixture + testType.BaseTypes.Add + ( + new CodeTypeReference(IUSEFIXTURE_TYPE, new CodeTypeReference[] { new CodeTypeReference(fixtureName) }) + ); + + // Add Fixture data; + testType.Members.Add(new CodeMemberField(fixtureName, FIXTURE_FIELD_NAME)); + + // Implement IUseFixture.SetFixture + CodeMemberMethod setFixtureMethod = new CodeMemberMethod() + { + Name = SETFIXTURE_METHOD_NAME, + Attributes = MemberAttributes.Public | MemberAttributes.Final + }; + setFixtureMethod.Parameters.Add + ( + new CodeParameterDeclarationExpression(new CodeTypeReference(fixtureName), SETFIXTURE_METHOD_PARAMETER_NAME) + ); + + // _fixture = fixture; + setFixtureMethod.Statements.Add + ( + new CodeAssignStatement + ( + new CodeVariableReferenceExpression(FIXTURE_FIELD_NAME), + new CodeArgumentReferenceExpression(SETFIXTURE_METHOD_PARAMETER_NAME) + ) + ); + testType.Members.Add(setFixtureMethod); + } + + private void GenerateFixture(Feature feature, string fixtureName) + { + fixtureName = fixtureName ?? string.Format(FIXTURE_FORMAT, feature.Title.ToIdentifier()); + + var fixtureType = + new CodeTypeDeclaration(fixtureName) + { + IsPartial = true + }; + fixtureType.TypeAttributes |= TypeAttributes.Public; + + // Inherit IDisposable + fixtureType.BaseTypes.Add + ( + new CodeTypeReference(IDISPOSABLE_TYPE) + ); + + fixtureType.Members.AddRange + ( + new CodeTypeMember[] + { + // add private bool _isDisposed = false; + new CodeMemberField(typeof(bool), ISDISPOSED_FIELD_NAME) + { + InitExpression = new CodePrimitiveExpression(false) + }, + // add private ITestRunner _testRunner; + new CodeMemberField(ITESTRUNNER_TYPE, TESTRUNNER_FIELD_NAME) + { + Attributes = MemberAttributes.Private + } + } + ); + + CodeMemberProperty testRunnerProperty = + new CodeMemberProperty() + { + Name = TESTRUNNER_PROPERTY_NAME, + Attributes = MemberAttributes.Public | MemberAttributes.Final, + Type = new CodeTypeReference(ITESTRUNNER_TYPE) + }; + testRunnerProperty.GetStatements.Add + ( + new CodeMethodReturnStatement + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME) + ) + ); + fixtureType.Members.Add(testRunnerProperty); + + CodeMemberMethod disposeMethod; + + // add public void Dispose() + disposeMethod = new CodeMemberMethod() + { + Name = DISPOSE_METHOD_NAME, + Attributes = MemberAttributes.Public | MemberAttributes.Final + }; + disposeMethod.Statements.AddRange + ( + new CodeStatement[] + { + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + DISPOSE_METHOD_NAME, + new CodePrimitiveExpression(true) + ) + ), + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeTypeReferenceExpression("GC"), + "SuppressFinalize", + new CodeThisReferenceExpression() + ) + ) + } + ); + fixtureType.Members.Add(disposeMethod); + + // add private void Dispose(bool isDisposing) + disposeMethod = new CodeMemberMethod() + { + Name = DISPOSE_METHOD_NAME, + Attributes = MemberAttributes.Private | MemberAttributes.Final + }; + disposeMethod.Parameters.Add + ( + new CodeParameterDeclarationExpression(typeof(bool), ISDISPOSING_PARAMETER_NAME) + ); + disposeMethod.Statements.Add + ( + new CodeConditionStatement + ( + new CodeBinaryOperatorExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(false) + ), + new CodeStatement[] + { + new CodeConditionStatement + ( + new CodeBinaryOperatorExpression + ( + new CodeBinaryOperatorExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(null) + ), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(false) + ), + new CodeStatement[] + { + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), + ON_FEATUREEND_METHOD_NAME, + new CodeExpression[] { } + ) + ), + new CodeAssignStatement + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), + new CodePrimitiveExpression(null) + ) + } + ), + new CodeConditionStatement + ( + new CodeBinaryOperatorExpression + ( + new CodeVariableReferenceExpression(ISDISPOSING_PARAMETER_NAME), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(true) + ), + new CodeStatement[] + { + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + "OnDisposeManagedResources", + new CodeExpression[] { } + ) + ) + } + ), + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + "OnDisposeUnmanagedResources", + new CodeExpression[] { } + ) + ), + new CodeAssignStatement + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), + new CodePrimitiveExpression(true) + ) + } + ) + ); + fixtureType.Members.Add(disposeMethod); + + // add destructor + fixtureType.Members.Add + ( + new CodeSnippetTypeMember + ( + string.Format + ( +@" ~{0}() + {{ + Dispose(false); + }}", + fixtureName + ) + ) + ); + + fixtureType.Members.AddRange + ( + new CodeTypeMember[] + { + // add partial void OnDisposeManagedResources() + new CodeSnippetTypeMember(" partial void OnDisposeManagedResources();"), + // add partial void OnDisposeUnmanagedResources() + new CodeSnippetTypeMember(" partial void OnDisposeUnmanagedResources();") + } + ); + + // add constructor + CodeConstructor constructor = new CodeConstructor() + { + Attributes = MemberAttributes.Public, + Name = fixtureName + }; + constructor.Statements.AddRange + ( + new CodeStatement[] + { + new CodeVariableDeclarationStatement + ( + FEATUREINFO_TYPE, + "featureInfo", + new CodeObjectCreateExpression + ( + FEATUREINFO_TYPE, + new CodeObjectCreateExpression(typeof(CultureInfo), new CodePrimitiveExpression(feature.Language)), + new CodePrimitiveExpression(feature.Title), + new CodePrimitiveExpression(feature.Description), + GetStringArrayExpression(feature.Tags) + ) + ), + new CodeAssignStatement + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), + new CodeMethodInvokeExpression + ( + new CodeTypeReferenceExpression(TESTRUNNERMANAGER_TYPE), + "GetTestRunner", + new CodeExpression[] { } + ) + ), + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), + "OnFeatureStart", + new CodeVariableReferenceExpression("featureInfo") + ) + ) + } + ); + fixtureType.Members.Add(constructor); + + _codeNamespace.Types.Add(fixtureType); + } + + private void AdjustFeatureForIDisposable(CodeTypeDeclaration testType) + { + // Inherit IDisposable + testType.BaseTypes.Add + ( + new CodeTypeReference(IDISPOSABLE_TYPE) + ); + + // add bool _isDisposed = false; + testType.Members.Add + ( + new CodeMemberField(typeof(bool), ISDISPOSED_FIELD_NAME) + { + Attributes = MemberAttributes.Private, + InitExpression = new CodePrimitiveExpression(false) + } + ); + + CodeMemberMethod disposeMethod; + + // add public void Dispose() + disposeMethod = new CodeMemberMethod() + { + Name = DISPOSE_METHOD_NAME, + Attributes = MemberAttributes.Public | MemberAttributes.Final + }; + disposeMethod.Statements.AddRange + ( + new CodeStatement[] + { + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + DISPOSE_METHOD_NAME, + new CodePrimitiveExpression(true) + ) + ), + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeTypeReferenceExpression("GC"), + "SuppressFinalize", + new CodeThisReferenceExpression() + ) + ) + } + ); + testType.Members.Add(disposeMethod); + + // add private void Dispose(bool isDisposing) + disposeMethod = new CodeMemberMethod() + { + Name = DISPOSE_METHOD_NAME, + Attributes = MemberAttributes.Private | MemberAttributes.Final + }; + disposeMethod.Parameters.Add + ( + new CodeParameterDeclarationExpression(typeof(bool), ISDISPOSING_PARAMETER_NAME) + ); + disposeMethod.Statements.Add + ( + new CodeConditionStatement + ( + new CodeBinaryOperatorExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(false) + ), + new CodeStatement[] + { + new CodeConditionStatement + ( + new CodeBinaryOperatorExpression + ( + new CodeVariableReferenceExpression(ISDISPOSING_PARAMETER_NAME), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression(true) + ), + new CodeStatement[] + { + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + "OnDisposeManagedResources", + new CodeExpression[] { } + ) + ) + } + ), + new CodeExpressionStatement + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + "OnDisposeUnmanagedResources", + new CodeExpression[] { } + ) + ), + new CodeAssignStatement + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), + new CodePrimitiveExpression(true) + ) + } + ) + ); + testType.Members.Add(disposeMethod); + + // add destructor + testType.Members.Add + ( + new CodeSnippetTypeMember + ( + string.Format + ( +@" ~{0}() + {{ + Dispose(false); + }}", + testType.Name + ) + ) + ); + + testType.Members.AddRange + ( + new CodeTypeMember[] + { + // add partial void OnDisposeManagedResources() + new CodeSnippetTypeMember(" partial void OnDisposeManagedResources();"), + // add partial void OnDisposeUnmanagedResources() + new CodeSnippetTypeMember(" partial void OnDisposeUnmanagedResources();") + } + ); + } + + private CodeMemberMethod GenerateTestSetup(CodeTypeDeclaration testType) + { + CodeConstructor constructor = new CodeConstructor() + { + Attributes = MemberAttributes.Public + }; + constructor.Statements.Add + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + "OnInitialize", + new CodeExpression[] { } + ) + ); + testType.Members.Add(constructor); + + testType.Members.Add + ( + // add partial void OnInitialize() + new CodeSnippetTypeMember(" partial void OnInitialize();") + ); + + return constructor; + } + + private void GenerateBackground(CodeTypeDeclaration testType, CodeMemberMethod testSetup, Background background) + { + CodeMemberMethod backgroundMethod = new CodeMemberMethod() + { + Attributes = MemberAttributes.Public, + Name = BACKGROUND_NAME + }; + testType.Members.Add(backgroundMethod); + + AddLineDirective(backgroundMethod.Statements, background); + + foreach (var given in background.Steps) + { + GenerateStep(backgroundMethod, given, null); + } + + AddLineDirectiveHidden(backgroundMethod.Statements); + + testSetup.Statements.Add + ( + new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), backgroundMethod.Name) + ); + } + + private void GenerateTestTearDown(CodeTypeDeclaration testType) + { + // XUnit does not implement test teardowns + // IDisposable was implemented previously + } + + private void GenerateScenarioOutlineTest(CodeTypeDeclaration testType, CodeMemberMethod testSetup, ScenarioOutline scenarioOutline, Feature feature) + { + string testMethodName = string.Format(TEST_FORMAT, scenarioOutline.Title.ToIdentifier()); + + ParameterSubstitution paramToIdentifier = new ParameterSubstitution(); + foreach (var param in scenarioOutline.Examples.ExampleSets[0].Table.Header.Cells) + { + paramToIdentifier.Add(param.Value, param.Value.ToIdentifierCamelCase()); + } + + if (scenarioOutline.Examples.ExampleSets.Length > 1) + { + //TODO: check params + } + + GenerateScenarioOutlineBody(feature, scenarioOutline, paramToIdentifier, testType, testMethodName, testSetup); + + int exampleSetIndex = 0; + foreach (var exampleSet in scenarioOutline.Examples.ExampleSets) + { + string exampleSetTitle = exampleSet.Title == null ? string.Format("Scenarios{0}", exampleSetIndex + 1) : exampleSet.Title.ToIdentifier(); + + bool useFirstColumnAsName = CanUseFirstColumnAsName(exampleSet.Table); + + for (int rowIndex = 0; rowIndex < exampleSet.Table.Body.Length; rowIndex++) + { + string variantName = useFirstColumnAsName ? exampleSet.Table.Body[rowIndex].Cells[0].Value.ToIdentifierPart() : string.Format("Variant{0}", rowIndex); + GenerateScenarioOutlineTestVariant(testType, scenarioOutline, testMethodName, paramToIdentifier, exampleSetTitle, exampleSet.Table.Body[rowIndex], variantName); + } + exampleSetIndex++; + } + } + + private void GenerateScenarioOutlineBody(Feature feature, ScenarioOutline scenarioOutline, ParameterSubstitution paramToIdentifier, CodeTypeDeclaration testType, string testMethodName, CodeMemberMethod testSetup) + { + CodeMemberMethod testMethod = new CodeMemberMethod() + { + Attributes = MemberAttributes.Public | MemberAttributes.Final, + Name = testMethodName + }; + testType.Members.Add(testMethod); + + foreach (var pair in paramToIdentifier) + { + testMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), pair.Value)); + } + + GenerateTestBody(feature, scenarioOutline, testMethod, testSetup, paramToIdentifier); + } + + private void GenerateScenarioOutlineTestVariant(CodeTypeDeclaration testType, ScenarioOutline scenarioOutline, string testMethodName, List> paramToIdentifier, string exampleSetTitle, Row row, string variantName) + { + CodeMemberMethod testMethod = GetTestMethodDeclaration(testType, scenarioOutline); + testMethod.Name = string.IsNullOrEmpty(exampleSetTitle) ? string.Format("{0}_{1}", testMethod.Name, variantName) : string.Format("{0}_{1}_{2}", testMethod.Name, exampleSetTitle, variantName); + + //call test implementation with the params + List argumentExpressions = new List(); + foreach (var paramCell in row.Cells) + { + argumentExpressions.Add(new CodePrimitiveExpression(paramCell.Value)); + } + testMethod.Statements.Add + ( + new CodeMethodInvokeExpression + ( + new CodeThisReferenceExpression(), + testMethodName, + argumentExpressions.ToArray() + ) + ); + } + + private void GenerateScenarioTest(CodeTypeDeclaration testType, CodeMemberMethod testSetup, Scenario scenario, Feature feature) + { + CodeMemberMethod testMethod = GetTestMethodDeclaration(testType, scenario); + GenerateTestBody(feature, scenario, testMethod, testSetup, null); + } + + private void GenerateTestBody(Feature feature, Scenario scenario, CodeMemberMethod testMethod, CodeMemberMethod testSetup, ParameterSubstitution paramToIdentifier) + { + //ScenarioInfo scenarioInfo = new ScenarioInfo("xxxx", tags...); + testMethod.Statements.Add + ( + new CodeVariableDeclarationStatement + ( + SCENARIOINFO_TYPE, + "scenarioInfo", + new CodeObjectCreateExpression + ( + SCENARIOINFO_TYPE, + new CodePrimitiveExpression(scenario.Title), GetStringArrayExpression(scenario.Tags) + ) + ) + ); + + AddLineDirective(testMethod.Statements, scenario); + + CodePropertyReferenceExpression testRunnerProperty = + new CodePropertyReferenceExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), FIXTURE_FIELD_NAME), + TESTRUNNER_PROPERTY_NAME + ); + + // _fixture.TestRunner.OnScenarioStart(scenarioInfo); + testMethod.Statements.Add + ( + new CodeMethodInvokeExpression + ( + testRunnerProperty, + "OnScenarioStart", + new CodeVariableReferenceExpression("scenarioInfo") + ) + ); + + foreach (var scenarioStep in scenario.Steps) + { + // TODO + GenerateStep(testMethod, scenarioStep, paramToIdentifier); + } + + AddLineDirectiveHidden(testMethod.Statements); + + // _fixture.TestRunner.CollectScenarioErrors(); + testMethod.Statements.Add + ( + new CodeMethodInvokeExpression + ( + testRunnerProperty, + "CollectScenarioErrors", + new CodeExpression[] { } + ) + ); + + // _fixture.TestRunner.OnScenarioEnd(); + testMethod.Statements.Add + ( + new CodeMethodInvokeExpression + ( + testRunnerProperty, + "OnScenarioEnd", + new CodeExpression[] { } + ) + ); + } + + private void GenerateStep(CodeMemberMethod testMethod, ScenarioStep scenarioStep, ParameterSubstitution paramToIdentifier) + { + CodePropertyReferenceExpression testRunnerProperty = + new CodePropertyReferenceExpression + ( + new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), FIXTURE_FIELD_NAME), + TESTRUNNER_PROPERTY_NAME + ); + + // _fixture.TestRunner.Given("something"); + List arguments = new List(); + arguments.Add(GetSubstitutedString(scenarioStep.Text, paramToIdentifier)); + if (scenarioStep.MultiLineTextArgument != null || scenarioStep.TableArg != null) + { + AddLineDirectiveHidden(testMethod.Statements); + arguments.Add(GetMultilineTextArgExpression(scenarioStep.MultiLineTextArgument, paramToIdentifier)); + arguments.Add(GetTableArgExpression(scenarioStep.TableArg, testMethod.Statements, paramToIdentifier)); + } + + AddLineDirective(testMethod.Statements, scenarioStep); + testMethod.Statements.Add + ( + new CodeMethodInvokeExpression + ( + testRunnerProperty, + scenarioStep.GetType().Name, + arguments.ToArray() + ) + ); + } + + private IEnumerable GetNonIgnoreTags(IEnumerable tags) + { + return tags.Where(t => !t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase)).Select(t => t.Name); + } + + private CodeExpression GetStringArrayExpression(Tags tags) + { + if (tags == null || tags.Count == 0) + return new CodeCastExpression(typeof(string[]), new CodePrimitiveExpression(null)); + + List items = new List(); + foreach (var tag in tags) + { + items.Add(new CodePrimitiveExpression(tag.Name)); + } + + return new CodeArrayCreateExpression(typeof(string[]), items.ToArray()); + } + + private CodeExpression GetStringArrayExpression(IEnumerable items, ParameterSubstitution paramToIdentifier) + { + List expressions = new List(); + foreach (var item in items) + { + expressions.Add(GetSubstitutedString(item, paramToIdentifier)); + } + + return new CodeArrayCreateExpression(typeof(string[]), expressions.ToArray()); + } + + private class ParameterSubstitution : List> + { + public void Add(string parameter, string identifier) + { + base.Add(new KeyValuePair(parameter.Trim(), identifier)); + } + + public bool TryGetIdentifier(string param, out string id) + { + param = param.Trim(); + foreach (var pair in this) + { + if (pair.Key.Equals(param)) + { + id = pair.Value; + return true; + } + } + id = null; + return false; + } + } + + private bool CanUseFirstColumnAsName(Table table) + { + if (table.Header.Cells.Length == 0) + return false; + + return table.Body.Select(r => r.Cells[0].Value.ToIdentifier()).Distinct().Count() == table.Body.Length; + } + + private CodeMemberMethod GetTestMethodDeclaration(CodeTypeDeclaration testType, Scenario scenario) + { + CodeMemberMethod testMethod = new CodeMemberMethod() + { + Attributes = MemberAttributes.Public | MemberAttributes.Final, + Name = string.Format(TEST_FORMAT, scenario.Title.ToIdentifier()) + }; + + testType.Members.Add(testMethod); + + _testGeneratorProvider.SetTest(testMethod, scenario.Title); + if (scenario.Tags != null) + { + _testGeneratorProvider.SetTestCategories(testMethod, GetNonIgnoreTags(scenario.Tags)); + if (scenario.Tags.Any(t => t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase))) + { + _testGeneratorProvider.SetIgnore(testMethod); + } + } + return testMethod; + } + + private CodeExpression GetSubstitutedString(string text, ParameterSubstitution paramToIdentifier) + { + if (text == null) + return new CodeCastExpression(typeof(string), new CodePrimitiveExpression(null)); + if (paramToIdentifier == null) + return new CodePrimitiveExpression(text); + + Regex paramRe = new Regex(@"\<(?[^\>]+)\>"); + string formatText = text.Replace("{", "{{").Replace("}", "}}"); + List arguments = new List(); + + formatText = paramRe.Replace(formatText, match => + { + string param = match.Groups["param"].Value; + string id; + if (!paramToIdentifier.TryGetIdentifier(param, out id)) + return match.Value; + int argIndex = arguments.IndexOf(id); + if (argIndex < 0) + { + argIndex = arguments.Count; + arguments.Add(id); + } + return "{" + argIndex + "}"; + }); + + if (arguments.Count == 0) + return new CodePrimitiveExpression(text); + + List formatArguments = new List(); + formatArguments.Add(new CodePrimitiveExpression(formatText)); + foreach (var id in arguments) + formatArguments.Add(new CodeVariableReferenceExpression(id)); + + return new CodeMethodInvokeExpression( + new CodeTypeReferenceExpression(typeof(string)), + "Format", + formatArguments.ToArray()); + } + + private int tableCounter = 0; + private CodeExpression GetTableArgExpression(Table tableArg, CodeStatementCollection statements, ParameterSubstitution paramToIdentifier) + { + if (tableArg == null) + return new CodeCastExpression(TABLE_TYPE, new CodePrimitiveExpression(null)); + + tableCounter++; + + //Table table0 = new Table(header...); + var tableVar = new CodeVariableReferenceExpression("table" + tableCounter); + statements.Add( + new CodeVariableDeclarationStatement(TABLE_TYPE, tableVar.VariableName, + new CodeObjectCreateExpression( + TABLE_TYPE, + GetStringArrayExpression(tableArg.Header.Cells.Select(c => c.Value), paramToIdentifier)))); + + foreach (var row in tableArg.Body) + { + //table0.AddRow(cells...); + statements.Add( + new CodeMethodInvokeExpression( + tableVar, + "AddRow", + GetStringArrayExpression(row.Cells.Select(c => c.Value), paramToIdentifier))); + } + return tableVar; + } + + private CodeExpression GetMultilineTextArgExpression(string multiLineTextArgument, ParameterSubstitution paramToIdentifier) + { + return GetSubstitutedString(multiLineTextArgument, paramToIdentifier); + } + + #region Line pragma handling + + private void AddLinePragmaInitial(CodeTypeDeclaration testType, Feature feature) + { + if (_allowDebugGeneratedFiles) + return; + + testType.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", Path.GetFileName(feature.SourceFile)))); + testType.Members.Add(new CodeSnippetTypeMember("#line hidden")); + } + + private void AddLineDirectiveHidden(CodeStatementCollection statements) + { + if (_allowDebugGeneratedFiles) + return; + + statements.Add(new CodeSnippetStatement("#line hidden")); + } + + private void AddLineDirective(CodeStatementCollection statements, Background background) + { + AddLineDirective(statements, null, background.FilePosition); + } + + private void AddLineDirective(CodeStatementCollection statements, Scenario scenario) + { + AddLineDirective(statements, null, scenario.FilePosition); + } + + private void AddLineDirective(CodeStatementCollection statements, ScenarioStep step) + { + AddLineDirective(statements, null, step.FilePosition); + } + + private void AddLineDirective(CodeStatementCollection statements, string sourceFile, FilePosition filePosition) + { + if (filePosition == null || _allowDebugGeneratedFiles) + return; + + if (sourceFile == null) + statements.Add(new CodeSnippetStatement( + string.Format("#line {0}", filePosition.Line))); + else + statements.Add(new CodeSnippetStatement( + string.Format("#line {0} \"{1}\"", filePosition.Line, Path.GetFileName(sourceFile)))); + + statements.Add(new CodeSnippetStatement( + string.Format("//#indentnext {0}", filePosition.Column - 1))); + } + + #endregion + } +} diff --git a/Generator/TechTalk.SpecFlow.Generator.csproj b/Generator/TechTalk.SpecFlow.Generator.csproj index 0c9364756..f6a437a9c 100644 --- a/Generator/TechTalk.SpecFlow.Generator.csproj +++ b/Generator/TechTalk.SpecFlow.Generator.csproj @@ -63,9 +63,12 @@ + + + diff --git a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs new file mode 100644 index 000000000..b16000d24 --- /dev/null +++ b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs @@ -0,0 +1,140 @@ +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Linq; + +namespace TechTalk.SpecFlow.Generator.UnitTestProvider +{ + public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider + { + private const string FEATURE_TITLE_KEY = "FeatureTitle"; + private const string FEATURE_TITLE_PROPERTY_NAME = "FeatureTitle"; + private const string FACT_ATTRIBUTE = "Xunit.FactAttribute"; + private const string FACT_ATTRIBUTE_SKIP_PROPERTY_NAME = "Skip"; + private const string SKIP_REASON = "Ignored"; + private const string TRAIT_ATTRIBUTE = "Xunit.TraitAttribute"; + private const string IUSEFIXTURE = "Xunit.IUseFixture"; // n/a uses IUseFixture, what to do? + private const string TESTSETUP_ATTR = "Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute"; // n/a uses the Constructor, what to do? + private const string IDISPOSABLE_METHOD_NAME = "Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute"; // n/a uses IDisposable.Dispose, what to do? + + private CodeTypeDeclaration _currentTypeDeclaration = null; + + public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description) + { + // xUnit does not use an attribute for the TestFixture + + // Remember the feature title for use later + typeDeclaration.UserData[FEATURE_TITLE_KEY] = title; + + _currentTypeDeclaration = typeDeclaration; + } + + public void SetTestFixtureCategories(CodeTypeDeclaration typeDeclaration, IEnumerable categories) + { + // xUnit does not support caregories + } + + public void SetTestFixtureSetup(CodeMemberMethod memberMethod) + { + // xUnit uses IUseFixture on the class + } + + public void SetTestFixtureTearDown(CodeMemberMethod memberMethod) + { + // xUnit uses IUseFixture on the class + } + + public void SetTest(CodeMemberMethod memberMethod, string title) + { + memberMethod.CustomAttributes.Add + ( + new CodeAttributeDeclaration + ( + new CodeTypeReference(FACT_ATTRIBUTE) + ) + ); + + if (_currentTypeDeclaration != null) + { + string featureTitle = _currentTypeDeclaration.UserData[FEATURE_TITLE_KEY] as string; + if (!string.IsNullOrEmpty(featureTitle)) + { + SetProperty(memberMethod.CustomAttributes, FEATURE_TITLE_PROPERTY_NAME, featureTitle); + } + } + + SetDescription(memberMethod.CustomAttributes, title); + } + + public void SetTestCategories(CodeMemberMethod memberMethod, IEnumerable categories) + { + // xUnit does not support caregories + } + + public void SetTestSetup(CodeMemberMethod memberMethod) + { + // xUnit uses a parameterless Constructor + } + + public void SetTestTearDown(CodeMemberMethod memberMethod) + { + // uses IDisposable.Dispose, what to do? + } + + public void SetIgnore(CodeTypeMember codeTypeMember) + { + foreach (var customAttribute in codeTypeMember.CustomAttributes) + { + CodeAttributeDeclaration codeAttributeDeclaration = customAttribute as CodeAttributeDeclaration; + if (codeAttributeDeclaration != null && codeAttributeDeclaration.Name == FACT_ATTRIBUTE) + { + // set [FactAttribute(Skip="reason")] + codeAttributeDeclaration.Arguments.Add + ( + new CodeAttributeArgument(FACT_ATTRIBUTE_SKIP_PROPERTY_NAME, new CodePrimitiveExpression(SKIP_REASON)) + ); + break; + } + } + } + + private void SetProperty(CodeAttributeDeclarationCollection customAttributes, string name, string value) + { + customAttributes.Add + ( + new CodeAttributeDeclaration + ( + new CodeTypeReference(TRAIT_ATTRIBUTE), + new CodeAttributeArgument + ( + new CodePrimitiveExpression(name) + ), + new CodeAttributeArgument + ( + new CodePrimitiveExpression(value) + ) + ) + ); + } + + private void SetDescription(CodeAttributeDeclarationCollection customAttributes, string description) + { + // xUnit doesn't have a DescriptionAttribute so using a TraitAttribute instead + customAttributes.Add + ( + new CodeAttributeDeclaration + ( + new CodeTypeReference(TRAIT_ATTRIBUTE), + new CodeAttributeArgument + ( + new CodePrimitiveExpression("Description") + ), + new CodeAttributeArgument + ( + new CodePrimitiveExpression(description) + ) + ) + ); + } + } +} \ No newline at end of file diff --git a/Runtime/Configuration/ConfigurationSectionHandler.cs b/Runtime/Configuration/ConfigurationSectionHandler.cs index 00fabc369..c921ff41b 100644 --- a/Runtime/Configuration/ConfigurationSectionHandler.cs +++ b/Runtime/Configuration/ConfigurationSectionHandler.cs @@ -55,6 +55,27 @@ public static TInterface CreateInstance(Type type) type.FullName, ex.Message), ex); } } + public static TInterface CreateInstance(Type type, params object[] arguments) + { + // do not use ErrorProvider for thowing exceptions here, because of the potential + // infinite loop + try + { + return (TInterface)Activator.CreateInstance(type, arguments); + } + catch (InvalidCastException) + { + throw new ConfigurationErrorsException( + String.Format("The specified type '{0}' does not implement interface '{1}'", + type.FullName, typeof(TInterface).FullName)); + } + catch (Exception ex) + { + throw new ConfigurationErrorsException( + String.Format("Unable to create instance of type '{0}': {1}", + type.FullName, ex.Message), ex); + } + } } partial class ConfigurationSectionHandler : ConfigurationSection diff --git a/Runtime/Configuration/RuntimeConfiguration.cs b/Runtime/Configuration/RuntimeConfiguration.cs index 7eb6293e6..4b3f4218e 100644 --- a/Runtime/Configuration/RuntimeConfiguration.cs +++ b/Runtime/Configuration/RuntimeConfiguration.cs @@ -147,7 +147,10 @@ private void SetUnitTestDefaultsByName(string name) case "nunit": RuntimeUnitTestProviderType = typeof(NUnitRuntimeProvider); break; - case "mstest": + case "xunit": + RuntimeUnitTestProviderType = typeof(XUnitRuntimeProvider); + break; + case "mstest": RuntimeUnitTestProviderType = typeof(MsTestRuntimeProvider); break; default: diff --git a/Runtime/TechTalk.SpecFlow.csproj b/Runtime/TechTalk.SpecFlow.csproj index abffc489a..e83148c41 100644 --- a/Runtime/TechTalk.SpecFlow.csproj +++ b/Runtime/TechTalk.SpecFlow.csproj @@ -82,6 +82,7 @@ + diff --git a/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs b/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs new file mode 100644 index 000000000..311f3f9ac --- /dev/null +++ b/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; + +namespace TechTalk.SpecFlow.UnitTestProvider +{ + public class XUnitRuntimeProvider : IUnitTestRuntimeProvider + { + private const string XUNIT_ASSEMBLY = "xunit"; + private const string ASSERT_TYPE = "Xunit.Assert"; + + Action assertInconclusive = null; + Action assertIgnore = null; + + public void TestInconclusive(string message) + { + throw new NotSupportedException("XUnit does not support Assert.Inconclusive"); + } + + public void TestIgnore(string message) + { + throw new NotSupportedException("XUnit does not support Assert.Ignore"); + } + + public bool DelayedFixtureTearDown + { + get { return false; } + } + } +} \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config b/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config new file mode 100644 index 000000000..56a45d063 --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config @@ -0,0 +1,21 @@ + + + +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj new file mode 100644 index 000000000..2fc6a1fd0 --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj @@ -0,0 +1,95 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC} + Library + Properties + Bowling.Specflow + Bowling.Specflow + v3.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + False + ..\..\..\..\..\Program Files (x86)\TechTalk\SpecFlow\TechTalk.SpecFlow.dll + + + False + ..\..\..\..\Library\xUnit\xunit.dll + + + + + + + True + True + ScoreCalculationAlternativesFeature.feature + + + True + True + ScoreCalculationFeature.feature + + + + + + SpecFlowSingleFileGenerator + ScoreCalculationAlternativesFeature.feature.cs + + + SpecFlowSingleFileGenerator + ScoreCalculationFeature.feature.cs + + + + + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} + Bowling + + + + + \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs new file mode 100644 index 000000000..fe96da35e --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs @@ -0,0 +1,93 @@ + +using Xunit; +using TechTalk.SpecFlow; + +namespace Bowling.Specflow +{ + [Binding] + public class BowlingSteps + { + private Game _game; + + [Given(@"a new bowling game")] + public void GivenANewBowlingGame() + { + _game = new Game(); + } + + [When(@"all of my balls are landing in the gutter")] + public void WhenAllOfMyBallsAreLandingInTheGutter() + { + for (int i = 0; i < 20; i++) + { + _game.Roll(0); + } + } + + [When(@"all of my rolls are strikes")] + public void WhenAllOfMyRollsAreStrikes() + { + for (int i = 0; i < 12; i++) + { + _game.Roll(10); + } + } + + [Then(@"my total score should be (\d+)")] + public void ThenMyTotalScoreShouldBe(int score) + { + Assert.Equal(score, _game.Score); + } + + [When(@"I roll (\d+)")] + public void WhenIRoll(int pins) + { + _game.Roll(pins); + } + + [When(@"I roll (\d+) and (\d+)")] + public void WhenIRoll(int pins1, int pins2) + { + _game.Roll(pins1); + _game.Roll(pins2); + } + +// [When(@"(\d+) times I roll (\d+) and (\d+)")] +// public void WhenIRollSeveralTimes(int rollCount, int pins1, int pins2) +// { +// for (int i = 0; i < rollCount; i++) +// { +// _game.Roll(pins1); +// _game.Roll(pins2); +// } +// } + + [When(@"I roll (\d+) times (\d+) and (\d+)")] + public void WhenIRollSeveralTimes2(int rollCount, int pins1, int pins2) + { + for (int i = 0; i < rollCount; i++) + { + _game.Roll(pins1); + _game.Roll(pins2); + } + } + + [When(@"I roll the following series:(.*)")] + public void WhenIRollTheFollowingSeries(string series) + { + foreach (var roll in series.Trim().Split(',')) + { + _game.Roll(int.Parse(roll)); + } + } + + [When(@"I roll")] + public void WhenIRoll(Table rolls) + { + foreach (var row in rolls.Rows) + { + _game.Roll(int.Parse(row["Pins"])); + } + } + } +} diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..62c82185d --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Bowling.Specflow")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Bowling.Specflow")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("999efa28-8498-4b70-a80d-979fbd7b840e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature new file mode 100644 index 000000000..2fb99cc00 --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature @@ -0,0 +1,42 @@ +Feature: Score Calculation (alternative forms) + In order to know my performance + As a player + I want the system to calculate my total score + + +Scenario: One single spare + Given a new bowling game + When I roll the following series: 3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + Then my total score should be 29 + +Scenario: All spares + Given a new bowling game + When I roll 10 times 1 and 9 + And I roll 1 + Then my total score should be 110 + +Scenario: Yet another beginners game + Given a new bowling game + When I roll + | Pins | + | 2 | + | 7 | + | 1 | + | 5 | + | 1 | + | 1 | + | 1 | + | 3 | + | 1 | + | 1 | + | 1 | + | 4 | + | 1 | + | 1 | + | 1 | + | 1 | + | 8 | + | 1 | + | 1 | + | 1 | + Then my total score should be 43 \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs new file mode 100644 index 000000000..2b378816d --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs @@ -0,0 +1,223 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (http://www.specflow.org/). +// SpecFlow Version:1.2.0.0 +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Bowling.Specflow +{ + using System; + using System.Globalization; + using Xunit; + using TechTalk.SpecFlow; + + + public partial class ScoreCalculationAlternativeFormsFeature : IUseFixture, IDisposable + { + + private ScoreCalculationAlternativeFormsFixture _fixture; + + private bool _isDisposed = false; + +#line 1 "ScoreCalculationAlternativesFeature.feature" +#line hidden + ~ScoreCalculationAlternativeFormsFeature() + { + Dispose(false); + } + partial void OnDisposeManagedResources(); + partial void OnDisposeUnmanagedResources(); + partial void OnInitialize(); + + public ScoreCalculationAlternativeFormsFeature() + { + this.OnInitialize(); + } + + public void SetFixture(ScoreCalculationAlternativeFormsFixture fixture) + { + _fixture = fixture; + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool isDisposing) + { + if ((this._isDisposed == false)) + { + if ((isDisposing == true)) + { + this.OnDisposeManagedResources(); + } + this.OnDisposeUnmanagedResources(); + this._isDisposed = true; + } + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] + [Xunit.TraitAttribute("Description", "One single spare")] + public void OneSingleSpare() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); +#line 7 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 8 + this._fixture.TestRunner.Given("a new bowling game"); +#line 9 + this._fixture.TestRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); +#line 10 + this._fixture.TestRunner.Then("my total score should be 29"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] + [Xunit.TraitAttribute("Description", "All spares")] + public void AllSpares() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); +#line 12 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 13 + this._fixture.TestRunner.Given("a new bowling game"); +#line 14 + this._fixture.TestRunner.When("I roll 10 times 1 and 9"); +#line 15 + this._fixture.TestRunner.And("I roll 1"); +#line 16 + this._fixture.TestRunner.Then("my total score should be 110"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] + [Xunit.TraitAttribute("Description", "Yet another beginners game")] + public void YetAnotherBeginnersGame() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Yet another beginners game", ((string[])(null))); +#line 18 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 19 + this._fixture.TestRunner.Given("a new bowling game"); +#line hidden + TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] { + "Pins"}); + table1.AddRow(new string[] { + "2"}); + table1.AddRow(new string[] { + "7"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "5"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "3"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "4"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "8"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); + table1.AddRow(new string[] { + "1"}); +#line 20 + this._fixture.TestRunner.When("I roll", ((string)(null)), table1); +#line 42 + this._fixture.TestRunner.Then("my total score should be 43"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + } + + public partial class ScoreCalculationAlternativeFormsFixture : IDisposable + { + + private bool _isDisposed = false; + + private ITestRunner _testRunner; + + ~ScoreCalculationAlternativeFormsFixture() + { + Dispose(false); + } + partial void OnDisposeManagedResources(); + partial void OnDisposeUnmanagedResources(); + + public ScoreCalculationAlternativeFormsFixture() + { + FeatureInfo featureInfo = new FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + + "otal score", ((string[])(null))); + this._testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + this._testRunner.OnFeatureStart(featureInfo); + } + + public ITestRunner TestRunner + { + get + { + return this._testRunner; + } + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool isDisposing) + { + if ((this._isDisposed == false)) + { + if (((this._testRunner == null) + == false)) + { + this._testRunner.OnFeatureEnd(); + this._testRunner = null; + } + if ((isDisposing == true)) + { + this.OnDisposeManagedResources(); + } + this.OnDisposeUnmanagedResources(); + this._isDisposed = true; + } + } + } +} diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature new file mode 100644 index 000000000..ec795307c --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature @@ -0,0 +1,37 @@ +Feature: Score Calculation + In order to know my performance + As a player + I want the system to calculate my total score + +Scenario: Gutter game + Given a new bowling game + When all of my balls are landing in the gutter + Then my total score should be 0 + +Scenario: Beginners game + Given a new bowling game + When I roll 2 and 7 + And I roll 3 and 4 + And I roll 8 times 1 and 1 + Then my total score should be 32 + +Scenario: Another beginners game + Given a new bowling game + When I roll the following series: 2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1 + Then my total score should be 40 + +Scenario: All Strikes + Given a new bowling game + When all of my rolls are strikes + Then my total score should be 300 + +Scenario: One single spare + Given a new bowling game + When I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + Then my total score should be 29 + +Scenario: All spares + Given a new bowling game + When I roll 10 times 1 and 9 + And I roll 1 + Then my total score should be 110 \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs new file mode 100644 index 000000000..867cccbc8 --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs @@ -0,0 +1,241 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (http://www.specflow.org/). +// SpecFlow Version:1.2.0.0 +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Bowling.Specflow +{ + using System; + using System.Globalization; + using Xunit; + using TechTalk.SpecFlow; + + + public partial class ScoreCalculationFeature : IUseFixture, IDisposable + { + + private ScoreCalculationFixture _fixture; + + private bool _isDisposed = false; + +#line 1 "ScoreCalculationFeature.feature" +#line hidden + ~ScoreCalculationFeature() + { + Dispose(false); + } + partial void OnDisposeManagedResources(); + partial void OnDisposeUnmanagedResources(); + partial void OnInitialize(); + + public ScoreCalculationFeature() + { + this.OnInitialize(); + } + + public void SetFixture(ScoreCalculationFixture fixture) + { + _fixture = fixture; + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool isDisposing) + { + if ((this._isDisposed == false)) + { + if ((isDisposing == true)) + { + this.OnDisposeManagedResources(); + } + this.OnDisposeUnmanagedResources(); + this._isDisposed = true; + } + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "Gutter game")] + public void GutterGame() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Gutter game", ((string[])(null))); +#line 6 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 7 + this._fixture.TestRunner.Given("a new bowling game"); +#line 8 + this._fixture.TestRunner.When("all of my balls are landing in the gutter"); +#line 9 + this._fixture.TestRunner.Then("my total score should be 0"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "Beginners game")] + public void BeginnersGame() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Beginners game", ((string[])(null))); +#line 11 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 12 + this._fixture.TestRunner.Given("a new bowling game"); +#line 13 + this._fixture.TestRunner.When("I roll 2 and 7"); +#line 14 + this._fixture.TestRunner.And("I roll 3 and 4"); +#line 15 + this._fixture.TestRunner.And("I roll 8 times 1 and 1"); +#line 16 + this._fixture.TestRunner.Then("my total score should be 32"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "Another beginners game")] + public void AnotherBeginnersGame() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Another beginners game", ((string[])(null))); +#line 18 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 19 + this._fixture.TestRunner.Given("a new bowling game"); +#line 20 + this._fixture.TestRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); +#line 21 + this._fixture.TestRunner.Then("my total score should be 40"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "All Strikes")] + public void AllStrikes() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All Strikes", ((string[])(null))); +#line 23 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 24 + this._fixture.TestRunner.Given("a new bowling game"); +#line 25 + this._fixture.TestRunner.When("all of my rolls are strikes"); +#line 26 + this._fixture.TestRunner.Then("my total score should be 300"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "One single spare")] + public void OneSingleSpare() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); +#line 28 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 29 + this._fixture.TestRunner.Given("a new bowling game"); +#line 30 + this._fixture.TestRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); +#line 31 + this._fixture.TestRunner.Then("my total score should be 29"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + + [Xunit.FactAttribute()] + [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] + [Xunit.TraitAttribute("Description", "All spares")] + public void AllSpares() + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); +#line 33 +this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +#line 34 + this._fixture.TestRunner.Given("a new bowling game"); +#line 35 + this._fixture.TestRunner.When("I roll 10 times 1 and 9"); +#line 36 + this._fixture.TestRunner.And("I roll 1"); +#line 37 + this._fixture.TestRunner.Then("my total score should be 110"); +#line hidden + this._fixture.TestRunner.CollectScenarioErrors(); + this._fixture.TestRunner.OnScenarioEnd(); + } + } + + public partial class ScoreCalculationFixture : IDisposable + { + + private bool _isDisposed = false; + + private ITestRunner _testRunner; + + ~ScoreCalculationFixture() + { + Dispose(false); + } + partial void OnDisposeManagedResources(); + partial void OnDisposeUnmanagedResources(); + + public ScoreCalculationFixture() + { + FeatureInfo featureInfo = new FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + + "otal score", ((string[])(null))); + this._testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + this._testRunner.OnFeatureStart(featureInfo); + } + + public ITestRunner TestRunner + { + get + { + return this._testRunner; + } + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool isDisposing) + { + if ((this._isDisposed == false)) + { + if (((this._testRunner == null) + == false)) + { + this._testRunner.OnFeatureEnd(); + this._testRunner = null; + } + if ((isDisposing == true)) + { + this.OnDisposeManagedResources(); + } + this.OnDisposeUnmanagedResources(); + this._isDisposed = true; + } + } + } +} diff --git a/Samples/BowlingKata - XUnit/Bowling.sln b/Samples/BowlingKata - XUnit/Bowling.sln new file mode 100644 index 000000000..2bd90eb9f --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling", "Bowling\Bowling.csproj", "{B065A18E-57BD-4399-AAF7-BD2FA0147FCB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling.Specflow", "Bowling.Specflow\Bowling.Specflow.csproj", "{D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.Build.0 = Release|Any CPU + {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj b/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj new file mode 100644 index 000000000..224516dde --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj @@ -0,0 +1,59 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} + Library + Properties + Bowling + Bowling + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling/Game.cs b/Samples/BowlingKata - XUnit/Bowling/Game.cs new file mode 100644 index 000000000..b3238058b --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling/Game.cs @@ -0,0 +1,67 @@ +namespace Bowling +{ + public class Game + { + private int[] rolls = new int[21]; + private int currentRoll; + + public void Roll(int pins) + { + rolls[currentRoll++] = pins; + } + + public int Score + { + get + { + int score = 0; + int frameIndex = 0; + for (int frame = 0; frame < 10; frame++) + { + if (isStrike(frameIndex)) + { + score += 10 + strikeBonus(frameIndex); + frameIndex++; + } + else if (isSpare(frameIndex)) + { + score += 10 + spareBonus(frameIndex); + frameIndex += 2; + } + else + { + score += sumOfBallsInFrame(frameIndex); + frameIndex += 2; + } + } + return score; + } + } + + private bool isStrike(int frameIndex) + { + return rolls[frameIndex] == 10; + } + + private int sumOfBallsInFrame(int frameIndex) + { + return rolls[frameIndex] + rolls[frameIndex + 1]; + } + + private int spareBonus(int frameIndex) + { + return rolls[frameIndex + 2]; + } + + private int strikeBonus(int frameIndex) + { + return rolls[frameIndex + 1] + rolls[frameIndex + 2]; + } + + private bool isSpare(int frameIndex) + { + return rolls[frameIndex] + rolls[frameIndex + 1] == 10; + } + + } +} diff --git a/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs b/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..638bab227 --- /dev/null +++ b/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Bowling")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Bowling")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7e637ff2-1f70-4d59-bedf-78202aeae595")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/ParserTests/ParserTests.csproj b/Tests/ParserTests/ParserTests.csproj index 5f4ad7c7f..12af689b9 100644 --- a/Tests/ParserTests/ParserTests.csproj +++ b/Tests/ParserTests/ParserTests.csproj @@ -59,6 +59,7 @@ + diff --git a/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs new file mode 100644 index 000000000..c61ae1a9f --- /dev/null +++ b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs @@ -0,0 +1,185 @@ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Xml.Serialization; +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 SuccessfulXUnitGenerationTest + { + [Test] + public void CanGenerateFromFiles() + { + foreach (var testFile in TestFileHelper.GetTestFiles()) + { + CanGenerateFromFile(testFile); + } + } + + [Test] + public void CanGenerateSimpleFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "simple.feature")); + } + + [Test] + public void CanGenerateCommentsFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "comments.feature")); + } + + [Test] + public void CanGenerateFeatureheaderFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "featureheader.feature")); + } + + [Test] + public void CanGenerateTagsFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "tags.feature")); + } + + [Test] + public void CanGeneratebackgroundFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "background.feature")); + } + + [Test] + public void CanGeneratebackgroundWithTitleFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "background_withtitle.feature")); + } + + [Test] + public void CanGenerateWhitespacesFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "whitespaces.feature")); + } + + [Test] + public void CanGenerateGivenWhenThenDuplicationFeatureFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "givenwhenthenduplication.feature")); + } + + [Test] + public void CanGenerateButFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "but.feature")); + } + + [Test] + public void CanGenerateMultilinetitleFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "multilinetitle.feature")); + } + + [Test] + public void CanGenerateMultilineargumentFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "multilineargument.feature")); + } + + [Test] + public void CanGenerateTableargumentFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "tableargument.feature")); + } + + [Test] + public void CanGenerateScneriooutlineFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "scenariooutline.feature")); + } + + [Test] + public void CanGenerateMixedGWTFeature() + { + var folder = Path.GetFullPath(Path.Combine(TestFileHelper.GetProjectLocation(), "TestFiles")); + CanGenerateFromFile(Path.Combine(folder, "mixedgivenwhenthen.feature")); + } + + + [Test, TestCaseSource(typeof(TestFileHelper), "GetTestFiles")] + public void CanGenerateFromFile(string fileName) + { + Console.WriteLine(fileName); + SpecFlowLangParser 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"); + } + } + + 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) + { + SpecFlowXUnitTestConverter converter = new SpecFlowXUnitTestConverter(new XUnitTestGeneratorProvider(), true); + var codeNamespace = converter.GenerateUnitTestFixture(feature, "TestClassName", "Target.Namespace"); + + CSharpCodeProvider codeProvider = new CSharpCodeProvider(); + CodeGeneratorOptions 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(); + } + } + } +} From 92c8f1704adb328edce367d7b99f964ecd2c196c Mon Sep 17 00:00:00 2001 From: jbandi Date: Tue, 2 Mar 2010 23:29:27 +0100 Subject: [PATCH 06/34] Fixing readme --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index d34bb820d..7c4b85ba4 100644 --- a/README.rdoc +++ b/README.rdoc @@ -13,7 +13,7 @@ Discussion group at: http://groups.google.com/group/SpecFlow 3. Make your feature addition or bugfix. -3. Send us a pull request vie the Google Group (http://groups.google.com/group/specflow/) +3. Send us a pull request via GitHub and maybe a short note on the Google Group (http://groups.google.com/group/specflow/) == Copyright From 8a575838eb4a35c79e977287647fc63dec0693c1 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 8 Mar 2010 17:59:50 +0100 Subject: [PATCH 07/34] fix xUnit support --- Generator/CodeDomHelper.cs | 26 + .../Configuration/GeneratorConfiguration.cs | 24 +- Generator/SpecFlowGenerator.cs | 3 +- Generator/SpecFlowUnitTestConverter.cs | 1 + .../ISpecFlowUnitTestConverter.cs | 8 - .../SpecFlowXUnitTestConverter.cs | 987 ------------------ Generator/TechTalk.SpecFlow.Generator.csproj | 4 +- .../ISpecFlowUnitTestConverter.cs | 11 + .../XUnitTestGeneratorProvider.cs | 323 +++--- .../ConfigurationSectionHandler.cs | 60 +- Runtime/Configuration/RuntimeConfiguration.cs | 23 +- .../UnitTestProvider/XUnitRuntimeProvider.cs | 10 +- .../Bowling.Specflow/App.config | 2 + .../Bowling.Specflow/Bowling.Specflow.csproj | 14 +- ...eCalculationAlternativesFeature.feature.cs | 151 +-- .../ScoreCalculationFeature.feature.cs | 194 ++-- Samples/BowlingKata - XUnit/Bowling.sln | 6 + .../SuccessfulXUnitGenerationTest.cs | 2 +- 18 files changed, 424 insertions(+), 1425 deletions(-) create mode 100644 Generator/CodeDomHelper.cs delete mode 100644 Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs delete mode 100644 Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs create mode 100644 Generator/UnitTestConverter/ISpecFlowUnitTestConverter.cs diff --git a/Generator/CodeDomHelper.cs b/Generator/CodeDomHelper.cs new file mode 100644 index 000000000..e736f5e26 --- /dev/null +++ b/Generator/CodeDomHelper.cs @@ -0,0 +1,26 @@ +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace TechTalk.SpecFlow.Generator +{ + internal static class CodeDomHelper + { + static public CodeTypeReference CreateNestedTypeReference(CodeTypeDeclaration baseTypeDeclaration, string nestedTypeName) + { + return new CodeTypeReference(baseTypeDeclaration.Name + "." + nestedTypeName); + } + + static public void SetTypeReferenceAsInterface(CodeTypeReference typeReference) + { + // this hack is necessary for VB.NET code generation + + var isInterfaceField = typeReference.GetType().GetField("isInterface", BindingFlags.Instance | BindingFlags.NonPublic); + if (isInterfaceField != null) + isInterfaceField.SetValue(typeReference, true); + } + } +} diff --git a/Generator/Configuration/GeneratorConfiguration.cs b/Generator/Configuration/GeneratorConfiguration.cs index 4a8784be3..93da8e37e 100644 --- a/Generator/Configuration/GeneratorConfiguration.cs +++ b/Generator/Configuration/GeneratorConfiguration.cs @@ -14,17 +14,15 @@ public class GeneratorConfiguration //unit test framework settings public Type GeneratorUnitTestProviderType { get; set; } - public Type SpecFlowUnitTestConverterType { get; set; } // generator settings public bool AllowDebugGeneratedFiles { get; set; } - + public GeneratorConfiguration() { FeatureLanguage = CultureInfo.GetCultureInfo(ConfigDefaults.FeatureLanguage); - ToolLanguage = string.IsNullOrEmpty(ConfigDefaults.ToolLanguage) ? - FeatureLanguage : - CultureInfo.GetCultureInfo(ConfigDefaults.ToolLanguage); + ToolLanguage = string.IsNullOrEmpty(ConfigDefaults.ToolLanguage) ? FeatureLanguage : + CultureInfo.GetCultureInfo(ConfigDefaults.ToolLanguage); SetUnitTestDefaultsByName(ConfigDefaults.UnitTestProviderName); @@ -38,9 +36,8 @@ internal void UpdateFromConfigFile(ConfigurationSectionHandler configSection) if (configSection.Language != null) { FeatureLanguage = CultureInfo.GetCultureInfo(configSection.Language.Feature); - ToolLanguage = string.IsNullOrEmpty(configSection.Language.Tool) ? - FeatureLanguage : - CultureInfo.GetCultureInfo(configSection.Language.Tool); + ToolLanguage = string.IsNullOrEmpty(configSection.Language.Tool) ? FeatureLanguage : + CultureInfo.GetCultureInfo(configSection.Language.Tool); } if (configSection.UnitTestProvider != null) @@ -71,16 +68,13 @@ private void SetUnitTestDefaultsByName(string name) { case "nunit": GeneratorUnitTestProviderType = typeof(NUnitTestConverter); - SpecFlowUnitTestConverterType = typeof(SpecFlowUnitTestConverter); break; - case "xunit": - GeneratorUnitTestProviderType = typeof(XUnitTestGeneratorProvider); - SpecFlowUnitTestConverterType = typeof(SpecFlowXUnitTestConverter); - break; + case "xunit": + GeneratorUnitTestProviderType = typeof(XUnitTestGeneratorProvider); + break; case "mstest": GeneratorUnitTestProviderType = typeof(MsTestGeneratorProvider); - SpecFlowUnitTestConverterType = typeof(SpecFlowUnitTestConverter); - break; + break; default: GeneratorUnitTestProviderType = null; break; diff --git a/Generator/SpecFlowGenerator.cs b/Generator/SpecFlowGenerator.cs index 8e6e332d8..525b83b7e 100644 --- a/Generator/SpecFlowGenerator.cs +++ b/Generator/SpecFlowGenerator.cs @@ -10,6 +10,7 @@ using Microsoft.CSharp; using TechTalk.SpecFlow.Configuration; using TechTalk.SpecFlow.Generator.Configuration; +using TechTalk.SpecFlow.Generator.UnitTestConverter; using TechTalk.SpecFlow.Generator.UnitTestProvider; using TechTalk.SpecFlow.Parser; using TechTalk.SpecFlow.Parser.SyntaxElements; @@ -133,7 +134,7 @@ public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextR Feature feature = parser.Parse(inputReader, featureFile.GetFullPath(project)); IUnitTestGeneratorProvider generatorProvider = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.GeneratorUnitTestProviderType); - ISpecFlowUnitTestConverter testConverter = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.SpecFlowUnitTestConverterType, new object[] { generatorProvider, project.GeneratorConfiguration.AllowDebugGeneratedFiles}); + ISpecFlowUnitTestConverter testConverter = new SpecFlowUnitTestConverter(generatorProvider, project.GeneratorConfiguration.AllowDebugGeneratedFiles); var codeNamespace = testConverter.GenerateUnitTestFixture(feature, null, targetNamespace); return codeNamespace; diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index 2c05cae3e..f54e6d744 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using System.Text.RegularExpressions; +using TechTalk.SpecFlow.Generator.UnitTestConverter; using TechTalk.SpecFlow.Generator.UnitTestProvider; using TechTalk.SpecFlow.Parser.SyntaxElements; diff --git a/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs b/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs deleted file mode 100644 index 76b6dcf42..000000000 --- a/Generator/SpecflowUnitTestConverters/ISpecFlowUnitTestConverter.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; -namespace TechTalk.SpecFlow.Generator -{ - interface ISpecFlowUnitTestConverter - { - System.CodeDom.CodeNamespace GenerateUnitTestFixture(TechTalk.SpecFlow.Parser.SyntaxElements.Feature feature, string testClassName, string targetNamespace); - } -} diff --git a/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs b/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs deleted file mode 100644 index a7aec9dc1..000000000 --- a/Generator/SpecflowUnitTestConverters/SpecFlowXUnitTestConverter.cs +++ /dev/null @@ -1,987 +0,0 @@ -using System; -using System.CodeDom; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using TechTalk.SpecFlow.Generator.UnitTestProvider; -using TechTalk.SpecFlow.Parser.SyntaxElements; - -namespace TechTalk.SpecFlow.Generator -{ - public class SpecFlowXUnitTestConverter : ISpecFlowUnitTestConverter - { - private const string DEFAULT_NAMESPACE = "SpecFlowTests"; - private const string FEATURE_FORMAT = "{0}Feature"; - private const string TEST_FORMAT = "{0}"; - private const string IGNORE_TAG = "Ignore"; - - private const string XUNIT_NAMESPACE="Xunit"; - private const string SPECFLOW_NAMESPACE = "TechTalk.SpecFlow"; - - private const string ITESTRUNNER_TYPE = "ITestRunner"; - private const string TESTRUNNER_FIELD_NAME = "_testRunner"; - private const string TESTRUNNER_PROPERTY_NAME = "TestRunner"; - - private const string IUSEFIXTURE_TYPE = "IUseFixture"; - private const string FIXTURE_FORMAT = "{0}Fixture"; - private const string SETFIXTURE_METHOD_NAME = "SetFixture"; - private const string SETFIXTURE_METHOD_PARAMETER_NAME = "fixture"; - private const string FIXTURE_FIELD_NAME = "_fixture"; - - private const string IDISPOSABLE_TYPE = "IDisposable"; - private const string ISDISPOSED_FIELD_NAME = "_isDisposed"; - private const string DISPOSE_METHOD_NAME = "Dispose"; - private const string ISDISPOSING_PARAMETER_NAME = "isDisposing"; - - private const string ON_FEATUREEND_METHOD_NAME = "OnFeatureEnd"; - private const string FEATUREINFO_TYPE = "FeatureInfo"; - private const string BACKGROUND_NAME = "FeatureBackground"; - - private const string TESTRUNNERMANAGER_TYPE = "TechTalk.SpecFlow.TestRunnerManager"; - private const string SCENARIOINFO_TYPE = "TechTalk.SpecFlow.ScenarioInfo"; - private const string TABLE_TYPE = "TechTalk.SpecFlow.Table"; - - private readonly IUnitTestGeneratorProvider _testGeneratorProvider; - private readonly bool _allowDebugGeneratedFiles; - private CodeNamespace _codeNamespace; - - public SpecFlowXUnitTestConverter(IUnitTestGeneratorProvider testGeneratorProvider, bool allowDebugGeneratedFiles) - { - _testGeneratorProvider = testGeneratorProvider; - _allowDebugGeneratedFiles = allowDebugGeneratedFiles; - } - - public CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassName, string targetNamespace) - { - targetNamespace = targetNamespace ?? DEFAULT_NAMESPACE; - testClassName = testClassName ?? string.Format(FEATURE_FORMAT, feature.Title.ToIdentifier()); - - _codeNamespace = new CodeNamespace(targetNamespace); - - _codeNamespace.Imports.Add(new CodeNamespaceImport("System")); - _codeNamespace.Imports.Add(new CodeNamespaceImport("System.Globalization")); - _codeNamespace.Imports.Add(new CodeNamespaceImport(XUNIT_NAMESPACE)); - _codeNamespace.Imports.Add(new CodeNamespaceImport(SPECFLOW_NAMESPACE)); - - var testType = new CodeTypeDeclaration(testClassName) - { - IsPartial = true - }; - testType.TypeAttributes |= TypeAttributes.Public; - _codeNamespace.Types.Add(testType); - - AddLinePragmaInitial(testType, feature); - - _testGeneratorProvider.SetTestFixture(testType, feature.Title, feature.Description); - if (feature.Tags != null) - { - _testGeneratorProvider.SetTestFixtureCategories(testType, GetNonIgnoreTags(feature.Tags)); - if (feature.Tags.Any(t => t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase))) - { - _testGeneratorProvider.SetIgnore(testType); - } - } - - AdjustTypeForIUseFixture(testType, feature); - AdjustFeatureForIDisposable(testType); - - var testSetupMethod = GenerateTestSetup(testType); - if (feature.Background != null) - { - GenerateBackground(testType, testSetupMethod, feature.Background); - } - - GenerateTestTearDown(testType); - - foreach (var scenario in feature.Scenarios) - { - if (scenario is ScenarioOutline) - { - GenerateScenarioOutlineTest(testType, testSetupMethod, (ScenarioOutline)scenario, feature); - } - else - { - GenerateScenarioTest(testType, testSetupMethod, scenario, feature); - } - } - return _codeNamespace; - } - - private void AdjustTypeForIUseFixture(CodeTypeDeclaration testType, Feature feature) - { - string fixtureName = string.Format(FIXTURE_FORMAT, feature.Title.ToIdentifier()); - - GenerateFixture(feature, fixtureName); - - // Inherit IUseFixture - testType.BaseTypes.Add - ( - new CodeTypeReference(IUSEFIXTURE_TYPE, new CodeTypeReference[] { new CodeTypeReference(fixtureName) }) - ); - - // Add Fixture data; - testType.Members.Add(new CodeMemberField(fixtureName, FIXTURE_FIELD_NAME)); - - // Implement IUseFixture.SetFixture - CodeMemberMethod setFixtureMethod = new CodeMemberMethod() - { - Name = SETFIXTURE_METHOD_NAME, - Attributes = MemberAttributes.Public | MemberAttributes.Final - }; - setFixtureMethod.Parameters.Add - ( - new CodeParameterDeclarationExpression(new CodeTypeReference(fixtureName), SETFIXTURE_METHOD_PARAMETER_NAME) - ); - - // _fixture = fixture; - setFixtureMethod.Statements.Add - ( - new CodeAssignStatement - ( - new CodeVariableReferenceExpression(FIXTURE_FIELD_NAME), - new CodeArgumentReferenceExpression(SETFIXTURE_METHOD_PARAMETER_NAME) - ) - ); - testType.Members.Add(setFixtureMethod); - } - - private void GenerateFixture(Feature feature, string fixtureName) - { - fixtureName = fixtureName ?? string.Format(FIXTURE_FORMAT, feature.Title.ToIdentifier()); - - var fixtureType = - new CodeTypeDeclaration(fixtureName) - { - IsPartial = true - }; - fixtureType.TypeAttributes |= TypeAttributes.Public; - - // Inherit IDisposable - fixtureType.BaseTypes.Add - ( - new CodeTypeReference(IDISPOSABLE_TYPE) - ); - - fixtureType.Members.AddRange - ( - new CodeTypeMember[] - { - // add private bool _isDisposed = false; - new CodeMemberField(typeof(bool), ISDISPOSED_FIELD_NAME) - { - InitExpression = new CodePrimitiveExpression(false) - }, - // add private ITestRunner _testRunner; - new CodeMemberField(ITESTRUNNER_TYPE, TESTRUNNER_FIELD_NAME) - { - Attributes = MemberAttributes.Private - } - } - ); - - CodeMemberProperty testRunnerProperty = - new CodeMemberProperty() - { - Name = TESTRUNNER_PROPERTY_NAME, - Attributes = MemberAttributes.Public | MemberAttributes.Final, - Type = new CodeTypeReference(ITESTRUNNER_TYPE) - }; - testRunnerProperty.GetStatements.Add - ( - new CodeMethodReturnStatement - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME) - ) - ); - fixtureType.Members.Add(testRunnerProperty); - - CodeMemberMethod disposeMethod; - - // add public void Dispose() - disposeMethod = new CodeMemberMethod() - { - Name = DISPOSE_METHOD_NAME, - Attributes = MemberAttributes.Public | MemberAttributes.Final - }; - disposeMethod.Statements.AddRange - ( - new CodeStatement[] - { - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - DISPOSE_METHOD_NAME, - new CodePrimitiveExpression(true) - ) - ), - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeTypeReferenceExpression("GC"), - "SuppressFinalize", - new CodeThisReferenceExpression() - ) - ) - } - ); - fixtureType.Members.Add(disposeMethod); - - // add private void Dispose(bool isDisposing) - disposeMethod = new CodeMemberMethod() - { - Name = DISPOSE_METHOD_NAME, - Attributes = MemberAttributes.Private | MemberAttributes.Final - }; - disposeMethod.Parameters.Add - ( - new CodeParameterDeclarationExpression(typeof(bool), ISDISPOSING_PARAMETER_NAME) - ); - disposeMethod.Statements.Add - ( - new CodeConditionStatement - ( - new CodeBinaryOperatorExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(false) - ), - new CodeStatement[] - { - new CodeConditionStatement - ( - new CodeBinaryOperatorExpression - ( - new CodeBinaryOperatorExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(null) - ), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(false) - ), - new CodeStatement[] - { - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), - ON_FEATUREEND_METHOD_NAME, - new CodeExpression[] { } - ) - ), - new CodeAssignStatement - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), - new CodePrimitiveExpression(null) - ) - } - ), - new CodeConditionStatement - ( - new CodeBinaryOperatorExpression - ( - new CodeVariableReferenceExpression(ISDISPOSING_PARAMETER_NAME), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(true) - ), - new CodeStatement[] - { - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - "OnDisposeManagedResources", - new CodeExpression[] { } - ) - ) - } - ), - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - "OnDisposeUnmanagedResources", - new CodeExpression[] { } - ) - ), - new CodeAssignStatement - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), - new CodePrimitiveExpression(true) - ) - } - ) - ); - fixtureType.Members.Add(disposeMethod); - - // add destructor - fixtureType.Members.Add - ( - new CodeSnippetTypeMember - ( - string.Format - ( -@" ~{0}() - {{ - Dispose(false); - }}", - fixtureName - ) - ) - ); - - fixtureType.Members.AddRange - ( - new CodeTypeMember[] - { - // add partial void OnDisposeManagedResources() - new CodeSnippetTypeMember(" partial void OnDisposeManagedResources();"), - // add partial void OnDisposeUnmanagedResources() - new CodeSnippetTypeMember(" partial void OnDisposeUnmanagedResources();") - } - ); - - // add constructor - CodeConstructor constructor = new CodeConstructor() - { - Attributes = MemberAttributes.Public, - Name = fixtureName - }; - constructor.Statements.AddRange - ( - new CodeStatement[] - { - new CodeVariableDeclarationStatement - ( - FEATUREINFO_TYPE, - "featureInfo", - new CodeObjectCreateExpression - ( - FEATUREINFO_TYPE, - new CodeObjectCreateExpression(typeof(CultureInfo), new CodePrimitiveExpression(feature.Language)), - new CodePrimitiveExpression(feature.Title), - new CodePrimitiveExpression(feature.Description), - GetStringArrayExpression(feature.Tags) - ) - ), - new CodeAssignStatement - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), - new CodeMethodInvokeExpression - ( - new CodeTypeReferenceExpression(TESTRUNNERMANAGER_TYPE), - "GetTestRunner", - new CodeExpression[] { } - ) - ), - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), TESTRUNNER_FIELD_NAME), - "OnFeatureStart", - new CodeVariableReferenceExpression("featureInfo") - ) - ) - } - ); - fixtureType.Members.Add(constructor); - - _codeNamespace.Types.Add(fixtureType); - } - - private void AdjustFeatureForIDisposable(CodeTypeDeclaration testType) - { - // Inherit IDisposable - testType.BaseTypes.Add - ( - new CodeTypeReference(IDISPOSABLE_TYPE) - ); - - // add bool _isDisposed = false; - testType.Members.Add - ( - new CodeMemberField(typeof(bool), ISDISPOSED_FIELD_NAME) - { - Attributes = MemberAttributes.Private, - InitExpression = new CodePrimitiveExpression(false) - } - ); - - CodeMemberMethod disposeMethod; - - // add public void Dispose() - disposeMethod = new CodeMemberMethod() - { - Name = DISPOSE_METHOD_NAME, - Attributes = MemberAttributes.Public | MemberAttributes.Final - }; - disposeMethod.Statements.AddRange - ( - new CodeStatement[] - { - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - DISPOSE_METHOD_NAME, - new CodePrimitiveExpression(true) - ) - ), - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeTypeReferenceExpression("GC"), - "SuppressFinalize", - new CodeThisReferenceExpression() - ) - ) - } - ); - testType.Members.Add(disposeMethod); - - // add private void Dispose(bool isDisposing) - disposeMethod = new CodeMemberMethod() - { - Name = DISPOSE_METHOD_NAME, - Attributes = MemberAttributes.Private | MemberAttributes.Final - }; - disposeMethod.Parameters.Add - ( - new CodeParameterDeclarationExpression(typeof(bool), ISDISPOSING_PARAMETER_NAME) - ); - disposeMethod.Statements.Add - ( - new CodeConditionStatement - ( - new CodeBinaryOperatorExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(false) - ), - new CodeStatement[] - { - new CodeConditionStatement - ( - new CodeBinaryOperatorExpression - ( - new CodeVariableReferenceExpression(ISDISPOSING_PARAMETER_NAME), - CodeBinaryOperatorType.ValueEquality, - new CodePrimitiveExpression(true) - ), - new CodeStatement[] - { - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - "OnDisposeManagedResources", - new CodeExpression[] { } - ) - ) - } - ), - new CodeExpressionStatement - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - "OnDisposeUnmanagedResources", - new CodeExpression[] { } - ) - ), - new CodeAssignStatement - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), ISDISPOSED_FIELD_NAME), - new CodePrimitiveExpression(true) - ) - } - ) - ); - testType.Members.Add(disposeMethod); - - // add destructor - testType.Members.Add - ( - new CodeSnippetTypeMember - ( - string.Format - ( -@" ~{0}() - {{ - Dispose(false); - }}", - testType.Name - ) - ) - ); - - testType.Members.AddRange - ( - new CodeTypeMember[] - { - // add partial void OnDisposeManagedResources() - new CodeSnippetTypeMember(" partial void OnDisposeManagedResources();"), - // add partial void OnDisposeUnmanagedResources() - new CodeSnippetTypeMember(" partial void OnDisposeUnmanagedResources();") - } - ); - } - - private CodeMemberMethod GenerateTestSetup(CodeTypeDeclaration testType) - { - CodeConstructor constructor = new CodeConstructor() - { - Attributes = MemberAttributes.Public - }; - constructor.Statements.Add - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - "OnInitialize", - new CodeExpression[] { } - ) - ); - testType.Members.Add(constructor); - - testType.Members.Add - ( - // add partial void OnInitialize() - new CodeSnippetTypeMember(" partial void OnInitialize();") - ); - - return constructor; - } - - private void GenerateBackground(CodeTypeDeclaration testType, CodeMemberMethod testSetup, Background background) - { - CodeMemberMethod backgroundMethod = new CodeMemberMethod() - { - Attributes = MemberAttributes.Public, - Name = BACKGROUND_NAME - }; - testType.Members.Add(backgroundMethod); - - AddLineDirective(backgroundMethod.Statements, background); - - foreach (var given in background.Steps) - { - GenerateStep(backgroundMethod, given, null); - } - - AddLineDirectiveHidden(backgroundMethod.Statements); - - testSetup.Statements.Add - ( - new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), backgroundMethod.Name) - ); - } - - private void GenerateTestTearDown(CodeTypeDeclaration testType) - { - // XUnit does not implement test teardowns - // IDisposable was implemented previously - } - - private void GenerateScenarioOutlineTest(CodeTypeDeclaration testType, CodeMemberMethod testSetup, ScenarioOutline scenarioOutline, Feature feature) - { - string testMethodName = string.Format(TEST_FORMAT, scenarioOutline.Title.ToIdentifier()); - - ParameterSubstitution paramToIdentifier = new ParameterSubstitution(); - foreach (var param in scenarioOutline.Examples.ExampleSets[0].Table.Header.Cells) - { - paramToIdentifier.Add(param.Value, param.Value.ToIdentifierCamelCase()); - } - - if (scenarioOutline.Examples.ExampleSets.Length > 1) - { - //TODO: check params - } - - GenerateScenarioOutlineBody(feature, scenarioOutline, paramToIdentifier, testType, testMethodName, testSetup); - - int exampleSetIndex = 0; - foreach (var exampleSet in scenarioOutline.Examples.ExampleSets) - { - string exampleSetTitle = exampleSet.Title == null ? string.Format("Scenarios{0}", exampleSetIndex + 1) : exampleSet.Title.ToIdentifier(); - - bool useFirstColumnAsName = CanUseFirstColumnAsName(exampleSet.Table); - - for (int rowIndex = 0; rowIndex < exampleSet.Table.Body.Length; rowIndex++) - { - string variantName = useFirstColumnAsName ? exampleSet.Table.Body[rowIndex].Cells[0].Value.ToIdentifierPart() : string.Format("Variant{0}", rowIndex); - GenerateScenarioOutlineTestVariant(testType, scenarioOutline, testMethodName, paramToIdentifier, exampleSetTitle, exampleSet.Table.Body[rowIndex], variantName); - } - exampleSetIndex++; - } - } - - private void GenerateScenarioOutlineBody(Feature feature, ScenarioOutline scenarioOutline, ParameterSubstitution paramToIdentifier, CodeTypeDeclaration testType, string testMethodName, CodeMemberMethod testSetup) - { - CodeMemberMethod testMethod = new CodeMemberMethod() - { - Attributes = MemberAttributes.Public | MemberAttributes.Final, - Name = testMethodName - }; - testType.Members.Add(testMethod); - - foreach (var pair in paramToIdentifier) - { - testMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), pair.Value)); - } - - GenerateTestBody(feature, scenarioOutline, testMethod, testSetup, paramToIdentifier); - } - - private void GenerateScenarioOutlineTestVariant(CodeTypeDeclaration testType, ScenarioOutline scenarioOutline, string testMethodName, List> paramToIdentifier, string exampleSetTitle, Row row, string variantName) - { - CodeMemberMethod testMethod = GetTestMethodDeclaration(testType, scenarioOutline); - testMethod.Name = string.IsNullOrEmpty(exampleSetTitle) ? string.Format("{0}_{1}", testMethod.Name, variantName) : string.Format("{0}_{1}_{2}", testMethod.Name, exampleSetTitle, variantName); - - //call test implementation with the params - List argumentExpressions = new List(); - foreach (var paramCell in row.Cells) - { - argumentExpressions.Add(new CodePrimitiveExpression(paramCell.Value)); - } - testMethod.Statements.Add - ( - new CodeMethodInvokeExpression - ( - new CodeThisReferenceExpression(), - testMethodName, - argumentExpressions.ToArray() - ) - ); - } - - private void GenerateScenarioTest(CodeTypeDeclaration testType, CodeMemberMethod testSetup, Scenario scenario, Feature feature) - { - CodeMemberMethod testMethod = GetTestMethodDeclaration(testType, scenario); - GenerateTestBody(feature, scenario, testMethod, testSetup, null); - } - - private void GenerateTestBody(Feature feature, Scenario scenario, CodeMemberMethod testMethod, CodeMemberMethod testSetup, ParameterSubstitution paramToIdentifier) - { - //ScenarioInfo scenarioInfo = new ScenarioInfo("xxxx", tags...); - testMethod.Statements.Add - ( - new CodeVariableDeclarationStatement - ( - SCENARIOINFO_TYPE, - "scenarioInfo", - new CodeObjectCreateExpression - ( - SCENARIOINFO_TYPE, - new CodePrimitiveExpression(scenario.Title), GetStringArrayExpression(scenario.Tags) - ) - ) - ); - - AddLineDirective(testMethod.Statements, scenario); - - CodePropertyReferenceExpression testRunnerProperty = - new CodePropertyReferenceExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), FIXTURE_FIELD_NAME), - TESTRUNNER_PROPERTY_NAME - ); - - // _fixture.TestRunner.OnScenarioStart(scenarioInfo); - testMethod.Statements.Add - ( - new CodeMethodInvokeExpression - ( - testRunnerProperty, - "OnScenarioStart", - new CodeVariableReferenceExpression("scenarioInfo") - ) - ); - - foreach (var scenarioStep in scenario.Steps) - { - // TODO - GenerateStep(testMethod, scenarioStep, paramToIdentifier); - } - - AddLineDirectiveHidden(testMethod.Statements); - - // _fixture.TestRunner.CollectScenarioErrors(); - testMethod.Statements.Add - ( - new CodeMethodInvokeExpression - ( - testRunnerProperty, - "CollectScenarioErrors", - new CodeExpression[] { } - ) - ); - - // _fixture.TestRunner.OnScenarioEnd(); - testMethod.Statements.Add - ( - new CodeMethodInvokeExpression - ( - testRunnerProperty, - "OnScenarioEnd", - new CodeExpression[] { } - ) - ); - } - - private void GenerateStep(CodeMemberMethod testMethod, ScenarioStep scenarioStep, ParameterSubstitution paramToIdentifier) - { - CodePropertyReferenceExpression testRunnerProperty = - new CodePropertyReferenceExpression - ( - new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), FIXTURE_FIELD_NAME), - TESTRUNNER_PROPERTY_NAME - ); - - // _fixture.TestRunner.Given("something"); - List arguments = new List(); - arguments.Add(GetSubstitutedString(scenarioStep.Text, paramToIdentifier)); - if (scenarioStep.MultiLineTextArgument != null || scenarioStep.TableArg != null) - { - AddLineDirectiveHidden(testMethod.Statements); - arguments.Add(GetMultilineTextArgExpression(scenarioStep.MultiLineTextArgument, paramToIdentifier)); - arguments.Add(GetTableArgExpression(scenarioStep.TableArg, testMethod.Statements, paramToIdentifier)); - } - - AddLineDirective(testMethod.Statements, scenarioStep); - testMethod.Statements.Add - ( - new CodeMethodInvokeExpression - ( - testRunnerProperty, - scenarioStep.GetType().Name, - arguments.ToArray() - ) - ); - } - - private IEnumerable GetNonIgnoreTags(IEnumerable tags) - { - return tags.Where(t => !t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase)).Select(t => t.Name); - } - - private CodeExpression GetStringArrayExpression(Tags tags) - { - if (tags == null || tags.Count == 0) - return new CodeCastExpression(typeof(string[]), new CodePrimitiveExpression(null)); - - List items = new List(); - foreach (var tag in tags) - { - items.Add(new CodePrimitiveExpression(tag.Name)); - } - - return new CodeArrayCreateExpression(typeof(string[]), items.ToArray()); - } - - private CodeExpression GetStringArrayExpression(IEnumerable items, ParameterSubstitution paramToIdentifier) - { - List expressions = new List(); - foreach (var item in items) - { - expressions.Add(GetSubstitutedString(item, paramToIdentifier)); - } - - return new CodeArrayCreateExpression(typeof(string[]), expressions.ToArray()); - } - - private class ParameterSubstitution : List> - { - public void Add(string parameter, string identifier) - { - base.Add(new KeyValuePair(parameter.Trim(), identifier)); - } - - public bool TryGetIdentifier(string param, out string id) - { - param = param.Trim(); - foreach (var pair in this) - { - if (pair.Key.Equals(param)) - { - id = pair.Value; - return true; - } - } - id = null; - return false; - } - } - - private bool CanUseFirstColumnAsName(Table table) - { - if (table.Header.Cells.Length == 0) - return false; - - return table.Body.Select(r => r.Cells[0].Value.ToIdentifier()).Distinct().Count() == table.Body.Length; - } - - private CodeMemberMethod GetTestMethodDeclaration(CodeTypeDeclaration testType, Scenario scenario) - { - CodeMemberMethod testMethod = new CodeMemberMethod() - { - Attributes = MemberAttributes.Public | MemberAttributes.Final, - Name = string.Format(TEST_FORMAT, scenario.Title.ToIdentifier()) - }; - - testType.Members.Add(testMethod); - - _testGeneratorProvider.SetTest(testMethod, scenario.Title); - if (scenario.Tags != null) - { - _testGeneratorProvider.SetTestCategories(testMethod, GetNonIgnoreTags(scenario.Tags)); - if (scenario.Tags.Any(t => t.Name.Equals(IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase))) - { - _testGeneratorProvider.SetIgnore(testMethod); - } - } - return testMethod; - } - - private CodeExpression GetSubstitutedString(string text, ParameterSubstitution paramToIdentifier) - { - if (text == null) - return new CodeCastExpression(typeof(string), new CodePrimitiveExpression(null)); - if (paramToIdentifier == null) - return new CodePrimitiveExpression(text); - - Regex paramRe = new Regex(@"\<(?[^\>]+)\>"); - string formatText = text.Replace("{", "{{").Replace("}", "}}"); - List arguments = new List(); - - formatText = paramRe.Replace(formatText, match => - { - string param = match.Groups["param"].Value; - string id; - if (!paramToIdentifier.TryGetIdentifier(param, out id)) - return match.Value; - int argIndex = arguments.IndexOf(id); - if (argIndex < 0) - { - argIndex = arguments.Count; - arguments.Add(id); - } - return "{" + argIndex + "}"; - }); - - if (arguments.Count == 0) - return new CodePrimitiveExpression(text); - - List formatArguments = new List(); - formatArguments.Add(new CodePrimitiveExpression(formatText)); - foreach (var id in arguments) - formatArguments.Add(new CodeVariableReferenceExpression(id)); - - return new CodeMethodInvokeExpression( - new CodeTypeReferenceExpression(typeof(string)), - "Format", - formatArguments.ToArray()); - } - - private int tableCounter = 0; - private CodeExpression GetTableArgExpression(Table tableArg, CodeStatementCollection statements, ParameterSubstitution paramToIdentifier) - { - if (tableArg == null) - return new CodeCastExpression(TABLE_TYPE, new CodePrimitiveExpression(null)); - - tableCounter++; - - //Table table0 = new Table(header...); - var tableVar = new CodeVariableReferenceExpression("table" + tableCounter); - statements.Add( - new CodeVariableDeclarationStatement(TABLE_TYPE, tableVar.VariableName, - new CodeObjectCreateExpression( - TABLE_TYPE, - GetStringArrayExpression(tableArg.Header.Cells.Select(c => c.Value), paramToIdentifier)))); - - foreach (var row in tableArg.Body) - { - //table0.AddRow(cells...); - statements.Add( - new CodeMethodInvokeExpression( - tableVar, - "AddRow", - GetStringArrayExpression(row.Cells.Select(c => c.Value), paramToIdentifier))); - } - return tableVar; - } - - private CodeExpression GetMultilineTextArgExpression(string multiLineTextArgument, ParameterSubstitution paramToIdentifier) - { - return GetSubstitutedString(multiLineTextArgument, paramToIdentifier); - } - - #region Line pragma handling - - private void AddLinePragmaInitial(CodeTypeDeclaration testType, Feature feature) - { - if (_allowDebugGeneratedFiles) - return; - - testType.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", Path.GetFileName(feature.SourceFile)))); - testType.Members.Add(new CodeSnippetTypeMember("#line hidden")); - } - - private void AddLineDirectiveHidden(CodeStatementCollection statements) - { - if (_allowDebugGeneratedFiles) - return; - - statements.Add(new CodeSnippetStatement("#line hidden")); - } - - private void AddLineDirective(CodeStatementCollection statements, Background background) - { - AddLineDirective(statements, null, background.FilePosition); - } - - private void AddLineDirective(CodeStatementCollection statements, Scenario scenario) - { - AddLineDirective(statements, null, scenario.FilePosition); - } - - private void AddLineDirective(CodeStatementCollection statements, ScenarioStep step) - { - AddLineDirective(statements, null, step.FilePosition); - } - - private void AddLineDirective(CodeStatementCollection statements, string sourceFile, FilePosition filePosition) - { - if (filePosition == null || _allowDebugGeneratedFiles) - return; - - if (sourceFile == null) - statements.Add(new CodeSnippetStatement( - string.Format("#line {0}", filePosition.Line))); - else - statements.Add(new CodeSnippetStatement( - string.Format("#line {0} \"{1}\"", filePosition.Line, Path.GetFileName(sourceFile)))); - - statements.Add(new CodeSnippetStatement( - string.Format("//#indentnext {0}", filePosition.Column - 1))); - } - - #endregion - } -} diff --git a/Generator/TechTalk.SpecFlow.Generator.csproj b/Generator/TechTalk.SpecFlow.Generator.csproj index f6a437a9c..77d3c3544 100644 --- a/Generator/TechTalk.SpecFlow.Generator.csproj +++ b/Generator/TechTalk.SpecFlow.Generator.csproj @@ -59,15 +59,15 @@ VersionInfo.cs + - + - diff --git a/Generator/UnitTestConverter/ISpecFlowUnitTestConverter.cs b/Generator/UnitTestConverter/ISpecFlowUnitTestConverter.cs new file mode 100644 index 000000000..d4beb02c5 --- /dev/null +++ b/Generator/UnitTestConverter/ISpecFlowUnitTestConverter.cs @@ -0,0 +1,11 @@ +using System; +using System.CodeDom; +using TechTalk.SpecFlow.Parser.SyntaxElements; + +namespace TechTalk.SpecFlow.Generator.UnitTestConverter +{ + public interface ISpecFlowUnitTestConverter + { + CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassName, string targetNamespace); + } +} \ No newline at end of file diff --git a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs index b16000d24..e6274a207 100644 --- a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs +++ b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs @@ -1,140 +1,197 @@ -using System; +using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; namespace TechTalk.SpecFlow.Generator.UnitTestProvider { - public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider - { - private const string FEATURE_TITLE_KEY = "FeatureTitle"; - private const string FEATURE_TITLE_PROPERTY_NAME = "FeatureTitle"; - private const string FACT_ATTRIBUTE = "Xunit.FactAttribute"; - private const string FACT_ATTRIBUTE_SKIP_PROPERTY_NAME = "Skip"; - private const string SKIP_REASON = "Ignored"; - private const string TRAIT_ATTRIBUTE = "Xunit.TraitAttribute"; - private const string IUSEFIXTURE = "Xunit.IUseFixture"; // n/a uses IUseFixture, what to do? - private const string TESTSETUP_ATTR = "Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute"; // n/a uses the Constructor, what to do? - private const string IDISPOSABLE_METHOD_NAME = "Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute"; // n/a uses IDisposable.Dispose, what to do? - - private CodeTypeDeclaration _currentTypeDeclaration = null; - - public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description) - { - // xUnit does not use an attribute for the TestFixture - - // Remember the feature title for use later - typeDeclaration.UserData[FEATURE_TITLE_KEY] = title; - - _currentTypeDeclaration = typeDeclaration; - } - - public void SetTestFixtureCategories(CodeTypeDeclaration typeDeclaration, IEnumerable categories) - { - // xUnit does not support caregories - } - - public void SetTestFixtureSetup(CodeMemberMethod memberMethod) - { - // xUnit uses IUseFixture on the class - } - - public void SetTestFixtureTearDown(CodeMemberMethod memberMethod) - { - // xUnit uses IUseFixture on the class - } - - public void SetTest(CodeMemberMethod memberMethod, string title) - { - memberMethod.CustomAttributes.Add - ( - new CodeAttributeDeclaration - ( - new CodeTypeReference(FACT_ATTRIBUTE) - ) - ); - - if (_currentTypeDeclaration != null) - { - string featureTitle = _currentTypeDeclaration.UserData[FEATURE_TITLE_KEY] as string; - if (!string.IsNullOrEmpty(featureTitle)) - { - SetProperty(memberMethod.CustomAttributes, FEATURE_TITLE_PROPERTY_NAME, featureTitle); - } - } - - SetDescription(memberMethod.CustomAttributes, title); - } - - public void SetTestCategories(CodeMemberMethod memberMethod, IEnumerable categories) - { - // xUnit does not support caregories - } - - public void SetTestSetup(CodeMemberMethod memberMethod) - { - // xUnit uses a parameterless Constructor - } - - public void SetTestTearDown(CodeMemberMethod memberMethod) - { - // uses IDisposable.Dispose, what to do? - } - - public void SetIgnore(CodeTypeMember codeTypeMember) - { - foreach (var customAttribute in codeTypeMember.CustomAttributes) - { - CodeAttributeDeclaration codeAttributeDeclaration = customAttribute as CodeAttributeDeclaration; - if (codeAttributeDeclaration != null && codeAttributeDeclaration.Name == FACT_ATTRIBUTE) - { - // set [FactAttribute(Skip="reason")] - codeAttributeDeclaration.Arguments.Add - ( - new CodeAttributeArgument(FACT_ATTRIBUTE_SKIP_PROPERTY_NAME, new CodePrimitiveExpression(SKIP_REASON)) - ); - break; - } - } - } - - private void SetProperty(CodeAttributeDeclarationCollection customAttributes, string name, string value) - { - customAttributes.Add - ( - new CodeAttributeDeclaration - ( - new CodeTypeReference(TRAIT_ATTRIBUTE), - new CodeAttributeArgument - ( - new CodePrimitiveExpression(name) - ), - new CodeAttributeArgument - ( - new CodePrimitiveExpression(value) - ) - ) - ); - } - - private void SetDescription(CodeAttributeDeclarationCollection customAttributes, string description) - { - // xUnit doesn't have a DescriptionAttribute so using a TraitAttribute instead - customAttributes.Add - ( - new CodeAttributeDeclaration - ( - new CodeTypeReference(TRAIT_ATTRIBUTE), - new CodeAttributeArgument - ( - new CodePrimitiveExpression("Description") - ), - new CodeAttributeArgument - ( - new CodePrimitiveExpression(description) - ) - ) - ); - } - } + public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider + { + private const string FEATURE_TITLE_KEY = "FeatureTitle"; + private const string FEATURE_TITLE_PROPERTY_NAME = "FeatureTitle"; + private const string FACT_ATTRIBUTE = "Xunit.FactAttribute"; + private const string FACT_ATTRIBUTE_SKIP_PROPERTY_NAME = "Skip"; + private const string SKIP_REASON = "Ignored"; + private const string TRAIT_ATTRIBUTE = "Xunit.TraitAttribute"; + private const string IUSEFIXTURE_INTERFACE = "Xunit.IUseFixture"; + + private CodeTypeDeclaration _currentTestTypeDeclaration = null; + private CodeTypeDeclaration _currentFixtureTypeDeclaration = null; + + public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description) + { + // xUnit does not use an attribute for the TestFixture, all public classes are potential fixtures + + // Remember the feature title for use later + typeDeclaration.UserData[FEATURE_TITLE_KEY] = title; + + _currentTestTypeDeclaration = typeDeclaration; + } + + public void SetTestFixtureCategories(CodeTypeDeclaration typeDeclaration, IEnumerable categories) + { + // xUnit does not support caregories + } + + public void SetTestFixtureSetup(CodeMemberMethod fixtureSetupMethod) + { + // xUnit uses IUseFixture on the class + + fixtureSetupMethod.Attributes |= MemberAttributes.Static; + + _currentFixtureTypeDeclaration = new CodeTypeDeclaration("FixtureData"); + _currentTestTypeDeclaration.Members.Add(_currentFixtureTypeDeclaration); + + var fixtureDataType = + CodeDomHelper.CreateNestedTypeReference(_currentTestTypeDeclaration, _currentFixtureTypeDeclaration.Name); + + var useFixtureType = new CodeTypeReference(IUSEFIXTURE_INTERFACE, fixtureDataType); + CodeDomHelper.SetTypeReferenceAsInterface(useFixtureType); + + _currentTestTypeDeclaration.BaseTypes.Add(useFixtureType); + + // public void SetFixture(T) { } // explicit interface implementation for generic interfaces does not work with codedom + + CodeMemberMethod setFixtureMethod = new CodeMemberMethod(); + setFixtureMethod.Attributes = MemberAttributes.Public; + setFixtureMethod.Name = "SetFixture"; + setFixtureMethod.Parameters.Add(new CodeParameterDeclarationExpression(fixtureDataType, "fixtureData")); + setFixtureMethod.ImplementationTypes.Add(useFixtureType); + _currentTestTypeDeclaration.Members.Add(setFixtureMethod); + + // public <_currentFixtureTypeDeclaration>() { (); } + CodeConstructor ctorMethod = new CodeConstructor(); + ctorMethod.Attributes = MemberAttributes.Public; + _currentFixtureTypeDeclaration.Members.Add(ctorMethod); + ctorMethod.Statements.Add( + new CodeMethodInvokeExpression( + new CodeTypeReferenceExpression(new CodeTypeReference(_currentTestTypeDeclaration.Name)), + fixtureSetupMethod.Name)); + } + + public void SetTestFixtureTearDown(CodeMemberMethod fixtureTearDownMethod) + { + // xUnit uses IUseFixture on the class + + fixtureTearDownMethod.Attributes |= MemberAttributes.Static; + + _currentFixtureTypeDeclaration.BaseTypes.Add(typeof(IDisposable)); + + // void IDisposable.Dispose() { (); } + + CodeMemberMethod disposeMethod = new CodeMemberMethod(); + disposeMethod.PrivateImplementationType = new CodeTypeReference(typeof(IDisposable)); + disposeMethod.Name = "Dispose"; + _currentFixtureTypeDeclaration.Members.Add(disposeMethod); + + disposeMethod.Statements.Add( + new CodeMethodInvokeExpression( + new CodeTypeReferenceExpression(new CodeTypeReference(_currentTestTypeDeclaration.Name)), + fixtureTearDownMethod.Name)); + } + + public void SetTest(CodeMemberMethod memberMethod, string title) + { + memberMethod.CustomAttributes.Add + ( + new CodeAttributeDeclaration + ( + new CodeTypeReference(FACT_ATTRIBUTE) + ) + ); + + if (_currentTestTypeDeclaration != null) + { + string featureTitle = _currentTestTypeDeclaration.UserData[FEATURE_TITLE_KEY] as string; + if (!string.IsNullOrEmpty(featureTitle)) + { + SetProperty(memberMethod.CustomAttributes, FEATURE_TITLE_PROPERTY_NAME, featureTitle); + } + } + + SetDescription(memberMethod.CustomAttributes, title); + } + + public void SetTestCategories(CodeMemberMethod memberMethod, IEnumerable categories) + { + // xUnit does not support caregories + } + + public void SetTestSetup(CodeMemberMethod memberMethod) + { + // xUnit uses a parameterless constructor + + // public <_currentTestTypeDeclaration>() { (); } + + CodeConstructor ctorMethod = new CodeConstructor(); + ctorMethod.Attributes = MemberAttributes.Public; + _currentTestTypeDeclaration.Members.Add(ctorMethod); + + ctorMethod.Statements.Add( + new CodeMethodInvokeExpression( + new CodeThisReferenceExpression(), + memberMethod.Name)); + } + + public void SetTestTearDown(CodeMemberMethod memberMethod) + { + // xUnit supports test tear down through the IDisposable interface + + _currentTestTypeDeclaration.BaseTypes.Add(typeof(IDisposable)); + + // void IDisposable.Dispose() { (); } + + CodeMemberMethod disposeMethod = new CodeMemberMethod(); + disposeMethod.PrivateImplementationType = new CodeTypeReference(typeof(IDisposable)); + disposeMethod.Name = "Dispose"; + _currentTestTypeDeclaration.Members.Add(disposeMethod); + + disposeMethod.Statements.Add( + new CodeMethodInvokeExpression( + new CodeThisReferenceExpression(), + memberMethod.Name)); + } + + public void SetIgnore(CodeTypeMember codeTypeMember) + { + foreach (var customAttribute in codeTypeMember.CustomAttributes) + { + CodeAttributeDeclaration codeAttributeDeclaration = customAttribute as CodeAttributeDeclaration; + if (codeAttributeDeclaration != null && codeAttributeDeclaration.Name == FACT_ATTRIBUTE) + { + // set [FactAttribute(Skip="reason")] + codeAttributeDeclaration.Arguments.Add + ( + new CodeAttributeArgument(FACT_ATTRIBUTE_SKIP_PROPERTY_NAME, new CodePrimitiveExpression(SKIP_REASON)) + ); + break; + } + } + } + + private void SetProperty(CodeAttributeDeclarationCollection customAttributes, string name, string value) + { + customAttributes.Add + ( + new CodeAttributeDeclaration + ( + new CodeTypeReference(TRAIT_ATTRIBUTE), + new CodeAttributeArgument + ( + new CodePrimitiveExpression(name) + ), + new CodeAttributeArgument + ( + new CodePrimitiveExpression(value) + ) + ) + ); + } + + private void SetDescription(CodeAttributeDeclarationCollection customAttributes, string description) + { + // xUnit doesn't have a DescriptionAttribute so using a TraitAttribute instead + SetProperty(customAttributes, "Description", description); + } + } } \ No newline at end of file diff --git a/Runtime/Configuration/ConfigurationSectionHandler.cs b/Runtime/Configuration/ConfigurationSectionHandler.cs index c921ff41b..df29bd064 100644 --- a/Runtime/Configuration/ConfigurationSectionHandler.cs +++ b/Runtime/Configuration/ConfigurationSectionHandler.cs @@ -40,42 +40,42 @@ public static TInterface CreateInstance(Type type) // infinite loop try { - return (TInterface)Activator.CreateInstance(type); + return (TInterface)Activator.CreateInstance(type); } - catch(InvalidCastException) + catch (InvalidCastException) { throw new ConfigurationErrorsException( - String.Format("The specified type '{0}' does not implement interface '{1}'", + String.Format("The specified type '{0}' does not implement interface '{1}'", type.FullName, typeof(TInterface).FullName)); } - catch(Exception ex) + catch (Exception ex) { throw new ConfigurationErrorsException( - String.Format("Unable to create instance of type '{0}': {1}", + String.Format("Unable to create instance of type '{0}': {1}", type.FullName, ex.Message), ex); } } - public static TInterface CreateInstance(Type type, params object[] arguments) - { - // do not use ErrorProvider for thowing exceptions here, because of the potential - // infinite loop - try - { - return (TInterface)Activator.CreateInstance(type, arguments); - } - catch (InvalidCastException) - { - throw new ConfigurationErrorsException( - String.Format("The specified type '{0}' does not implement interface '{1}'", - type.FullName, typeof(TInterface).FullName)); - } - catch (Exception ex) - { - throw new ConfigurationErrorsException( - String.Format("Unable to create instance of type '{0}': {1}", - type.FullName, ex.Message), ex); - } - } + public static TInterface CreateInstance(Type type, params object[] arguments) + { + // do not use ErrorProvider for thowing exceptions here, because of the potential + // infinite loop + try + { + return (TInterface)Activator.CreateInstance(type, arguments); + } + catch (InvalidCastException) + { + throw new ConfigurationErrorsException( + String.Format("The specified type '{0}' does not implement interface '{1}'", + type.FullName, typeof(TInterface).FullName)); + } + catch (Exception ex) + { + throw new ConfigurationErrorsException( + String.Format("Unable to create instance of type '{0}': {1}", + type.FullName, ex.Message), ex); + } + } } partial class ConfigurationSectionHandler : ConfigurationSection @@ -130,7 +130,7 @@ static internal ConfigurationSectionHandler CreateFromXml(string xmlContent) section.Reset(null); using (var reader = new XmlTextReader(new StringReader(xmlContent))) { - section.DeserializeSection(reader); + section.DeserializeSection(reader); } section.ResetModified(); return section; @@ -143,7 +143,7 @@ static internal ConfigurationSectionHandler CreateFromXml(XmlNode xmlContent) section.Reset(null); using (var reader = new XmlNodeReader(xmlContent)) { - section.DeserializeSection(reader); + section.DeserializeSection(reader); } section.ResetModified(); return section; @@ -154,7 +154,7 @@ public class LanguageConfigElement : ConfigurationElement { [ConfigurationProperty("feature", DefaultValue = "en", IsRequired = false)] [RegexStringValidator(@"\w{2}(-\w{2})?")] - public string Feature + public string Feature { get { return (String)this["feature"]; } set { this["feature"] = value; } @@ -268,7 +268,7 @@ protected override ConfigurationElement CreateNewElement() protected override object GetElementKey(ConfigurationElement element) { - return ((StepAssemblyConfigElement) element).File; + return ((StepAssemblyConfigElement)element).File; } } diff --git a/Runtime/Configuration/RuntimeConfiguration.cs b/Runtime/Configuration/RuntimeConfiguration.cs index 4b3f4218e..650d51dd6 100644 --- a/Runtime/Configuration/RuntimeConfiguration.cs +++ b/Runtime/Configuration/RuntimeConfiguration.cs @@ -13,7 +13,7 @@ namespace TechTalk.SpecFlow.Configuration { public partial class ConfigurationSectionHandler { - + } internal class RuntimeConfiguration @@ -35,7 +35,7 @@ static public RuntimeConfiguration Current public bool DetectAmbiguousMatches { get; set; } public bool StopAtFirstError { get; set; } public MissingOrPendingStepsOutcome MissingOrPendingStepsOutcome { get; set; } - + //tracing settings public Type TraceListenerType { get; set; } public bool TraceSuccessfulSteps { get; set; } @@ -44,15 +44,16 @@ static public RuntimeConfiguration Current public IEnumerable AdditionalStepAssemblies { - get { + get + { return _additionalStepAssemblies; } } public RuntimeConfiguration() { - ToolLanguage = string.IsNullOrEmpty(ConfigDefaults.ToolLanguage) ? - CultureInfo.GetCultureInfo(ConfigDefaults.FeatureLanguage) : + ToolLanguage = string.IsNullOrEmpty(ConfigDefaults.ToolLanguage) ? + CultureInfo.GetCultureInfo(ConfigDefaults.FeatureLanguage) : CultureInfo.GetCultureInfo(ConfigDefaults.ToolLanguage); SetUnitTestDefaultsByName(ConfigDefaults.UnitTestProviderName); @@ -84,7 +85,7 @@ public static RuntimeConfiguration LoadFromConfigFile(ConfigurationSectionHandle if (configSection.Language != null) { config.ToolLanguage = string.IsNullOrEmpty(configSection.Language.Tool) ? - CultureInfo.GetCultureInfo(configSection.Language.Feature) : + CultureInfo.GetCultureInfo(configSection.Language.Feature) : CultureInfo.GetCultureInfo(configSection.Language.Tool); } @@ -115,7 +116,7 @@ public static RuntimeConfiguration LoadFromConfigFile(ConfigurationSectionHandle config.MinTracedDuration = configSection.Trace.MinTracedDuration; } - foreach(var element in configSection.StepAssemblies) + foreach (var element in configSection.StepAssemblies) { string stepAssemblyFileName = ((StepAssemblyConfigElement)element).File; string fullPath = Path.GetFullPath(stepAssemblyFileName); @@ -147,10 +148,10 @@ private void SetUnitTestDefaultsByName(string name) case "nunit": RuntimeUnitTestProviderType = typeof(NUnitRuntimeProvider); break; - case "xunit": - RuntimeUnitTestProviderType = typeof(XUnitRuntimeProvider); - break; - case "mstest": + case "xunit": + RuntimeUnitTestProviderType = typeof(XUnitRuntimeProvider); + break; + case "mstest": RuntimeUnitTestProviderType = typeof(MsTestRuntimeProvider); break; default: diff --git a/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs b/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs index 311f3f9ac..41cd10ad2 100644 --- a/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs +++ b/Runtime/UnitTestProvider/XUnitRuntimeProvider.cs @@ -5,20 +5,14 @@ namespace TechTalk.SpecFlow.UnitTestProvider { public class XUnitRuntimeProvider : IUnitTestRuntimeProvider { - private const string XUNIT_ASSEMBLY = "xunit"; - private const string ASSERT_TYPE = "Xunit.Assert"; - - Action assertInconclusive = null; - Action assertIgnore = null; - public void TestInconclusive(string message) { - throw new NotSupportedException("XUnit does not support Assert.Inconclusive"); + throw new SpecFlowException("Test inconclusive: " + message); } public void TestIgnore(string message) { - throw new NotSupportedException("XUnit does not support Assert.Ignore"); + throw new SpecFlowException("Test ignored: " + message); } public bool DelayedFixtureTearDown diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config b/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config index 56a45d063..36408f390 100644 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config @@ -17,5 +17,7 @@ + + \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj index 2fc6a1fd0..b680cf0c0 100644 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj @@ -46,15 +46,16 @@ False - ..\..\..\..\..\Program Files (x86)\TechTalk\SpecFlow\TechTalk.SpecFlow.dll + ..\..\..\Runtime\bin\Debug\TechTalk.SpecFlow.dll False - ..\..\..\..\Library\xUnit\xunit.dll + ..\..\..\..\..\Program Files (x86)\xUnit.net 1.5\xunit.dll + True @@ -66,6 +67,11 @@ True ScoreCalculationFeature.feature + + True + True + SpecFlowFeature1.feature + @@ -77,6 +83,10 @@ SpecFlowSingleFileGenerator ScoreCalculationFeature.feature.cs + + SpecFlowSingleFileGenerator + SpecFlowFeature1.feature.cs + diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs index 2b378816d..f2d4baf92 100644 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs @@ -10,108 +10,98 @@ // ------------------------------------------------------------------------------ namespace Bowling.Specflow { - using System; - using System.Globalization; - using Xunit; using TechTalk.SpecFlow; - public partial class ScoreCalculationAlternativeFormsFeature : IUseFixture, IDisposable + public partial class ScoreCalculationAlternativeFormsFeature : Xunit.IUseFixture, System.IDisposable { - private ScoreCalculationAlternativeFormsFixture _fixture; - - private bool _isDisposed = false; + private static TechTalk.SpecFlow.ITestRunner testRunner; #line 1 "ScoreCalculationAlternativesFeature.feature" #line hidden - ~ScoreCalculationAlternativeFormsFeature() - { - Dispose(false); - } - partial void OnDisposeManagedResources(); - partial void OnDisposeUnmanagedResources(); - partial void OnInitialize(); - public ScoreCalculationAlternativeFormsFeature() + public static void FeatureSetup() { - this.OnInitialize(); + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + + "otal score", ((string[])(null))); + testRunner.OnFeatureStart(featureInfo); } - public void SetFixture(ScoreCalculationAlternativeFormsFixture fixture) + public virtual void SetFixture(ScoreCalculationAlternativeFormsFeature.FixtureData fixtureData) { - _fixture = fixture; } - public void Dispose() + public static void FeatureTearDown() { - this.Dispose(true); - GC.SuppressFinalize(this); + testRunner.OnFeatureEnd(); + testRunner = null; } - private void Dispose(bool isDisposing) + public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) { - if ((this._isDisposed == false)) - { - if ((isDisposing == true)) - { - this.OnDisposeManagedResources(); - } - this.OnDisposeUnmanagedResources(); - this._isDisposed = true; - } + testRunner.OnScenarioStart(scenarioInfo); + } + + public virtual void ScenarioTearDown() + { + testRunner.OnScenarioEnd(); + } + + void System.IDisposable.Dispose() + { + this.ScenarioTearDown(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] [Xunit.TraitAttribute("Description", "One single spare")] - public void OneSingleSpare() + public virtual void OneSingleSpare() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); #line 7 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 8 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 9 - this._fixture.TestRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); + testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); #line 10 - this._fixture.TestRunner.Then("my total score should be 29"); + testRunner.Then("my total score should be 29"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] [Xunit.TraitAttribute("Description", "All spares")] - public void AllSpares() + public virtual void AllSpares() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); #line 12 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 13 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 14 - this._fixture.TestRunner.When("I roll 10 times 1 and 9"); + testRunner.When("I roll 10 times 1 and 9"); #line 15 - this._fixture.TestRunner.And("I roll 1"); + testRunner.And("I roll 1"); #line 16 - this._fixture.TestRunner.Then("my total score should be 110"); + testRunner.Then("my total score should be 110"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] [Xunit.TraitAttribute("Description", "Yet another beginners game")] - public void YetAnotherBeginnersGame() + public virtual void YetAnotherBeginnersGame() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Yet another beginners game", ((string[])(null))); #line 18 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 19 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line hidden TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] { "Pins"}); @@ -156,67 +146,24 @@ public void YetAnotherBeginnersGame() table1.AddRow(new string[] { "1"}); #line 20 - this._fixture.TestRunner.When("I roll", ((string)(null)), table1); + testRunner.When("I roll", ((string)(null)), table1); #line 42 - this._fixture.TestRunner.Then("my total score should be 43"); + testRunner.Then("my total score should be 43"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); - } - } - - public partial class ScoreCalculationAlternativeFormsFixture : IDisposable - { - - private bool _isDisposed = false; - - private ITestRunner _testRunner; - - ~ScoreCalculationAlternativeFormsFixture() - { - Dispose(false); - } - partial void OnDisposeManagedResources(); - partial void OnDisposeUnmanagedResources(); - - public ScoreCalculationAlternativeFormsFixture() - { - FeatureInfo featureInfo = new FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - this._testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - this._testRunner.OnFeatureStart(featureInfo); + testRunner.CollectScenarioErrors(); } - public ITestRunner TestRunner + public class FixtureData : System.IDisposable { - get + + public FixtureData() { - return this._testRunner; + ScoreCalculationAlternativeFormsFeature.FeatureSetup(); } - } - - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool isDisposing) - { - if ((this._isDisposed == false)) + + void System.IDisposable.Dispose() { - if (((this._testRunner == null) - == false)) - { - this._testRunner.OnFeatureEnd(); - this._testRunner = null; - } - if ((isDisposing == true)) - { - this.OnDisposeManagedResources(); - } - this.OnDisposeUnmanagedResources(); - this._isDisposed = true; + ScoreCalculationAlternativeFormsFeature.FeatureTearDown(); } } } diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs index 867cccbc8..a85aba1e3 100644 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs @@ -10,231 +10,175 @@ // ------------------------------------------------------------------------------ namespace Bowling.Specflow { - using System; - using System.Globalization; - using Xunit; using TechTalk.SpecFlow; - public partial class ScoreCalculationFeature : IUseFixture, IDisposable + public partial class ScoreCalculationFeature : Xunit.IUseFixture, System.IDisposable { - private ScoreCalculationFixture _fixture; - - private bool _isDisposed = false; + private static TechTalk.SpecFlow.ITestRunner testRunner; #line 1 "ScoreCalculationFeature.feature" #line hidden - ~ScoreCalculationFeature() - { - Dispose(false); - } - partial void OnDisposeManagedResources(); - partial void OnDisposeUnmanagedResources(); - partial void OnInitialize(); - public ScoreCalculationFeature() + public static void FeatureSetup() { - this.OnInitialize(); + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + + "otal score", ((string[])(null))); + testRunner.OnFeatureStart(featureInfo); } - public void SetFixture(ScoreCalculationFixture fixture) + public virtual void SetFixture(ScoreCalculationFeature.FixtureData fixtureData) { - _fixture = fixture; } - public void Dispose() + public static void FeatureTearDown() { - this.Dispose(true); - GC.SuppressFinalize(this); + testRunner.OnFeatureEnd(); + testRunner = null; } - private void Dispose(bool isDisposing) + public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) { - if ((this._isDisposed == false)) - { - if ((isDisposing == true)) - { - this.OnDisposeManagedResources(); - } - this.OnDisposeUnmanagedResources(); - this._isDisposed = true; - } + testRunner.OnScenarioStart(scenarioInfo); + } + + public virtual void ScenarioTearDown() + { + testRunner.OnScenarioEnd(); + } + + void System.IDisposable.Dispose() + { + this.ScenarioTearDown(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "Gutter game")] - public void GutterGame() + public virtual void GutterGame() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Gutter game", ((string[])(null))); #line 6 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 7 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 8 - this._fixture.TestRunner.When("all of my balls are landing in the gutter"); + testRunner.When("all of my balls are landing in the gutter"); #line 9 - this._fixture.TestRunner.Then("my total score should be 0"); + testRunner.Then("my total score should be 0"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "Beginners game")] - public void BeginnersGame() + public virtual void BeginnersGame() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Beginners game", ((string[])(null))); #line 11 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 12 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 13 - this._fixture.TestRunner.When("I roll 2 and 7"); + testRunner.When("I roll 2 and 7"); #line 14 - this._fixture.TestRunner.And("I roll 3 and 4"); + testRunner.And("I roll 3 and 4"); #line 15 - this._fixture.TestRunner.And("I roll 8 times 1 and 1"); + testRunner.And("I roll 8 times 1 and 1"); #line 16 - this._fixture.TestRunner.Then("my total score should be 32"); + testRunner.Then("my total score should be 32"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "Another beginners game")] - public void AnotherBeginnersGame() + public virtual void AnotherBeginnersGame() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Another beginners game", ((string[])(null))); #line 18 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 19 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 20 - this._fixture.TestRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); + testRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); #line 21 - this._fixture.TestRunner.Then("my total score should be 40"); + testRunner.Then("my total score should be 40"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "All Strikes")] - public void AllStrikes() + public virtual void AllStrikes() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All Strikes", ((string[])(null))); #line 23 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 24 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 25 - this._fixture.TestRunner.When("all of my rolls are strikes"); + testRunner.When("all of my rolls are strikes"); #line 26 - this._fixture.TestRunner.Then("my total score should be 300"); + testRunner.Then("my total score should be 300"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "One single spare")] - public void OneSingleSpare() + public virtual void OneSingleSpare() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); #line 28 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 29 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 30 - this._fixture.TestRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); + testRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); #line 31 - this._fixture.TestRunner.Then("my total score should be 29"); + testRunner.Then("my total score should be 29"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); + testRunner.CollectScenarioErrors(); } [Xunit.FactAttribute()] [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] [Xunit.TraitAttribute("Description", "All spares")] - public void AllSpares() + public virtual void AllSpares() { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); #line 33 -this._fixture.TestRunner.OnScenarioStart(scenarioInfo); +this.ScenarioSetup(scenarioInfo); #line 34 - this._fixture.TestRunner.Given("a new bowling game"); + testRunner.Given("a new bowling game"); #line 35 - this._fixture.TestRunner.When("I roll 10 times 1 and 9"); + testRunner.When("I roll 10 times 1 and 9"); #line 36 - this._fixture.TestRunner.And("I roll 1"); + testRunner.And("I roll 1"); #line 37 - this._fixture.TestRunner.Then("my total score should be 110"); + testRunner.Then("my total score should be 110"); #line hidden - this._fixture.TestRunner.CollectScenarioErrors(); - this._fixture.TestRunner.OnScenarioEnd(); - } - } - - public partial class ScoreCalculationFixture : IDisposable - { - - private bool _isDisposed = false; - - private ITestRunner _testRunner; - - ~ScoreCalculationFixture() - { - Dispose(false); - } - partial void OnDisposeManagedResources(); - partial void OnDisposeUnmanagedResources(); - - public ScoreCalculationFixture() - { - FeatureInfo featureInfo = new FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - this._testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - this._testRunner.OnFeatureStart(featureInfo); + testRunner.CollectScenarioErrors(); } - public ITestRunner TestRunner + public class FixtureData : System.IDisposable { - get + + public FixtureData() { - return this._testRunner; + ScoreCalculationFeature.FeatureSetup(); } - } - - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool isDisposing) - { - if ((this._isDisposed == false)) + + void System.IDisposable.Dispose() { - if (((this._testRunner == null) - == false)) - { - this._testRunner.OnFeatureEnd(); - this._testRunner = null; - } - if ((isDisposing == true)) - { - this.OnDisposeManagedResources(); - } - this.OnDisposeUnmanagedResources(); - this._isDisposed = true; + ScoreCalculationFeature.FeatureTearDown(); } } } diff --git a/Samples/BowlingKata - XUnit/Bowling.sln b/Samples/BowlingKata - XUnit/Bowling.sln index 2bd90eb9f..15c7cd2e2 100644 --- a/Samples/BowlingKata - XUnit/Bowling.sln +++ b/Samples/BowlingKata - XUnit/Bowling.sln @@ -5,6 +5,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling", "Bowling\Bowling. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling.Specflow", "Bowling.Specflow\Bowling.Specflow.csproj", "{D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.vbproj", "{E2352F77-9222-444B-8B15-470E73D3D990}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -19,6 +21,10 @@ Global {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.Build.0 = Debug|Any CPU {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.Build.0 = Release|Any CPU + {E2352F77-9222-444B-8B15-470E73D3D990}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2352F77-9222-444B-8B15-470E73D3D990}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2352F77-9222-444B-8B15-470E73D3D990}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2352F77-9222-444B-8B15-470E73D3D990}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs index c61ae1a9f..50d20cb14 100644 --- a/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs +++ b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs @@ -157,7 +157,7 @@ private void CompareWithExpectedResult(Feature feature, string expectedResultFil private void GenerateCodeFromFeature(Feature feature, TextWriter writer) { - SpecFlowXUnitTestConverter converter = new SpecFlowXUnitTestConverter(new XUnitTestGeneratorProvider(), true); + SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new XUnitTestGeneratorProvider(), true); var codeNamespace = converter.GenerateUnitTestFixture(feature, "TestClassName", "Target.Namespace"); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); From ad7a566cb6d3437630fa9ed0031002bdcb6a0c17 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 8 Mar 2010 18:04:24 +0100 Subject: [PATCH 08/34] generate proper extension for the behind file in VB.NET --- VsIntegration/SpecFlowSingleFileGenerator.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/VsIntegration/SpecFlowSingleFileGenerator.cs b/VsIntegration/SpecFlowSingleFileGenerator.cs index ce5499e18..09c784d1e 100644 --- a/VsIntegration/SpecFlowSingleFileGenerator.cs +++ b/VsIntegration/SpecFlowSingleFileGenerator.cs @@ -38,7 +38,9 @@ public class SpecFlowSingleFileGenerator : BaseCodeGeneratorWithSite { protected override string GetDefaultExtension() { - return ".feature.cs"; + CodeDomProvider provider = GetCodeProvider(); + + return ".feature." + provider.FileExtension; } protected override string GenerateCode(string inputFileContent) From 96b8dcd7d8dfb330e74c03b8e718b9af4b0503a5 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Tue, 9 Mar 2010 12:49:15 +0100 Subject: [PATCH 09/34] VB.NET support --- Generator/CodeDomHelper.cs | 108 +- Generator/SpecFlowGenerator.cs | 12 +- Generator/SpecFlowUnitTestConverter.cs | 43 +- .../XUnitTestGeneratorProvider.cs | 4 +- Installer/SpecFlowSetup/SpecFlowSetup.vdproj | 1083 +++++++---------- .../Bowling.Specflow/Bowling.Specflow.csproj | 1 + Tests/ParserTests/SuccessfulGenerationTest.cs | 2 +- .../SuccessfulXUnitGenerationTest.cs | 2 +- Tests/RuntimeTests/ExecutionTestBase.cs | 2 +- .../SpecFlowEventDefinition.vstemplate | 13 + .../SpecFlowEventDefinition1.vb | 75 ++ .../SpecFlowEventDefinitionIcon.ico | Bin 0 -> 10134 bytes .../SpecFlowFeature1.feature | 11 + .../SpecFlowFeatureIcon.ico | Bin 0 -> 10134 bytes .../SpecFlowFeature_VB.vstemplate | 13 + .../SpecFlowStepDefinition.vstemplate | 13 + .../SpecFlowStepDefinition1.vb | 43 + .../SpecFlowStepDefinitionIcon.ico | Bin 0 -> 10134 bytes .../TechTalk.SpecFlow.VsIntegration.csproj | 11 + 19 files changed, 755 insertions(+), 681 deletions(-) create mode 100644 VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition.vstemplate create mode 100644 VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition1.vb create mode 100644 VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinitionIcon.ico create mode 100644 VsIntegration/ItemTemplates/SpecFlowFeature_VB/SpecFlowFeature1.feature create mode 100644 VsIntegration/ItemTemplates/SpecFlowFeature_VB/SpecFlowFeatureIcon.ico create mode 100644 VsIntegration/ItemTemplates/SpecFlowFeature_VB/SpecFlowFeature_VB.vstemplate create mode 100644 VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition.vstemplate create mode 100644 VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition1.vb create mode 100644 VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinitionIcon.ico diff --git a/Generator/CodeDomHelper.cs b/Generator/CodeDomHelper.cs index e736f5e26..9fc8a9c72 100644 --- a/Generator/CodeDomHelper.cs +++ b/Generator/CodeDomHelper.cs @@ -1,26 +1,118 @@ using System; using System.CodeDom; -using System.Collections.Generic; -using System.Linq; +using System.CodeDom.Compiler; +using System.Globalization; using System.Reflection; -using System.Text; namespace TechTalk.SpecFlow.Generator { - internal static class CodeDomHelper + public enum GenerationTargetLanguage { - static public CodeTypeReference CreateNestedTypeReference(CodeTypeDeclaration baseTypeDeclaration, string nestedTypeName) + CSharp, + VB, + Other + } + + public interface ICodeDomHelperRequired + { + CodeDomHelper CodeDomHelper { get; set; } + } + + public class CodeDomHelper + { + public GenerationTargetLanguage TargetLanguage { get; private set; } + + public CodeDomHelper(CodeDomProvider codeComProvider) + { + switch (codeComProvider.FileExtension.ToLower(CultureInfo.InvariantCulture)) + { + case "cs": + TargetLanguage = GenerationTargetLanguage.CSharp; + break; + case "vb": + TargetLanguage = GenerationTargetLanguage.VB; + break; + default: + TargetLanguage = GenerationTargetLanguage.Other; + break; + } + } + + public CodeDomHelper(GenerationTargetLanguage targetLanguage) + { + TargetLanguage = targetLanguage; + } + + public CodeTypeReference CreateNestedTypeReference(CodeTypeDeclaration baseTypeDeclaration, string nestedTypeName) { return new CodeTypeReference(baseTypeDeclaration.Name + "." + nestedTypeName); } - static public void SetTypeReferenceAsInterface(CodeTypeReference typeReference) + public void SetTypeReferenceAsInterface(CodeTypeReference typeReference) { // this hack is necessary for VB.NET code generation - var isInterfaceField = typeReference.GetType().GetField("isInterface", BindingFlags.Instance | BindingFlags.NonPublic); - if (isInterfaceField != null) + if (TargetLanguage == GenerationTargetLanguage.VB) + { + var isInterfaceField = typeReference.GetType().GetField("isInterface", + BindingFlags.Instance | BindingFlags.NonPublic); + if (isInterfaceField == null) + throw new InvalidOperationException("CodeDom version does not support VB.NET generation."); + isInterfaceField.SetValue(typeReference, true); + } + } + + public void InjectIfRequired(object target) + { + ICodeDomHelperRequired codeDomHelperRequired = target as ICodeDomHelperRequired; + if (codeDomHelperRequired != null) + codeDomHelperRequired.CodeDomHelper = this; + } + + public void AddCommentStatement(CodeStatementCollection statements, string comment) + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + statements.Add(new CodeSnippetStatement("//" + comment)); + break; + case GenerationTargetLanguage.VB: + statements.Add(new CodeSnippetStatement("'" + comment)); + break; + } + } + + public void BindTypeToSourceFile(CodeTypeDeclaration typeDeclaration, string fileName) + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + typeDeclaration.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", fileName))); + typeDeclaration.Members.Add(new CodeSnippetTypeMember("#line hidden")); + break; + } + } + + public void AddSourceLinePragmaStatement(CodeStatementCollection statements, int lineNo, int colNo) + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + statements.Add(new CodeSnippetStatement(string.Format("#line {0}", lineNo))); + AddCommentStatement(statements, string.Format("#indentnext {0}", colNo - 1)); + break; + } + } + + public void AddDisableSourceLinePragmaStatement(CodeStatementCollection statements) + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + statements.Add(new CodeSnippetStatement("#line hidden")); + break; + } } } } diff --git a/Generator/SpecFlowGenerator.cs b/Generator/SpecFlowGenerator.cs index 525b83b7e..e30dd1bd1 100644 --- a/Generator/SpecFlowGenerator.cs +++ b/Generator/SpecFlowGenerator.cs @@ -78,7 +78,7 @@ public override Encoding Encoding get { return innerWriter.Encoding; } } - static public readonly Regex indentNextRe = new Regex(@"^[\s\/\']*#indentnext (?\d+)\s*$"); + static private readonly Regex indentNextRe = new Regex(@"^[\s\/\']*#indentnext (?\d+)\s*$"); public override void WriteLine(string text) { @@ -115,7 +115,7 @@ public void GenerateTestFile(SpecFlowFeatureFile featureFile, CodeDomProvider co { outputWriter = new HackedWriter(outputWriter); - var codeNamespace = GenerateTestFileCode(featureFile, inputReader); + var codeNamespace = GenerateTestFileCode(featureFile, inputReader, codeProvider); var options = new CodeGeneratorOptions { BracingStyle = "C" @@ -126,15 +126,19 @@ public void GenerateTestFile(SpecFlowFeatureFile featureFile, CodeDomProvider co outputWriter.Flush(); } - public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextReader inputReader) + public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextReader inputReader, CodeDomProvider codeProvider) { string targetNamespace = GetTargetNamespace(featureFile); SpecFlowLangParser parser = new SpecFlowLangParser(project.GeneratorConfiguration.FeatureLanguage); Feature feature = parser.Parse(inputReader, featureFile.GetFullPath(project)); + CodeDomHelper codeDomHelper = new CodeDomHelper(codeProvider); + IUnitTestGeneratorProvider generatorProvider = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.GeneratorUnitTestProviderType); - ISpecFlowUnitTestConverter testConverter = new SpecFlowUnitTestConverter(generatorProvider, project.GeneratorConfiguration.AllowDebugGeneratedFiles); + codeDomHelper.InjectIfRequired(generatorProvider); + + ISpecFlowUnitTestConverter testConverter = new SpecFlowUnitTestConverter(generatorProvider, codeDomHelper, project.GeneratorConfiguration.AllowDebugGeneratedFiles); var codeNamespace = testConverter.GenerateUnitTestFixture(feature, null, targetNamespace); return codeNamespace; diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index f54e6d744..c9891a825 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -32,11 +32,13 @@ public class SpecFlowUnitTestConverter : ISpecFlowUnitTestConverter private const string SPECFLOW_NAMESPACE = "TechTalk.SpecFlow"; private readonly IUnitTestGeneratorProvider testGeneratorProvider; + private readonly CodeDomHelper codeDomHelper; private readonly bool allowDebugGeneratedFiles; - public SpecFlowUnitTestConverter(IUnitTestGeneratorProvider testGeneratorProvider, bool allowDebugGeneratedFiles) + public SpecFlowUnitTestConverter(IUnitTestGeneratorProvider testGeneratorProvider, CodeDomHelper codeDomHelper, bool allowDebugGeneratedFiles) { this.testGeneratorProvider = testGeneratorProvider; + this.codeDomHelper = codeDomHelper; this.allowDebugGeneratedFiles = allowDebugGeneratedFiles; } @@ -125,7 +127,7 @@ private CodeMemberMethod GenerateTestFixtureSetup(CodeTypeDeclaration testType, setupMethod.Statements.Add( new CodeVariableDeclarationStatement(FEATUREINFO_TYPE, "featureInfo", new CodeObjectCreateExpression(FEATUREINFO_TYPE, - new CodeObjectCreateExpression(typeof(CultureInfo), + new CodeObjectCreateExpression(typeof(CultureInfo), new CodePrimitiveExpression(feature.Language)), new CodePrimitiveExpression(feature.Title), new CodePrimitiveExpression(feature.Description), @@ -152,7 +154,7 @@ private CodeExpression GetStringArrayExpression(Tags tags) items.Add(new CodePrimitiveExpression(tag.Name)); } - return new CodeArrayCreateExpression(typeof (string[]), items.ToArray()); + return new CodeArrayCreateExpression(typeof(string[]), items.ToArray()); } private CodeExpression GetStringArrayExpression(IEnumerable items, ParameterSubstitution paramToIdentifier) @@ -163,7 +165,7 @@ private CodeExpression GetStringArrayExpression(IEnumerable items, Param expressions.Add(GetSubstitutedString(item, paramToIdentifier)); } - return new CodeArrayCreateExpression(typeof (string[]), expressions.ToArray()); + return new CodeArrayCreateExpression(typeof(string[]), expressions.ToArray()); } private CodeMemberMethod GenerateTestFixtureTearDown(CodeTypeDeclaration testType) @@ -327,7 +329,7 @@ private void GenerateScenarioOutlineBody(Feature feature, ScenarioOutline scenar foreach (var pair in paramToIdentifier) { - testMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof (string), pair.Value)); + testMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), pair.Value)); } GenerateTestBody(feature, scenarioOutline, testMethod, testSetup, paramToIdentifier); @@ -397,7 +399,7 @@ private CodeMemberMethod GetTestMethodDeclaration(CodeTypeDeclaration testType, { CodeMemberMethod testMethod = new CodeMemberMethod(); testType.Members.Add(testMethod); - + testMethod.Attributes = MemberAttributes.Public; testMethod.Name = string.Format(TEST_FORMAT, scenario.Title.ToIdentifier()); @@ -446,7 +448,7 @@ private CodeExpression GetSubstitutedString(string text, ParameterSubstitution p formatArguments.Add(new CodeVariableReferenceExpression(id)); return new CodeMethodInvokeExpression( - new CodeTypeReferenceExpression(typeof (string)), + new CodeTypeReferenceExpression(typeof(string)), "Format", formatArguments.ToArray()); } @@ -513,11 +515,10 @@ private CodeExpression GetMultilineTextArgExpression(string multiLineTextArgumen private void AddLinePragmaInitial(CodeTypeDeclaration testType, Feature feature) { - if (allowDebugGeneratedFiles) - return; + if (allowDebugGeneratedFiles) + return; - testType.Members.Add(new CodeSnippetTypeMember(string.Format("#line 1 \"{0}\"", Path.GetFileName(feature.SourceFile)))); - testType.Members.Add(new CodeSnippetTypeMember("#line hidden")); + codeDomHelper.BindTypeToSourceFile(testType, Path.GetFileName(feature.SourceFile)); } private void AddLineDirectiveHidden(CodeStatementCollection statements) @@ -525,38 +526,30 @@ private void AddLineDirectiveHidden(CodeStatementCollection statements) if (allowDebugGeneratedFiles) return; - statements.Add(new CodeSnippetStatement("#line hidden")); + codeDomHelper.AddDisableSourceLinePragmaStatement(statements); } private void AddLineDirective(CodeStatementCollection statements, Background background) { - AddLineDirective(statements, null, background.FilePosition); + AddLineDirective(statements, background.FilePosition); } private void AddLineDirective(CodeStatementCollection statements, Scenario scenario) { - AddLineDirective(statements, null, scenario.FilePosition); + AddLineDirective(statements, scenario.FilePosition); } private void AddLineDirective(CodeStatementCollection statements, ScenarioStep step) { - AddLineDirective(statements, null, step.FilePosition); + AddLineDirective(statements, step.FilePosition); } - private void AddLineDirective(CodeStatementCollection statements, string sourceFile, FilePosition filePosition) + private void AddLineDirective(CodeStatementCollection statements, FilePosition filePosition) { if (filePosition == null || allowDebugGeneratedFiles) return; - if (sourceFile == null) - statements.Add(new CodeSnippetStatement( - string.Format("#line {0}", filePosition.Line))); - else - statements.Add(new CodeSnippetStatement( - string.Format("#line {0} \"{1}\"", filePosition.Line, Path.GetFileName(sourceFile)))); - - statements.Add(new CodeSnippetStatement( - string.Format("//#indentnext {0}", filePosition.Column - 1))); + codeDomHelper.AddSourceLinePragmaStatement(statements, filePosition.Line, filePosition.Column); } #endregion diff --git a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs index e6274a207..6959b8cba 100644 --- a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs +++ b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs @@ -5,7 +5,7 @@ namespace TechTalk.SpecFlow.Generator.UnitTestProvider { - public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider + public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider, ICodeDomHelperRequired { private const string FEATURE_TITLE_KEY = "FeatureTitle"; private const string FEATURE_TITLE_PROPERTY_NAME = "FeatureTitle"; @@ -18,6 +18,8 @@ public class XUnitTestGeneratorProvider : IUnitTestGeneratorProvider private CodeTypeDeclaration _currentTestTypeDeclaration = null; private CodeTypeDeclaration _currentFixtureTypeDeclaration = null; + public CodeDomHelper CodeDomHelper { get; set; } + public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description) { // xUnit does not use an attribute for the TestFixture, all public classes are potential fixtures diff --git a/Installer/SpecFlowSetup/SpecFlowSetup.vdproj b/Installer/SpecFlowSetup/SpecFlowSetup.vdproj index 8b4077974..5b912a0fa 100644 --- a/Installer/SpecFlowSetup/SpecFlowSetup.vdproj +++ b/Installer/SpecFlowSetup/SpecFlowSetup.vdproj @@ -15,620 +15,500 @@ { "Entry" { - "MsmKey" = "8:_019055E8025F50104F4EDCD40D23AB47" + "MsmKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_01EB354B0A90719FCE0DB9F521F23AAA" - "OwnerKey" = "8:_6E18F9AB5609CE08526FEBCCD51B43B2" + "MsmKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0EFD25C2961F3370383FEDE414DD7238" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0EFD25C2961F3370383FEDE414DD7238" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_109CA2795B9A7ADE61C883D41F3F86F5" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" + "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" - "OwnerKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" - "OwnerKey" = "8:_8B7827FFE66F143641790B9E6A834514" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" + "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" + "MsmKey" = "8:_07EFB2A647FC1E848005431A1987742D" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "MsmKey" = "8:_07EFB2A647FC1E848005431A1987742D" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" - "OwnerKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" + "MsmKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_277A812A65804F067023A54D435F95E9" - "OwnerKey" = "8:_8B7827FFE66F143641790B9E6A834514" + "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" + "OwnerKey" = "8:_64856A6CB2398B25902A9F573E713774" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_277A812A65804F067023A54D435F95E9" + "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_277A812A65804F067023A54D435F95E9" - "OwnerKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_277A812A65804F067023A54D435F95E9" + "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" + "MsmKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" + "MsmKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" + "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" + "MsmKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" + "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "MsmKey" = "8:_3216833F11954BC68EEB656787B13A78" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_3A5846D3AAC658826DF820C18017467C" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_3A5846D3AAC658826DF820C18017467C" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_3E249700CAD3855C654723A8664E0F0F" - "OwnerKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" + "MsmKey" = "8:_543C0F615AB14853A79FF3333FCAED04" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5200717186B38682CC469E61FA770589" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5200717186B38682CC469E61FA770589" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5200717186B38682CC469E61FA770589" - "OwnerKey" = "8:_868F4FD1F4C0AB914DA21D1E95D4EED7" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5200717186B38682CC469E61FA770589" - "OwnerKey" = "8:_D5DE8FFC7C8DF908C525F0D8C61D6537" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5B1AFC4F8443CD366D441E91E926E3F1" - "OwnerKey" = "8:_868F4FD1F4C0AB914DA21D1E95D4EED7" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_64C0AC2C36F206D7B415B1588A67AB7D" - "OwnerKey" = "8:_277A812A65804F067023A54D435F95E9" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_64C0AC2C36F206D7B415B1588A67AB7D" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_64C0AC2C36F206D7B415B1588A67AB7D" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" - "OwnerKey" = "8:_6E18F9AB5609CE08526FEBCCD51B43B2" + "MsmKey" = "8:_5BE6B6A465646A3722242A77B6B33945" + "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" + "MsmKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" + "OwnerKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_6E18F9AB5609CE08526FEBCCD51B43B2" + "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_6E18F9AB5609CE08526FEBCCD51B43B2" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" + "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" + "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_72BA062375FF32683B46885AB8FB9F3C" + "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_72BA062375FF32683B46885AB8FB9F3C" - "OwnerKey" = "8:_109CA2795B9A7ADE61C883D41F3F86F5" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_72BA062375FF32683B46885AB8FB9F3C" - "OwnerKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "OwnerKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" + "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" + "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" + "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "OwnerKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" + "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" - "OwnerKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" + "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" + "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "MsmKey" = "8:_743F26685BA8BFACB085688D3CFB7678" + "OwnerKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" + "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "MsmKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_868F4FD1F4C0AB914DA21D1E95D4EED7" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "MsmKey" = "8:_8C9C7FF1DB4641FF874CFFD3CFF10E62" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" + "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_277A812A65804F067023A54D435F95E9" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" + "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_8B7827FFE66F143641790B9E6A834514" + "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" + "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" + "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_ED3D10E989AADCAA0A7443322308EE1F" + "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" + "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "OwnerKey" = "8:_ABD5677C265A4D7BC34829F543181C87" + "MsmKey" = "8:_B090EC1C6CEB405EB055B415CD5F43DD" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8B7827FFE66F143641790B9E6A834514" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8B7827FFE66F143641790B9E6A834514" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8B7827FFE66F143641790B9E6A834514" - "OwnerKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8C9C7FF1DB4641FF874CFFD3CFF10E62" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_ABD5677C265A4D7BC34829F543181C87" - "OwnerKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_ABD5677C265A4D7BC34829F543181C87" - "OwnerKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" + "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" + "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_ABD5677C265A4D7BC34829F543181C87" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_CBF13B5BAB959D830ACE400CDE0FAE9A" + "OwnerKey" = "8:_EF6DB08211573D16021F74A994EB6287" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" + "MsmKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" - "OwnerKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_B090EC1C6CEB405EB055B415CD5F43DD" + "MsmKey" = "8:_D406CAF4268247A88286DA2188E91F52" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_BBBD29910145A3B6E935E8D02FEDA996" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_BBBD29910145A3B6E935E8D02FEDA996" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_D4F59786D4D8429DB792FFBA2FCA3806" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_D87E105E86E344BCB54D1F2D1EA180F3" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "MsmKey" = "8:_DB9DD3F2B9CF2208CBA2D313591F2B01" + "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "MsmKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" - "OwnerKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" + "MsmKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D3C51B67E3B5564BEA7AB170962FA29F" + "MsmKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D3C51B67E3B5564BEA7AB170962FA29F" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "MsmKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D406CAF4268247A88286DA2188E91F52" + "MsmKey" = "8:_EE4A03D8C2544A6280806185DC6D9CCD" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D5DE8FFC7C8DF908C525F0D8C61D6537" + "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D5DE8FFC7C8DF908C525F0D8C61D6537" - "OwnerKey" = "8:_868F4FD1F4C0AB914DA21D1E95D4EED7" + "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_D87E105E86E344BCB54D1F2D1EA180F3" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" + "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" - "OwnerKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" + "OwnerKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" + "MsmKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" + "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_E6AD94D42A19F4BF70FED3A0358400E1" + "MsmKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_E6AD94D42A19F4BF70FED3A0358400E1" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_ED3D10E989AADCAA0A7443322308EE1F" - "OwnerKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_ED3D10E989AADCAA0A7443322308EE1F" - "OwnerKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_ED3D10E989AADCAA0A7443322308EE1F" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" + "MsmKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_EE4A03D8C2544A6280806185DC6D9CCD" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" + "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_F3E0D5DBC95C9FCB609F519F665BCC92" - "OwnerKey" = "8:_5200717186B38682CC469E61FA770589" + "MsmKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_F91B5502CE7EB8FB0E124C265BE9EAA3" + "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -646,12 +526,6 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_72BA062375FF32683B46885AB8FB9F3C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" "MsmSig" = "8:_UNDEFINED" } @@ -664,109 +538,109 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_3062EBEC857307CE646864E951AD7CF4" + "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E6AD94D42A19F4BF70FED3A0358400E1" + "OwnerKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_76FE53DB004302324A1E0E189ECFF22B" + "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_84C757C079461F1C50F74EF2AE7B70B7" + "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" + "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_76A50A8C2366870C6FF9029C08057BC1" + "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1AD5B2DAD15CADF7525F6B4F9791283D" + "OwnerKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_D3C51B67E3B5564BEA7AB170962FA29F" + "OwnerKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_2EB9CD8CC0B58F8EF675A33D260D3FCE" + "OwnerKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_BBBD29910145A3B6E935E8D02FEDA996" + "OwnerKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_019055E8025F50104F4EDCD40D23AB47" + "OwnerKey" = "8:_F91B5502CE7EB8FB0E124C265BE9EAA3" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_868F4FD1F4C0AB914DA21D1E95D4EED7" + "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_D5DE8FFC7C8DF908C525F0D8C61D6537" + "OwnerKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5200717186B38682CC469E61FA770589" + "OwnerKey" = "8:_EF6DB08211573D16021F74A994EB6287" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_0EFD25C2961F3370383FEDE414DD7238" + "OwnerKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_6E18F9AB5609CE08526FEBCCD51B43B2" + "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_65BCD078F68F9A3A16106B29194C0B30" + "OwnerKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -778,37 +652,25 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_6E1CCF469FF44C51440438B84FAA9363" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8B7827FFE66F143641790B9E6A834514" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_277A812A65804F067023A54D435F95E9" + "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_64C0AC2C36F206D7B415B1588A67AB7D" + "OwnerKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_109CA2795B9A7ADE61C883D41F3F86F5" + "OwnerKey" = "8:_64856A6CB2398B25902A9F573E713774" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_12B423DBA56C8DC0E3B05977AFDCC8BB" + "OwnerKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -817,24 +679,6 @@ "OwnerKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" "MsmSig" = "8:_UNDEFINED" } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_ED3D10E989AADCAA0A7443322308EE1F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_ABD5677C265A4D7BC34829F543181C87" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_887B7AF445E3CB62E718707DB1A2DB74" - "MsmSig" = "8:_UNDEFINED" - } } "Configurations" { @@ -954,20 +798,20 @@ } "File" { - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_019055E8025F50104F4EDCD40D23AB47" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_02C89A22052196FAB5EB6EC86FF2EED1" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Designer.Interfaces, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.9.0, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_019055E8025F50104F4EDCD40D23AB47" + "_02C89A22052196FAB5EB6EC86FF2EED1" { - "Name" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" + "Name" = "8:Microsoft.VisualStudio.Shell.9.0.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" + "SourcePath" = "8:Microsoft.VisualStudio.Shell.9.0.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -985,40 +829,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_01EB354B0A90719FCE0DB9F521F23AAA" - { - "SourcePath" = "8:dte80.olb" - "TargetName" = "8:dte80.olb" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0EFD25C2961F3370383FEDE414DD7238" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_05ABEF09E18093DA7629C15B36903C7C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.VSHelp, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_0EFD25C2961F3370383FEDE414DD7238" + "_05ABEF09E18093DA7629C15B36903C7C" { - "Name" = "8:Microsoft.VisualStudio.VSHelp.dll" + "Name" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.VSHelp.dll" + "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1036,20 +860,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_109CA2795B9A7ADE61C883D41F3F86F5" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_07EFB2A647FC1E848005431A1987742D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:EnvDTE80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_109CA2795B9A7ADE61C883D41F3F86F5" + "_07EFB2A647FC1E848005431A1987742D" { - "Name" = "8:Microsoft.Build.Utilities.v3.5.dll" + "Name" = "8:EnvDTE80.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.Build.Utilities.v3.5.dll" + "SourcePath" = "8:EnvDTE80.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1067,20 +891,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_12B423DBA56C8DC0E3B05977AFDCC8BB" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1B375A60975719B19E7BC5D4D3D30C59" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Antlr3.Runtime, Version=3.1.2.41038, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7, processorArchitecture=MSIL" "ScatterAssemblies" { - "_12B423DBA56C8DC0E3B05977AFDCC8BB" + "_1B375A60975719B19E7BC5D4D3D30C59" { - "Name" = "8:Microsoft.Build.Engine.dll" + "Name" = "8:Antlr3.Runtime.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.Build.Engine.dll" + "SourcePath" = "8:Antlr3.Runtime.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1094,24 +918,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" + "Exclude" = "11:FALSE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1AD5B2DAD15CADF7525F6B4F9791283D" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1F5F9C1A9E627AC43DD956E3941E83CD" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:VSLangProj2, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_1AD5B2DAD15CADF7525F6B4F9791283D" + "_1F5F9C1A9E627AC43DD956E3941E83CD" { - "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" + "Name" = "8:VSLangProj2.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" + "SourcePath" = "8:VSLangProj2.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1129,20 +953,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_277A812A65804F067023A54D435F95E9" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_256D72AC1D8DF0AF111519661A5FAE8E" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Parser, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:VSLangProj80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_277A812A65804F067023A54D435F95E9" + "_256D72AC1D8DF0AF111519661A5FAE8E" { - "Name" = "8:TechTalk.SpecFlow.Parser.dll" + "Name" = "8:VSLangProj80.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:TechTalk.SpecFlow.Parser.dll" + "SourcePath" = "8:VSLangProj80.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1156,27 +980,16 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:FALSE" + "Exclude" = "11:TRUE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2EB9CD8CC0B58F8EF675A33D260D3FCE" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3216833F11954BC68EEB656787B13A78" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.OLE.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_2EB9CD8CC0B58F8EF675A33D260D3FCE" - { - "Name" = "8:Microsoft.VisualStudio.OLE.Interop.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.OLE.Interop.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowFeature_VB.zip" + "TargetName" = "8:SpecFlowFeature_VB.zip" "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" + "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1187,24 +1000,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3062EBEC857307CE646864E951AD7CF4" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3A5846D3AAC658826DF820C18017467C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating.VSHost, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_3062EBEC857307CE646864E951AD7CF4" + "_3A5846D3AAC658826DF820C18017467C" { - "Name" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" + "Name" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" + "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1222,12 +1035,12 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3E249700CAD3855C654723A8664E0F0F" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_543C0F615AB14853A79FF3333FCAED04" { - "SourcePath" = "8:dte80a.olb" - "TargetName" = "8:dte80a.olb" + "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowEventDefinition_VB.zip" + "TargetName" = "8:SpecFlowEventDefinition_VB.zip" "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" + "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1238,24 +1051,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5200717186B38682CC469E61FA770589" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_56C99935BE668A0DE481B47F7A63DF51" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.OLE.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_5200717186B38682CC469E61FA770589" + "_56C99935BE668A0DE481B47F7A63DF51" { - "Name" = "8:VSLangProj.dll" + "Name" = "8:Microsoft.VisualStudio.OLE.Interop.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:VSLangProj.dll" + "SourcePath" = "8:Microsoft.VisualStudio.OLE.Interop.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1273,10 +1086,10 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5B1AFC4F8443CD366D441E91E926E3F1" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5BE6B6A465646A3722242A77B6B33945" { - "SourcePath" = "8:vslangproj80.olb" - "TargetName" = "8:vslangproj80.olb" + "SourcePath" = "8:dte80.olb" + "TargetName" = "8:dte80.olb" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1293,20 +1106,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_64C0AC2C36F206D7B415B1588A67AB7D" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5F888AA7DA5BEFE6506F216943C3E7A0" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Antlr3.Runtime, Version=3.1.2.41038, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_64C0AC2C36F206D7B415B1588A67AB7D" + "_5F888AA7DA5BEFE6506F216943C3E7A0" { - "Name" = "8:Antlr3.Runtime.dll" + "Name" = "8:Microsoft.VisualStudio.TextTemplating.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Antlr3.Runtime.dll" + "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1320,24 +1133,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:FALSE" + "Exclude" = "11:TRUE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_65BCD078F68F9A3A16106B29194C0B30" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_64856A6CB2398B25902A9F573E713774" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Parser, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" "ScatterAssemblies" { - "_65BCD078F68F9A3A16106B29194C0B30" + "_64856A6CB2398B25902A9F573E713774" { - "Name" = "8:EnvDTE.dll" + "Name" = "8:TechTalk.SpecFlow.Parser.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:EnvDTE.dll" + "SourcePath" = "8:TechTalk.SpecFlow.Parser.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1351,24 +1164,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" + "Exclude" = "11:FALSE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6E18F9AB5609CE08526FEBCCD51B43B2" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6A20E911F3BF498068F67CB81F0FD08D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:EnvDTE80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Generator, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" "ScatterAssemblies" { - "_6E18F9AB5609CE08526FEBCCD51B43B2" + "_6A20E911F3BF498068F67CB81F0FD08D" { - "Name" = "8:EnvDTE80.dll" + "Name" = "8:TechTalk.SpecFlow.Generator.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:EnvDTE80.dll" + "SourcePath" = "8:TechTalk.SpecFlow.Generator.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1382,24 +1195,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" + "Exclude" = "11:FALSE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6E1CCF469FF44C51440438B84FAA9363" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Reporting, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_6E1CCF469FF44C51440438B84FAA9363" + "_6CFD7B9A45EE6B2484BD5BBE0BEC6405" { - "Name" = "8:TechTalk.SpecFlow.Reporting.dll" + "Name" = "8:EnvDTE.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:TechTalk.SpecFlow.Reporting.dll" + "SourcePath" = "8:EnvDTE.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1413,25 +1226,14 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:FALSE" + "Exclude" = "11:TRUE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_72BA062375FF32683B46885AB8FB9F3C" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_743F26685BA8BFACB085688D3CFB7678" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:TRUE" - "AssemblyAsmDisplayName" = "8:Microsoft.Build.Framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_72BA062375FF32683B46885AB8FB9F3C" - { - "Name" = "8:Microsoft.Build.Framework.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.Build.Framework.dll" - "TargetName" = "8:" + "SourcePath" = "8:dte80a.olb" + "TargetName" = "8:dte80a.olb" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1448,20 +1250,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_76A50A8C2366870C6FF9029C08057BC1" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7A444B51B1E8A522A97AB1010E95299B" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Reporting, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" "ScatterAssemblies" { - "_76A50A8C2366870C6FF9029C08057BC1" + "_7A444B51B1E8A522A97AB1010E95299B" { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.dll" + "Name" = "8:TechTalk.SpecFlow.Reporting.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.dll" + "SourcePath" = "8:TechTalk.SpecFlow.Reporting.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1475,27 +1277,16 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" + "Exclude" = "11:FALSE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_76FE53DB004302324A1E0E189ECFF22B" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8C9C7FF1DB4641FF874CFFD3CFF10E62" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.9.0, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_76FE53DB004302324A1E0E189ECFF22B" - { - "Name" = "8:Microsoft.VisualStudio.Shell.9.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.9.0.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowEventDefinition.zip" + "TargetName" = "8:SpecFlowEventDefinition.zip" "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" + "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1506,24 +1297,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_84C757C079461F1C50F74EF2AE7B70B7" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_97B8D5270749019C22E312C81F141CB1" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_84C757C079461F1C50F74EF2AE7B70B7" + "_97B8D5270749019C22E312C81F141CB1" { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" + "Name" = "8:Microsoft.VisualStudio.Shell.Interop.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" + "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1541,20 +1332,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_868F4FD1F4C0AB914DA21D1E95D4EED7" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AD591DC54D4D279D30A20BC80D4F8AE8" { "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.MSXML, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_868F4FD1F4C0AB914DA21D1E95D4EED7" + "_AD591DC54D4D279D30A20BC80D4F8AE8" { - "Name" = "8:VSLangProj80.dll" + "Name" = "8:Microsoft.MSXML.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:VSLangProj80.dll" + "SourcePath" = "8:Microsoft.MSXML.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1572,21 +1363,10 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_887B7AF445E3CB62E718707DB1A2DB74" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B090EC1C6CEB405EB055B415CD5F43DD" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_887B7AF445E3CB62E718707DB1A2DB74" - { - "Name" = "8:System.Core.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Core.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\..\\changelog.txt" + "TargetName" = "8:changelog.txt" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1599,24 +1379,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8B7827FFE66F143641790B9E6A834514" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4170BCBC1823C4A75A031351A3BAE01" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Generator, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_8B7827FFE66F143641790B9E6A834514" + "_C4170BCBC1823C4A75A031351A3BAE01" { - "Name" = "8:TechTalk.SpecFlow.Generator.dll" + "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:TechTalk.SpecFlow.Generator.dll" + "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1630,16 +1410,16 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:FALSE" + "Exclude" = "11:TRUE" "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8C9C7FF1DB4641FF874CFFD3CFF10E62" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CBF13B5BAB959D830ACE400CDE0FAE9A" { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowEventDefinition.zip" - "TargetName" = "8:SpecFlowEventDefinition.zip" + "SourcePath" = "8:vslangproj.olb" + "TargetName" = "8:vslangproj.olb" "Tag" = "8:" - "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" + "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1650,24 +1430,24 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_ABD5677C265A4D7BC34829F543181C87" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CE199EB240A722F1476C0DFB720C5A6C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating.VSHost, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_ABD5677C265A4D7BC34829F543181C87" + "_CE199EB240A722F1476C0DFB720C5A6C" { - "Name" = "8:System.Data.DataSetExtensions.dll" + "Name" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Data.DataSetExtensions.dll" + "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1685,23 +1465,12 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AD591DC54D4D279D30A20BC80D4F8AE8" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D406CAF4268247A88286DA2188E91F52" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:TRUE" - "AssemblyAsmDisplayName" = "8:Microsoft.MSXML, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_AD591DC54D4D279D30A20BC80D4F8AE8" - { - "Name" = "8:Microsoft.MSXML.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.MSXML.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowFeature.zip" + "TargetName" = "8:SpecFlowFeature.zip" "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" + "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1712,16 +1481,16 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B090EC1C6CEB405EB055B415CD5F43DD" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D4F59786D4D8429DB792FFBA2FCA3806" { - "SourcePath" = "8:..\\..\\changelog.txt" - "TargetName" = "8:changelog.txt" + "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowStepDefinition_VB.zip" + "TargetName" = "8:SpecFlowStepDefinition_VB.zip" "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" + "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1736,21 +1505,10 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BBBD29910145A3B6E935E8D02FEDA996" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D87E105E86E344BCB54D1F2D1EA180F3" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Modeling.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_BBBD29910145A3B6E935E8D02FEDA996" - { - "Name" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.targets" + "TargetName" = "8:TechTalk.SpecFlow.targets" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1763,25 +1521,14 @@ "SharedLegacy" = "11:FALSE" "PackageAs" = "3:1" "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CDB5EF528F7640FEF9EE58B3A2D014B2" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DB9DD3F2B9CF2208CBA2D313591F2B01" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_CDB5EF528F7640FEF9EE58B3A2D014B2" - { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" - "TargetName" = "8:" + "SourcePath" = "8:vslangproj80.olb" + "TargetName" = "8:vslangproj80.olb" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1798,20 +1545,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3C51B67E3B5564BEA7AB170962FA29F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DC9E6E45C15279C0E22E26ECE4FF2616" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.ProjectAggregator, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.VSHelp, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_D3C51B67E3B5564BEA7AB170962FA29F" + "_DC9E6E45C15279C0E22E26ECE4FF2616" { - "Name" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" + "Name" = "8:Microsoft.VisualStudio.VSHelp.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" + "SourcePath" = "8:Microsoft.VisualStudio.VSHelp.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1829,40 +1576,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D406CAF4268247A88286DA2188E91F52" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowFeature.zip" - "TargetName" = "8:SpecFlowFeature.zip" - "Tag" = "8:" - "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D5DE8FFC7C8DF908C525F0D8C61D6537" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EAA403069CAC8682EC7DDA8D158BF471" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj2, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.ProjectAggregator, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_D5DE8FFC7C8DF908C525F0D8C61D6537" + "_EAA403069CAC8682EC7DDA8D158BF471" { - "Name" = "8:VSLangProj2.dll" + "Name" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:VSLangProj2.dll" + "SourcePath" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1880,10 +1607,10 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D87E105E86E344BCB54D1F2D1EA180F3" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EE4A03D8C2544A6280806185DC6D9CCD" { - "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.targets" - "TargetName" = "8:TechTalk.SpecFlow.targets" + "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.tasks" + "TargetName" = "8:TechTalk.SpecFlow.tasks" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -1900,20 +1627,20 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DDB8AF16D8DBB0CE47C567DBC0C19EE8" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EF6DB08211573D16021F74A994EB6287" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:VSLangProj, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_DDB8AF16D8DBB0CE47C567DBC0C19EE8" + "_EF6DB08211573D16021F74A994EB6287" { - "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" + "Name" = "8:VSLangProj.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" + "SourcePath" = "8:VSLangProj.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1931,20 +1658,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E6AD94D42A19F4BF70FED3A0358400E1" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F10B61599FE4AEFE63EE4715E63058AC" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_E6AD94D42A19F4BF70FED3A0358400E1" + "_F10B61599FE4AEFE63EE4715E63058AC" { - "Name" = "8:Microsoft.VisualStudio.TextTemplating.dll" + "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.dll" + "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1962,20 +1689,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_ED3D10E989AADCAA0A7443322308EE1F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F52A09B8F81FF0DC98A0149F3A9C25C2" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Modeling.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_ED3D10E989AADCAA0A7443322308EE1F" + "_F52A09B8F81FF0DC98A0149F3A9C25C2" { - "Name" = "8:System.Xml.Linq.dll" + "Name" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Xml.Linq.dll" + "SourcePath" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" @@ -1993,30 +1720,21 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EE4A03D8C2544A6280806185DC6D9CCD" - { - "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.tasks" - "TargetName" = "8:TechTalk.SpecFlow.tasks" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F3E0D5DBC95C9FCB609F519F665BCC92" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F91B5502CE7EB8FB0E124C265BE9EAA3" { - "SourcePath" = "8:vslangproj.olb" - "TargetName" = "8:vslangproj.olb" + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Designer.Interfaces, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + "_F91B5502CE7EB8FB0E124C265BE9EAA3" + { + "Name" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" + "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" "Condition" = "8:" @@ -2115,6 +1833,17 @@ { } } + "{9EF0B969-E518-4E46-987F-47570745A589}:_D5C535519B9141ED88626F5C449BBE0F" + { + "Name" = "8:VisualBasic" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_D0DAA827840845CAAD015C5746A5A015" + "Folders" + { + } + } } } } @@ -2310,12 +2039,12 @@ } } } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_65E72B6AAC754E2AB4FFBB20039101DF" + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F521EB414BAD4A7582E60409FE3A030F" { "Name" = "8:.feature" "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" + "AlwaysCreate" = "11:TRUE" + "DeleteAtUninstall" = "11:TRUE" "Transitive" = "11:FALSE" "Keys" { @@ -2337,6 +2066,80 @@ { } } + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EBB17476826F4485847803E0177254A9" + { + "Name" = "8:{164B10B9-B200-11D0-8C61-00A0C91E29D5}" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4B7D7F51BA6B4FB9867263F82057DA05" + { + "Name" = "8:.feature" + "Condition" = "8:" + "AlwaysCreate" = "11:TRUE" + "DeleteAtUninstall" = "11:TRUE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6D7BA471D831489B8F7D71F64F0DD5F3" + { + "Name" = "8:" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:SpecFlowSingleFileGenerator" + } + } + } + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6A746015D53E4C9B889766B22D74763C" + { + "Name" = "8:SpecFlowSingleFileGenerator" + "Condition" = "8:" + "AlwaysCreate" = "11:TRUE" + "DeleteAtUninstall" = "11:TRUE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0B1BB1771C64445B9A723F5CB6FCA7E8" + { + "Name" = "8:GeneratesDesignTimeSource" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:3" + "Value" = "3:1" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_629CFB2D727D4F6D8E154209235AEE92" + { + "Name" = "8:CLSID" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{3c9cf10a-a9ab-4899-a0fb-4b3be4a36c15}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BE64961D8E4B4EDEAC503630DA63A887" + { + "Name" = "8:" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:VB.NET SpecFlow Generator" + } + } + } + } + "Values" + { + } + } } "Values" { diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj index b680cf0c0..d6f69c703 100644 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj +++ b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj @@ -72,6 +72,7 @@ True SpecFlowFeature1.feature + diff --git a/Tests/ParserTests/SuccessfulGenerationTest.cs b/Tests/ParserTests/SuccessfulGenerationTest.cs index 5355b007b..fe82050e7 100644 --- a/Tests/ParserTests/SuccessfulGenerationTest.cs +++ b/Tests/ParserTests/SuccessfulGenerationTest.cs @@ -157,7 +157,7 @@ private void CompareWithExpectedResult(Feature feature, string expectedResultFil private void GenerateCodeFromFeature(Feature feature, TextWriter writer) { - SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new NUnitTestConverter(), true); + SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new NUnitTestConverter(), new CodeDomHelper(GenerationTargetLanguage.CSharp), true); var codeNamespace = converter.GenerateUnitTestFixture(feature, "TestClassName", "Target.Namespace"); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); diff --git a/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs index 50d20cb14..96199e053 100644 --- a/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs +++ b/Tests/ParserTests/SuccessfulXUnitGenerationTest.cs @@ -157,7 +157,7 @@ private void CompareWithExpectedResult(Feature feature, string expectedResultFil private void GenerateCodeFromFeature(Feature feature, TextWriter writer) { - SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new XUnitTestGeneratorProvider(), true); + SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new XUnitTestGeneratorProvider(), new CodeDomHelper(GenerationTargetLanguage.CSharp), true); var codeNamespace = converter.GenerateUnitTestFixture(feature, "TestClassName", "Target.Namespace"); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); diff --git a/Tests/RuntimeTests/ExecutionTestBase.cs b/Tests/RuntimeTests/ExecutionTestBase.cs index 2b7e0c595..90171332a 100644 --- a/Tests/RuntimeTests/ExecutionTestBase.cs +++ b/Tests/RuntimeTests/ExecutionTestBase.cs @@ -173,7 +173,7 @@ private object CompileAndCreateTest(string fileName, Feature feature) { string className = Path.GetFileNameWithoutExtension(fileName); const string targetNamespace = "Target.Namespace"; - SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new NUnitTestConverter(), true); + SpecFlowUnitTestConverter converter = new SpecFlowUnitTestConverter(new NUnitTestConverter(), new CodeDomHelper(GenerationTargetLanguage.CSharp), true); var codeNamespace = converter.GenerateUnitTestFixture(feature, className, targetNamespace); var compileUnit = new CodeCompileUnit(); compileUnit.Namespaces.Add(codeNamespace); diff --git a/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition.vstemplate b/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition.vstemplate new file mode 100644 index 000000000..02ce3785f --- /dev/null +++ b/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition.vstemplate @@ -0,0 +1,13 @@ + + + EventDefinition.cs + SpecFlowEventDefinition + SpecFlow Event Definition + VisualBasic + 10 + SpecFlowEventDefinitionIcon.ico + + + SpecFlowEventDefinition1.vb + + \ No newline at end of file diff --git a/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition1.vb b/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition1.vb new file mode 100644 index 000000000..966e2e0c0 --- /dev/null +++ b/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinition1.vb @@ -0,0 +1,75 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq +Imports System.Text +Imports TechTalk.SpecFlow + +Namespace $rootnamespace$ + + _ + Public Class $safeitemname$ + + _ + Public Sub BeforeStep() + 'TODO: implement logic that has to run before each scenario step + ' For storing and retrieving scenario-specific data, + ' the instance fields of the class or the + ' ScenarioContext.Current + ' collection can be used. + ' For storing and retrieving feature-specific data, the + ' FeatureContext.Current + ' collection can be used. + ' Use the attribute overload to specify tags. If tags are specified, the event + ' handler will be executed only if any of the tags are specified for the + ' feature or the scenario. + ' _ + End Sub + + _ + Public Sub AfterStep() + 'TODO: implement logic that has to run after each scenario step + End Sub + + _ + Public Sub BeforeScenarioBlock() + 'TODO: implement logic that has to run before each scenario block (given-when-then) + End Sub + + _ + Public Sub AfterScenarioBlock() + 'TODO: implement logic that has to run after each scenario block (given-when-then) + End Sub + + _ + Public Sub BeforeScenario() + 'TODO: implement logic that has to run before executing each scenario + End Sub + + _ + Public Sub AfterScenario() + 'TODO: implement logic that has to run after executing each scenario + End Sub + + _ + Public Shared Sub BeforeFeature() + 'TODO: implement logic that has to run before executing each feature + End Sub + + _ + Public Shared Sub AfterFeature() + 'TODO: implement logic that has to run after executing each feature + End Sub + + _ + Public Shared Sub BeforeTestRun() + 'TODO: implement logic that has to run before the entire test run + End Sub + + _ + Public Shared Sub AfterTestRun() + 'TODO: implement logic that has to run after the entire test run + End Sub + + End Class + +End Namespace diff --git a/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinitionIcon.ico b/VsIntegration/ItemTemplates/SpecFlowEventDefinition_VB/SpecFlowEventDefinitionIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ab089ad0498e887dabfbefd324f1d55568f987c GIT binary patch literal 10134 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 iHCCZqG*PUB@R8J#I8sJtKy + + SpecFlowFeature.feature + SpecFlowFeature + SpecFlow Feature + VisualBasic + 10 + SpecFlowFeatureIcon.ico + + + SpecFlowFeature1.feature + + \ No newline at end of file diff --git a/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition.vstemplate b/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition.vstemplate new file mode 100644 index 000000000..528880dc9 --- /dev/null +++ b/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition.vstemplate @@ -0,0 +1,13 @@ + + + StepDefinition.cs + SpecFlowStepDefinition + SpecFlow Step Definition + VisualBasic + 10 + SpecFlowStepDefinitionIcon.ico + + + SpecFlowStepDefinition1.vb + + \ No newline at end of file diff --git a/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition1.vb b/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition1.vb new file mode 100644 index 000000000..efd22865e --- /dev/null +++ b/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinition1.vb @@ -0,0 +1,43 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq +Imports System.Text +Imports TechTalk.SpecFlow + +Namespace $rootnamespace$ + + _ + Public Class $safeitemname$ + + _ + Public Sub GivenIHaveEnteredSomethingIntoTheCalculator(ByVal number As Integer) + 'TODO: implement arrange (recondition) logic + ' For storing and retrieving scenario-specific data, + ' the instance fields of the class or the + ' ScenarioContext.Current + ' collection can be used. + ' To use the multiline text or the table argument of the scenario, + ' additional string/Table parameters can be defined on the step definition + ' method. + + ScenarioContext.Current.Pending() + End Sub + + <[When]("I press add")> _ + Public Sub WhenIPressAdd() + 'TODO: implement act (action) logic + + ScenarioContext.Current.Pending() + End Sub + + <[Then]("the result should be (.*) on the screen")> _ + Public Sub ThenTheResultShouldBe(ByVal result As Integer) + 'TODO: implement assert (verification) logic + + ScenarioContext.Current.Pending() + End Sub + + + End Class + +End Namespace diff --git a/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinitionIcon.ico b/VsIntegration/ItemTemplates/SpecFlowStepDefinition_VB/SpecFlowStepDefinitionIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ab089ad0498e887dabfbefd324f1d55568f987c GIT binary patch literal 10134 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 iHCCZqG*PUB@R8J#I8sJtKy + + True @@ -108,6 +110,12 @@ + + + + + + @@ -123,6 +131,9 @@ + + + - \ No newline at end of file diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/BowlingSteps.cs b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/BowlingSteps.cs deleted file mode 100644 index 96c4ea4ac..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/BowlingSteps.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using TechTalk.SpecFlow; - -namespace Bowling.Specflow -{ - [Binding] - public class BowlingSteps - { - private Game _game; - - [Given(@"a new bowling game")] - public void GivenANewBowlingGame() - { - _game = new Game(); - } - - [When(@"all of my balls are landing in the gutter")] - public void WhenAllOfMyBallsAreLandingInTheGutter() - { - for (int i = 0; i < 20; i++) - { - _game.Roll(0); - } - } - - [When(@"all of my rolls are strikes")] - public void WhenAllOfMyRollsAreStrikes() - { - for (int i = 0; i < 12; i++) - { - _game.Roll(10); - } - } - - [Then(@"my total score should be (\d+)")] - public void ThenMyTotalScoreShouldBe(int score) - { - Assert.AreEqual(score, _game.Score); - } - - [When(@"I roll (\d+)")] - public void WhenIRoll(int pins) - { - _game.Roll(pins); - } - - [When(@"I roll (\d+) and (\d+)")] - public void WhenIRoll(int pins1, int pins2) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - -// [When(@"(\d+) times I roll (\d+) and (\d+)")] -// public void WhenIRollSeveralTimes(int rollCount, int pins1, int pins2) -// { -// for (int i = 0; i < rollCount; i++) -// { -// _game.Roll(pins1); -// _game.Roll(pins2); -// } -// } - - [When(@"I roll (\d+) times (\d+) and (\d+)")] - public void WhenIRollSeveralTimes2(int rollCount, int pins1, int pins2) - { - for (int i = 0; i < rollCount; i++) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - } - - [When(@"I roll the following series:(.*)")] - public void WhenIRollTheFollowingSeries(string series) - { - foreach (var roll in series.Trim().Split(',')) - { - _game.Roll(int.Parse(roll)); - } - } - - [When(@"I roll")] - public void WhenIRoll(Table rolls) - { - foreach (var row in rolls.Rows) - { - _game.Roll(int.Parse(row["Pins"])); - } - } - } -} diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/Properties/AssemblyInfo.cs b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/Properties/AssemblyInfo.cs deleted file mode 100644 index 581bb000d..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling.SpecFlow")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Bowling.SpecFlow")] -[assembly: AssemblyCopyright("Copyright © 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM componenets. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("01e9aaa1-56e3-4cf9-9800-95ecdbd23963")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature deleted file mode 100644 index 8b65aee95..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature +++ /dev/null @@ -1,38 +0,0 @@ -Feature: Score Calculation - In order to know my performance - As a player - I want the system to calculate my total score - -Scenario: Gutter game - Given a new bowling game - When all of my balls are landing in the gutter - Then my total score should be 0 - -Scenario: Beginners game - Given a new bowling game - When I roll 2 and 7 - And I roll 3 and 4 - And I roll 8 times 1 and 1 - Then my total score should be 32 - -Scenario: Another beginners game - Given a new bowling game - When I roll the following series: 2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1 - Then my total score should be 40 - -Scenario: All Strikes - Given a new bowling game - When all of my rolls are strikes - Then my total score should be 300 - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 - diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature.cs b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature.cs deleted file mode 100644 index 493f1bdc4..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculation.feature.cs +++ /dev/null @@ -1,166 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.1.0.0 -// Runtime Version:2.0.50727.4918 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.SpecFlow -{ - using TechTalk.SpecFlow; - - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] - public partial class ScoreCalculationFeature - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculation.feature" -#line hidden - - [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] - public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] - public static void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Gutter game")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void GutterGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Gutter game", ((string[])(null))); -#line 6 -this.ScenarioSetup(scenarioInfo); -#line 7 - testRunner.Given("a new bowling game"); -#line 8 - testRunner.When("all of my balls are landing in the gutter"); -#line 9 - testRunner.Then("my total score should be 0"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Beginners game")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void BeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Beginners game", ((string[])(null))); -#line 11 -this.ScenarioSetup(scenarioInfo); -#line 12 - testRunner.Given("a new bowling game"); -#line 13 - testRunner.When("I roll 2 and 7"); -#line 14 - testRunner.And("I roll 3 and 4"); -#line 15 - testRunner.And("I roll 8 times 1 and 1"); -#line 16 - testRunner.Then("my total score should be 32"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Another beginners game")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void AnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Another beginners game", ((string[])(null))); -#line 18 -this.ScenarioSetup(scenarioInfo); -#line 19 - testRunner.Given("a new bowling game"); -#line 20 - testRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); -#line 21 - testRunner.Then("my total score should be 40"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("All Strikes")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void AllStrikes() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All Strikes", ((string[])(null))); -#line 23 -this.ScenarioSetup(scenarioInfo); -#line 24 - testRunner.Given("a new bowling game"); -#line 25 - testRunner.When("all of my rolls are strikes"); -#line 26 - testRunner.Then("my total score should be 300"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("One single spare")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 28 -this.ScenarioSetup(scenarioInfo); -#line 29 - testRunner.Given("a new bowling game"); -#line 30 - testRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 31 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("All spares")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 33 -this.ScenarioSetup(scenarioInfo); -#line 34 - testRunner.Given("a new bowling game"); -#line 35 - testRunner.When("I roll 10 times 1 and 9"); -#line 36 - testRunner.And("I roll 1"); -#line 37 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - } -} diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature deleted file mode 100644 index da991dd8e..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature +++ /dev/null @@ -1,43 +0,0 @@ -Feature: Score Calculation (alternative forms) - In order to know my performance - As a player - I want the system to calculate my total score - - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 - -Scenario: Yet another beginners game - Given a new bowling game - When I roll - | Pins | - | 2 | - | 7 | - | 1 | - | 5 | - | 1 | - | 1 | - | 1 | - | 3 | - | 1 | - | 1 | - | 1 | - | 4 | - | 1 | - | 1 | - | 1 | - | 1 | - | 8 | - | 1 | - | 1 | - | 1 | - Then my total score should be 43 - diff --git a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature.cs b/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature.cs deleted file mode 100644 index e221ca55a..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.SpecFlow/ScoreCalculationAlternatives.feature.cs +++ /dev/null @@ -1,151 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.1.0.0 -// Runtime Version:2.0.50727.4918 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.SpecFlow -{ - using TechTalk.SpecFlow; - - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()] - public partial class ScoreCalculationAlternativeFormsFeature - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculationAlternatives.feature" -#line hidden - - [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()] - public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext) - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()] - public static void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()] - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("One single spare")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 7 -this.ScenarioSetup(scenarioInfo); -#line 8 - testRunner.Given("a new bowling game"); -#line 9 - testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 10 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("All spares")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 12 -this.ScenarioSetup(scenarioInfo); -#line 13 - testRunner.Given("a new bowling game"); -#line 14 - testRunner.When("I roll 10 times 1 and 9"); -#line 15 - testRunner.And("I roll 1"); -#line 16 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] - [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Yet another beginners game")] - [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - public virtual void YetAnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Yet another beginners game", ((string[])(null))); -#line 18 -this.ScenarioSetup(scenarioInfo); -#line 19 - testRunner.Given("a new bowling game"); -#line hidden - TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] { - "Pins"}); - table1.AddRow(new string[] { - "2"}); - table1.AddRow(new string[] { - "7"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "5"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "3"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "4"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "8"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); -#line 20 - testRunner.When("I roll", ((string)(null)), table1); -#line 42 - testRunner.Then("my total score should be 43"); -#line hidden - testRunner.CollectScenarioErrors(); - } - } -} diff --git a/Samples/BowlingKata - MsTest/Bowling.sln b/Samples/BowlingKata - MsTest/Bowling.sln deleted file mode 100644 index 28d8d6692..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.sln +++ /dev/null @@ -1,35 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling", "Bowling\Bowling.csproj", "{B065A18E-57BD-4399-AAF7-BD2FA0147FCB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling.SpecFlow", "Bowling.SpecFlow\Bowling.SpecFlow.csproj", "{04D53AE6-D834-434F-8A29-2A4D8787F581}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{85430265-759B-4CA9-B2BA-CBD9CB670274}" - ProjectSection(SolutionItems) = preProject - Bowling.vsmdi = Bowling.vsmdi - LocalTestRun.testrunconfig = LocalTestRun.testrunconfig - EndProjectSection -EndProject -Global - GlobalSection(TestCaseManagementSettings) = postSolution - CategoryFile = Bowling.vsmdi - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.Build.0 = Release|Any CPU - {04D53AE6-D834-434F-8A29-2A4D8787F581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04D53AE6-D834-434F-8A29-2A4D8787F581}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04D53AE6-D834-434F-8A29-2A4D8787F581}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04D53AE6-D834-434F-8A29-2A4D8787F581}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Samples/BowlingKata - MsTest/Bowling.vsmdi b/Samples/BowlingKata - MsTest/Bowling.vsmdi deleted file mode 100644 index 9562b681d..000000000 --- a/Samples/BowlingKata - MsTest/Bowling.vsmdi +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata - MsTest/Bowling/Bowling.csproj b/Samples/BowlingKata - MsTest/Bowling/Bowling.csproj deleted file mode 100644 index 224516dde..000000000 --- a/Samples/BowlingKata - MsTest/Bowling/Bowling.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} - Library - Properties - Bowling - Bowling - v3.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata - MsTest/Bowling/Game.cs b/Samples/BowlingKata - MsTest/Bowling/Game.cs deleted file mode 100644 index b3238058b..000000000 --- a/Samples/BowlingKata - MsTest/Bowling/Game.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace Bowling -{ - public class Game - { - private int[] rolls = new int[21]; - private int currentRoll; - - public void Roll(int pins) - { - rolls[currentRoll++] = pins; - } - - public int Score - { - get - { - int score = 0; - int frameIndex = 0; - for (int frame = 0; frame < 10; frame++) - { - if (isStrike(frameIndex)) - { - score += 10 + strikeBonus(frameIndex); - frameIndex++; - } - else if (isSpare(frameIndex)) - { - score += 10 + spareBonus(frameIndex); - frameIndex += 2; - } - else - { - score += sumOfBallsInFrame(frameIndex); - frameIndex += 2; - } - } - return score; - } - } - - private bool isStrike(int frameIndex) - { - return rolls[frameIndex] == 10; - } - - private int sumOfBallsInFrame(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1]; - } - - private int spareBonus(int frameIndex) - { - return rolls[frameIndex + 2]; - } - - private int strikeBonus(int frameIndex) - { - return rolls[frameIndex + 1] + rolls[frameIndex + 2]; - } - - private bool isSpare(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1] == 10; - } - - } -} diff --git a/Samples/BowlingKata - MsTest/Bowling/Properties/AssemblyInfo.cs b/Samples/BowlingKata - MsTest/Bowling/Properties/AssemblyInfo.cs deleted file mode 100644 index 638bab227..000000000 --- a/Samples/BowlingKata - MsTest/Bowling/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Bowling")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7e637ff2-1f70-4d59-bedf-78202aeae595")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata - MsTest/LocalTestRun.testrunconfig b/Samples/BowlingKata - MsTest/LocalTestRun.testrunconfig deleted file mode 100644 index 1f5f907fe..000000000 --- a/Samples/BowlingKata - MsTest/LocalTestRun.testrunconfig +++ /dev/null @@ -1,5 +0,0 @@ - - - This is a default test run configuration for a local test run. - - \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config b/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config deleted file mode 100644 index 56a45d063..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/App.config +++ /dev/null @@ -1,21 +0,0 @@ - - - -
- - - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj b/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj deleted file mode 100644 index 4970a67ec..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/Bowling.Specflow.csproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC} - Library - Properties - Bowling.Specflow - Bowling.Specflow - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - False - ..\..\..\Runtime\bin\Debug\TechTalk.SpecFlow.dll - - - False - ..\..\..\..\..\Program Files (x86)\xUnit.net 1.5\xunit.dll - - - - - - - True - True - ScoreCalculationAlternativesFeature.feature - - - True - True - ScoreCalculationFeature.feature - - - - - - SpecFlowSingleFileGenerator - ScoreCalculationAlternativesFeature.feature.cs - - - SpecFlowSingleFileGenerator - ScoreCalculationFeature.feature.cs - - - - - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} - Bowling - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs deleted file mode 100644 index fe96da35e..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/BowlingSteps.cs +++ /dev/null @@ -1,93 +0,0 @@ - -using Xunit; -using TechTalk.SpecFlow; - -namespace Bowling.Specflow -{ - [Binding] - public class BowlingSteps - { - private Game _game; - - [Given(@"a new bowling game")] - public void GivenANewBowlingGame() - { - _game = new Game(); - } - - [When(@"all of my balls are landing in the gutter")] - public void WhenAllOfMyBallsAreLandingInTheGutter() - { - for (int i = 0; i < 20; i++) - { - _game.Roll(0); - } - } - - [When(@"all of my rolls are strikes")] - public void WhenAllOfMyRollsAreStrikes() - { - for (int i = 0; i < 12; i++) - { - _game.Roll(10); - } - } - - [Then(@"my total score should be (\d+)")] - public void ThenMyTotalScoreShouldBe(int score) - { - Assert.Equal(score, _game.Score); - } - - [When(@"I roll (\d+)")] - public void WhenIRoll(int pins) - { - _game.Roll(pins); - } - - [When(@"I roll (\d+) and (\d+)")] - public void WhenIRoll(int pins1, int pins2) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - -// [When(@"(\d+) times I roll (\d+) and (\d+)")] -// public void WhenIRollSeveralTimes(int rollCount, int pins1, int pins2) -// { -// for (int i = 0; i < rollCount; i++) -// { -// _game.Roll(pins1); -// _game.Roll(pins2); -// } -// } - - [When(@"I roll (\d+) times (\d+) and (\d+)")] - public void WhenIRollSeveralTimes2(int rollCount, int pins1, int pins2) - { - for (int i = 0; i < rollCount; i++) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - } - - [When(@"I roll the following series:(.*)")] - public void WhenIRollTheFollowingSeries(string series) - { - foreach (var roll in series.Trim().Split(',')) - { - _game.Roll(int.Parse(roll)); - } - } - - [When(@"I roll")] - public void WhenIRoll(Table rolls) - { - foreach (var row in rolls.Rows) - { - _game.Roll(int.Parse(row["Pins"])); - } - } - } -} diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs deleted file mode 100644 index 62c82185d..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling.Specflow")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Bowling.Specflow")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("999efa28-8498-4b70-a80d-979fbd7b840e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature deleted file mode 100644 index 2fb99cc00..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature +++ /dev/null @@ -1,42 +0,0 @@ -Feature: Score Calculation (alternative forms) - In order to know my performance - As a player - I want the system to calculate my total score - - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 - -Scenario: Yet another beginners game - Given a new bowling game - When I roll - | Pins | - | 2 | - | 7 | - | 1 | - | 5 | - | 1 | - | 1 | - | 1 | - | 3 | - | 1 | - | 1 | - | 1 | - | 4 | - | 1 | - | 1 | - | 1 | - | 1 | - | 8 | - | 1 | - | 1 | - | 1 | - Then my total score should be 43 \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs deleted file mode 100644 index f2d4baf92..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationAlternativesFeature.feature.cs +++ /dev/null @@ -1,170 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.2.0.0 -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.Specflow -{ - using TechTalk.SpecFlow; - - - public partial class ScoreCalculationAlternativeFormsFeature : Xunit.IUseFixture, System.IDisposable - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculationAlternativesFeature.feature" -#line hidden - - public static void FeatureSetup() - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - public virtual void SetFixture(ScoreCalculationAlternativeFormsFeature.FixtureData fixtureData) - { - } - - public static void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - void System.IDisposable.Dispose() - { - this.ScenarioTearDown(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - [Xunit.TraitAttribute("Description", "One single spare")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 7 -this.ScenarioSetup(scenarioInfo); -#line 8 - testRunner.Given("a new bowling game"); -#line 9 - testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 10 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - [Xunit.TraitAttribute("Description", "All spares")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 12 -this.ScenarioSetup(scenarioInfo); -#line 13 - testRunner.Given("a new bowling game"); -#line 14 - testRunner.When("I roll 10 times 1 and 9"); -#line 15 - testRunner.And("I roll 1"); -#line 16 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] - [Xunit.TraitAttribute("Description", "Yet another beginners game")] - public virtual void YetAnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Yet another beginners game", ((string[])(null))); -#line 18 -this.ScenarioSetup(scenarioInfo); -#line 19 - testRunner.Given("a new bowling game"); -#line hidden - TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] { - "Pins"}); - table1.AddRow(new string[] { - "2"}); - table1.AddRow(new string[] { - "7"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "5"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "3"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "4"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "8"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); -#line 20 - testRunner.When("I roll", ((string)(null)), table1); -#line 42 - testRunner.Then("my total score should be 43"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - public class FixtureData : System.IDisposable - { - - public FixtureData() - { - ScoreCalculationAlternativeFormsFeature.FeatureSetup(); - } - - void System.IDisposable.Dispose() - { - ScoreCalculationAlternativeFormsFeature.FeatureTearDown(); - } - } - } -} diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature deleted file mode 100644 index ec795307c..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature +++ /dev/null @@ -1,37 +0,0 @@ -Feature: Score Calculation - In order to know my performance - As a player - I want the system to calculate my total score - -Scenario: Gutter game - Given a new bowling game - When all of my balls are landing in the gutter - Then my total score should be 0 - -Scenario: Beginners game - Given a new bowling game - When I roll 2 and 7 - And I roll 3 and 4 - And I roll 8 times 1 and 1 - Then my total score should be 32 - -Scenario: Another beginners game - Given a new bowling game - When I roll the following series: 2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1 - Then my total score should be 40 - -Scenario: All Strikes - Given a new bowling game - When all of my rolls are strikes - Then my total score should be 300 - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs b/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs deleted file mode 100644 index a85aba1e3..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.Specflow/ScoreCalculationFeature.feature.cs +++ /dev/null @@ -1,185 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.2.0.0 -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.Specflow -{ - using TechTalk.SpecFlow; - - - public partial class ScoreCalculationFeature : Xunit.IUseFixture, System.IDisposable - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculationFeature.feature" -#line hidden - - public static void FeatureSetup() - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - public virtual void SetFixture(ScoreCalculationFeature.FixtureData fixtureData) - { - } - - public static void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - void System.IDisposable.Dispose() - { - this.ScenarioTearDown(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "Gutter game")] - public virtual void GutterGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Gutter game", ((string[])(null))); -#line 6 -this.ScenarioSetup(scenarioInfo); -#line 7 - testRunner.Given("a new bowling game"); -#line 8 - testRunner.When("all of my balls are landing in the gutter"); -#line 9 - testRunner.Then("my total score should be 0"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "Beginners game")] - public virtual void BeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Beginners game", ((string[])(null))); -#line 11 -this.ScenarioSetup(scenarioInfo); -#line 12 - testRunner.Given("a new bowling game"); -#line 13 - testRunner.When("I roll 2 and 7"); -#line 14 - testRunner.And("I roll 3 and 4"); -#line 15 - testRunner.And("I roll 8 times 1 and 1"); -#line 16 - testRunner.Then("my total score should be 32"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "Another beginners game")] - public virtual void AnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Another beginners game", ((string[])(null))); -#line 18 -this.ScenarioSetup(scenarioInfo); -#line 19 - testRunner.Given("a new bowling game"); -#line 20 - testRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); -#line 21 - testRunner.Then("my total score should be 40"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "All Strikes")] - public virtual void AllStrikes() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All Strikes", ((string[])(null))); -#line 23 -this.ScenarioSetup(scenarioInfo); -#line 24 - testRunner.Given("a new bowling game"); -#line 25 - testRunner.When("all of my rolls are strikes"); -#line 26 - testRunner.Then("my total score should be 300"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "One single spare")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 28 -this.ScenarioSetup(scenarioInfo); -#line 29 - testRunner.Given("a new bowling game"); -#line 30 - testRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 31 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [Xunit.FactAttribute()] - [Xunit.TraitAttribute("FeatureTitle", "Score Calculation")] - [Xunit.TraitAttribute("Description", "All spares")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 33 -this.ScenarioSetup(scenarioInfo); -#line 34 - testRunner.Given("a new bowling game"); -#line 35 - testRunner.When("I roll 10 times 1 and 9"); -#line 36 - testRunner.And("I roll 1"); -#line 37 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - public class FixtureData : System.IDisposable - { - - public FixtureData() - { - ScoreCalculationFeature.FeatureSetup(); - } - - void System.IDisposable.Dispose() - { - ScoreCalculationFeature.FeatureTearDown(); - } - } - } -} diff --git a/Samples/BowlingKata - XUnit/Bowling.sln b/Samples/BowlingKata - XUnit/Bowling.sln deleted file mode 100644 index 2bd90eb9f..000000000 --- a/Samples/BowlingKata - XUnit/Bowling.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling", "Bowling\Bowling.csproj", "{B065A18E-57BD-4399-AAF7-BD2FA0147FCB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling.Specflow", "Bowling.Specflow\Bowling.Specflow.csproj", "{D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.Build.0 = Release|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj b/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj deleted file mode 100644 index 224516dde..000000000 --- a/Samples/BowlingKata - XUnit/Bowling/Bowling.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} - Library - Properties - Bowling - Bowling - v3.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata - XUnit/Bowling/Game.cs b/Samples/BowlingKata - XUnit/Bowling/Game.cs deleted file mode 100644 index b3238058b..000000000 --- a/Samples/BowlingKata - XUnit/Bowling/Game.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace Bowling -{ - public class Game - { - private int[] rolls = new int[21]; - private int currentRoll; - - public void Roll(int pins) - { - rolls[currentRoll++] = pins; - } - - public int Score - { - get - { - int score = 0; - int frameIndex = 0; - for (int frame = 0; frame < 10; frame++) - { - if (isStrike(frameIndex)) - { - score += 10 + strikeBonus(frameIndex); - frameIndex++; - } - else if (isSpare(frameIndex)) - { - score += 10 + spareBonus(frameIndex); - frameIndex += 2; - } - else - { - score += sumOfBallsInFrame(frameIndex); - frameIndex += 2; - } - } - return score; - } - } - - private bool isStrike(int frameIndex) - { - return rolls[frameIndex] == 10; - } - - private int sumOfBallsInFrame(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1]; - } - - private int spareBonus(int frameIndex) - { - return rolls[frameIndex + 2]; - } - - private int strikeBonus(int frameIndex) - { - return rolls[frameIndex + 1] + rolls[frameIndex + 2]; - } - - private bool isSpare(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1] == 10; - } - - } -} diff --git a/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs b/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs deleted file mode 100644 index 638bab227..000000000 --- a/Samples/BowlingKata - XUnit/Bowling/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Bowling")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7e637ff2-1f70-4d59-bedf-78202aeae595")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata/Bowling.Specflow/App.config b/Samples/BowlingKata/Bowling.Specflow/App.config deleted file mode 100644 index 71ca59bd1..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/App.config +++ /dev/null @@ -1,21 +0,0 @@ - - - -
- - - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata/Bowling.Specflow/Bowling.Specflow.csproj b/Samples/BowlingKata/Bowling.Specflow/Bowling.Specflow.csproj deleted file mode 100644 index e4ed965cf..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/Bowling.Specflow.csproj +++ /dev/null @@ -1,94 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC} - Library - Properties - Bowling.Specflow - Bowling.Specflow - v3.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\..\..\lib\nunit\nunit.framework.dll - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - False - C:\Program Files\TechTalk\SpecFlow\TechTalk.SpecFlow.dll - - - - - - - True - True - ScoreCalculation.feature - - - True - True - ScoreCalculationAlternatives.feature - - - - - - SpecFlowSingleFileGenerator - ScoreCalculation.feature.cs - - - SpecFlowSingleFileGenerator - ScoreCalculationAlternatives.feature.cs - - - - - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} - Bowling - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata/Bowling.Specflow/BowlingSteps.cs b/Samples/BowlingKata/Bowling.Specflow/BowlingSteps.cs deleted file mode 100644 index 87e1e73c8..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/BowlingSteps.cs +++ /dev/null @@ -1,93 +0,0 @@ - -using NUnit.Framework; -using TechTalk.SpecFlow; - -namespace Bowling.Specflow -{ - [Binding] - public class BowlingSteps - { - private Game _game; - - [Given(@"a new bowling game")] - public void GivenANewBowlingGame() - { - _game = new Game(); - } - - [When(@"all of my balls are landing in the gutter")] - public void WhenAllOfMyBallsAreLandingInTheGutter() - { - for (int i = 0; i < 20; i++) - { - _game.Roll(0); - } - } - - [When(@"all of my rolls are strikes")] - public void WhenAllOfMyRollsAreStrikes() - { - for (int i = 0; i < 12; i++) - { - _game.Roll(10); - } - } - - [Then(@"my total score should be (\d+)")] - public void ThenMyTotalScoreShouldBe(int score) - { - Assert.AreEqual(score, _game.Score); - } - - [When(@"I roll (\d+)")] - public void WhenIRoll(int pins) - { - _game.Roll(pins); - } - - [When(@"I roll (\d+) and (\d+)")] - public void WhenIRoll(int pins1, int pins2) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - -// [When(@"(\d+) times I roll (\d+) and (\d+)")] -// public void WhenIRollSeveralTimes(int rollCount, int pins1, int pins2) -// { -// for (int i = 0; i < rollCount; i++) -// { -// _game.Roll(pins1); -// _game.Roll(pins2); -// } -// } - - [When(@"I roll (\d+) times (\d+) and (\d+)")] - public void WhenIRollSeveralTimes2(int rollCount, int pins1, int pins2) - { - for (int i = 0; i < rollCount; i++) - { - _game.Roll(pins1); - _game.Roll(pins2); - } - } - - [When(@"I roll the following series:(.*)")] - public void WhenIRollTheFollowingSeries(string series) - { - foreach (var roll in series.Trim().Split(',')) - { - _game.Roll(int.Parse(roll)); - } - } - - [When(@"I roll")] - public void WhenIRoll(Table rolls) - { - foreach (var row in rolls.Rows) - { - _game.Roll(int.Parse(row["Pins"])); - } - } - } -} diff --git a/Samples/BowlingKata/Bowling.Specflow/Properties/AssemblyInfo.cs b/Samples/BowlingKata/Bowling.Specflow/Properties/AssemblyInfo.cs deleted file mode 100644 index 62c82185d..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling.Specflow")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Bowling.Specflow")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("999efa28-8498-4b70-a80d-979fbd7b840e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature b/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature deleted file mode 100644 index 8b65aee95..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature +++ /dev/null @@ -1,38 +0,0 @@ -Feature: Score Calculation - In order to know my performance - As a player - I want the system to calculate my total score - -Scenario: Gutter game - Given a new bowling game - When all of my balls are landing in the gutter - Then my total score should be 0 - -Scenario: Beginners game - Given a new bowling game - When I roll 2 and 7 - And I roll 3 and 4 - And I roll 8 times 1 and 1 - Then my total score should be 32 - -Scenario: Another beginners game - Given a new bowling game - When I roll the following series: 2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1 - Then my total score should be 40 - -Scenario: All Strikes - Given a new bowling game - When all of my rolls are strikes - Then my total score should be 300 - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 - diff --git a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature.cs b/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature.cs deleted file mode 100644 index 92f467376..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculation.feature.cs +++ /dev/null @@ -1,188 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.1.0.0 -// Runtime Version:2.0.50727.4918 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.Specflow -{ - using TechTalk.SpecFlow; - - - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("Score Calculation")] - public partial class ScoreCalculationFeature - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculation.feature" -#line hidden - - [NUnit.Framework.TestFixtureSetUpAttribute()] - public virtual void FeatureSetup() - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - [NUnit.Framework.TestFixtureTearDownAttribute()] - public virtual void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - [NUnit.Framework.TearDownAttribute()] - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Gutter game")] - public virtual void GutterGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Gutter game", ((string[])(null))); -#line 6 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 7 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 8 -//#indentnext 2 - testRunner.When("all of my balls are landing in the gutter"); -#line 9 -//#indentnext 2 - testRunner.Then("my total score should be 0"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Beginners game")] - public virtual void BeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Beginners game", ((string[])(null))); -#line 11 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 12 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 13 -//#indentnext 2 - testRunner.When("I roll 2 and 7"); -#line 14 -//#indentnext 2 - testRunner.And("I roll 3 and 4"); -#line 15 -//#indentnext 2 - testRunner.And("I roll 8 times 1 and 1"); -#line 16 -//#indentnext 2 - testRunner.Then("my total score should be 32"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Another beginners game")] - public virtual void AnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Another beginners game", ((string[])(null))); -#line 18 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 19 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 20 -//#indentnext 2 - testRunner.When("I roll the following series:\t2,7,3,4,1,1,5,1,1,1,1,1,1,1,1,1,1,1,5,1"); -#line 21 -//#indentnext 2 - testRunner.Then("my total score should be 40"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("All Strikes")] - public virtual void AllStrikes() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All Strikes", ((string[])(null))); -#line 23 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 24 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 25 -//#indentnext 2 - testRunner.When("all of my rolls are strikes"); -#line 26 -//#indentnext 2 - testRunner.Then("my total score should be 300"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("One single spare")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 28 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 29 -//#indentnext 3 - testRunner.Given("a new bowling game"); -#line 30 -//#indentnext 3 - testRunner.When("I roll the following series: 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 31 -//#indentnext 3 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("All spares")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 33 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 34 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 35 -//#indentnext 2 - testRunner.When("I roll 10 times 1 and 9"); -#line 36 -//#indentnext 2 - testRunner.And("I roll 1"); -#line 37 -//#indentnext 2 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - } -} diff --git a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature b/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature deleted file mode 100644 index da991dd8e..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature +++ /dev/null @@ -1,43 +0,0 @@ -Feature: Score Calculation (alternative forms) - In order to know my performance - As a player - I want the system to calculate my total score - - -Scenario: One single spare - Given a new bowling game - When I roll the following series: 3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - Then my total score should be 29 - -Scenario: All spares - Given a new bowling game - When I roll 10 times 1 and 9 - And I roll 1 - Then my total score should be 110 - -Scenario: Yet another beginners game - Given a new bowling game - When I roll - | Pins | - | 2 | - | 7 | - | 1 | - | 5 | - | 1 | - | 1 | - | 1 | - | 3 | - | 1 | - | 1 | - | 1 | - | 4 | - | 1 | - | 1 | - | 1 | - | 1 | - | 8 | - | 1 | - | 1 | - | 1 | - Then my total score should be 43 - diff --git a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature.cs b/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature.cs deleted file mode 100644 index cc45c189c..000000000 --- a/Samples/BowlingKata/Bowling.Specflow/ScoreCalculationAlternatives.feature.cs +++ /dev/null @@ -1,162 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.1.0.0 -// Runtime Version:2.0.50727.4918 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Bowling.Specflow -{ - using TechTalk.SpecFlow; - - - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("Score Calculation (alternative forms)")] - public partial class ScoreCalculationAlternativeFormsFeature - { - - private static TechTalk.SpecFlow.ITestRunner testRunner; - -#line 1 "ScoreCalculationAlternatives.feature" -#line hidden - - [NUnit.Framework.TestFixtureSetUpAttribute()] - public virtual void FeatureSetup() - { - testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); - TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en"), "Score Calculation (alternative forms)", "In order to know my performance\r\nAs a player\r\nI want the system to calculate my t" + - "otal score", ((string[])(null))); - testRunner.OnFeatureStart(featureInfo); - } - - [NUnit.Framework.TestFixtureTearDownAttribute()] - public virtual void FeatureTearDown() - { - testRunner.OnFeatureEnd(); - testRunner = null; - } - - public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioStart(scenarioInfo); - } - - [NUnit.Framework.TearDownAttribute()] - public virtual void ScenarioTearDown() - { - testRunner.OnScenarioEnd(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("One single spare")] - public virtual void OneSingleSpare() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); -#line 7 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 8 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 9 -//#indentnext 2 - testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); -#line 10 -//#indentnext 2 - testRunner.Then("my total score should be 29"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("All spares")] - public virtual void AllSpares() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("All spares", ((string[])(null))); -#line 12 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 13 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line 14 -//#indentnext 2 - testRunner.When("I roll 10 times 1 and 9"); -#line 15 -//#indentnext 2 - testRunner.And("I roll 1"); -#line 16 -//#indentnext 2 - testRunner.Then("my total score should be 110"); -#line hidden - testRunner.CollectScenarioErrors(); - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Yet another beginners game")] - public virtual void YetAnotherBeginnersGame() - { - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Yet another beginners game", ((string[])(null))); -#line 18 -//#indentnext 0 - this.ScenarioSetup(scenarioInfo); -#line 19 -//#indentnext 2 - testRunner.Given("a new bowling game"); -#line hidden - TechTalk.SpecFlow.Table table1 = new TechTalk.SpecFlow.Table(new string[] { - "Pins"}); - table1.AddRow(new string[] { - "2"}); - table1.AddRow(new string[] { - "7"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "5"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "3"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "4"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "8"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); - table1.AddRow(new string[] { - "1"}); -#line 20 -//#indentnext 2 - testRunner.When("I roll", ((string)(null)), table1); -#line 42 -//#indentnext 2 - testRunner.Then("my total score should be 43"); -#line hidden - testRunner.CollectScenarioErrors(); - } - } -} diff --git a/Samples/BowlingKata/Bowling.sln b/Samples/BowlingKata/Bowling.sln deleted file mode 100644 index 2bd90eb9f..000000000 --- a/Samples/BowlingKata/Bowling.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling", "Bowling\Bowling.csproj", "{B065A18E-57BD-4399-AAF7-BD2FA0147FCB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bowling.Specflow", "Bowling.Specflow\Bowling.Specflow.csproj", "{D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB}.Release|Any CPU.Build.0 = Release|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1FC8B4C-8553-4B50-BFC3-1BA12CDABBAC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Samples/BowlingKata/Bowling/Bowling.csproj b/Samples/BowlingKata/Bowling/Bowling.csproj deleted file mode 100644 index 224516dde..000000000 --- a/Samples/BowlingKata/Bowling/Bowling.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {B065A18E-57BD-4399-AAF7-BD2FA0147FCB} - Library - Properties - Bowling - Bowling - v3.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/BowlingKata/Bowling/Game.cs b/Samples/BowlingKata/Bowling/Game.cs deleted file mode 100644 index b3238058b..000000000 --- a/Samples/BowlingKata/Bowling/Game.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace Bowling -{ - public class Game - { - private int[] rolls = new int[21]; - private int currentRoll; - - public void Roll(int pins) - { - rolls[currentRoll++] = pins; - } - - public int Score - { - get - { - int score = 0; - int frameIndex = 0; - for (int frame = 0; frame < 10; frame++) - { - if (isStrike(frameIndex)) - { - score += 10 + strikeBonus(frameIndex); - frameIndex++; - } - else if (isSpare(frameIndex)) - { - score += 10 + spareBonus(frameIndex); - frameIndex += 2; - } - else - { - score += sumOfBallsInFrame(frameIndex); - frameIndex += 2; - } - } - return score; - } - } - - private bool isStrike(int frameIndex) - { - return rolls[frameIndex] == 10; - } - - private int sumOfBallsInFrame(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1]; - } - - private int spareBonus(int frameIndex) - { - return rolls[frameIndex + 2]; - } - - private int strikeBonus(int frameIndex) - { - return rolls[frameIndex + 1] + rolls[frameIndex + 2]; - } - - private bool isSpare(int frameIndex) - { - return rolls[frameIndex] + rolls[frameIndex + 1] == 10; - } - - } -} diff --git a/Samples/BowlingKata/Bowling/Properties/AssemblyInfo.cs b/Samples/BowlingKata/Bowling/Properties/AssemblyInfo.cs deleted file mode 100644 index 638bab227..000000000 --- a/Samples/BowlingKata/Bowling/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bowling")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Bowling")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7e637ff2-1f70-4d59-bedf-78202aeae595")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/Readme.txt b/Samples/Readme.txt new file mode 100644 index 000000000..cc4b56fb1 --- /dev/null +++ b/Samples/Readme.txt @@ -0,0 +1,4 @@ +2010-03-26: +All Examples were moved to a separate project hosted on GitHub: + +http://github.com/techtalk/SpecFlow-Examples \ No newline at end of file From 0239b4303562439914cbe501c278bc3c24ef9a9e Mon Sep 17 00:00:00 2001 From: jbandi Date: Mon, 5 Apr 2010 02:13:22 +0200 Subject: [PATCH 12/34] Implementing StepTransformations --- Generator/SpecFlowUnitTestConverter.cs | 1 + Runtime/Attributes.cs | 16 ++ Runtime/BindingRegistry.cs | 86 +++------ Runtime/EventBinding.cs | 11 +- Runtime/StepArgumentTypeConverter.cs | 34 ++++ Runtime/StepBinding.cs | 15 +- Runtime/StepMethodBinding.cs | 163 ++++++++++++++++++ Runtime/StepTransformation.cs | 26 +++ Runtime/TechTalk.SpecFlow.csproj | 2 + Runtime/TestRunner.cs | 26 ++- Tests/FeatureTests/FeatureTests.csproj | 10 ++ .../StepArgumentTransformation.feature | 8 + .../StepArgumentTransformation.feature.cs | 68 ++++++++ .../StepArgumentTransformationSteps.cs | 57 ++++++ .../SuccessfulXUnitGenerationTest.cs | 4 +- Tests/RuntimeTests/BindingRegistryTest.cs | 31 ++++ Tests/RuntimeTests/RuntimeTests.csproj | 4 +- .../StepArgumentTypeConverterTest.cs | 67 +++++++ Tests/RuntimeTests/StepTransformationTests.cs | 69 ++++++++ 19 files changed, 607 insertions(+), 91 deletions(-) create mode 100644 Runtime/StepMethodBinding.cs create mode 100644 Runtime/StepTransformation.cs create mode 100644 Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature create mode 100644 Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature.cs create mode 100644 Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformationSteps.cs create mode 100644 Tests/RuntimeTests/BindingRegistryTest.cs create mode 100644 Tests/RuntimeTests/StepArgumentTypeConverterTest.cs create mode 100644 Tests/RuntimeTests/StepTransformationTests.cs diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index c9891a825..f6d843f69 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -39,6 +39,7 @@ public SpecFlowUnitTestConverter(IUnitTestGeneratorProvider testGeneratorProvide { this.testGeneratorProvider = testGeneratorProvider; this.codeDomHelper = codeDomHelper; + codeDomHelper.InjectIfRequired(testGeneratorProvider); this.allowDebugGeneratedFiles = allowDebugGeneratedFiles; } diff --git a/Runtime/Attributes.cs b/Runtime/Attributes.cs index 578e4e6f3..09f2587a9 100644 --- a/Runtime/Attributes.cs +++ b/Runtime/Attributes.cs @@ -108,4 +108,20 @@ public class AfterStep : BindingEventAttribute { public AfterStep(params string[] tags) : base(BindingEvent.StepEnd, tags) { } } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + public class StepTransformationAttribute : Attribute + { + public string Regex { get; set; } + + public StepTransformationAttribute(string regex) + { + Regex = regex; + } + + public StepTransformationAttribute() + { + Regex = "(.*)"; + } + } } \ No newline at end of file diff --git a/Runtime/BindingRegistry.cs b/Runtime/BindingRegistry.cs index 2cd039929..fc40ef416 100644 --- a/Runtime/BindingRegistry.cs +++ b/Runtime/BindingRegistry.cs @@ -28,6 +28,7 @@ internal class BindingRegistry : IEnumerable private readonly ErrorProvider errorProvider; private readonly List stepBindings = new List(); + private readonly List stepTransformations = new List(); private readonly Dictionary> eventBindings = new Dictionary>(); public BindingRegistry() @@ -64,6 +65,13 @@ private void BuildBindingsFromType(Type type) { BuildEventBindingFromMethod(method, bindingEventAttr); } + + var stepTransformationAttrs = Attribute.GetCustomAttributes(method, typeof(StepTransformationAttribute)); + if (stepTransformationAttrs != null) + foreach (StepTransformationAttribute stepTransformationAttr in stepTransformationAttrs) + { + BuildStepTransformationFromMethod(method, stepTransformationAttr); + } } } @@ -79,12 +87,16 @@ public List GetEvents(BindingEvent bindingEvent) return list; } + public ICollection StepTransformations + { + get { return stepTransformations; } + } + private void BuildEventBindingFromMethod(MethodInfo method, BindingEventAttribute bindingEventAttr) { CheckEventBindingMethod(bindingEventAttr.Event, method); - Delegate bindingAction = CreateBindingAction(method); - var eventBinding = new EventBinding(bindingAction, bindingEventAttr.Tags, method); + var eventBinding = new EventBinding(bindingEventAttr.Tags, method); GetEvents(bindingEventAttr.Event).Add(eventBinding); } @@ -113,79 +125,21 @@ private void BuildStepBindingFromMethod(MethodInfo method, ScenarioStepAttribute { CheckStepBindingMethod(method); - Regex regex = new Regex("^" + scenarioStepAttr.Regex + "$", RegexOptions.Compiled | RegexOptions.CultureInvariant); - Delegate bindingAction = CreateBindingAction(method); - var parameterTypes = method.GetParameters().Select(pi => pi.ParameterType).ToArray(); - StepBinding stepBinding = new StepBinding(scenarioStepAttr.Type, regex, bindingAction, parameterTypes, method); + StepBinding stepBinding = new StepBinding(scenarioStepAttr.Type, scenarioStepAttr.Regex, method); stepBindings.Add(stepBinding); } - private void CheckStepBindingMethod(MethodInfo method) + private void BuildStepTransformationFromMethod(MethodInfo method, StepTransformationAttribute transformationAttribute) { - //TODO: check parameters, etc. - } - - #region extended action types - static readonly Type[] actionTypes = new Type[] { typeof(Action), typeof(Action<>), typeof(Action<,>), typeof(Action<,,>), typeof(Action<,,,>), - typeof(ExtendedAction<,,,,>), typeof(ExtendedAction<,,,,,>), typeof(ExtendedAction<,,,,,,>), typeof(ExtendedAction<,,,,,,,>), typeof(ExtendedAction<,,,,,,,,>), typeof(ExtendedAction<,,,,,,,,,>) - }; + StepTransformation stepTransformation = new StepTransformation(transformationAttribute.Regex, method); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); - public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); - - private Type GetActionType(Type[] typeArgs) - { - if (typeArgs.Length >= actionTypes.Length) - { - throw errorProvider.GetTooManyBindingParamError(actionTypes.Length - 1); - } - if (typeArgs.Length == 0) - { - return actionTypes[typeArgs.Length]; - } - return actionTypes[typeArgs.Length].MakeGenericType(typeArgs); + stepTransformations.Add(stepTransformation); } - #endregion - private Delegate CreateBindingAction(MethodInfo method) + private void CheckStepBindingMethod(MethodInfo method) { - List parameters = new List(); - foreach (ParameterInfo parameterInfo in method.GetParameters()) - { - parameters.Add(Expression.Parameter(parameterInfo.ParameterType, parameterInfo.Name)); - } - - LambdaExpression lambda; - - if (method.IsStatic) - { - lambda = Expression.Lambda( - GetActionType(parameters.Select(p => p.Type).ToArray()), - Expression.Call(method, parameters.Cast().ToArray()), - parameters.ToArray()); - } - else - { - Type bindingType = method.DeclaringType; - Expression> getInstanceExpression = - () => ScenarioContext.Current.GetBindingInstance(bindingType); - - lambda = Expression.Lambda( - GetActionType(parameters.Select(p => p.Type).ToArray()), - Expression.Call( - Expression.Convert(getInstanceExpression.Body, bindingType), - method, - parameters.Cast().ToArray()), - parameters.ToArray()); - } - - - return lambda.Compile(); + //TODO: check parameters, etc. } public IEnumerator GetEnumerator() diff --git a/Runtime/EventBinding.cs b/Runtime/EventBinding.cs index 2850c1e6c..5814fc43c 100644 --- a/Runtime/EventBinding.cs +++ b/Runtime/EventBinding.cs @@ -1,20 +1,15 @@ -using System; -using System.Linq; using System.Reflection; namespace TechTalk.SpecFlow { - internal class EventBinding + internal class EventBinding : MethodBinding { - public Delegate BindingAction { get; private set; } public string[] Tags { get; private set; } - public MethodInfo MethodInfo { get; private set; } - public EventBinding(Delegate bindingAction, string[] tags, MethodInfo methodInfo) + public EventBinding(string[] tags, MethodInfo methodInfo) + : base(methodInfo) { - BindingAction = bindingAction; Tags = tags; - MethodInfo = methodInfo; } } } \ No newline at end of file diff --git a/Runtime/StepArgumentTypeConverter.cs b/Runtime/StepArgumentTypeConverter.cs index 5c7d1416e..e416953ca 100644 --- a/Runtime/StepArgumentTypeConverter.cs +++ b/Runtime/StepArgumentTypeConverter.cs @@ -1,19 +1,38 @@ using System; +using System.Collections.Generic; using System.Globalization; +using System.Linq; namespace TechTalk.SpecFlow { public interface IStepArgumentTypeConverter { + ICollection StepTransformations { get; } object Convert(string value, Type typeToConvertTo, CultureInfo cultureInfo); + bool CanConvert(string value, Type typeToConvertTo, CultureInfo cultureInfo); } public class StepArgumentTypeConverter : IStepArgumentTypeConverter { + public StepArgumentTypeConverter(ICollection stepTransformations) + { + StepTransformations = stepTransformations ?? new List(); + } + + public ICollection StepTransformations { get; private set; } + public object Convert(string value, Type typeToConvertTo, CultureInfo cultureInfo) { object convertedArg; + var stepTransformation = StepTransformations.Where(t => t.ReturnType == typeToConvertTo && t.Regex.IsMatch(value)).SingleOrDefault(); + if (stepTransformation != null) + { + var arguments = stepTransformation.GetStepTransformationArguments(value); + var convertedValue = stepTransformation.BindingAction.DynamicInvoke(arguments); + return convertedValue; + } + var paramType = typeToConvertTo; if (paramType.IsEnum) { @@ -26,5 +45,20 @@ public object Convert(string value, Type typeToConvertTo, CultureInfo cultureInf return convertedArg; } + + public bool CanConvert(string value, Type typeToConvertTo, CultureInfo cultureInfo) + { + try + { + var val = Convert(value, typeToConvertTo, cultureInfo); + if (val != null) + return true; + } + catch (Exception) + { + return false; + } + return false; + } } } \ No newline at end of file diff --git a/Runtime/StepBinding.cs b/Runtime/StepBinding.cs index afc536959..bb883e253 100644 --- a/Runtime/StepBinding.cs +++ b/Runtime/StepBinding.cs @@ -1,26 +1,19 @@ -using System; -using System.Linq; using System.Reflection; using System.Text.RegularExpressions; namespace TechTalk.SpecFlow { - internal class StepBinding + internal class StepBinding : MethodBinding { public BindingType Type { get; private set; } public Regex Regex { get; private set; } - public Delegate BindingAction { get; private set; } - public Type[] ParameterTypes { get; private set; } - public MethodInfo MethodInfo { get; private set; } - - public StepBinding(BindingType type, Regex regex, Delegate bindingAction, Type[] parameterTypes, MethodInfo methodInfo) + public StepBinding(BindingType type, string regexString, MethodInfo methodInfo) + : base(methodInfo) { Type = type; + Regex regex = new Regex("^" + regexString + "$", RegexOptions.Compiled | RegexOptions.CultureInvariant); Regex = regex; - BindingAction = bindingAction; - ParameterTypes = parameterTypes; - MethodInfo = methodInfo; } } } \ No newline at end of file diff --git a/Runtime/StepMethodBinding.cs b/Runtime/StepMethodBinding.cs new file mode 100644 index 000000000..88b9cfcc9 --- /dev/null +++ b/Runtime/StepMethodBinding.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using TechTalk.SpecFlow.ErrorHandling; + +namespace TechTalk.SpecFlow +{ + public abstract class MethodBinding + { + private readonly ErrorProvider errorProvider; + + public MethodBinding(MethodInfo method) + { + errorProvider = ObjectContainer.ErrorProvider; + + BindingAction = CreateMethodDelegate(method); + MethodInfo = method; + ParameterTypes = method.GetParameters().Select(pi => pi.ParameterType).ToArray(); + ReturnType = method.ReturnType; + } + + public Delegate BindingAction { get; protected set; } + public MethodInfo MethodInfo { get; private set; } + public Type[] ParameterTypes { get; private set; } + public Type ReturnType { get; private set; } + + protected Delegate CreateMethodDelegate(MethodInfo method) + { + if (method.ReturnType == typeof (void)) + return CreateActionDelegate(method); + else + return CreateFuncDelegate(method); + } + + private Delegate CreateActionDelegate(MethodInfo method) + { + List parameters = new List(); + foreach (ParameterInfo parameterInfo in method.GetParameters()) + { + parameters.Add(Expression.Parameter(parameterInfo.ParameterType, parameterInfo.Name)); + } + + LambdaExpression lambda; + + if (method.IsStatic) + { + lambda = Expression.Lambda( + GetActionType(parameters.Select(p => p.Type).ToArray()), + Expression.Call(method, parameters.Cast().ToArray()), + parameters.ToArray()); + } + else + { + Type bindingType = method.DeclaringType; + Expression> getInstanceExpression = + () => ScenarioContext.Current.GetBindingInstance(bindingType); + + lambda = Expression.Lambda( + GetActionType(parameters.Select(p => p.Type).ToArray()), + Expression.Call( + Expression.Convert(getInstanceExpression.Body, bindingType), + method, + parameters.Cast().ToArray()), + parameters.ToArray()); + } + + + return lambda.Compile(); + } + + private Delegate CreateFuncDelegate(MethodInfo method) + { + List parameters = new List(); + foreach (ParameterInfo parameterInfo in method.GetParameters()) + { + parameters.Add(Expression.Parameter(parameterInfo.ParameterType, parameterInfo.Name)); + } + + LambdaExpression lambda; + + if (method.IsStatic) + { + lambda = Expression.Lambda( + GetFuncType(parameters.Select(p => p.Type).ToArray(), method.ReturnType), + Expression.Call(method, parameters.Cast().ToArray()), + parameters.ToArray()); + } + else + { + Type bindingType = method.DeclaringType; + Expression> getInstanceExpression = + () => ScenarioContext.Current.GetBindingInstance(bindingType); + + lambda = Expression.Lambda( + GetFuncType(parameters.Select(p => p.Type).ToArray(), method.ReturnType), + Expression.Call( + Expression.Convert(getInstanceExpression.Body, bindingType), + method, + parameters.Cast().ToArray()), + parameters.ToArray()); + } + + + return lambda.Compile(); + } + + + #region extended action types + static readonly Type[] actionTypes = new Type[] { typeof(Action), typeof(Action<>), typeof(Action<,>), typeof(Action<,,>), typeof(Action<,,,>), + typeof(ExtendedAction<,,,,>), typeof(ExtendedAction<,,,,,>), typeof(ExtendedAction<,,,,,,>), typeof(ExtendedAction<,,,,,,,>), typeof(ExtendedAction<,,,,,,,,>), typeof(ExtendedAction<,,,,,,,,,>) + }; + + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6); + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7); + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8); + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + public delegate void ExtendedAction(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + private Type GetActionType(Type[] typeArgs) + { + if (typeArgs.Length >= actionTypes.Length) + { + throw errorProvider.GetTooManyBindingParamError(actionTypes.Length - 1); + } + if (typeArgs.Length == 0) + { + return actionTypes[typeArgs.Length]; + } + return actionTypes[typeArgs.Length].MakeGenericType(typeArgs); + } + #endregion + + #region extended func types + static readonly Type[] funcTypes = new Type[] { typeof(Func<>), typeof(Func<,>), typeof(Func<,,>), typeof(Func<,,,>), + typeof(Func<,,,,>), typeof(ExtendedFunc<,,,,,>), typeof(ExtendedFunc<,,,,,,>), typeof(ExtendedFunc<,,,,,,,>), typeof(ExtendedFunc<,,,,,,,,>), typeof(ExtendedFunc<,,,,,,,,,>) + }; + + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6); + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7); + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8); + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + public delegate TResult ExtendedFunc(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + private Type GetFuncType(Type[] typeArgs, Type resultType) + { + if (typeArgs.Length >= actionTypes.Length) + { + throw errorProvider.GetTooManyBindingParamError(actionTypes.Length - 1); + } + if (typeArgs.Length == 0) + { + return funcTypes[0].MakeGenericType(resultType); + } + var genericTypeArgs = typeArgs.Concat(new Type[] {resultType}).ToArray(); + return funcTypes[typeArgs.Length].MakeGenericType(genericTypeArgs); + } + #endregion + } +} \ No newline at end of file diff --git a/Runtime/StepTransformation.cs b/Runtime/StepTransformation.cs new file mode 100644 index 000000000..aab61e152 --- /dev/null +++ b/Runtime/StepTransformation.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace TechTalk.SpecFlow +{ + public class StepTransformation : MethodBinding + { + public Regex Regex { get; private set; } + + public StepTransformation(string regexString, MethodInfo methodInfo) + : base(methodInfo) + { + Regex regex = new Regex("^" + regexString + "$", RegexOptions.Compiled | RegexOptions.CultureInvariant); + Regex = regex; + } + + public string[] GetStepTransformationArguments(string stepSnippet) + { + var match = Regex.Match(stepSnippet); + var argumentStrings = match.Groups.Cast().Skip(1).Select(g => g.Value).ToArray(); + return argumentStrings; + } + } +} \ No newline at end of file diff --git a/Runtime/TechTalk.SpecFlow.csproj b/Runtime/TechTalk.SpecFlow.csproj index e83148c41..729576fab 100644 --- a/Runtime/TechTalk.SpecFlow.csproj +++ b/Runtime/TechTalk.SpecFlow.csproj @@ -59,6 +59,8 @@ VersionInfo.cs + + diff --git a/Runtime/TestRunner.cs b/Runtime/TestRunner.cs index 81be0fa02..44b07c3c4 100644 --- a/Runtime/TestRunner.cs +++ b/Runtime/TestRunner.cs @@ -13,13 +13,13 @@ namespace TechTalk.SpecFlow { public class TestRunner : ITestRunner { - private BindingRegistry bindingRegistry = null; private readonly ErrorProvider errorProvider; private readonly TestTracer testTracer; private readonly IUnitTestRuntimeProvider unitTestRuntimeProvider; private readonly StepFormatter stepFormatter; private readonly StepDefinitionSkeletonProvider stepDefinitionSkeletonProvider; - private readonly IStepArgumentTypeConverter stepArgumentTypeConverter = new StepArgumentTypeConverter(); + private readonly BindingRegistry bindingRegistry; + private readonly IStepArgumentTypeConverter stepArgumentTypeConverter; public TestRunner() { @@ -28,12 +28,13 @@ public TestRunner() unitTestRuntimeProvider = ObjectContainer.UnitTestRuntimeProvider; stepFormatter = ObjectContainer.StepFormatter; stepDefinitionSkeletonProvider = ObjectContainer.StepDefinitionSkeletonProvider; - stepArgumentTypeConverter = ObjectContainer.StepArgumentTypeConverter; + + bindingRegistry = new BindingRegistry(); + stepArgumentTypeConverter = new StepArgumentTypeConverter(bindingRegistry.StepTransformations); } public virtual void InitializeTestRunner(Assembly[] bindingAssemblies) { - bindingRegistry = new BindingRegistry(); foreach (Assembly assembly in bindingAssemblies) { bindingRegistry.BuildBindingsFromAssembly(assembly); @@ -216,9 +217,26 @@ private bool IsTagNeeded(IEnumerable filterTags, IEnumerable cur private BindingMatch Match(StepBinding stepBinding, StepArgs stepArgs) { Match match = stepBinding.Regex.Match(stepArgs.Text); + + // Check if regexp is a match if (!match.Success) return null; + var regexArgs = match.Groups.Cast().Skip(1).Select(g => g.Value).ToArray(); + + // Check if argument-count of method matches capture-groups of regexp + if (regexArgs.Length != stepBinding.ParameterTypes.Length) + return null; + + // Check if argument types of method can be provided + for (int i = 0; i < regexArgs.Length; i++) + { + if (stepBinding.ParameterTypes[i] != typeof(string)) + if (!stepArgumentTypeConverter.CanConvert(regexArgs[i], stepBinding.ParameterTypes[i], + FeatureContext.Current.FeatureInfo.CultureInfo)) + return null; + } + object[] extraArgs = null; if (stepArgs.MultilineTextArgument != null || stepArgs.TableArgument != null) { diff --git a/Tests/FeatureTests/FeatureTests.csproj b/Tests/FeatureTests/FeatureTests.csproj index 5fa3e6187..34da6c5bf 100644 --- a/Tests/FeatureTests/FeatureTests.csproj +++ b/Tests/FeatureTests/FeatureTests.csproj @@ -69,6 +69,12 @@ ExternalSteps.feature + + StepArgumentTransformation.feature + True + True + + @@ -91,6 +97,10 @@ SpecFlowSingleFileGenerator ExternalSteps.feature.cs + + SpecFlowSingleFileGenerator + StepArgumentTransformation.feature.cs + - \ No newline at end of file diff --git a/Installer/DevenvSetupCustomAction/Properties/AssemblyInfo.cs b/Installer/DevenvSetupCustomAction/Properties/AssemblyInfo.cs deleted file mode 100644 index 52d645075..000000000 --- a/Installer/DevenvSetupCustomAction/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("DevenvSetupCustomAction")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DevenvSetupCustomAction")] -[assembly: AssemblyCopyright("Copyright © 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("46be5ea5-e3f1-400f-b6c0-eaf5b7b4d9c4")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Installer/Resources/EULA.rtf b/Installer/Resources/EULA.rtf new file mode 100644 index 000000000..7ab4e4cea --- /dev/null +++ b/Installer/Resources/EULA.rtf @@ -0,0 +1,216 @@ +{\rtf1\adeflang1025\ansi\ansicpg1250\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1038\deflangfe1038\themelang1038\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fbidi \fmodern\fcharset238\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f37\fbidi \fswiss\fcharset238\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset238\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset238\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset0\fprq1 Courier New;}{\f60\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f62\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f63\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f64\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f65\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f66\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f67\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f411\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} +{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31530\fbidi \froman\fcharset0\fprq2 Cambria;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22\lang1038\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 +\ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{ +\s15\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 +\sbasedon0 \snext15 \sqformat \spriority34 \styrsid670357 List Paragraph;}}{\*\listtable{\list\listtemplateid-1897397696\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 +\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid220287820}{\list\listtemplateid1253327872\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1748092732\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af31506\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026369 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\lin4320 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid1222596848}{\list\listtemplateid-430031380\listhybrid{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0 +{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext +\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid1550722509}} +{\*\listoverridetable{\listoverride\listid220287820\listoverridecount0\ls1}{\listoverride\listid1222596848\listoverridecount0\ls2}{\listoverride\listid1550722509\listoverridecount0\ls3}}{\*\rsidtbl \rsid670357\rsid10623324}{\mmathPr\mmathFont34\mbrkBin0 +\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Gaspar Nagy}{\operator Gaspar Nagy}{\creatim\yr2010\mo4\dy30\hr14\min22}{\revtim\yr2010\mo4\dy30\hr14\min24}{\version1}{\edmins2}{\nofpages1} +{\nofwords206}{\nofchars1423}{\nofcharsws1626}{\vern49243}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1417\gutter0\ltrsect +\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0 +\showxmlerrors1\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1417\dgvorigin1417\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot670357\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 Copyright (c) 2009, TechTalk +\par Disclaimer: +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 +\ltrch\fcs0 \insrsid670357 The initial codebase of Specflow was written by TechTalk employees. No 3rd party code was included. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}No code of customer projects was used to create this project. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}TechTalk had the full rights to publish the initial codebase. +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 +\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 Redistribution and use in source and binary forms, with or without}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 +modification, are permitted provided that the following conditions are met: +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 +\ltrch\fcs0 \insrsid670357 Redistributions of source code must retain the above copyright}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 notice, this list of conditions and the following disclaimer. + +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Redistributions in binary form must reproduce the above copyright}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{ +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 notice, this list of conditions and the following disclaimer in the}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 documentatio +n and/or other materials provided with the distribution. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Neither the name of the SpecFlow project nor thenames of its contributors may be used to endorse or promote products}{ +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 derived from this software without specific prior written permission. +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE}{ +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 DISCLAIMED. IN NO EVENT SHALL TECHTALK OR CONTRIBUTORS BE LIABLE FOR ANY}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 +\ltrch\fcs0 \insrsid670357 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND}{ +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 +\ltrch\fcs0 \insrsid670357 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid10623324 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b0304140006000800000021003bb85ec01007000069230000160000007468656d652f7468656d652f +7468656d65312e786d6cec5a4f6fdb3614bf0fd87720746f6d27761a07758ad8b19bad4d1bc46e871e6999965853a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb04752b2c5585e9236d89ca23e2416f5f8fefc1edfe34f94af5e7b1031744084a43c6e7895cb650f91d8e7031a070def4eaf +7369dd4352e17880198f49c39b10e95ddbfcf083ab784385242208e6c7720337bc50a964a354923e0c6379992724867b432e22ace05204a581c087a03762a595 +7279ad14611a7b28c611a8bd3d1c529fa09e56e96d66cadb0c2e6325f580cf4457ab26ce0c233b1855b4849cc81613e800b386077606fcb0471e280f312c15dc +687865f3f14a9b574b78239dc4d482b9b9791df349e7a51306a315635304fda9d14aa75abfb2eda59044fe693089b0188d934b3e8f12ac689f32aa26061e0f45 +fec64741cc05ee334028538b2bd539bd11f505977ca82e839e123758666883b24ad9629d056e3c676a3e8076bbdd6a57324bcb1a40ea39f67d581b367bf92c54 +3beb95e6d26721e7bdfd3a9f8d56b956ae5e90408cf73690d5b9baa8379bcd5a7dd99755ce7bfbb53a17c87a79adbab572310231dedb406a7381549b5badd6da +c508c4786f03599b0ba473a5be56bd208118ef4346e3d15c187a63ea74963d1f53df879ced14c6b10e71ac0385b0a46059379099fbc003a6bc422765c863b588 +6544f83e171d10d0820c36eb18a9494286d887ddb985a3bea0587304bc4170ee8e1df2e5dc90b685a42f68a21adec709062e34d3f7fac58faf5f3c43470f9f1f +3dfce5e8d1a3a3873f5b45ceac1d1c07f959afbeffe2ef279fa2bf9e7df7eaf157c5f2322ffffb4f9ffdf6eb97c582409c66eebcfcfae91fcf9fbefce6f33f7f +785c20be051c252fdea31191e8163944fb3c82c00c2aaee7a42fce36a317629a9fb1150712c7585b29d0df56a1237d6b82599a1dc78f267111bc2b803816095e +1fdf771cee8662ac6881e51b61e408ee72ce9a40e28a50b8a16de560ee8de3a0d8b818e7e5f6313e28b2ddc2b193dff63801c69c2d4b27f056481c37f7188e15 +0e484c14d2f7f8889082e8ee51eae0ba9b314f748fa226a68590f468df594db3493b3482bc4c8a62867c3bd8ecde454dce8aa2de2607ae2454056605cef70873 +60bc8ec70a47452a7b386279c06f62151639d99d083f2fd7960a321d10c6517b40a42c9a735b40bcb9a4dfc0d04a0bd3becb26912b29141d15e9bc8939cf4b6e +f3512bc4f04851804297c6615ef6233982258ad11e5745e2bbdcad107d0d79c0f1c274dfa5c449f7c9dde00e0d1c97660b44df198b8228ae13eeacdfee840d31 +3145064ddde9d5118587a8cec2c6cd28746e6be1fc1a37b4ca97df3e29f07b595bf616ec5e4535b373ac512f923bde9e5b5c0ce8f277e76d3c8ef70814c4fc16 +f5be39bf6fcede3bdf9c17d5f3f9b7e459178606adb98825da8676470b59f79032d65513466e4a43bc25ec3d830e0cea79e6ac914ccfdf9210beea4a06038e5c +20b0998304579f501576439c0069af785a492053d581440997704c68860b756b7920feca1e32d6f4639bed1c12ab5d3eb0c3ab7ad88c6b3fcc9925f865bc0acc +51666668552b38adb1d52ba952d0f926c62adaa9535bab18d74c5374ac4d432e0c0d06a76802a941408500e53538edd5a6e161073332d0b8db1c6569315938cf +14c9100f489a231df77c8e2a2649d95af9971ce927da1350cb59ab6bb56f61ed3449ca9bab2e309765ef6db294ade0599640dbf1726471be38598c0e1b5ebdb6 +52f3908f93863784e764f81a259075a979246601bc66f095b0cbfec46236553ecb663d0bcc2d820a9c945adce70276fa4022a4dac632b44bc3dc4a97008bb525 +ebff4a0d603daf000abad1e9bc585d87c5f0bf790138baa925c321f1553ed9b9118d9dbd4c5b291f2b22bae1e010f5d958ec6348bf5eaa10cf804a38ee301d41 +5fc05b198db6b9e536e7b4e8f227fb460e742cebe9928601b324c4e93ea07b47d6626c1c6613988263ae72b801e885a01ad4cf8eb1e945ef3ac6f9c27f8ff1f9 +bc273cbe8ecf8ab1663d7090b43ad08a7c78bf2b30d24dafe171a1420e1b4a1252bf2380039a6d000a1f5ed2c26da86d78cb6cfe0b72a0ffdbf66975686d0cce +03d43e0d90a0402d542808d9831dc63492139455521a6255668a2c599cb92b13eb769f1c10d6d3dbd99aa6691e0aa16b998d21ede846ee78c5bad76933ec079a +afe65ba7b3294d19a2ed1aff3589b57d198272b754c34d33fca72e1690583bdf4ccf68543e107d63c698abd9520263b95dbd9e36ca3774e18cacc96e3e7311af +d432e7208bf311c3e094dbc2abfa10e93f4065a8f099fdc982e6463dbe0fdb24825f206865b06c60555fb21c12e9bdce0ef68103db41bb98b42a0b6dca82356a +19ef3ae78796a9dd63606bcf4e93ef33823de5d9ae39a716cf13ec1461076b3bb6106ac8ecf11285a161f64c6a12637eeb92ff390aefdf87446fc3eb9f3153d2 +2c26f8b189c0f0a4d7357500c56f2d9aa99bff000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468 +656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451 +eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e319872 +0e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2 +c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000000000000000 +0000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000 +300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019020000746865 +6d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021003bb85ec010070000692300001600000000000000000000 +000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000000000 +000000000000001a0a00007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000150b00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000b0fa +c71d60e8ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/Installer/Resources/header.bmp b/Installer/Resources/header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94fb385dcc47f481ed080455b501798d8a2b7a50 GIT binary patch literal 85894 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 literal 0 HcmV?d00001 diff --git a/Installer/Resources/welcome_dialog.bmp b/Installer/Resources/welcome_dialog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7f40983494d6d1589c7ae2432c984f3414d0726e GIT binary patch literal 461814 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 qUK8_@HbDRa(Fx#jJRUt;C + + + + + + + + + + + diff --git a/Installer/SpecFlowInstaller/CoreFiles.wxs b/Installer/SpecFlowInstaller/CoreFiles.wxs new file mode 100644 index 000000000..2a857d4de --- /dev/null +++ b/Installer/SpecFlowInstaller/CoreFiles.wxs @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Installer/SpecFlowInstaller/Product.Generated.wxs b/Installer/SpecFlowInstaller/Product.Generated.wxs new file mode 100644 index 000000000..8c6815581 --- /dev/null +++ b/Installer/SpecFlowInstaller/Product.Generated.wxs @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Installer/SpecFlowInstaller/Product.wxs b/Installer/SpecFlowInstaller/Product.wxs new file mode 100644 index 000000000..0272983c1 --- /dev/null +++ b/Installer/SpecFlowInstaller/Product.wxs @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Privileged + NOT NEWERVERSIONDETECTED + + + + + + + + + + + + + + + + + + + + + NOT VS90DEVENV + + + + NOT VS2010DEVENV + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Installer/SpecFlowInstaller/SpecFlowInstaller.wixproj b/Installer/SpecFlowInstaller/SpecFlowInstaller.wixproj new file mode 100644 index 000000000..25456bb47 --- /dev/null +++ b/Installer/SpecFlowInstaller/SpecFlowInstaller.wixproj @@ -0,0 +1,98 @@ + + + Debug + x86 + 3.5 + {89167eb9-f458-48da-9d8f-f639a74f5871} + 2.0 + SpecFlowSetup + Package + $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.5\Wix.targets + $(MSBuildExtensionsPath)\Microsoft\WiX\v3.5\Wix.targets + + + bin\$(Configuration)\ + obj\$(Configuration)\ + Debug + + + bin\$(Configuration)\ + obj\$(Configuration)\ + + + + + + + Product.wxs + True + + + + + + TechTalk.SpecFlow.Generator + {453d8014-b6cd-4e86-80a8-d59f59092334} + True + Binaries + INSTALLLOCATION + + + TechTalk.SpecFlow.Parser + {7ccef6d6-fc17-422e-9bed-edd752b6496f} + True + Binaries + INSTALLLOCATION + + + TechTalk.SpecFlow.Reporting + {fc43509f-e7d3-40c4-b4c3-1e6c9d5530a4} + True + Binaries + INSTALLLOCATION + + + TechTalk.SpecFlow + {413ee28c-4f89-4c6f-ba1e-2cdee4cd43b4} + True + Binaries + INSTALLLOCATION + + + TechTalk.SpecFlow.Tools + {87be7fe6-c3de-4409-abf6-fa5b60af3de1} + True + Binaries + INSTALLLOCATION + + + TechTalk.SpecFlow.VsIntegration + {5703ca95-a08a-46ae-ae24-db6b21fd6f7e} + True + Binaries + INSTALLLOCATION + + + + + $(WixExtDir)\WixUIExtension.dll + WixUIExtension + + + $(WixExtDir)\WixVSExtension.dll + WixVSExtension + + + + + + + + \ No newline at end of file diff --git a/Installer/SpecFlowInstaller/VS2008.wxs b/Installer/SpecFlowInstaller/VS2008.wxs new file mode 100644 index 000000000..9a1169045 --- /dev/null +++ b/Installer/SpecFlowInstaller/VS2008.wxs @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Installer/SpecFlowInstaller/VS2010.wxs b/Installer/SpecFlowInstaller/VS2010.wxs new file mode 100644 index 000000000..c53385cda --- /dev/null +++ b/Installer/SpecFlowInstaller/VS2010.wxs @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Installer/SpecFlowSetup/SpecFlowSetup.vdproj b/Installer/SpecFlowSetup/SpecFlowSetup.vdproj deleted file mode 100644 index 5b912a0fa..000000000 --- a/Installer/SpecFlowSetup/SpecFlowSetup.vdproj +++ /dev/null @@ -1,2823 +0,0 @@ -"DeployProject" -{ -"VSVersion" = "3:800" -"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" -"IsWebType" = "8:FALSE" -"ProjectName" = "8:SpecFlowSetup" -"LanguageId" = "3:1033" -"CodePage" = "3:1252" -"UILanguageId" = "3:1033" -"SccProjectName" = "8:" -"SccLocalPath" = "8:" -"SccAuxPath" = "8:" -"SccProvider" = "8:" - "Hierarchy" - { - "Entry" - { - "MsmKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_07EFB2A647FC1E848005431A1987742D" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_07EFB2A647FC1E848005431A1987742D" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" - "OwnerKey" = "8:_64856A6CB2398B25902A9F573E713774" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" - "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_3216833F11954BC68EEB656787B13A78" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_543C0F615AB14853A79FF3333FCAED04" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5BE6B6A465646A3722242A77B6B33945" - "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" - "OwnerKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" - "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_64856A6CB2398B25902A9F573E713774" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" - "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_743F26685BA8BFACB085688D3CFB7678" - "OwnerKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_8C9C7FF1DB4641FF874CFFD3CFF10E62" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" - "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_B090EC1C6CEB405EB055B415CD5F43DD" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CBF13B5BAB959D830ACE400CDE0FAE9A" - "OwnerKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D406CAF4268247A88286DA2188E91F52" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D4F59786D4D8429DB792FFBA2FCA3806" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D87E105E86E344BCB54D1F2D1EA180F3" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_DB9DD3F2B9CF2208CBA2D313591F2B01" - "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EE4A03D8C2544A6280806185DC6D9CCD" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "OwnerKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F91B5502CE7EB8FB0E124C265BE9EAA3" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FCA7A8942BCF47809C58574D51DA4A7B" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_AD591DC54D4D279D30A20BC80D4F8AE8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_F40F425B3B5D4365A81330EA775FCC1B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8B2D5366F6C941138FF83318D8C65C46" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_CE199EB240A722F1476C0DFB720C5A6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5F888AA7DA5BEFE6506F216943C3E7A0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_02C89A22052196FAB5EB6EC86FF2EED1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_3A5846D3AAC658826DF820C18017467C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_05ABEF09E18093DA7629C15B36903C7C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_F10B61599FE4AEFE63EE4715E63058AC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_97B8D5270749019C22E312C81F141CB1" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C4170BCBC1823C4A75A031351A3BAE01" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_EAA403069CAC8682EC7DDA8D158BF471" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_56C99935BE668A0DE481B47F7A63DF51" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_F52A09B8F81FF0DC98A0149F3A9C25C2" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_F91B5502CE7EB8FB0E124C265BE9EAA3" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_256D72AC1D8DF0AF111519661A5FAE8E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1F5F9C1A9E627AC43DD956E3941E83CD" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_EF6DB08211573D16021F74A994EB6287" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_DC9E6E45C15279C0E22E26ECE4FF2616" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_07EFB2A647FC1E848005431A1987742D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_75A70548B8444C668B2D0462EC9CC366" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_7A444B51B1E8A522A97AB1010E95299B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_6A20E911F3BF498068F67CB81F0FD08D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_64856A6CB2398B25902A9F573E713774" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1B375A60975719B19E7BC5D4D3D30C59" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_0C0AEB379A994D6380D2AF032EA60E7A" - "MsmSig" = "8:_UNDEFINED" - } - } - "Configurations" - { - "Debug" - { - "DisplayName" = "8:Debug" - "IsDebugOnly" = "11:TRUE" - "IsReleaseOnly" = "11:FALSE" - "OutputFilename" = "8:Debug\\SpecFlowSetup.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1" - { - "Name" = "8:.NET Framework 3.5 SP1" - "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1" - } - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" - { - "Name" = "8:Windows Installer 3.1" - "ProductCode" = "8:Microsoft.Windows.Installer.3.1" - } - } - } - } - "Release" - { - "DisplayName" = "8:Release" - "IsDebugOnly" = "11:FALSE" - "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\SpecFlowSetup.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1" - { - "Name" = "8:.NET Framework 3.5 SP1" - "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1" - } - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" - { - "Name" = "8:Windows Installer 3.1" - "ProductCode" = "8:Microsoft.Windows.Installer.3.1" - } - } - } - } - } - "Deployable" - { - "CustomAction" - { - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_8BE80C3D803648FFA919FA055AE54D1D" - { - "Name" = "8:Primary output from DevenvSetupCustomAction (Active)" - "Condition" = "8:" - "Object" = "8:_F40F425B3B5D4365A81330EA775FCC1B" - "FileType" = "3:1" - "InstallAction" = "3:1" - "Arguments" = "8:" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_E247026D_04A7_4DCD_91D1_9E7CFC32EDE4" - "InstallerClass" = "11:TRUE" - "CustomActionData" = "8:" - } - } - "DefaultFeature" - { - "Name" = "8:DefaultFeature" - "Title" = "8:" - "Description" = "8:" - } - "ExternalPersistence" - { - "LaunchCondition" - { - "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_8C8905E43EE54EA383E630F7E4D3F21B" - { - "Name" = "8:.NET Framework" - "Message" = "8:[VSDNETMSG]" - "Version" = "8:3.5.30729" - "AllowLaterVersions" = "11:FALSE" - "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617" - } - } - } - "File" - { - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_02C89A22052196FAB5EB6EC86FF2EED1" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.9.0, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_02C89A22052196FAB5EB6EC86FF2EED1" - { - "Name" = "8:Microsoft.VisualStudio.Shell.9.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.9.0.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_05ABEF09E18093DA7629C15B36903C7C" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_05ABEF09E18093DA7629C15B36903C7C" - { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.8.0.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_07EFB2A647FC1E848005431A1987742D" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:EnvDTE80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_07EFB2A647FC1E848005431A1987742D" - { - "Name" = "8:EnvDTE80.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:EnvDTE80.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1B375A60975719B19E7BC5D4D3D30C59" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Antlr3.Runtime, Version=3.1.2.41038, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_1B375A60975719B19E7BC5D4D3D30C59" - { - "Name" = "8:Antlr3.Runtime.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Antlr3.Runtime.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1F5F9C1A9E627AC43DD956E3941E83CD" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj2, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_1F5F9C1A9E627AC43DD956E3941E83CD" - { - "Name" = "8:VSLangProj2.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:VSLangProj2.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_256D72AC1D8DF0AF111519661A5FAE8E" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_256D72AC1D8DF0AF111519661A5FAE8E" - { - "Name" = "8:VSLangProj80.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:VSLangProj80.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3216833F11954BC68EEB656787B13A78" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowFeature_VB.zip" - "TargetName" = "8:SpecFlowFeature_VB.zip" - "Tag" = "8:" - "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3A5846D3AAC658826DF820C18017467C" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop.9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_3A5846D3AAC658826DF820C18017467C" - { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.9.0.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_543C0F615AB14853A79FF3333FCAED04" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowEventDefinition_VB.zip" - "TargetName" = "8:SpecFlowEventDefinition_VB.zip" - "Tag" = "8:" - "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_56C99935BE668A0DE481B47F7A63DF51" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.OLE.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_56C99935BE668A0DE481B47F7A63DF51" - { - "Name" = "8:Microsoft.VisualStudio.OLE.Interop.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.OLE.Interop.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5BE6B6A465646A3722242A77B6B33945" - { - "SourcePath" = "8:dte80.olb" - "TargetName" = "8:dte80.olb" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5F888AA7DA5BEFE6506F216943C3E7A0" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_5F888AA7DA5BEFE6506F216943C3E7A0" - { - "Name" = "8:Microsoft.VisualStudio.TextTemplating.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_64856A6CB2398B25902A9F573E713774" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Parser, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_64856A6CB2398B25902A9F573E713774" - { - "Name" = "8:TechTalk.SpecFlow.Parser.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:TechTalk.SpecFlow.Parser.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6A20E911F3BF498068F67CB81F0FD08D" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Generator, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_6A20E911F3BF498068F67CB81F0FD08D" - { - "Name" = "8:TechTalk.SpecFlow.Generator.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:TechTalk.SpecFlow.Generator.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_6CFD7B9A45EE6B2484BD5BBE0BEC6405" - { - "Name" = "8:EnvDTE.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:EnvDTE.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_743F26685BA8BFACB085688D3CFB7678" - { - "SourcePath" = "8:dte80a.olb" - "TargetName" = "8:dte80a.olb" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7A444B51B1E8A522A97AB1010E95299B" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:TechTalk.SpecFlow.Reporting, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_7A444B51B1E8A522A97AB1010E95299B" - { - "Name" = "8:TechTalk.SpecFlow.Reporting.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:TechTalk.SpecFlow.Reporting.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8C9C7FF1DB4641FF874CFFD3CFF10E62" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowEventDefinition.zip" - "TargetName" = "8:SpecFlowEventDefinition.zip" - "Tag" = "8:" - "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_97B8D5270749019C22E312C81F141CB1" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Shell.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_97B8D5270749019C22E312C81F141CB1" - { - "Name" = "8:Microsoft.VisualStudio.Shell.Interop.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Shell.Interop.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AD591DC54D4D279D30A20BC80D4F8AE8" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:TRUE" - "AssemblyAsmDisplayName" = "8:Microsoft.MSXML, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_AD591DC54D4D279D30A20BC80D4F8AE8" - { - "Name" = "8:Microsoft.MSXML.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.MSXML.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B090EC1C6CEB405EB055B415CD5F43DD" - { - "SourcePath" = "8:..\\..\\changelog.txt" - "TargetName" = "8:changelog.txt" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4170BCBC1823C4A75A031351A3BAE01" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_C4170BCBC1823C4A75A031351A3BAE01" - { - "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CBF13B5BAB959D830ACE400CDE0FAE9A" - { - "SourcePath" = "8:vslangproj.olb" - "TargetName" = "8:vslangproj.olb" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CE199EB240A722F1476C0DFB720C5A6C" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextTemplating.VSHost, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_CE199EB240A722F1476C0DFB720C5A6C" - { - "Name" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.TextTemplating.VSHost.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D406CAF4268247A88286DA2188E91F52" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowFeature.zip" - "TargetName" = "8:SpecFlowFeature.zip" - "Tag" = "8:" - "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D4F59786D4D8429DB792FFBA2FCA3806" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowStepDefinition_VB.zip" - "TargetName" = "8:SpecFlowStepDefinition_VB.zip" - "Tag" = "8:" - "Folder" = "8:_D5C535519B9141ED88626F5C449BBE0F" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D87E105E86E344BCB54D1F2D1EA180F3" - { - "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.targets" - "TargetName" = "8:TechTalk.SpecFlow.targets" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DB9DD3F2B9CF2208CBA2D313591F2B01" - { - "SourcePath" = "8:vslangproj80.olb" - "TargetName" = "8:vslangproj80.olb" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DC9E6E45C15279C0E22E26ECE4FF2616" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.VSHelp, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_DC9E6E45C15279C0E22E26ECE4FF2616" - { - "Name" = "8:Microsoft.VisualStudio.VSHelp.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.VSHelp.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EAA403069CAC8682EC7DDA8D158BF471" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.ProjectAggregator, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_EAA403069CAC8682EC7DDA8D158BF471" - { - "Name" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.ProjectAggregator.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EE4A03D8C2544A6280806185DC6D9CCD" - { - "SourcePath" = "8:..\\..\\Tools\\MsBuild\\TechTalk.SpecFlow.tasks" - "TargetName" = "8:TechTalk.SpecFlow.tasks" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EF6DB08211573D16021F74A994EB6287" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:VSLangProj, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_EF6DB08211573D16021F74A994EB6287" - { - "Name" = "8:VSLangProj.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:VSLangProj.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F10B61599FE4AEFE63EE4715E63058AC" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_F10B61599FE4AEFE63EE4715E63058AC" - { - "Name" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.TextManager.Interop.8.0.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F52A09B8F81FF0DC98A0149F3A9C25C2" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Modeling.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_F52A09B8F81FF0DC98A0149F3A9C25C2" - { - "Name" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Modeling.Sdk.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F91B5502CE7EB8FB0E124C265BE9EAA3" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Designer.Interfaces, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_F91B5502CE7EB8FB0E124C265BE9EAA3" - { - "Name" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Microsoft.VisualStudio.Designer.Interfaces.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FCA7A8942BCF47809C58574D51DA4A7B" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\SpecFlowStepDefinition.zip" - "TargetName" = "8:SpecFlowStepDefinition.zip" - "Tag" = "8:" - "Folder" = "8:_12420575FD334397AA439BFC984D6ADD" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - } - "FileType" - { - } - "Folder" - { - "{1525181F-901A-416C-8A58-119130FE478E}:_0D973C38FF244F3385C4A5443206BADC" - { - "Name" = "8:#1912" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:ProgramFilesFolder" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_D3CB3FD488E24EA28989947C5F21C83A" - { - "Name" = "8:Microsoft Visual Studio 9.0" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_B896852428AC4C6D97649F0BEDC23020" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_5BDFFF6F4CD04E4DACD1F9242FDE943B" - { - "Name" = "8:Common7" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_881FC7CE7CFA458C89FD776514498158" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_63AAC09E3F3142DCBBBB2B627C18C317" - { - "Name" = "8:IDE" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_B639E0D649354E7D8CA7E33426B80CAF" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_4C8481282A6F4892B1D597D2E9A70EC3" - { - "Name" = "8:ItemTemplates" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_F1064E5043444DCEA6D05B20743DF5F7" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_12420575FD334397AA439BFC984D6ADD" - { - "Name" = "8:CSharp" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_414375239DF94CE1AC2FB4AE722AE08D" - "Folders" - { - } - } - "{9EF0B969-E518-4E46-987F-47570745A589}:_D5C535519B9141ED88626F5C449BBE0F" - { - "Name" = "8:VisualBasic" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_D0DAA827840845CAAD015C5746A5A015" - "Folders" - { - } - } - } - } - } - } - } - } - } - } - } - } - "{3C67513D-01DD-4637-8A68-80971EB9504F}:_2D85F2CCE0F64901A8231E38E3C0F2A8" - { - "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" - "Name" = "8:#1925" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:TARGETDIR" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_256850BB5BF44587B0F43F11538A0DA3" - { - "Name" = "8:Setup" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_43B2C86145704B89A45FF1A6079494BB" - "Folders" - { - } - } - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_7245F19CBD31456A88C546138269A2C7" - { - "Name" = "8:#1916" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:DesktopFolder" - "Folders" - { - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_C27063BB52F74507B0D11312FC4CF5AD" - { - "Name" = "8:#1919" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:ProgramMenuFolder" - "Folders" - { - } - } - } - "LaunchCondition" - { - } - "Locator" - { - } - "MsiBootstrapper" - { - "LangId" = "3:1033" - "RequiresElevation" = "11:FALSE" - } - "Product" - { - "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:SpecFlow" - "ProductCode" = "8:{735A442F-1666-43D6-A9C1-44F4605677E0}" - "PackageCode" = "8:{6257E6BC-D807-4484-AB67-42930815077D}" - "UpgradeCode" = "8:{A72428B6-8ADB-4EDF-BC23-4BE4E19F01A0}" - "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:TRUE" - "DetectNewerInstalledVersion" = "11:TRUE" - "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.2.0" - "Manufacturer" = "8:TechTalk" - "ARPHELPTELEPHONE" = "8:" - "ARPHELPLINK" = "8:" - "Title" = "8:SpecFlow Setup" - "Subject" = "8:" - "ARPCONTACT" = "8:TechTalk" - "Keywords" = "8:" - "ARPCOMMENTS" = "8:" - "ARPURLINFOABOUT" = "8:http://www.techtalk.at" - "ARPPRODUCTICON" = "8:" - "ARPIconIndex" = "3:0" - "SearchPath" = "8:" - "UseSystemSearchPath" = "11:TRUE" - "TargetPlatform" = "3:0" - "PreBuildEvent" = "8:" - "PostBuildEvent" = "8:" - "RunPostBuildEvent" = "3:0" - } - "Registry" - { - "HKLM" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_363B9008780E4586AF4C3F5EF6FED156" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3B6B0BD4FA844D4C8B27E8B848E9F1C4" - { - "Name" = "8:Microsoft" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_022539F5784D4832AEF49B04F7282A26" - { - "Name" = "8:VisualStudio" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FCC39B3DE9814FA7B1A8EC55B09D2EEB" - { - "Name" = "8:9.0" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_631C1751839F4D379D73C9B99F19D7C6" - { - "Name" = "8:Generators" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_639FA0EC01D74BE4AFC951A9EE3D2A42" - { - "Name" = "8:{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_07C34ECC8B7F45A8867F521F0FEB7392" - { - "Name" = "8:SpecFlowSingleFileGenerator" - "Condition" = "8:" - "AlwaysCreate" = "11:TRUE" - "DeleteAtUninstall" = "11:TRUE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9901238E48724728AAEC4DE8DC2682BF" - { - "Name" = "8:GeneratesDesignTimeSource" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:3" - "Value" = "3:1" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D3521D326FB54D4D8C1AACCE7AF96641" - { - "Name" = "8:" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:C# SpecFlow Generator" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F2DEB7F18072428E9054176CBB7E8D03" - { - "Name" = "8:CLSID" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:{3c9cf10a-a9ab-4899-a0fb-4b3be4a36c15}" - } - } - } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F521EB414BAD4A7582E60409FE3A030F" - { - "Name" = "8:.feature" - "Condition" = "8:" - "AlwaysCreate" = "11:TRUE" - "DeleteAtUninstall" = "11:TRUE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F85DCEABD60A4AEB8B868AD97E74664C" - { - "Name" = "8:" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:SpecFlowSingleFileGenerator" - } - } - } - } - "Values" - { - } - } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EBB17476826F4485847803E0177254A9" - { - "Name" = "8:{164B10B9-B200-11D0-8C61-00A0C91E29D5}" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4B7D7F51BA6B4FB9867263F82057DA05" - { - "Name" = "8:.feature" - "Condition" = "8:" - "AlwaysCreate" = "11:TRUE" - "DeleteAtUninstall" = "11:TRUE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6D7BA471D831489B8F7D71F64F0DD5F3" - { - "Name" = "8:" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:SpecFlowSingleFileGenerator" - } - } - } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6A746015D53E4C9B889766B22D74763C" - { - "Name" = "8:SpecFlowSingleFileGenerator" - "Condition" = "8:" - "AlwaysCreate" = "11:TRUE" - "DeleteAtUninstall" = "11:TRUE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0B1BB1771C64445B9A723F5CB6FCA7E8" - { - "Name" = "8:GeneratesDesignTimeSource" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:3" - "Value" = "3:1" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_629CFB2D727D4F6D8E154209235AEE92" - { - "Name" = "8:CLSID" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:{3c9cf10a-a9ab-4899-a0fb-4b3be4a36c15}" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BE64961D8E4B4EDEAC503630DA63A887" - { - "Name" = "8:" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:VB.NET SpecFlow Generator" - } - } - } - } - "Values" - { - } - } - } - "Values" - { - } - } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EFC1365941CC4798B22FF6EC4B226FCA" - { - "Name" = "8:CLSID" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BFE21C66F6A2445FA3867A968B1A7F15" - { - "Name" = "8:{3c9cf10a-a9ab-4899-a0fb-4b3be4a36c15}" - "Condition" = "8:" - "AlwaysCreate" = "11:TRUE" - "DeleteAtUninstall" = "11:TRUE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_1EC902AC326B4460B18B3E0B4050178E" - { - "Name" = "8:ThreadingModel" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:Both" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_366C5CE62F4844C28735863A68A28DEB" - { - "Name" = "8:" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:TechTalk.SpecFlow.VsIntegration.SpecFlowSingleFileGenerator" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6CE2FEF912F54CD089CC3E3E31889CAC" - { - "Name" = "8:CodeBase" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:[TARGETDIR]TechTalk.SpecFlow.VsIntegration.dll" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_94726C38431249DF8384D23E8BA613B0" - { - "Name" = "8:Class" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:TechTalk.SpecFlow.VsIntegration.SpecFlowSingleFileGenerator" - } - "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E2FD31A153DC4C318BD01E2B98955C9D" - { - "Name" = "8:InprocServer32" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "ValueTypes" = "3:1" - "Value" = "8:C:\\\\Windows\\\\SYSTEM32\\\\MSCOREE.DLL" - } - } - } - } - "Values" - { - } - } - } - "Values" - { - } - } - } - "Values" - { - } - } - } - "Values" - { - } - } - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5F4F0D3B132B4FA68F74A3C4F3204168" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCU" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_736C73D4991041BB8C22A98B3A7C4DB0" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_68BD654DF7F74F2C939E877CAA7ABCC4" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCR" - { - "Keys" - { - } - } - "HKU" - { - "Keys" - { - } - } - "HKPU" - { - "Keys" - { - } - } - } - "Sequences" - { - } - "Shortcut" - { - } - "UserInterface" - { - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_78EC5B9BD71848C8B9DE0BCCC562FE2D" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdBasicDialogs.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8315B5B5D73441BBB1B60197F1306BAF" - { - "Name" = "8:#1900" - "Sequence" = "3:1" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_25CD641CE1D848FB9DAEFF3B853538E5" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2FA24DF28AF440A69CDF2121CC7148B6" - { - "Sequence" = "3:100" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D899A8B8C71544C494C6A0E3C2A75285" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "InstallAllUsersVisible" - { - "Name" = "8:InstallAllUsersVisible" - "DisplayName" = "8:#1059" - "Description" = "8:#1159" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_885AA5D1FCE948E6BE10176036326C87" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdUserInterface.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B5DD7A30A0204BD49EF92881466FBDEB" - { - "Name" = "8:#1901" - "Sequence" = "3:2" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_472056B25B0444FE853A199EB2863590" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_CD3FFD57F5CC4D4D80F56C89596D39EE" - { - "Name" = "8:#1902" - "Sequence" = "3:1" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7CF40BED5E714A7A818E671FA0E43078" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "UpdateText" - { - "Name" = "8:UpdateText" - "DisplayName" = "8:#1058" - "Description" = "8:#1158" - "Type" = "3:15" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1258" - "DefaultValue" = "8:#1258" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_CFB112A450AD41559683D756D2C9F164" - { - "Name" = "8:#1901" - "Sequence" = "3:1" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3FFFE72C40F443E89F88D67983940FBA" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D9560655D69D414BB4A07027DC771D50" - { - "Name" = "8:#1902" - "Sequence" = "3:2" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_923CA499284D4B7CB9F7F50EFFE55B48" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E6D2568384DB48DF92E7A614F789BB0C" - { - "Name" = "8:#1900" - "Sequence" = "3:2" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6EC5FA4AB3B94FEBBB70BA6713536D87" - { - "Sequence" = "3:100" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_861CB73AD432476EB2B105EF984B45B3" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B5D432FD97D6486DA75CFE0E6DAE0101" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - } - "MergeModule" - { - } - "ProjectOutput" - { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0C0AEB379A994D6380D2AF032EA60E7A" - { - "SourcePath" = "8:..\\..\\Runtime\\obj\\Debug\\TechTalk.SpecFlow.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_75A70548B8444C668B2D0462EC9CC366" - { - "SourcePath" = "8:..\\..\\Tools\\obj\\Debug\\specflow.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_8B2D5366F6C941138FF83318D8C65C46" - { - "SourcePath" = "8:..\\..\\VsIntegration\\obj\\Debug\\TechTalk.SpecFlow.VsIntegration.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_2D85F2CCE0F64901A8231E38E3C0F2A8" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_F40F425B3B5D4365A81330EA775FCC1B" - { - "SourcePath" = "8:..\\DevenvSetupCustomAction\\obj\\Debug\\DevenvSetupCustomAction.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_256850BB5BF44587B0F43F11538A0DA3" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{02F3B86D-0421-4D45-A701-44F3C94CF07D}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - } - } -} diff --git a/TechTalk.SpecFlow.sln b/TechTalk.SpecFlow.sln index f8a03a367..c65883c6e 100644 --- a/TechTalk.SpecFlow.sln +++ b/TechTalk.SpecFlow.sln @@ -28,10 +28,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RuntimeTests", "Tests\Runti EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.VsIntegration", "VsIntegration\TechTalk.SpecFlow.VsIntegration.csproj", "{5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevenvSetupCustomAction", "Installer\DevenvSetupCustomAction\DevenvSetupCustomAction.csproj", "{02F3B86D-0421-4D45-A701-44F3C94CF07D}" -EndProject -Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "SpecFlowSetup", "Installer\SpecFlowSetup\SpecFlowSetup.vdproj", "{F6740296-282C-4A0F-941E-A8FD1B1DAC2D}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.Generator", "Generator\TechTalk.SpecFlow.Generator.csproj", "{453D8014-B6CD-4E86-80A8-D59F59092334}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechTalk.SpecFlow.Tools", "Tools\TechTalk.SpecFlow.Tools.csproj", "{87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}" @@ -42,70 +38,144 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ExternalStepsVB", "Tests\Fe EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExternalStepsCS", "Tests\FeatureTests\ExternalSteps\ExternalStepsCS\ExternalStepsCS.csproj", "{3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}" EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "SpecFlowInstaller", "Installer\SpecFlowInstaller\SpecFlowInstaller.wixproj", "{89167EB9-F458-48DA-9D8F-F639A74F5871}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Debug|x86.ActiveCfg = Debug|Any CPU {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Release|Any CPU.Build.0 = Release|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FC43509F-E7D3-40C4-B4C3-1E6C9D5530A4}.Release|x86.ActiveCfg = Release|Any CPU {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Debug|x86.ActiveCfg = Debug|Any CPU {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Release|Any CPU.Build.0 = Release|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {413EE28C-4F89-4C6F-BA1E-2CDEE4CD43B4}.Release|x86.ActiveCfg = Release|Any CPU {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Debug|x86.ActiveCfg = Debug|Any CPU {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Release|Any CPU.ActiveCfg = Release|Any CPU {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Release|Any CPU.Build.0 = Release|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7CCEF6D6-FC17-422E-9BED-EDD752B6496F}.Release|x86.ActiveCfg = Release|Any CPU {70376361-0BE1-478D-8EEC-47BD1C768165}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70376361-0BE1-478D-8EEC-47BD1C768165}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Debug|x86.ActiveCfg = Debug|Any CPU {70376361-0BE1-478D-8EEC-47BD1C768165}.Release|Any CPU.ActiveCfg = Release|Any CPU {70376361-0BE1-478D-8EEC-47BD1C768165}.Release|Any CPU.Build.0 = Release|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {70376361-0BE1-478D-8EEC-47BD1C768165}.Release|x86.ActiveCfg = Release|Any CPU {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Debug|x86.ActiveCfg = Debug|Any CPU {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Release|Any CPU.ActiveCfg = Release|Any CPU {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Release|Any CPU.Build.0 = Release|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F8FACCF0-5497-4C6B-861F-78D72FD9561B}.Release|x86.ActiveCfg = Release|Any CPU {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Debug|x86.ActiveCfg = Debug|Any CPU {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Release|Any CPU.ActiveCfg = Release|Any CPU {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Release|Any CPU.Build.0 = Release|Any CPU - {02F3B86D-0421-4D45-A701-44F3C94CF07D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02F3B86D-0421-4D45-A701-44F3C94CF07D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02F3B86D-0421-4D45-A701-44F3C94CF07D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02F3B86D-0421-4D45-A701-44F3C94CF07D}.Release|Any CPU.Build.0 = Release|Any CPU - {F6740296-282C-4A0F-941E-A8FD1B1DAC2D}.Debug|Any CPU.ActiveCfg = Debug - {F6740296-282C-4A0F-941E-A8FD1B1DAC2D}.Release|Any CPU.ActiveCfg = Release - {F6740296-282C-4A0F-941E-A8FD1B1DAC2D}.Release|Any CPU.Build.0 = Release + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5703CA95-A08A-46AE-AE24-DB6B21FD6F7E}.Release|x86.ActiveCfg = Release|Any CPU {453D8014-B6CD-4E86-80A8-D59F59092334}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {453D8014-B6CD-4E86-80A8-D59F59092334}.Debug|Any CPU.Build.0 = Debug|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Debug|x86.ActiveCfg = Debug|Any CPU {453D8014-B6CD-4E86-80A8-D59F59092334}.Release|Any CPU.ActiveCfg = Release|Any CPU {453D8014-B6CD-4E86-80A8-D59F59092334}.Release|Any CPU.Build.0 = Release|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {453D8014-B6CD-4E86-80A8-D59F59092334}.Release|x86.ActiveCfg = Release|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Debug|x86.ActiveCfg = Debug|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Any CPU.Build.0 = Release|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {87BE7FE6-C3DE-4409-ABF6-FA5B60AF3DE1}.Release|x86.ActiveCfg = Release|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Debug|x86.ActiveCfg = Debug|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.ActiveCfg = Release|Any CPU {3FE793A8-E662-4026-B4EC-891324073235}.Release|Any CPU.Build.0 = Release|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3FE793A8-E662-4026-B4EC-891324073235}.Release|x86.ActiveCfg = Release|Any CPU {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Debug|x86.ActiveCfg = Debug|Any CPU {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Any CPU.Build.0 = Release|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D3F6B835-B228-4DCF-B533-B6ED469A33B3}.Release|x86.ActiveCfg = Release|Any CPU {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Debug|x86.ActiveCfg = Debug|Any CPU {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Any CPU.ActiveCfg = Release|Any CPU {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Any CPU.Build.0 = Release|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3836A6FC-4ECC-413A-AC8F-83A0A773EC9E}.Release|x86.ActiveCfg = Release|Any CPU + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Debug|Any CPU.ActiveCfg = Debug|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Debug|x86.ActiveCfg = Debug|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Debug|x86.Build.0 = Debug|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Release|Any CPU.ActiveCfg = Release|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Release|Mixed Platforms.Build.0 = Release|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Release|x86.ActiveCfg = Release|x86 + {89167EB9-F458-48DA-9D8F-F639A74F5871}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {02F3B86D-0421-4D45-A701-44F3C94CF07D} = {DCE0C3C4-5BC6-4A30-86BE-3FEFF4677A01} - {F6740296-282C-4A0F-941E-A8FD1B1DAC2D} = {DCE0C3C4-5BC6-4A30-86BE-3FEFF4677A01} + {89167EB9-F458-48DA-9D8F-F639A74F5871} = {DCE0C3C4-5BC6-4A30-86BE-3FEFF4677A01} {70376361-0BE1-478D-8EEC-47BD1C768165} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} {F8FACCF0-5497-4C6B-861F-78D72FD9561B} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} {3FE793A8-E662-4026-B4EC-891324073235} = {A10B5CD6-38EC-4D7E-9D1C-2EBA8017E437} diff --git a/VsIntegration/TechTalk.SpecFlow.VsIntegration.csproj b/VsIntegration/TechTalk.SpecFlow.VsIntegration.csproj index 3e98d1196..3292e7830 100644 --- a/VsIntegration/TechTalk.SpecFlow.VsIntegration.csproj +++ b/VsIntegration/TechTalk.SpecFlow.VsIntegration.csproj @@ -148,8 +148,24 @@ + + + + + + + + + + + + - --> \ No newline at end of file From 531047e6ad1c8fc762ce29b004a3902d46cb5180 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 3 May 2010 10:31:42 +0200 Subject: [PATCH 25/34] fix EULA, changelog --- Installer/Resources/EULA.rtf | 139 ++++++++++++++++++----------------- changelog.txt | 1 + 2 files changed, 71 insertions(+), 69 deletions(-) diff --git a/Installer/Resources/EULA.rtf b/Installer/Resources/EULA.rtf index 7ab4e4cea..e8a1ddb8a 100644 --- a/Installer/Resources/EULA.rtf +++ b/Installer/Resources/EULA.rtf @@ -1,42 +1,43 @@ -{\rtf1\adeflang1025\ansi\ansicpg1250\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1038\deflangfe1038\themelang1038\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\rtf1\adeflang1025\ansi\ansicpg1250\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1038\deflangfe1038\themelang1038\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset238\fprq2{\*\panose 020b0604020202020204}Arial;} {\f2\fbidi \fmodern\fcharset238\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} -{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f37\fbidi \fswiss\fcharset238\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\flomajor\f31500\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\fdbmajor\f31501\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset238\fprq2{\*\panose 02040503050406030204}Cambria;} {\fbimajor\f31503\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\fdbminor\f31505\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset238\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset0\fprq1 Courier New;}{\f60\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} -{\f62\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f63\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f64\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f65\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} -{\f66\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f67\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f411\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} -{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;} -{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31530\fbidi \froman\fcharset0\fprq2 Cambria;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} -{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} -{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;} -{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} -{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; -\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22\lang1038\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 -\ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +{\fbiminor\f31507\fbidi \froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f293\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\f292\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f294\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f295\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f296\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f297\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f298\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f299\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f303\fbidi \fswiss\fcharset0\fprq2 Arial;}{\f302\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f304\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f305\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f306\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f307\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f308\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f309\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f313\fbidi \fmodern\fcharset0\fprq1 Courier New;}{\f312\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f314\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f315\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f316\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f317\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f318\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f319\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31530\fbidi \froman\fcharset0\fprq2 Cambria;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp +\f31506\fs22\lang1038\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive +\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* \ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{ -\s15\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{ +\s15\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 \sbasedon0 \snext15 \sqformat \spriority34 \styrsid670357 List Paragraph;}}{\*\listtable{\list\listtemplateid-1897397696\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext \leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371 \'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;} @@ -46,7 +47,7 @@ \leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 \levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 \levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid220287820}{\list\listtemplateid1253327872\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1748092732\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af31506\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1748092732\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af0\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 {\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026369 \'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 @@ -62,9 +63,10 @@ \f10\fbias0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026369\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026371\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel \levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid68026373\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid1550722509}} -{\*\listoverridetable{\listoverride\listid220287820\listoverridecount0\ls1}{\listoverride\listid1222596848\listoverridecount0\ls2}{\listoverride\listid1550722509\listoverridecount0\ls3}}{\*\rsidtbl \rsid670357\rsid10623324}{\mmathPr\mmathFont34\mbrkBin0 -\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Gaspar Nagy}{\operator Gaspar Nagy}{\creatim\yr2010\mo4\dy30\hr14\min22}{\revtim\yr2010\mo4\dy30\hr14\min24}{\version1}{\edmins2}{\nofpages1} -{\nofwords206}{\nofchars1423}{\nofcharsws1626}{\vern49243}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1417\gutter0\ltrsect +{\*\listoverridetable{\listoverride\listid220287820\listoverridecount0\ls1}{\listoverride\listid1222596848\listoverridecount0\ls2}{\listoverride\listid1550722509\listoverridecount0\ls3}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid670357 +\rsid1664046\rsid1842604\rsid4740818\rsid7685343\rsid10623324}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Gaspar Nagy}{\operator Gaspar Nagy} +{\creatim\yr2010\mo4\dy30\hr14\min22}{\revtim\yr2010\mo5\dy3\hr10\min20}{\version5}{\edmins11}{\nofpages1}{\nofwords215}{\nofchars1484}{\nofcharsws1696}{\vern49243}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1417\gutter0\ltrsect \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0 \showxmlerrors1\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1417\dgvorigin1417\dghshow1\dgvshow1 \jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct @@ -72,36 +74,35 @@ {\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 \pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 \pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 Copyright (c) 2009, TechTalk +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4740818 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af1 \ltrch\fcs0 \b\f1\fs32\insrsid1842604 SpecFlow}{\rtlch\fcs1 \af1 \ltrch\fcs0 \b\f1\fs32\insrsid4740818\charrsid4740818 License +\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid4740818 SpecFlow}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid4740818\charrsid4740818 is distributed under the BSD licens}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid4740818 e. +\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid4740818\charrsid4740818 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 {\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 Copyright (c) 2009}{\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\insrsid7685343 -2010}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 , TechTalk \par Disclaimer: -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 -\ltrch\fcs0 \insrsid670357 The initial codebase of Specflow was written by TechTalk employees. No 3rd party code was included. -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}No code of customer projects was used to create this project. -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}TechTalk had the full rights to publish the initial codebase. -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 -\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 Redistribution and use in source and binary forms, with or without}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 -modification, are permitted provided that the following conditions are met: -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af31507 -\ltrch\fcs0 \insrsid670357 Redistributions of source code must retain the above copyright}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 notice, this list of conditions and the following disclaimer. - -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Redistributions in binary form must reproduce the above copyright}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{ -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 notice, this list of conditions and the following disclaimer in the}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 documentatio -n and/or other materials provided with the distribution. -\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af31507\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357 \loch\af3\dbch\af31506\hich\f3 \'b7\tab}Neither the name of the SpecFlow project nor thenames of its contributors may be used to endorse or promote products}{ -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 derived from this software without specific prior written permission. -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE}{ -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 DISCLAIMED. IN NO EVENT SHALL TECHTALK OR CONTRIBUTORS BE LIABLE FOR ANY}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 -\ltrch\fcs0 \insrsid670357 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND}{ -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 -\ltrch\fcs0 \insrsid670357 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid670357 -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid10623324 +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\insrsid670357\charrsid4740818 The initial codebase of Spec}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid1664046 F}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 low was written by TechTalk employees. No 3}{\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\super\insrsid670357\charrsid4740818 rd}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 party code was included. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab}No code of customer projects was used to create this project. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab}TechTalk had the full rights to publish the initial codebase. +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { +\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 +\par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s15\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid670357\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 {\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\insrsid670357\charrsid4740818 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab} +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +\par {\listtext\pard\plain\ltrpar \s15 \rtlch\fcs1 \af1\afs22 \ltrch\fcs0 \f3\fs22\insrsid670357\charrsid4740818 \loch\af3\dbch\af0\hich\f3 \'b7\tab} +Neither the name of the SpecFlow project nor thenames of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid670357 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1038\langfe1033\cgrid\langnp1038\langfenp1033 { +\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid670357\charrsid4740818 +THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TECHTALK OR CO +NTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED A +ND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.}{\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\insrsid10623324\charrsid4740818 \par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a 9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad 5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 @@ -209,8 +210,8 @@ fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000b0fa -c71d60e8ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000d01a +938b99eaca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index d5089be6b..d7d431c07 100644 --- a/changelog.txt +++ b/changelog.txt @@ -7,6 +7,7 @@ New features: + Custom step parameter converters can be defined as a binding. See examples in Tests/FeatureTests/StepArgumentTransfomation + SpecFlow feature files can be added also to VB.NET projects + Support for xUnit ++ Single installer for Visual Studio 2008 and 2010 (Issue 6, 10, 11) 1.2.0 - 2009/11/25 From 7f75fe4f4cc56abc59b589fdbb32d7b4b8312170 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 3 May 2010 11:28:18 +0200 Subject: [PATCH 26/34] fix/extend changelog --- changelog.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/changelog.txt b/changelog.txt index d7d431c07..84a5933c6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,13 +1,19 @@ next release New features: -+ Context injection in step definitions. Step definitions can get a context injected with constructor injection. See examples in Tests/FeatureTests/ContextInjection -+ Using steps in other assemblies. This enables writing steps in VB. See examples in Tests/FeatureTests/ExternalSteps -+ Steps can be invoked from other steps using step text. See examples in Tests/FeatureTests/CallingStepsFromStepDefinitions -+ Custom step parameter converters can be defined as a binding. See examples in Tests/FeatureTests/StepArgumentTransfomation ++ Context injection in step definitions. Step definitions can get a context injected with + constructor injection. (Issue 30) + See examples in Tests/FeatureTests/ContextInjection ++ Using steps in other assemblies. This enables writing steps in VB. (Issue 19) + See examples in Tests/FeatureTests/ExternalSteps ++ Steps can be invoked from other steps using step text. See examples in + Tests/FeatureTests/CallingStepsFromStepDefinitions ++ Custom step parameter converters can be defined as a binding. + See examples in Tests/FeatureTests/StepArgumentTransfomation + SpecFlow feature files can be added also to VB.NET projects + Support for xUnit + Single installer for Visual Studio 2008 and 2010 (Issue 6, 10, 11) ++ SpecFlow Reporting doesn't work with Firefox (Issue 31) 1.2.0 - 2009/11/25 @@ -38,7 +44,8 @@ New features: Fixed issues: + Runtime: Remove direct dependency on nunit.framework.dll from the runtime (Issue 12) + Runtime: Binding methods with more than 4 parameters cannot be used (Issue 21) -+ Generator: Special language characters (e.g. accented letters) are removed when generating test method names (Issue 22) ++ Generator: Special language characters (e.g. accented letters) are removed when generating + test method names (Issue 22) 1.0.2 - 2009/10/20 From 310f3ea1b00b92201a22655e06aa0fb49670dae6 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 3 May 2010 11:33:02 +0200 Subject: [PATCH 27/34] add generated code attribute/region to the generated code --- Generator/CodeDomHelper.cs | 44 +++++++++++++++++++ Generator/SpecFlowGenerator.cs | 20 ++++++--- Generator/SpecFlowUnitTestConverter.cs | 2 +- .../XUnitTestGeneratorProvider.cs | 2 +- .../CallingStepsFromStepDefinition.feature.cs | 4 ++ .../ContextInjection.feature.cs | 4 ++ .../ExternalSteps/ExternalSteps.feature.cs | 4 ++ .../StepArgumentTransformation.feature.cs | 4 ++ Tests/RuntimeTests/ExecutionTestBase.cs | 2 + changelog.txt | 2 + 10 files changed, 80 insertions(+), 8 deletions(-) diff --git a/Generator/CodeDomHelper.cs b/Generator/CodeDomHelper.cs index 9fc8a9c72..62926d5c7 100644 --- a/Generator/CodeDomHelper.cs +++ b/Generator/CodeDomHelper.cs @@ -3,6 +3,7 @@ using System.CodeDom.Compiler; using System.Globalization; using System.Reflection; +using System.Runtime.CompilerServices; namespace TechTalk.SpecFlow.Generator { @@ -114,5 +115,48 @@ public void AddDisableSourceLinePragmaStatement(CodeStatementCollection statemen break; } } + + public CodeStatement GetStartRegionStatement(string regionText) + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + return new CodeSnippetStatement("#region " + regionText); + case GenerationTargetLanguage.VB: + return new CodeSnippetStatement("#Region \"" + regionText + "\""); + } + return new CodeCommentStatement("#region " + regionText); + } + + public CodeStatement GetEndRegionStatement() + { + switch (TargetLanguage) + { + case GenerationTargetLanguage.CSharp: + return new CodeSnippetStatement("#endregion"); + case GenerationTargetLanguage.VB: + return new CodeSnippetStatement("#End Region"); + } + return new CodeCommentStatement("#endregion"); + } + + private Version GetCurrentSpecFlowVersion() + { + return Assembly.GetExecutingAssembly().GetName().Version; + } + + public CodeTypeDeclaration CreateGeneratedTypeDeclaration(string className) + { + var result = new CodeTypeDeclaration(className); + result.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(typeof(GeneratedCodeAttribute)), + new CodeAttributeArgument(new CodePrimitiveExpression("TechTalk.SpecFlow")), + new CodeAttributeArgument(new CodePrimitiveExpression(GetCurrentSpecFlowVersion().ToString())))); + result.CustomAttributes.Add( + new CodeAttributeDeclaration( + new CodeTypeReference(typeof(CompilerGeneratedAttribute)))); + return result; + } } } diff --git a/Generator/SpecFlowGenerator.cs b/Generator/SpecFlowGenerator.cs index e30dd1bd1..153b75069 100644 --- a/Generator/SpecFlowGenerator.cs +++ b/Generator/SpecFlowGenerator.cs @@ -115,26 +115,27 @@ public void GenerateTestFile(SpecFlowFeatureFile featureFile, CodeDomProvider co { outputWriter = new HackedWriter(outputWriter); - var codeNamespace = GenerateTestFileCode(featureFile, inputReader, codeProvider); + CodeDomHelper codeDomHelper = new CodeDomHelper(codeProvider); + + var codeNamespace = GenerateTestFileCode(featureFile, inputReader, codeProvider, codeDomHelper); var options = new CodeGeneratorOptions { BracingStyle = "C" }; - AddSpecFlowHeader(codeProvider, outputWriter); + AddSpecFlowHeader(codeProvider, outputWriter, codeDomHelper); codeProvider.GenerateCodeFromNamespace(codeNamespace, outputWriter, options); + AddSpecFlowFooter(codeProvider, outputWriter, codeDomHelper); outputWriter.Flush(); } - public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextReader inputReader, CodeDomProvider codeProvider) + public CodeNamespace GenerateTestFileCode(SpecFlowFeatureFile featureFile, TextReader inputReader, CodeDomProvider codeProvider, CodeDomHelper codeDomHelper) { string targetNamespace = GetTargetNamespace(featureFile); SpecFlowLangParser parser = new SpecFlowLangParser(project.GeneratorConfiguration.FeatureLanguage); Feature feature = parser.Parse(inputReader, featureFile.GetFullPath(project)); - CodeDomHelper codeDomHelper = new CodeDomHelper(codeProvider); - IUnitTestGeneratorProvider generatorProvider = ConfigurationServices.CreateInstance(project.GeneratorConfiguration.GeneratorUnitTestProviderType); codeDomHelper.InjectIfRequired(generatorProvider); @@ -168,7 +169,7 @@ private string GetTargetNamespace(SpecFlowFeatureFile featureFile) return targetNamespace; } - private void AddSpecFlowHeader(CodeDomProvider codeProvider, TextWriter outputWriter) + private void AddSpecFlowHeader(CodeDomProvider codeProvider, TextWriter outputWriter, CodeDomHelper codeDomHelper) { var specFlowHeaderTemplate = @"------------------------------------------------------------------------------ @@ -191,6 +192,13 @@ the code is regenerated. { codeProvider.GenerateCodeFromStatement(new CodeCommentStatement(line), outputWriter, null); } + + codeProvider.GenerateCodeFromStatement(codeDomHelper.GetStartRegionStatement("Designer generated code"), outputWriter, null); + } + + private void AddSpecFlowFooter(CodeDomProvider codeProvider, TextWriter outputWriter, CodeDomHelper codeDomHelper) + { + codeProvider.GenerateCodeFromStatement(codeDomHelper.GetEndRegionStatement(), outputWriter, null); } public Version GetCurrentSpecFlowVersion() diff --git a/Generator/SpecFlowUnitTestConverter.cs b/Generator/SpecFlowUnitTestConverter.cs index 1d12bdaeb..41b1da021 100644 --- a/Generator/SpecFlowUnitTestConverter.cs +++ b/Generator/SpecFlowUnitTestConverter.cs @@ -53,7 +53,7 @@ public CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassNa codeNamespace.Imports.Add(new CodeNamespaceImport(SPECFLOW_NAMESPACE)); - var testType = new CodeTypeDeclaration(testClassName); + var testType = codeDomHelper.CreateGeneratedTypeDeclaration(testClassName); testType.IsPartial = true; testType.TypeAttributes |= TypeAttributes.Public; codeNamespace.Types.Add(testType); diff --git a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs index 6959b8cba..209ae657a 100644 --- a/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs +++ b/Generator/UnitTestProvider/XUnitTestGeneratorProvider.cs @@ -41,7 +41,7 @@ public void SetTestFixtureSetup(CodeMemberMethod fixtureSetupMethod) fixtureSetupMethod.Attributes |= MemberAttributes.Static; - _currentFixtureTypeDeclaration = new CodeTypeDeclaration("FixtureData"); + _currentFixtureTypeDeclaration = CodeDomHelper.CreateGeneratedTypeDeclaration("FixtureData"); _currentTestTypeDeclaration.Members.Add(_currentFixtureTypeDeclaration); var fixtureDataType = diff --git a/Tests/FeatureTests/CallingStepsFromStepDefinitions/CallingStepsFromStepDefinition.feature.cs b/Tests/FeatureTests/CallingStepsFromStepDefinitions/CallingStepsFromStepDefinition.feature.cs index 656139565..25f50baea 100644 --- a/Tests/FeatureTests/CallingStepsFromStepDefinitions/CallingStepsFromStepDefinition.feature.cs +++ b/Tests/FeatureTests/CallingStepsFromStepDefinitions/CallingStepsFromStepDefinition.feature.cs @@ -8,11 +8,14 @@ // the code is regenerated. // // ------------------------------------------------------------------------------ +#region Designer generated code namespace TechTalk.SpecFlow.FeatureTests.CallingStepsFromStepDefinitions { using TechTalk.SpecFlow; + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.2.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [NUnit.Framework.TestFixtureAttribute()] [NUnit.Framework.DescriptionAttribute("Calling Steps from StepDefinitions")] public partial class CallingStepsFromStepDefinitionsFeature @@ -87,3 +90,4 @@ public virtual void DoSomethingMeaningful() } } } +#endregion diff --git a/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs index f1f52ec1f..94269a59f 100644 --- a/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs +++ b/Tests/FeatureTests/ContextInjection/ContextInjection.feature.cs @@ -8,11 +8,14 @@ // the code is regenerated. // // ------------------------------------------------------------------------------ +#region Designer generated code namespace TechTalk.SpecFlow.FeatureTests.ContextInjection { using TechTalk.SpecFlow; + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.2.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [NUnit.Framework.TestFixtureAttribute()] [NUnit.Framework.DescriptionAttribute("Injecting context into step specifications")] public partial class InjectingContextIntoStepSpecificationsFeature @@ -132,3 +135,4 @@ public virtual void FeatureWithADependentContext() } } } +#endregion diff --git a/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs index 8389bf338..9b747e21d 100644 --- a/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs +++ b/Tests/FeatureTests/ExternalSteps/ExternalSteps.feature.cs @@ -8,11 +8,14 @@ // the code is regenerated. // // ------------------------------------------------------------------------------ +#region Designer generated code namespace TechTalk.SpecFlow.FeatureTests.ExternalSteps { using TechTalk.SpecFlow; + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.2.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [NUnit.Framework.TestFixtureAttribute()] [NUnit.Framework.DescriptionAttribute("External Step Definitions")] public partial class ExternalStepDefinitionsFeature @@ -69,3 +72,4 @@ public virtual void StepsDefinedInAnExternalVBProjectAndAnExternalC_SharpProject } } } +#endregion diff --git a/Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature.cs b/Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature.cs index 77f92ac25..b53be37de 100644 --- a/Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature.cs +++ b/Tests/FeatureTests/StepArgumentTransfomation/StepArgumentTransformation.feature.cs @@ -8,11 +8,14 @@ // the code is regenerated. // // ------------------------------------------------------------------------------ +#region Designer generated code namespace TechTalk.SpecFlow.FeatureTests.StepArgumentTransfomation { using TechTalk.SpecFlow; + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.2.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [NUnit.Framework.TestFixtureAttribute()] [NUnit.Framework.DescriptionAttribute("Step Argument Transformations")] public partial class StepArgumentTransformationsFeature @@ -66,3 +69,4 @@ public virtual void StepsWithNon_StringArguments() } } } +#endregion diff --git a/Tests/RuntimeTests/ExecutionTestBase.cs b/Tests/RuntimeTests/ExecutionTestBase.cs index 90171332a..66117a40b 100644 --- a/Tests/RuntimeTests/ExecutionTestBase.cs +++ b/Tests/RuntimeTests/ExecutionTestBase.cs @@ -187,6 +187,8 @@ private object CompileAndCreateTest(string fileName, Feature feature) compilerParameters.GenerateInMemory = true; compilerParameters.TempFiles.KeepFiles = true; + compilerParameters.ReferencedAssemblies.Add( + TestFileHelper.GetAssemblyPath(typeof (GeneratedCodeAttribute))); //System compilerParameters.ReferencedAssemblies.Add( TestFileHelper.GetAssemblyPath(typeof (TestAttribute))); //NUnit compilerParameters.ReferencedAssemblies.Add( diff --git a/changelog.txt b/changelog.txt index 84a5933c6..8c4bd245b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -14,6 +14,8 @@ New features: + Support for xUnit + Single installer for Visual Studio 2008 and 2010 (Issue 6, 10, 11) + SpecFlow Reporting doesn't work with Firefox (Issue 31) ++ Place GeneratedCodeAttribute and 'Designer generated code' region on generated code to + avoid having this code parsed by code analysis. (Issue 33) 1.2.0 - 2009/11/25 From 4af28575b82528635428398a816cb0b9e47d4064 Mon Sep 17 00:00:00 2001 From: Gaspar Nagy Date: Mon, 3 May 2010 14:20:27 +0200 Subject: [PATCH 28/34] fix firefox javascript in reports --- Reporting/Common/Common.xslt | 60 +++++++++++++++---- .../NUnitExecutionReport.xslt | 4 +- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/Reporting/Common/Common.xslt b/Reporting/Common/Common.xslt index cd7323fde..772b40dc7 100644 --- a/Reporting/Common/Common.xslt +++ b/Reporting/Common/Common.xslt @@ -202,7 +202,12 @@ ]"; @@ -228,13 +257,20 @@