Browse Source

Add MSpec addin.

pull/32/merge
Matt Ward 13 years ago
parent
commit
29e267f154
  1. 22
      SharpDevelop.Tests.sln
  2. 15
      SharpDevelop.sln
  3. 20
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj
  4. 140
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs
  5. 386
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs
  6. 4
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecUnitTestMonitorTests.cs
  7. 42
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.sln
  8. 16
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj
  9. 19
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/BehaviorImportedTestMember.cs
  10. 32
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs
  11. 46
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs
  12. 94
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs
  13. 22
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestDebugger.cs
  14. 98
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestFramework.cs
  15. 41
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs
  16. 22
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProcessRunnerContext.cs
  17. 139
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs
  18. 16
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecUnitTestMonitor.cs
  19. 41
      src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MspecTestRunner.cs

22
SharpDevelop.Tests.sln

@ -213,6 +213,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage.Tests", "src\A
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Analysis\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Analysis\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications.Tests", "src\AddIns\Analysis\MachineSpecifications\MachineSpecifications.Tests\MachineSpecifications.Tests.csproj", "{172AE35D-2051-4977-AC13-0BF1B76374D5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications", "src\AddIns\Analysis\MachineSpecifications\MachineSpecifications\MachineSpecifications.csproj", "{D1DA3B8F-7313-4BDA-8880-461C5F007751}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortSD4AddInToSD5", "samples\PortSD4AddInToSD5\PortSD4AddInToSD5.csproj", "{E2FD63DA-8478-4066-934C-DA82A852C83A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortSD4AddInToSD5", "samples\PortSD4AddInToSD5\PortSD4AddInToSD5.csproj", "{E2FD63DA-8478-4066-934C-DA82A852C83A}"
EndProject EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "src\Tools\Tools.build", "{3DF4060F-5EE0-41CF-8096-F27355FD5511}" Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "src\Tools\Tools.build", "{3DF4060F-5EE0-41CF-8096-F27355FD5511}"
@ -857,6 +861,22 @@ Global
{85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU {85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|x86.Build.0 = Release|Any CPU {85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|x86.Build.0 = Release|Any CPU
{85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|x86.ActiveCfg = Release|Any CPU {85226AFB-CE71-4851-9A75-7EEC663A8E8A}.Release|x86.ActiveCfg = Release|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Debug|x86.Build.0 = Debug|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Debug|x86.ActiveCfg = Debug|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Release|Any CPU.Build.0 = Release|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Release|x86.Build.0 = Release|Any CPU
{172AE35D-2051-4977-AC13-0BF1B76374D5}.Release|x86.ActiveCfg = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|x86.Build.0 = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|x86.ActiveCfg = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.Build.0 = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|x86.Build.0 = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -951,5 +971,7 @@ Global
DC88D67C-E6B5-4994-9FA9-D4AB0E162FB3 = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9} DC88D67C-E6B5-4994-9FA9-D4AB0E162FB3 = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9}
{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9} {A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9}
{08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9} {08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9}
{172AE35D-2051-4977-AC13-0BF1B76374D5} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9}
{D1DA3B8F-7313-4BDA-8880-461C5F007751} = {B3352C08-3CB4-4DD9-996F-B9DCE4356BB9}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

15
SharpDevelop.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 11.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010 # Visual Studio 2010
# SharpDevelop 5.0 # SharpDevelop 4.3
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject ProjectSection(SolutionItems) = postProject
EndProjectSection EndProjectSection
@ -117,7 +117,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement", "src\Ad
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.PowerShell", "src\AddIns\Misc\PackageManagement\PowerShell\Project\PackageManagement.PowerShell.csproj", "{A406803B-C584-43A3-BCEE-A0BB3132CB5F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.PowerShell", "src\AddIns\Misc\PackageManagement\PowerShell\Project\PackageManagement.PowerShell.csproj", "{A406803B-C584-43A3-BCEE-A0BB3132CB5F}"
EndProject EndProject
Project("") = "SharpDevelop.EnvDTE", "src\AddIns\Misc\PackageManagement\SharpDevelop.EnvDTE\SharpDevelop.EnvDTE.vbproj", "752BD058-5517-48A1-BB27-5ED186FA052B" Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SharpDevelop.EnvDTE", "src\AddIns\Misc\PackageManagement\SharpDevelop.EnvDTE\SharpDevelop.EnvDTE.vbproj", "752BD058-5517-48A1-BB27-5ED186FA052B"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}"
ProjectSection(SolutionItems) = postProject ProjectSection(SolutionItems) = postProject
@ -175,6 +175,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceAnalysis", "src\AddIn
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Analysis\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Analysis\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications", "src\AddIns\Analysis\MachineSpecifications\MachineSpecifications\MachineSpecifications.csproj", "{D1DA3B8F-7313-4BDA-8880-461C5F007751}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E}"
ProjectSection(SolutionItems) = postProject ProjectSection(SolutionItems) = postProject
EndProjectSection EndProjectSection
@ -697,6 +699,14 @@ Global
752BD058-5517-48A1-BB27-5ED186FA052B.Release|Any CPU.ActiveCfg = Release|Any CPU 752BD058-5517-48A1-BB27-5ED186FA052B.Release|Any CPU.ActiveCfg = Release|Any CPU
752BD058-5517-48A1-BB27-5ED186FA052B.Release|x86.Build.0 = Release|Any CPU 752BD058-5517-48A1-BB27-5ED186FA052B.Release|x86.Build.0 = Release|Any CPU
752BD058-5517-48A1-BB27-5ED186FA052B.Release|x86.ActiveCfg = Release|Any CPU 752BD058-5517-48A1-BB27-5ED186FA052B.Release|x86.ActiveCfg = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|x86.Build.0 = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|x86.ActiveCfg = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.Build.0 = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|x86.Build.0 = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -773,6 +783,7 @@ Global
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} {3EAA45A9-735C-4AC7-A799-947B93EA449D} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7}
44FA68C9-DAD1-4C3C-90BB-3435F0D1D128 = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} 44FA68C9-DAD1-4C3C-90BB-3435F0D1D128 = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7}
{08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} {08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7}
{D1DA3B8F-7313-4BDA-8880-461C5F007751} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E} {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E} {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E}
EndGlobalSection EndGlobalSection

20
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj

@ -7,12 +7,18 @@
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace>ICSharpCode.MachineSpecifications.Tests</RootNamespace> <RootNamespace>ICSharpCode.MachineSpecifications.Tests</RootNamespace>
<AssemblyName>MachineSpecifications.Tests</AssemblyName> <AssemblyName>MachineSpecifications.Tests</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkProfile> <TargetFrameworkProfile>
</TargetFrameworkProfile> </TargetFrameworkProfile>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<OutputPath>..\..\..\..\..\bin\UnitTests\</OutputPath> <OutputPath>..\..\..\..\..\bin\UnitTests\</OutputPath>
<NoWin32Manifest>False</NoWin32Manifest>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>True</DebugSymbols> <DebugSymbols>True</DebugSymbols>
@ -20,6 +26,7 @@
<Optimize>False</Optimize> <Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>False</DebugSymbols> <DebugSymbols>False</DebugSymbols>
@ -28,6 +35,13 @@
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<BaseAddress>4194304</BaseAddress>
<Prefer32Bit>False</Prefer32Bit>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="developwithpassion.specifications"> <Reference Include="developwithpassion.specifications">
<HintPath>..\Libraries\developwithpassion.specifications.rhinomocks.0.4.13.0\developwithpassion.specifications.dll</HintPath> <HintPath>..\Libraries\developwithpassion.specifications.rhinomocks.0.4.13.0\developwithpassion.specifications.dll</HintPath>
@ -79,10 +93,6 @@
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project> <Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name> <Name>ICSharpCode.Core</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>
</ProjectReference>
<ProjectReference Include="..\..\UnitTesting\UnitTesting.csproj"> <ProjectReference Include="..\..\UnitTesting\UnitTesting.csproj">
<Project>{1F261725-6318-4434-A1B1-6C70CE4CD324}</Project> <Project>{1F261725-6318-4434-A1B1-6C70CE4CD324}</Project>
<Name>UnitTesting</Name> <Name>UnitTesting</Name>

140
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs

@ -1,70 +1,70 @@
/* ///*
* Created by SharpDevelop. // * Created by SharpDevelop.
* User: trecio // * User: trecio
* Date: 2011-09-23 // * Date: 2011-09-23
* Time: 19:53 // * Time: 19:53
* // *
* To change this template use Tools | Options | Coding | Edit Standard Headers. // * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ // */
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using developwithpassion.specifications.extensions; //using developwithpassion.specifications.extensions;
using developwithpassion.specifications.rhinomocks; //using developwithpassion.specifications.rhinomocks;
using ICSharpCode.SharpDevelop.Dom; //using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project; //using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.UnitTesting; //using ICSharpCode.UnitTesting;
using Machine.Specifications; //using Machine.Specifications;
using Machine.Fakes.Adapters.Rhinomocks; //using Machine.Fakes.Adapters.Rhinomocks;
//
namespace ICSharpCode.MachineSpecifications.Tests //namespace ICSharpCode.MachineSpecifications.Tests
{ //{
[Subject(typeof(ClassFilterBuilder))] // [Subject(typeof(ClassFilterBuilder))]
public class When_building_class_filter_from_test_selection : Observes<ClassFilterBuilder> // public class When_building_class_filter_from_test_selection : Observes<ClassFilterBuilder>
{ // {
const string NAMESPACE_FILTER = "Namespace"; // const string NAMESPACE_FILTER = "Namespace";
static DefaultClass classAddedExplicitly, classInNamespace, classOutsideNamespace, classNestedInAddedExplicitly, classNestedInClassInNamespace; // static DefaultClass classAddedExplicitly, classInNamespace, classOutsideNamespace, classNestedInAddedExplicitly, classNestedInClassInNamespace;
static SelectedTests selectedTests; // static SelectedTests selectedTests;
static IProjectContent projectContent; // static IProjectContent projectContent;
static IList<string> result; // static IList<string> result;
//
Establish ctx = () => { // Establish ctx = () => {
projectContent = fake.an<IProjectContent>(); // projectContent = fake.an<IProjectContent>();
projectContent.setup(x => x.SystemTypes).Return(new SystemTypes(projectContent)); // projectContent.setup(x => x.SystemTypes).Return(new SystemTypes(projectContent));
var compilationUnit = new DefaultCompilationUnit(projectContent); // var compilationUnit = new DefaultCompilationUnit(projectContent);
//
classAddedExplicitly = new DefaultClass(compilationUnit, "ClassAddedExplicitly"); // classAddedExplicitly = new DefaultClass(compilationUnit, "ClassAddedExplicitly");
classNestedInAddedExplicitly = new DefaultClass(compilationUnit, classAddedExplicitly); // classNestedInAddedExplicitly = new DefaultClass(compilationUnit, classAddedExplicitly);
classNestedInAddedExplicitly.FullyQualifiedName = "ClassAddedExplicitly.InnerClass"; // classNestedInAddedExplicitly.FullyQualifiedName = "ClassAddedExplicitly.InnerClass";
classAddedExplicitly.InnerClasses.Add(classNestedInAddedExplicitly); // classAddedExplicitly.InnerClasses.Add(classNestedInAddedExplicitly);
//
classInNamespace = new DefaultClass(compilationUnit, "Namespace.OtherNamespace.ClassInNamespace"); // classInNamespace = new DefaultClass(compilationUnit, "Namespace.OtherNamespace.ClassInNamespace");
classNestedInClassInNamespace = new DefaultClass(compilationUnit, classInNamespace); // classNestedInClassInNamespace = new DefaultClass(compilationUnit, classInNamespace);
classNestedInClassInNamespace.FullyQualifiedName = "Namespace.OtherNamespace.ClassInNamespace.InnerClass"; // classNestedInClassInNamespace.FullyQualifiedName = "Namespace.OtherNamespace.ClassInNamespace.InnerClass";
classInNamespace.InnerClasses.Add(classNestedInClassInNamespace); // classInNamespace.InnerClasses.Add(classNestedInClassInNamespace);
classOutsideNamespace = new DefaultClass(compilationUnit, "Namespace2.ClassOutsideNamespac"); // classOutsideNamespace = new DefaultClass(compilationUnit, "Namespace2.ClassOutsideNamespac");
//
var project = fake.an<IProject>(); // var project = fake.an<IProject>();
projectContent.setup(x => x.Classes).Return(new[]{classInNamespace, classOutsideNamespace}); // projectContent.setup(x => x.Classes).Return(new[]{classInNamespace, classOutsideNamespace});
//
selectedTests = new SelectedTests(project, NAMESPACE_FILTER, classAddedExplicitly, null); // selectedTests = new SelectedTests(project, NAMESPACE_FILTER, classAddedExplicitly, null);
}; // };
//
Because of = () => // Because of = () =>
result = sut.BuildFilterFor(selectedTests, projectContent); // result = sut.BuildFilterFor(selectedTests, projectContent);
//
It should_add_dotnet_name_of_selected_test_class = () => // It should_add_dotnet_name_of_selected_test_class = () =>
result.ShouldContain(classAddedExplicitly.DotNetName); // result.ShouldContain(classAddedExplicitly.DotNetName);
//
It should_add_class_included_in_selected_namespace = () => // It should_add_class_included_in_selected_namespace = () =>
result.ShouldContain(classInNamespace.DotNetName); // result.ShouldContain(classInNamespace.DotNetName);
//
It should_not_include_class_not_included_in_namespace = () => // It should_not_include_class_not_included_in_namespace = () =>
result.ShouldNotContain(classOutsideNamespace.DotNetName); // result.ShouldNotContain(classOutsideNamespace.DotNetName);
//
It should_not_include_class_nested_in_selected_test_class = () => // It should_not_include_class_nested_in_selected_test_class = () =>
result.ShouldNotContain(classNestedInAddedExplicitly.DotNetName); // result.ShouldNotContain(classNestedInAddedExplicitly.DotNetName);
//
It should_include_class_nested_in_class_from_selected_namespace = () => // It should_include_class_nested_in_class_from_selected_namespace = () =>
result.ShouldContain(classNestedInClassInNamespace.DotNetName); // result.ShouldContain(classNestedInClassInNamespace.DotNetName);
} // }
} //}

386
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs

@ -1,193 +1,193 @@
/* ///*
* Created by SharpDevelop. // * Created by SharpDevelop.
* User: trecio // * User: trecio
* Date: 2011-06-18 // * Date: 2011-06-18
* Time: 15:12 // * Time: 15:12
* // *
* To change this template use Tools | Options | Coding | Edit Standard Headers. // * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ // */
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using System.Collections.ObjectModel; //using System.Collections.ObjectModel;
using System.Linq; //using System.Linq;
using developwithpassion.specifications.extensions; //using developwithpassion.specifications.extensions;
using developwithpassion.specifications.dsl; //using developwithpassion.specifications.dsl;
using developwithpassion.specifications.rhinomocks; //using developwithpassion.specifications.rhinomocks;
using ICSharpCode.SharpDevelop.Project; //using ICSharpCode.SharpDevelop.Project;
using Machine.Specifications; //using Machine.Specifications;
using ICSharpCode.UnitTesting; //using ICSharpCode.UnitTesting;
using ICSharpCode.SharpDevelop.Dom; //using ICSharpCode.SharpDevelop.Dom;
using Rhino.Mocks; //using Rhino.Mocks;
//
namespace ICSharpCode.MachineSpecifications.Tests //namespace ICSharpCode.MachineSpecifications.Tests
{ //{
[Subject(typeof(MSpecTestFramework))] // [Subject(typeof(MSpecTestFramework))]
public class When_checking_if_is_a_test_project : Observes<MSpecTestFramework> // public class When_checking_if_is_a_test_project : Observes<MSpecTestFramework>
{ // {
static IProject testProject; // static IProject testProject;
static IProject nonTestProject; // static IProject nonTestProject;
//
static bool resultForTestProject; // static bool resultForTestProject;
static bool resultForNonTestProject; // static bool resultForNonTestProject;
//
const string MSpecAssemblyName = "Machine.Specifications"; // const string MSpecAssemblyName = "Machine.Specifications";
//
Establish ctx = () => // Establish ctx = () =>
{ // {
testProject = fake.an<IProject>(); // testProject = fake.an<IProject>();
var mspecReference = MockRepository.GenerateStub<ReferenceProjectItem>(testProject); // var mspecReference = MockRepository.GenerateStub<ReferenceProjectItem>(testProject);
mspecReference.setup(x => x.ShortName).Return(MSpecAssemblyName); // mspecReference.setup(x => x.ShortName).Return(MSpecAssemblyName);
testProject.setup(x => x.Items).Return(new ReadOnlyCollection<ProjectItem>(new[] { mspecReference })); // testProject.setup(x => x.Items).Return(new ReadOnlyCollection<ProjectItem>(new[] { mspecReference }));
//
nonTestProject = fake.an<IProject>(); // nonTestProject = fake.an<IProject>();
var otherReference = MockRepository.GenerateStub<ReferenceProjectItem>(nonTestProject); // var otherReference = MockRepository.GenerateStub<ReferenceProjectItem>(nonTestProject);
mspecReference.setup(x => x.ShortName).Return("System.Configuration"); // mspecReference.setup(x => x.ShortName).Return("System.Configuration");
nonTestProject.setup(x => x.Items).Return(new ReadOnlyCollection<ProjectItem>(new[] { otherReference })); // nonTestProject.setup(x => x.Items).Return(new ReadOnlyCollection<ProjectItem>(new[] { otherReference }));
}; // };
//
Because of = () => // Because of = () =>
{ // {
resultForTestProject = sut.IsTestProject(testProject); // resultForTestProject = sut.IsTestProject(testProject);
resultForNonTestProject = sut.IsTestProject(nonTestProject); // resultForNonTestProject = sut.IsTestProject(nonTestProject);
}; // };
//
It should_return_true_for_project_which_has_reference_to_test_framework = () => // It should_return_true_for_project_which_has_reference_to_test_framework = () =>
resultForTestProject.ShouldBeTrue(); // resultForTestProject.ShouldBeTrue();
//
It should_return_false_for_project_which_has_no_reference_to_test_framework = () => // It should_return_false_for_project_which_has_no_reference_to_test_framework = () =>
resultForNonTestProject.ShouldBeFalse(); // resultForNonTestProject.ShouldBeFalse();
} // }
//
public abstract class MSpecTestFrameworkFieldsConcern : Observes<MSpecTestFramework> // public abstract class MSpecTestFrameworkFieldsConcern : Observes<MSpecTestFramework>
{ // {
protected static ICompilationUnit CompilationUnit; // protected static ICompilationUnit CompilationUnit;
//
Establish ctx = () => // Establish ctx = () =>
{ // {
var ProjectContent = fake.an<IProjectContent>(); // var ProjectContent = fake.an<IProjectContent>();
ProjectContent.setup(x => x.SystemTypes).Return(new SystemTypes(ProjectContent)); // ProjectContent.setup(x => x.SystemTypes).Return(new SystemTypes(ProjectContent));
CompilationUnit = new DefaultCompilationUnit(ProjectContent); // CompilationUnit = new DefaultCompilationUnit(ProjectContent);
}; // };
//
protected const string MSpecItTypeName = "Machine.Specifications.It"; // protected const string MSpecItTypeName = "Machine.Specifications.It";
protected const string MSpecBehavesTypeName = "Machine.Specifications.Behaves_like"; // protected const string MSpecBehavesTypeName = "Machine.Specifications.Behaves_like";
protected const string MSpecBehaviorTypeName = "Machine.Specifications.BehaviorsAttribute"; // protected const string MSpecBehaviorTypeName = "Machine.Specifications.BehaviorsAttribute";
//
protected static IClass SetupClass(bool isAbstract, IList<IField> fields, IList<IAttribute> attributes) // protected static IClass SetupClass(bool isAbstract, IList<IField> fields, IList<IAttribute> attributes)
{ // {
var c = fake.an<IClass>(); // var c = fake.an<IClass>();
c.setup(x => x.IsAbstract).Return(isAbstract); // c.setup(x => x.IsAbstract).Return(isAbstract);
c.setup(x => x.Fields).Return(fields); // c.setup(x => x.Fields).Return(fields);
c.setup(x => x.Attributes).Return(attributes); // c.setup(x => x.Attributes).Return(attributes);
return c; // return c;
} // }
//
protected static IField SetupField(string returnTypeName) // protected static IField SetupField(string returnTypeName)
{ // {
var field = fake.an<IField>(); // var field = fake.an<IField>();
field.ReturnType = SetupReturnType(returnTypeName); // field.ReturnType = SetupReturnType(returnTypeName);
return field; // return field;
} // }
//
protected static IAttribute SetupBehaviorAttribute() // protected static IAttribute SetupBehaviorAttribute()
{ // {
var attribute = fake.an<IAttribute>(); // var attribute = fake.an<IAttribute>();
attribute.setup(x => x.AttributeType).Return(SetupReturnType(MSpecBehaviorTypeName)); // attribute.setup(x => x.AttributeType).Return(SetupReturnType(MSpecBehaviorTypeName));
return attribute; // return attribute;
} // }
//
protected static IReturnType SetupReturnType(string typeName) // protected static IReturnType SetupReturnType(string typeName)
{ // {
var returnType = fake.an<IReturnType>(); // var returnType = fake.an<IReturnType>();
returnType.Stub(x => x.FullyQualifiedName).Return(typeName); // returnType.Stub(x => x.FullyQualifiedName).Return(typeName);
return returnType; // return returnType;
} // }
} // }
//
[Subject(typeof(MSpecTestFramework))] // [Subject(typeof(MSpecTestFramework))]
public class When_checking_if_is_a_test_class : MSpecTestFrameworkFieldsConcern // public class When_checking_if_is_a_test_class : MSpecTestFrameworkFieldsConcern
{ // {
static IClass classWithoutSpecificationMembers; // static IClass classWithoutSpecificationMembers;
static IClass classWithSpecificationMembers; // static IClass classWithSpecificationMembers;
static IClass classWithBehavior; // static IClass classWithBehavior;
static IClass classWithSpecificationMembersAndBehaviorAttribute; // static IClass classWithSpecificationMembersAndBehaviorAttribute;
//
static bool resultForClassWithBehaviorAttribute; // static bool resultForClassWithBehaviorAttribute;
static bool resultForClassWithSpecifications; // static bool resultForClassWithSpecifications;
static bool resultForClassWithBehavior; // static bool resultForClassWithBehavior;
static bool resultForClassWithoutSpecifications; // static bool resultForClassWithoutSpecifications;
//
Establish ctx = () => // Establish ctx = () =>
{ // {
classWithoutSpecificationMembers = SetupClass(false, new IField[0], new IAttribute[0]); // classWithoutSpecificationMembers = SetupClass(false, new IField[0], new IAttribute[0]);
classWithSpecificationMembers = SetupClass(false, new IField[] { SetupField(MSpecItTypeName) }, new IAttribute[0]); // classWithSpecificationMembers = SetupClass(false, new IField[] { SetupField(MSpecItTypeName) }, new IAttribute[0]);
classWithBehavior = SetupClass(false, new IField[] { SetupField(MSpecBehavesTypeName) }, new IAttribute[0]); // classWithBehavior = SetupClass(false, new IField[] { SetupField(MSpecBehavesTypeName) }, new IAttribute[0]);
classWithSpecificationMembersAndBehaviorAttribute = SetupClass(false, new IField[] { SetupField(MSpecItTypeName) }, new IAttribute[] { SetupBehaviorAttribute() }); // classWithSpecificationMembersAndBehaviorAttribute = SetupClass(false, new IField[] { SetupField(MSpecItTypeName) }, new IAttribute[] { SetupBehaviorAttribute() });
}; // };
//
Because of = () => // Because of = () =>
{ // {
resultForClassWithoutSpecifications = sut.IsTestClass(classWithoutSpecificationMembers); // resultForClassWithoutSpecifications = sut.IsTestClass(classWithoutSpecificationMembers);
resultForClassWithSpecifications = sut.IsTestClass(classWithSpecificationMembers); // resultForClassWithSpecifications = sut.IsTestClass(classWithSpecificationMembers);
resultForClassWithBehavior = sut.IsTestClass(classWithBehavior); // resultForClassWithBehavior = sut.IsTestClass(classWithBehavior);
resultForClassWithBehaviorAttribute = sut.IsTestClass(classWithSpecificationMembersAndBehaviorAttribute); // resultForClassWithBehaviorAttribute = sut.IsTestClass(classWithSpecificationMembersAndBehaviorAttribute);
}; // };
//
It should_return_false_for_class_without_specification_members = () => // It should_return_false_for_class_without_specification_members = () =>
resultForClassWithoutSpecifications.ShouldBeFalse(); // resultForClassWithoutSpecifications.ShouldBeFalse();
//
It should_return_true_for_class_with_specification_members = () => // It should_return_true_for_class_with_specification_members = () =>
resultForClassWithSpecifications.ShouldBeTrue(); // resultForClassWithSpecifications.ShouldBeTrue();
//
It should_return_true_for_class_with_behavior = () => // It should_return_true_for_class_with_behavior = () =>
resultForClassWithBehavior.ShouldBeTrue(); // resultForClassWithBehavior.ShouldBeTrue();
//
It should_return_false_for_class_with_behavior_attribute = () => // It should_return_false_for_class_with_behavior_attribute = () =>
resultForClassWithBehaviorAttribute.ShouldBeFalse(); // resultForClassWithBehaviorAttribute.ShouldBeFalse();
} // }
//
public class When_enumerating_test_members : MSpecTestFrameworkFieldsConcern // public class When_enumerating_test_members : MSpecTestFrameworkFieldsConcern
{ // {
static IClass behaviorClass; // static IClass behaviorClass;
static IField testSpecificationInBehavior; // static IField testSpecificationInBehavior;
//
static IClass testClass; // static IClass testClass;
static IField testSpecification; // static IField testSpecification;
static IField otherField; // static IField otherField;
static IField behavesLikeField; // static IField behavesLikeField;
//
static IEnumerable<TestMember> result; // static IEnumerable<TestMember> result;
//
const string BehaviorClassName = "Test.Behavior"; // const string BehaviorClassName = "Test.Behavior";
//
Establish ctx = () => // Establish ctx = () =>
{ // {
var itReturnType = SetupReturnType(MSpecItTypeName); // var itReturnType = SetupReturnType(MSpecItTypeName);
//
behaviorClass = new DefaultClass(CompilationUnit, "BehaviorClass"); // behaviorClass = new DefaultClass(CompilationUnit, "BehaviorClass");
testSpecificationInBehavior = new DefaultField(itReturnType, "testSpecificationInBehavior", ModifierEnum.None, DomRegion.Empty, behaviorClass); // testSpecificationInBehavior = new DefaultField(itReturnType, "testSpecificationInBehavior", ModifierEnum.None, DomRegion.Empty, behaviorClass);
behaviorClass.Fields.Add(testSpecificationInBehavior); // behaviorClass.Fields.Add(testSpecificationInBehavior);
//
testClass = new DefaultClass(CompilationUnit, "TestClass"); // testClass = new DefaultClass(CompilationUnit, "TestClass");
testSpecification = new DefaultField(itReturnType, "testSpecification", ModifierEnum.None, DomRegion.Empty, testClass); // testSpecification = new DefaultField(itReturnType, "testSpecification", ModifierEnum.None, DomRegion.Empty, testClass);
testClass.Fields.Add(testSpecification); // testClass.Fields.Add(testSpecification);
otherField = new DefaultField(fake.an<IReturnType>(), "OtherField", ModifierEnum.None, DomRegion.Empty, testClass); // otherField = new DefaultField(fake.an<IReturnType>(), "OtherField", ModifierEnum.None, DomRegion.Empty, testClass);
testClass.Fields.Add(otherField); // testClass.Fields.Add(otherField);
//
var behavesLikeReturnType = new ConstructedReturnType(SetupReturnType(MSpecBehavesTypeName), new List<IReturnType>{new DefaultReturnType(behaviorClass)}); // var behavesLikeReturnType = new ConstructedReturnType(SetupReturnType(MSpecBehavesTypeName), new List<IReturnType>{new DefaultReturnType(behaviorClass)});
behavesLikeField = new DefaultField(behavesLikeReturnType, "behavesLikeField", ModifierEnum.None, new DomRegion(), testClass); // behavesLikeField = new DefaultField(behavesLikeReturnType, "behavesLikeField", ModifierEnum.None, new DomRegion(), testClass);
testClass.Fields.Add(behavesLikeField); // testClass.Fields.Add(behavesLikeField);
}; // };
//
Because of = () => result = sut.GetTestMembersFor(testClass); // Because of = () => result = sut.GetTestMembersFor(testClass);
//
It should_contain_field_with_it_return_type = () => // It should_contain_field_with_it_return_type = () =>
result.Select(m => m.Member).ShouldContain(testSpecification); // result.Select(m => m.Member).ShouldContain(testSpecification);
//
It should_not_contain_field_with_arbitrary_return_type = () => // It should_not_contain_field_with_arbitrary_return_type = () =>
result.Select(m => m.Member).ShouldNotContain(otherField); // result.Select(m => m.Member).ShouldNotContain(otherField);
//
It should_contain_imported_field_from_behavior = () => // It should_contain_imported_field_from_behavior = () =>
result.Select(m => m.Member).ShouldContain(member => member.FullyQualifiedName == "TestClass.testSpecificationInBehavior"); // result.Select(m => m.Member).ShouldContain(member => member.FullyQualifiedName == "TestClass.testSpecificationInBehavior");
} // }
} //}

4
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecUnitTestMonitorTests.cs

@ -14,10 +14,10 @@ namespace ICSharpCode.MachineSpecifications.Tests.Src
private Because of = () => private Because of = () =>
{ {
sut.Start(); sut.Start();
sut.TestFinished += (source, e) => FinishedTests.Add(e.Result);; sut.TestFinished += (source, e) => FinishedTests.Add(e.Result);
sut.FileName = FILE_NAME; sut.FileName = FILE_NAME;
sut.Read(); sut.Read();
sut.Stop(); sut.Join();
}; };
private It should_create_test_result_for_passed_test_with_status_set_to_success = () => private It should_create_test_result_for_passed_test_with_status_set_to_success = () =>

42
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 11.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010 # Visual Studio 2010
# SharpDevelop 4.2.0.8235-alpha # SharpDevelop 4.3
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications", "MachineSpecifications\MachineSpecifications.csproj", "{D1DA3B8F-7313-4BDA-8880-461C5F007751}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications", "MachineSpecifications\MachineSpecifications.csproj", "{D1DA3B8F-7313-4BDA-8880-461C5F007751}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications.Tests", "MachineSpecifications.Tests\MachineSpecifications.Tests.csproj", "{172AE35D-2051-4977-AC13-0BF1B76374D5}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications.Tests", "MachineSpecifications.Tests\MachineSpecifications.Tests.csproj", "{172AE35D-2051-4977-AC13-0BF1B76374D5}"
@ -10,10 +10,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "..\..\.
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "..\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "..\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj", "{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -52,14 +56,6 @@ Global
{2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.Build.0 = Release|Any CPU {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|Any CPU.Build.0 = Release|Any CPU
{2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.ActiveCfg = Release|Any CPU {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.ActiveCfg = Release|Any CPU
{2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.Build.0 = Release|Any CPU {2748AD25-9C63-4E12-877B-4DCE96FBED54}.Release|x86.Build.0 = Release|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.ActiveCfg = Debug|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Debug|x86.Build.0 = Debug|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|Any CPU.Build.0 = Release|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.ActiveCfg = Release|Any CPU
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}.Release|x86.Build.0 = Release|Any CPU
{1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.Build.0 = Debug|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|x86.ActiveCfg = Debug|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -70,6 +66,30 @@ Global
{1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|x86.Build.0 = Release|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|x86.Build.0 = Release|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.Build.0 = Debug|Any CPU {D1DA3B8F-7313-4BDA-8880-461C5F007751}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.Build.0 = Release|Any CPU {D1DA3B8F-7313-4BDA-8880-461C5F007751}.Release|Any CPU.Build.0 = Release|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|Any CPU.ActiveCfg = net_4_5_Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x86.Build.0 = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Debug|x86.ActiveCfg = Debug|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|Any CPU.Build.0 = Release|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x86.Build.0 = Release|Any CPU
{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}.Release|x86.ActiveCfg = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.Build.0 = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|x86.ActiveCfg = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.Build.0 = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|x86.ActiveCfg = Release|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.Build.0 = Debug|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Debug|x86.ActiveCfg = Debug|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.Build.0 = Release|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.Build.0 = Release|Any CPU
{8035765F-D51F-4A0C-A746-2FD100E19419}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

16
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj

@ -19,6 +19,7 @@
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress> <BaseAddress>4194304</BaseAddress>
<FileAlignment>4096</FileAlignment> <FileAlignment>4096</FileAlignment>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<Optimize>False</Optimize> <Optimize>False</Optimize>
@ -99,12 +100,21 @@
<Compile Include="src\BehaviorImportedTestMember.cs" /> <Compile Include="src\BehaviorImportedTestMember.cs" />
<Compile Include="src\ClassFilterBuilder.cs" /> <Compile Include="src\ClassFilterBuilder.cs" />
<Compile Include="src\MSpecApplication.cs" /> <Compile Include="src\MSpecApplication.cs" />
<Compile Include="src\MSpecTestClass.cs" />
<Compile Include="src\MSpecTestDebugger.cs" /> <Compile Include="src\MSpecTestDebugger.cs" />
<Compile Include="src\MSpecTestMember.cs" />
<Compile Include="src\MSpecTestFramework.cs" /> <Compile Include="src\MSpecTestFramework.cs" />
<Compile Include="src\MSpecTestProcessRunnerContext.cs" />
<Compile Include="src\MSpecTestProject.cs" />
<Compile Include="src\MspecTestRunner.cs" /> <Compile Include="src\MspecTestRunner.cs" />
<Compile Include="src\MSpecUnitTestMonitor.cs" /> <Compile Include="src\MSpecUnitTestMonitor.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj"> <ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project> <Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name> <Name>ICSharpCode.SharpDevelop</Name>
@ -115,9 +125,9 @@
<Name>ICSharpCode.Core</Name> <Name>ICSharpCode.Core</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj"> <ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project> <Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name> <Name>ICSharpCode.SharpDevelop.Widgets</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\UnitTesting\UnitTesting.csproj"> <ProjectReference Include="..\..\UnitTesting\UnitTesting.csproj">

19
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/BehaviorImportedTestMember.cs

@ -7,19 +7,26 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers. * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ */
using System; using System;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.UnitTesting; using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
{ {
/// <summary> public class BehaviorImportedTestMember : MSpecTestMember
/// Description of BehaviorImportedClass.
/// </summary>
public class BehaviorImportedTestMember : BaseTestMember
{ {
public BehaviorImportedTestMember(IClass testClass, IMember behaviorMember) IMember behavior;
: base(testClass, behaviorMember, behaviorMember.Name)
public BehaviorImportedTestMember(
MSpecTestProject parentProject,
IMember behavior)
: base(parentProject, behavior)
{ {
this.behavior = behavior;
}
public override string DisplayName {
get { return behavior.DeclaringType.Name + "." + behavior.Name; }
} }
} }
} }

32
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs

@ -18,26 +18,26 @@ namespace ICSharpCode.MachineSpecifications
/// </summary> /// </summary>
public class ClassFilterBuilder public class ClassFilterBuilder
{ {
public IList<string> BuildFilterFor(SelectedTests tests, IProjectContent @using) { public IList<string> BuildFilterFor(IEnumerable<ITest> tests) {
var projectContent = @using; //var projectContent = @using;
var filter = new List<string>(); var filter = new List<string>();
if (tests.Class != null) // if (tests.Class != null)
filter.Add(tests.Class.DotNetName); // filter.Add(tests.Class.DotNetName);
if (tests.NamespaceFilter != null) // if (tests.NamespaceFilter != null)
foreach (var projectClass in projectContent.Classes) // foreach (var projectClass in projectContent.Classes)
if (projectClass.FullyQualifiedName.StartsWith(tests.NamespaceFilter + ".")) // if (projectClass.FullyQualifiedName.StartsWith(tests.NamespaceFilter + "."))
Add(projectClass, to: filter); // Add(projectClass, to: filter);
return filter; return filter;
} }
//
static void Add(IClass @class, IList<string> to) // static void Add(IClass @class, IList<string> to)
{ // {
var list = to; // var list = to;
to.Add(@class.DotNetName); // to.Add(@class.DotNetName);
foreach (var innerClass in @class.InnerClasses) // foreach (var innerClass in @class.InnerClasses)
Add(innerClass, to: list); // Add(innerClass, to: list);
} // }
} }
} }

46
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs

@ -9,13 +9,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.UnitTesting;
using System.IO; using System.IO;
using System.Linq;
using System.Text;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using System.Text; using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
{ {
@ -24,28 +26,30 @@ namespace ICSharpCode.MachineSpecifications
/// </summary> /// </summary>
public class MSpecApplication public class MSpecApplication
{ {
public MSpecApplication(SelectedTests tests) { public MSpecApplication(IEnumerable<ITest> tests)
{
InitializeFrom(tests); InitializeFrom(tests);
} }
public ProcessStartInfo GetProcessStartInfo() { public ProcessStartInfo GetProcessStartInfo()
var result = new ProcessStartInfo(); {
result.FileName = ExecutableFileName; return new ProcessStartInfo {
result.Arguments = GetArguments(); FileName = ExecutableFileName,
result.WorkingDirectory = WorkingDirectory; Arguments = GetArguments()
};
return result;
} }
public string Results {get;set;} public string Results { get;set; }
void InitializeFrom(SelectedTests tests) { void InitializeFrom(IEnumerable<ITest> tests)
{
this.tests = tests; this.tests = tests;
project = tests.Project; ITest test = tests.FirstOrDefault();
if (test != null)
project = test.ParentProject.Project;
} }
SelectedTests tests; IEnumerable<ITest> tests;
IProject project; IProject project;
string GetArguments() string GetArguments()
@ -66,7 +70,7 @@ namespace ICSharpCode.MachineSpecifications
builder.Append("\""); builder.Append("\"");
builder.Append(project.OutputAssemblyFullPath); builder.Append(project.OutputAssemblyFullPath);
builder.Append("\""); builder.Append("\"");
return builder.ToString(); return builder.ToString();
} }
@ -74,8 +78,8 @@ namespace ICSharpCode.MachineSpecifications
string CreateFilterFile() string CreateFilterFile()
{ {
var classFilterBuilder = new ClassFilterBuilder(); var classFilterBuilder = new ClassFilterBuilder();
var projectContent = ParserService.GetProjectContent(project); //var projectContent = SD.ParserService.GetProjectContent(project);
var filter = classFilterBuilder.BuildFilterFor(tests, @using: projectContent); var filter = classFilterBuilder.BuildFilterFor(tests);
string path = null; string path = null;
if (filter.Count > 0) { if (filter.Count > 0) {
@ -83,7 +87,7 @@ namespace ICSharpCode.MachineSpecifications
using (var stream = new FileStream(path, FileMode.Create, FileAccess.Write)) using (var stream = new FileStream(path, FileMode.Create, FileAccess.Write))
using (var writer = new StreamWriter(stream)) using (var writer = new StreamWriter(stream))
foreach (var testClassName in filter) { foreach (var testClassName in filter) {
writer.WriteLine(testClassName); writer.WriteLine(testClassName);
} }
} }
return path; return path;

94
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs

@ -0,0 +1,94 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Widgets;
using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications
{
public class MSpecTestClass : TestBase
{
MSpecTestProject parentProject;
FullTypeName fullTypeName;
public MSpecTestClass(MSpecTestProject parentProject, FullTypeName fullTypeName)
{
this.parentProject = parentProject;
this.fullTypeName = fullTypeName;
BindResultToCompositeResultOfNestedTests();
}
public override ITestProject ParentProject {
get { return parentProject; }
}
public override string DisplayName {
get { return fullTypeName.Name; }
}
protected override void OnNestedTestsInitialized()
{
ITypeDefinition typeDefinition = Resolve();
if (typeDefinition != null) {
Update(typeDefinition);
}
base.OnNestedTestsInitialized();
}
public void Update(ITypeDefinition typeDefinition)
{
if (!NestedTestsInitialized)
return;
var newOrUpdatedTests = new HashSet<ITest>();
foreach (ITest test in parentProject.GetTestMembersFor(typeDefinition)) {
MSpecTestMember existingTest = FindTestMember(test);
if (existingTest == null) {
NestedTestCollection.Add(test);
newOrUpdatedTests.Add(test);
} else {
newOrUpdatedTests.Add(existingTest);
}
}
NestedTestCollection.RemoveAll(t => !newOrUpdatedTests.Contains(t));
}
MSpecTestMember FindTestMember(ITest test)
{
var testMember = test as MSpecTestMember;
return FindTestMember(testMember.DisplayName);
}
public MSpecTestMember FindTestMember(string name)
{
return NestedTestCollection
.OfType<MSpecTestMember>()
.LastOrDefault(member => member.DisplayName == name);
}
public override System.Windows.Input.ICommand GoToDefinition {
get {
return new RelayCommand(
delegate {
ITypeDefinition typeDefinition = Resolve();
if (typeDefinition != null)
NavigationService.NavigateTo(typeDefinition);
});
}
}
public ITypeDefinition Resolve()
{
ICompilation compilation = SD.ParserService.GetCompilation(parentProject.Project);
IType type = compilation.MainAssembly.GetTypeDefinition(fullTypeName);
return type.GetDefinition();
}
}
}

22
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestDebugger.cs

@ -7,7 +7,10 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers. * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ */
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.SharpDevelop;
using ICSharpCode.UnitTesting; using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
@ -17,20 +20,27 @@ namespace ICSharpCode.MachineSpecifications
/// </summary> /// </summary>
public class MSpecTestDebugger : TestDebuggerBase public class MSpecTestDebugger : TestDebuggerBase
{ {
public MSpecTestDebugger() public MSpecTestDebugger()
: base(new UnitTestDebuggerService(), new UnitTestMessageService(), new MSpecUnitTestMonitor()) : base(new UnitTestDebuggerService(), SD.MessageService, new MSpecUnitTestMonitor())
{ } {
}
protected override ProcessStartInfo GetProcessStartInfo(SelectedTests selectedTests) protected override ProcessStartInfo GetProcessStartInfo(IEnumerable<ITest> selectedTests)
{ {
var app = new MSpecApplication(selectedTests); var app = new MSpecApplication(selectedTests);
app.Results = TestResultsMonitor.FileName; var monitor = TestResultsReader as MSpecUnitTestMonitor;
app.Results = monitor.FileName;
return app.GetProcessStartInfo(); return app.GetProcessStartInfo();
} }
protected override TestResult CreateTestResultForTestFramework(TestResult testResult) protected override TestResult CreateTestResultForTestFramework(TestResult testResult)
{ {
return testResult; return testResult;
}
public override int GetExpectedNumberOfTestResults(IEnumerable<ITest> selectedTests)
{
return 0;
} }
} }
} }

98
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestFramework.cs

@ -1,11 +1,6 @@
/* // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
* Created by SharpDevelop. // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
* User: trecio
* Date: 2011-06-18
* Time: 13:31
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -16,102 +11,31 @@ using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
{ {
/// <summary>
/// Description of MSpecTestFramework.
/// </summary>
public class MSpecTestFramework : ITestFramework public class MSpecTestFramework : ITestFramework
{ {
public bool IsTestMember(IMember member) { public bool IsTestProject(IProject project)
return member is IField
&& HasItReturnType(member as IField);
}
public bool IsTestClass(IClass c) {
return HasSpecificationMembers(c) && !HasBehaviorAttribute(c);
}
public IEnumerable<TestMember> GetTestMembersFor(IClass @class) {
return GetTestMembers(@class, @class.Fields);
}
private IEnumerable<TestMember> GetTestMembers(IClass testClass, IList<IField> fields)
{ {
var result = fields.Where(HasItReturnType).Select(field => new TestMember(field)).ToList();
foreach (var field in fields)
if (HasBehavesLikeReturnType(field))
{
var behaviorFields = ResolveBehaviorFieldsOf(field);
var behaviorMembers = behaviorFields.Where(HasItReturnType);
var testMembersFromBehavior = behaviorMembers.Select(testField =>
new TestMember(testField.DeclaringType, new BehaviorImportedTestMember(testClass, testField)));
result.AddRange(testMembersFromBehavior);
}
return result;
}
public bool IsTestProject(IProject project) {
if (project != null) { if (project != null) {
foreach (ProjectItem item in project.Items) foreach (ProjectItem item in project.Items)
if (IsMSpecAssemblyReference(item)) if (IsMSpecAssemblyReference(item))
return true; return true;
} }
return false; return false;
} }
public ITestRunner CreateTestRunner() { public ITestProject CreateTestProject(ITestSolution parentSolution, IProject project)
return new MSpecTestRunner();
}
public ITestRunner CreateTestDebugger() {
return new MSpecTestDebugger();
}
public bool IsBuildNeededBeforeTestRun {
get {return true;}
}
private IList<IField> ResolveBehaviorFieldsOf(IField field)
{ {
var fieldReturnType = field.ReturnType.CastToConstructedReturnType(); return new MSpecTestProject(parentSolution, project);
if (fieldReturnType == null) return new List<IField>();
if (fieldReturnType.TypeArguments.Count != 1)
LoggingService.Error(string.Format("Expected behavior specification {0} to have one type argument but {1} found.", field.FullyQualifiedName, fieldReturnType.TypeArgumentCount));
var behaviorClassType = fieldReturnType.TypeArguments.FirstOrDefault();
return behaviorClassType != null ? behaviorClassType.GetFields() : new List<IField>();
}
private bool HasSpecificationMembers(IClass c) {
return !c.IsAbstract
&& c.Fields.Any(f => HasItReturnType(f) || HasBehavesLikeReturnType(f));
}
private bool HasBehavesLikeReturnType(IField field) {
return MSpecBehavesLikeFQName.Equals(field.ReturnType.FullyQualifiedName);
} }
private bool HasItReturnType(IField field) { private bool IsMSpecAssemblyReference(ProjectItem projectItem)
return MSpecItFQName.Equals(field.ReturnType.FullyQualifiedName); {
}
private bool HasBehaviorAttribute(IClass c) {
return c.Attributes.Any(
attribute => MSpecBehaviorsAttributeFQName.Equals(attribute.AttributeType.FullyQualifiedName));
}
private bool IsMSpecAssemblyReference(ProjectItem projectItem) {
if (projectItem is ReferenceProjectItem) { if (projectItem is ReferenceProjectItem) {
ReferenceProjectItem refProjectItem = projectItem as ReferenceProjectItem; var refProjectItem = projectItem as ReferenceProjectItem;
string name = refProjectItem.ShortName; string name = refProjectItem.ShortName;
return MSpecAssemblyName.Equals(name, StringComparison.OrdinalIgnoreCase); return MSpecTestProject.MSpecAssemblyName.Equals(name, StringComparison.OrdinalIgnoreCase);
} }
return false; return false;
} }
const string MSpecAssemblyName = "Machine.Specifications";
const string MSpecItFQName = MSpecAssemblyName + ".It";
const string MSpecBehavesLikeFQName = MSpecAssemblyName + ".Behaves_like";
const string MSpecBehaviorsAttributeFQName = MSpecAssemblyName + ".BehaviorsAttribute";
} }
} }

41
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs

@ -0,0 +1,41 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications
{
public class MSpecTestMember : TestBase
{
MSpecTestProject parentProject;
string displayName;
public MSpecTestMember(MSpecTestProject parentProject, string displayName)
{
this.parentProject = parentProject;
this.displayName = displayName;
}
public MSpecTestMember(
MSpecTestProject parentProject,
IMember member)
: this(parentProject, member.DeclaringType.Name + "." + member.Name)
{
}
public override ITestProject ParentProject {
get { return parentProject; }
}
public override string DisplayName {
get { return displayName; }
}
public void UpdateTestResult(TestResult result)
{
this.Result = result.ResultType;
}
}
}

22
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProcessRunnerContext.cs

@ -0,0 +1,22 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications
{
public class MSpecTestProcessRunnerContext : TestProcessRunnerBaseContext
{
public MSpecTestProcessRunnerContext(TestExecutionOptions options)
: base(
options,
new UnitTestProcessRunner(),
new MSpecUnitTestMonitor(),
new UnitTestFileService(),
SD.MessageService)
{
}
}
}

139
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs

@ -0,0 +1,139 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications
{
public class MSpecTestProject : TestProjectBase
{
public const string MSpecAssemblyName = "Machine.Specifications";
const string MSpecItFQName = MSpecAssemblyName + ".It";
const string MSpecBehavesLikeFQName = MSpecAssemblyName + ".Behaves_like";
const string MSpecBehaviorsAttributeFQName = MSpecAssemblyName + ".BehaviorsAttribute";
public MSpecTestProject(ITestSolution parentSolution, IProject project)
: base(project)
{
}
public override void UpdateTestResult(TestResult result)
{
// Code duplication - taken from NUnitTestProject
int lastDot = result.Name.LastIndexOf('.');
if (lastDot < 0)
return;
string fixtureName = result.Name.Substring(0, lastDot);
string memberName = result.Name.Substring(lastDot + 1);
var testClass = GetMSpecTestClass(new FullTypeName(fixtureName)) as MSpecTestClass;
MSpecTestMember test = testClass.FindTestMember(memberName);
if (test != null)
test.UpdateTestResult(result);
}
MSpecTestClass GetMSpecTestClass(FullTypeName fullTypeName)
{
return GetTestClass(fullTypeName.TopLevelTypeName) as MSpecTestClass;
}
protected override void UpdateTestClass(ITest test, ITypeDefinition typeDefinition)
{
var mspecTest = test as MSpecTestClass;
mspecTest.Update(typeDefinition);
}
protected override bool IsTestClass(ITypeDefinition typeDefinition)
{
return HasSpecificationMembers(typeDefinition) && !HasBehaviorAttribute(typeDefinition);
}
public override IEnumerable<ITest> GetTestsForEntity(IEntity entity)
{
return new ITest[0];
}
public override ITestRunner CreateTestRunner(TestExecutionOptions options)
{
if (options.UseDebugger)
return new MSpecTestDebugger();
return new MSpecTestRunner(options);
}
protected override ITest CreateTestClass(ITypeDefinition typeDefinition)
{
if (IsTestClass(typeDefinition))
return new MSpecTestClass(this, typeDefinition.FullTypeName);
return null;
}
public bool IsTestMember(IMember member)
{
return member is IField && HasItReturnType(member as IField);
}
public IEnumerable<ITest> GetTestMembersFor(ITypeDefinition typeDefinition)
{
return GetTestMembers(typeDefinition, typeDefinition.Fields);
}
IEnumerable<ITest> GetTestMembers(ITypeDefinition testClass, IEnumerable<IField> fields)
{
var result = fields.Where(HasItReturnType).Select(field => new MSpecTestMember(this, field.Name)).ToList();
foreach (var field in fields) {
if (HasBehavesLikeReturnType(field)) {
var behaviorFields = ResolveBehaviorFieldsOf(field);
var behaviorMembers = behaviorFields.Where(HasItReturnType);
var testMembersFromBehavior = behaviorMembers.Select(testField =>
new BehaviorImportedTestMember(this, testField));
result.AddRange(testMembersFromBehavior);
}
}
return result;
}
IEnumerable<IField> ResolveBehaviorFieldsOf(IField field)
{
var fieldReturnType = field.ReturnType;
if (fieldReturnType == null) return new List<IField>();
if (fieldReturnType.TypeArguments.Count != 1)
LoggingService.Error(string.Format("Expected behavior specification {0} to have one type argument but {1} found.", field.FullName, fieldReturnType.TypeArguments.Count));
var behaviorClassType = fieldReturnType.TypeArguments.FirstOrDefault();
return behaviorClassType != null ? behaviorClassType.GetFields() : new List<IField>();
}
private bool HasSpecificationMembers(ITypeDefinition typeDefinition)
{
return !typeDefinition.IsAbstract
&& typeDefinition.Fields.Any(f => HasItReturnType(f) || HasBehavesLikeReturnType(f));
}
private bool HasBehavesLikeReturnType(IField field)
{
return MSpecBehavesLikeFQName.Equals(field.ReturnType.FullName);
}
private bool HasItReturnType(IField field)
{
return MSpecItFQName.Equals(field.ReturnType.FullName);
}
private bool HasBehaviorAttribute(ITypeDefinition typeDefinition)
{
return typeDefinition.Attributes.Any(
attribute => MSpecBehaviorsAttributeFQName.Equals(attribute.AttributeType.FullName));
}
}
}

16
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecUnitTestMonitor.cs

@ -9,9 +9,9 @@ using System.Xml;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
{ {
public class MSpecUnitTestMonitor : ITestResultsMonitor public class MSpecUnitTestMonitor : ITestResultsReader
{ {
public event TestFinishedEventHandler TestFinished; public event EventHandler<TestFinishedEventArgs> TestFinished;
private FileSystemWatcher fileSystemWatcher; private FileSystemWatcher fileSystemWatcher;
private ISet<string> reportedResults; private ISet<string> reportedResults;
@ -22,13 +22,13 @@ namespace ICSharpCode.MachineSpecifications
public string FileName { get; set; } public string FileName { get; set; }
public void Stop() public void Join()
{ {
if (fileSystemWatcher != null) if (fileSystemWatcher != null)
{ {
fileSystemWatcher.Dispose(); fileSystemWatcher.Dispose();
fileSystemWatcher = null; fileSystemWatcher = null;
} }
} }
public void Start() public void Start()
@ -119,11 +119,9 @@ namespace ICSharpCode.MachineSpecifications
} }
} }
public long InitialFilePosition { get; set; }
public void Dispose() public void Dispose()
{ {
Stop(); Join();
try try
{ {
File.Delete(FileName); File.Delete(FileName);
@ -133,5 +131,9 @@ namespace ICSharpCode.MachineSpecifications
LoggingService.Warn("Could delete temporary file.", e); LoggingService.Warn("Could delete temporary file.", e);
} }
} }
public string PipeName {
get { return String.Empty; }
}
} }
} }

41
src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MspecTestRunner.cs

@ -7,9 +7,11 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers. * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ */
using System; using System;
using ICSharpCode.UnitTesting; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.UnitTesting;
namespace ICSharpCode.MachineSpecifications namespace ICSharpCode.MachineSpecifications
{ {
/// <summary> /// <summary>
@ -17,20 +19,27 @@ namespace ICSharpCode.MachineSpecifications
/// </summary> /// </summary>
public class MSpecTestRunner : TestProcessRunnerBase public class MSpecTestRunner : TestProcessRunnerBase
{ {
public MSpecTestRunner() public MSpecTestRunner(TestExecutionOptions options)
: base(new UnitTestProcessRunner(), new MSpecUnitTestMonitor(), new UnitTestFileService(), new UnitTestMessageService()) : base(new MSpecTestProcessRunnerContext(options))
{ } {
}
protected override ProcessStartInfo GetProcessStartInfo(SelectedTests selectedTests)
{ protected override ProcessStartInfo GetProcessStartInfo(IEnumerable<ITest> selectedTests)
var app = new MSpecApplication(selectedTests); {
app.Results = TestResultsMonitor.FileName; var app = new MSpecApplication(selectedTests);
return app.GetProcessStartInfo(); var monitor = TestResultsReader as MSpecUnitTestMonitor;
} app.Results = monitor.FileName;
return app.GetProcessStartInfo();
protected override TestResult CreateTestResultForTestFramework(TestResult testResult) }
{
return testResult; protected override TestResult CreateTestResultForTestFramework(TestResult testResult)
} {
return testResult;
}
public override int GetExpectedNumberOfTestResults(IEnumerable<ITest> selectedTests)
{
return 0;
}
} }
} }

Loading…
Cancel
Save