diff --git a/packages/repositories.config b/packages/repositories.config
index f4f574e808..ace6572be4 100644
--- a/packages/repositories.config
+++ b/packages/repositories.config
@@ -2,4 +2,5 @@
+
\ No newline at end of file
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj
index e98cf19027..6a3673f6aa 100644
--- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/MachineSpecifications.Tests.csproj
@@ -44,6 +44,9 @@
..\..\..\..\..\packages\Machine.Specifications.0.4.13.0\lib\Machine.Specifications.dll
+
+ ..\..\..\..\..\packages\RhinoMocks.3.6\lib\Rhino.Mocks.dll
+
3.5
@@ -55,6 +58,7 @@
+
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs
new file mode 100644
index 0000000000..a7ef56592c
--- /dev/null
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs
@@ -0,0 +1,60 @@
+/*
+ * Created by SharpDevelop.
+ * User: trecio
+ * Date: 2011-09-23
+ * Time: 19:53
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+using developwithpassion.specifications.extensions;
+using developwithpassion.specifications.rhinomocks;
+using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Project;
+using ICSharpCode.UnitTesting;
+using Machine.Specifications;
+using Machine.Fakes.Adapters.Rhinomocks;
+
+namespace ICSharpCode.MachineSpecifications.Tests
+{
+ [Subject(typeof(ClassFilterBuilder))]
+ public class When_building_class_filter_from_test_selection : Observes
+ {
+ const string NAMESPACE_FILTER = "Namespace";
+ static IClass classAddedExplicitly, classInNamespace, classOutsideNamespace;
+ static SelectedTests selectedTests;
+ static IProjectContent projectContent;
+ static IList result;
+
+ Establish ctx = () => {
+ classAddedExplicitly = fake.an();
+ classAddedExplicitly.setup(x => x.Namespace).Return("");
+ classAddedExplicitly.setup(x => x.FullyQualifiedName).Return("ClassAddedExplicitly");
+ classInNamespace = fake.an();
+ classInNamespace.setup(x => x.Namespace).Return("Namespace.OtherNamespace");
+ classInNamespace.setup(x => x.FullyQualifiedName).Return("Namespace.OtherNamespace.ClassInNamespace");
+ classOutsideNamespace = fake.an();
+ classOutsideNamespace.setup(x => x.Namespace).Return("Namespace2");
+ classOutsideNamespace.setup(x => x.FullyQualifiedName).Return("Namespace2.ClassOutsideNamespac");
+
+ var project = fake.an();
+ projectContent = fake.an();
+ projectContent.setup(x => x.Classes).Return(new[]{classInNamespace, classOutsideNamespace});
+
+ selectedTests = new SelectedTests(project, NAMESPACE_FILTER, classAddedExplicitly, null);
+ };
+
+ Because of = () =>
+ result = sut.BuildFilterFor(selectedTests, projectContent);
+
+ It should_add_fully_qualified_name_of_selected_test_class = () =>
+ result.ShouldContain(classAddedExplicitly.FullyQualifiedName);
+
+ It should_add_class_included_in_selected_namespace = () =>
+ result.ShouldContain(classInNamespace.FullyQualifiedName);
+
+ It should_not_include_class_not_included_in_namespace = () =>
+ result.ShouldNotContain(classOutsideNamespace.FullyQualifiedName);
+ }
+}
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs
index 67d8838197..f817c4cda5 100644
--- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/MSpecTestFrameworkTests.cs
@@ -8,11 +8,16 @@
*/
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using developwithpassion.specifications.extensions;
+using developwithpassion.specifications.dsl;
using developwithpassion.specifications.rhinomocks;
using ICSharpCode.SharpDevelop.Project;
using Machine.Specifications;
using ICSharpCode.UnitTesting;
using ICSharpCode.SharpDevelop.Dom;
+using Rhino.Mocks;
namespace ICSharpCode.MachineSpecifications.Tests
{
@@ -25,7 +30,19 @@ namespace ICSharpCode.MachineSpecifications.Tests
static bool resultForTestProject;
static bool resultForNonTestProject;
- Establish ctx;
+ const string MSpecAssemblyName = "Machine.Specifications";
+
+ Establish ctx = () => {
+ testProject = fake.an();
+ var mspecReference = MockRepository.GenerateStub(testProject);
+ mspecReference.setup(x => x.ShortName).Return(MSpecAssemblyName);
+ testProject.setup(x => x.Items).Return(new ReadOnlyCollection(new[]{mspecReference }));
+
+ nonTestProject = fake.an();
+ var otherReference = MockRepository.GenerateStub(nonTestProject);
+ mspecReference.setup(x => x.ShortName).Return("System.Configuration");
+ nonTestProject.setup(x => x.Items).Return(new ReadOnlyCollection(new[]{otherReference }));
+ };
Because of = () => {
resultForTestProject = sut.IsTestProject(testProject);
@@ -42,20 +59,58 @@ namespace ICSharpCode.MachineSpecifications.Tests
[Subject(typeof(MSpecTestFramework))]
public class When_checking_if_is_a_test_class : Observes
{
- static IClass classWithoutSpecificationMembers;
+ const string MSpecItTypeName = "Machine.Specifications.It";
+ const string MSpecBehavesTypeName = "Machine.Specifications.Behaves_like";
+ const string MSpecBehaviorTypeName = "Machine.Specifications.BehaviorsAttribute";
+
+ static IClass classWithoutSpecificationMembers;
static IClass classWithSpecificationMembers;
+ static IClass classWithBehavior;
static IClass classWithSpecificationMembersAndBehaviorAttribute;
static bool resultForClassWithBehaviorAttribute;
static bool resultForClassWithSpecifications;
+ static bool resultForClassWithBehavior;
static bool resultForClassWithoutSpecifications;
- Establish ctx;
+ Establish ctx = () => {
+ classWithoutSpecificationMembers = SetupClass(false, new IField[0], new IAttribute[0]);
+ classWithSpecificationMembers = SetupClass(false, new IField[]{SetupField(MSpecItTypeName)}, new IAttribute[0]);
+ classWithBehavior = SetupClass(false, new IField[]{SetupField(MSpecBehavesTypeName)}, new IAttribute[0]);
+ classWithSpecificationMembersAndBehaviorAttribute = SetupClass(false, new IField[]{SetupField(MSpecItTypeName)}, new IAttribute[]{SetupBehaviorAttribute()});
+ };
+
+ static IClass SetupClass(bool isAbstract, IList fields, IList attributes) {
+ var c = fake.an();
+ c.setup(x => x.IsAbstract).Return(isAbstract);
+ c.setup(x => x.Fields).Return(fields);
+ c.setup(x => x.Attributes).Return(attributes);
+ return c;
+ }
+
+ static IField SetupField(string returnTypeName) {
+ var field = fake.an();
+ field.ReturnType = SetupReturnType(returnTypeName);
+ return field;
+ }
+
+ static IAttribute SetupBehaviorAttribute() {
+ var attribute = fake.an();
+ attribute.setup(x => x.AttributeType).Return(SetupReturnType(MSpecBehaviorTypeName));
+ return attribute;
+ }
+
+ static IReturnType SetupReturnType(string typeName) {
+ var returnType = fake.an();
+ returnType.Stub(x => x.FullyQualifiedName).Return(typeName);
+ return returnType;
+ }
Because of = () =>
{
resultForClassWithoutSpecifications = sut.IsTestClass(classWithoutSpecificationMembers);
resultForClassWithSpecifications = sut.IsTestClass(classWithSpecificationMembers);
+ resultForClassWithBehavior = sut.IsTestClass(classWithBehavior);
resultForClassWithBehaviorAttribute = sut.IsTestClass(classWithSpecificationMembersAndBehaviorAttribute);
};
@@ -64,6 +119,9 @@ namespace ICSharpCode.MachineSpecifications.Tests
It should_return_true_for_class_with_specification_members = () =>
resultForClassWithSpecifications.ShouldBeTrue();
+
+ It should_return_true_for_class_with_behavior = () =>
+ resultForClassWithBehavior.ShouldBeTrue();
It should_return_false_for_class_with_behavior_attribute = () =>
resultForClassWithBehaviorAttribute.ShouldBeFalse();
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj
index 91909d3bb5..9951ffaf44 100644
--- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/MachineSpecifications.csproj
@@ -58,6 +58,7 @@
+
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs
new file mode 100644
index 0000000000..39f3cff85d
--- /dev/null
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs
@@ -0,0 +1,35 @@
+/*
+ * Created by SharpDevelop.
+ * User: trecio
+ * Date: 2011-09-23
+ * Time: 19:40
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.UnitTesting;
+
+namespace ICSharpCode.MachineSpecifications
+{
+ ///
+ /// Creates class list filter for tests which should be run.
+ ///
+ public class ClassFilterBuilder
+ {
+ public IList BuildFilterFor(SelectedTests tests, IProjectContent @using) {
+ var projectContent = @using;
+
+ var filter = new List();
+ if (tests.Class != null)
+ filter.Add(tests.Class.FullyQualifiedName);
+ if (tests.NamespaceFilter != null)
+ foreach (var projectClass in projectContent.Classes)
+ if (projectClass.FullyQualifiedName.StartsWith(tests.NamespaceFilter + "."))
+ filter.Add(projectClass.FullyQualifiedName);
+
+ return filter;
+ }
+ }
+}
diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs
index 4251f04c96..ed5548616b 100644
--- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs
+++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecApplication.cs
@@ -73,25 +73,17 @@ namespace ICSharpCode.MachineSpecifications
string CreateFilterFile()
{
- var filter = new List();
- if (tests.Class != null)
- filter.Add(tests.Class);
- if (tests.NamespaceFilter != null)
- {
- var projectContent = ParserService.GetProjectContent(project);
- foreach (var projectClass in projectContent.Classes)
- if (projectClass.FullyQualifiedName.StartsWith(tests.NamespaceFilter + "."))
- filter.Add(projectClass);
- }
-
+ var classFilterBuilder = new ClassFilterBuilder();
+ var projectContent = ParserService.GetProjectContent(project);
+ var filter = classFilterBuilder.BuildFilterFor(tests, @using: projectContent);
string path = null;
if (filter.Count > 0) {
path = Path.GetTempFileName();
using (var stream = new FileStream(path, FileMode.Create, FileAccess.Write))
using (var writer = new StreamWriter(stream))
- foreach (var testClass in filter) {
- writer.WriteLine(testClass.FullyQualifiedName);
+ foreach (var testClassName in filter) {
+ writer.WriteLine(testClassName);
}
}
return path;