From 4ce6985a7ca5cf06022d1c5d716f3f168e402b22 Mon Sep 17 00:00:00 2001 From: Tomasz Tretkowski Date: Fri, 23 Sep 2011 21:49:31 +0200 Subject: [PATCH] Added reference to Rhino.Mocks in test project. Missing changes in unit tests. --- packages/repositories.config | 1 + .../MachineSpecifications.Tests.csproj | 4 ++ .../Src/ClassFilterBuilder.cs | 60 +++++++++++++++++ .../Src/MSpecTestFrameworkTests.cs | 64 ++++++++++++++++++- .../MachineSpecifications.csproj | 1 + .../src/ClassFilterBuilder.cs | 35 ++++++++++ .../src/MSpecApplication.cs | 18 ++---- 7 files changed, 167 insertions(+), 16 deletions(-) create mode 100644 src/AddIns/Analysis/MachineSpecifications/MachineSpecifications.Tests/Src/ClassFilterBuilder.cs create mode 100644 src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/ClassFilterBuilder.cs 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;