From 08c1792353c40a713e2fccc437bf7bfb0516076c Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 6 Jul 2010 12:13:51 +0000 Subject: [PATCH] When running unit tests in multiple projects, perform a single build for all those projects before executing any tests. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6049 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/AbstractRunTestCommands.cs | 21 ++++---- .../Src/BuildProjectBeforeTestRun.cs | 44 ---------------- .../UnitTesting/Src/IBuildProjectFactory.cs | 4 +- .../Src/MultipleProjectBuildable.cs | 50 +++++++++++++++++++ .../Src/UnitTestBuildProjectFactory.cs | 6 ++- .../BuildProjectBeforeTestRunTestFixture.cs | 50 ------------------- .../RunTestCommandBeforeRunTestFixture.cs | 2 +- ...nTestWithDebuggerCommandTestFixtureBase.cs | 4 +- ...nTestsWithoutBuildingProjectTestFixture.cs | 6 ++- .../Tree/RunTwoProjectsTestsTestFixture.cs | 6 +-- .../UnitTesting/Test/UnitTesting.Tests.csproj | 4 +- .../Utils/MockBuildProjectBeforeTestRun.cs | 9 ++-- .../Test/Utils/MockBuildProjectFactory.cs | 7 ++- ...ockBuildProjectBeforeTestRunTestFixture.cs | 4 +- .../Analysis/UnitTesting/UnitTesting.csproj | 2 +- .../Project/Src/Commands/BuildCommands.cs | 10 ++-- 16 files changed, 97 insertions(+), 132 deletions(-) delete mode 100644 src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs create mode 100644 src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs delete mode 100644 src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs diff --git a/src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs b/src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs index 5cba431e82..d8093e2913 100644 --- a/src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs +++ b/src/AddIns/Analysis/UnitTesting/Src/AbstractRunTestCommands.cs @@ -6,12 +6,14 @@ // using System; +using System.Collections.Generic; using System.IO; - +using System.Linq; using ICSharpCode.Core; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; namespace ICSharpCode.UnitTesting { @@ -60,7 +62,7 @@ namespace ICSharpCode.UnitTesting if (selectedTests.HasProjects) { runningTestCommand = this; BeforeRun(); - RunTests(); + BuildAndRunTests(); } } @@ -91,7 +93,7 @@ namespace ICSharpCode.UnitTesting OnBeforeRunTests(); } - void RunTests() + void BuildAndRunTests() { if (IsBuildNeededBeforeTestRun()) { BuildProjectBeforeRunningTests(selectedTests); @@ -103,7 +105,7 @@ namespace ICSharpCode.UnitTesting bool IsBuildNeededBeforeTestRun() { - return context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(selectedTests.Project); + return selectedTests.Projects.Any(p => context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(p)); } void ClearTasks() @@ -138,20 +140,21 @@ namespace ICSharpCode.UnitTesting } /// - /// Runs the tests after building the project under test. + /// Runs the tests after building the project(s) under test. /// void BuildProjectBeforeRunningTests(SelectedTests selectedTests) { - BuildProjectBeforeTestRun build = CreateBuildProjectBeforeTestRun(selectedTests); + BuildProject build = CreateBuildProjectBeforeTestRun(selectedTests); build.BuildComplete += delegate { OnBuildComplete(build.LastBuildResults, selectedTests); }; build.Run(); } - BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(SelectedTests selectedTests) + BuildProject CreateBuildProjectBeforeTestRun(SelectedTests selectedTests) { - return context.BuildProjectFactory.CreateBuildProjectBeforeTestRun(selectedTests.Project); + var projects = selectedTests.Projects.Where(p => context.RegisteredTestFrameworks.IsBuildNeededBeforeTestRunForProject(p)); + return context.BuildProjectFactory.CreateBuildProjectBeforeTestRun(projects); } /// @@ -197,7 +200,7 @@ namespace ICSharpCode.UnitTesting StopActiveTestRunner(); selectedTests.RemoveFirstProject(); if (selectedTests.HasProjects) { - RunTests(); + RunTests(selectedTests); } else { runningTestCommand = null; UpdateUnitTestsPadToolbar(); diff --git a/src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs b/src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs deleted file mode 100644 index d0cb7fb7ae..0000000000 --- a/src/AddIns/Analysis/UnitTesting/Src/BuildProjectBeforeTestRun.cs +++ /dev/null @@ -1,44 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using System; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.Project.Commands; - -namespace ICSharpCode.UnitTesting -{ - /// - /// Custom build command that makes sure errors and warnings - /// are not cleared from the Errors list before every build since - /// we may be running multiple tests after each other. - /// - public class BuildProjectBeforeTestRun : BuildProjectBeforeExecute - { - IUnitTestSaveAllFilesCommand saveAllFilesCommand; - - public BuildProjectBeforeTestRun(IProject targetProject, - IUnitTestSaveAllFilesCommand saveAllFilesCommand) - : base(targetProject) - { - this.saveAllFilesCommand = saveAllFilesCommand; - } - - public BuildProjectBeforeTestRun(IProject targetProject) - : this(targetProject, new UnitTestSaveAllFilesCommand()) - { - } - - /// - /// Before a build do not clear the tasks, just save any - /// dirty files. - /// - public override void BeforeBuild() - { - saveAllFilesCommand.SaveAllFiles(); - } - } -} diff --git a/src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs b/src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs index 476aedf1d0..94933b62eb 100644 --- a/src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs +++ b/src/AddIns/Analysis/UnitTesting/Src/IBuildProjectFactory.cs @@ -6,12 +6,14 @@ // using System; +using System.Collections.Generic; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; namespace ICSharpCode.UnitTesting { public interface IBuildProjectFactory { - BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project); + BuildProject CreateBuildProjectBeforeTestRun(IEnumerable projects); } } diff --git a/src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs b/src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs new file mode 100644 index 0000000000..d6ed794467 --- /dev/null +++ b/src/AddIns/Analysis/UnitTesting/Src/MultipleProjectBuildable.cs @@ -0,0 +1,50 @@ +// +// +// +// +// $Revision$ +// +using System; +using System.Collections.Generic; +using System.Linq; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.UnitTesting +{ + /// + /// IBuildable implementation that builds several projects. + /// + public class MultipleProjectBuildable : IBuildable + { + readonly IBuildable[] projects; + + public MultipleProjectBuildable(IEnumerable projects) + { + this.projects = projects.ToArray(); + } + + public string Name { + get { return string.Empty; } + } + + public Solution ParentSolution { + get { return projects.Length > 0 ? projects[0].ParentSolution : null; } + } + + public ICollection GetBuildDependencies(ProjectBuildOptions buildOptions) + { + return projects; + } + + public void StartBuild(ProjectBuildOptions buildOptions, IBuildFeedbackSink feedbackSink) + { + // SharpDevelop already has built our dependencies, so we're done immediately. + feedbackSink.Done(true); + } + + public ProjectBuildOptions CreateProjectBuildOptions(BuildOptions options, bool isRootBuildable) + { + return null; + } + } +} diff --git a/src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs b/src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs index da4a07154d..0d434e0a3b 100644 --- a/src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs +++ b/src/AddIns/Analysis/UnitTesting/Src/UnitTestBuildProjectFactory.cs @@ -6,15 +6,17 @@ // using System; +using System.Collections.Generic; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; namespace ICSharpCode.UnitTesting { public class UnitTestBuildProjectFactory : IBuildProjectFactory { - public BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project) + public BuildProject CreateBuildProjectBeforeTestRun(IEnumerable projects) { - return new BuildProjectBeforeTestRun(project); + return new BuildProjectBeforeExecute(new MultipleProjectBuildable(projects)); } } } diff --git a/src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs deleted file mode 100644 index 88fd597f9d..0000000000 --- a/src/AddIns/Analysis/UnitTesting/Test/Tree/BuildProjectBeforeTestRunTestFixture.cs +++ /dev/null @@ -1,50 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using System; -using ICSharpCode.Core; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.UnitTesting; -using NUnit.Framework; -using UnitTesting.Tests.Utils; - -namespace UnitTesting.Tests.Tree -{ - [TestFixture] - public class BuildProjectBeforeTestRunTestFixture - { - BuildProjectBeforeTestRun buildProjectBeforeTestRun; - MockSaveAllFilesCommand saveAllFilesCommand; - MockCSharpProject project; - - [SetUp] - public void Init() - { - if (!PropertyService.Initialized) { - PropertyService.InitializeServiceForUnitTests(); - } - saveAllFilesCommand = new MockSaveAllFilesCommand(); - project = new MockCSharpProject(); - BuildResults buildResults = new BuildResults(); - - buildProjectBeforeTestRun = new BuildProjectBeforeTestRun(project, saveAllFilesCommand); - } - - [Test] - public void SaveAllFilesCommandNotCalledInitially() - { - Assert.IsFalse(saveAllFilesCommand.IsSaveAllFilesMethodCalled); - } - - [Test] - public void BeforeBuildMethodSavesAllFiles() - { - buildProjectBeforeTestRun.BeforeBuild(); - Assert.IsTrue(saveAllFilesCommand.IsSaveAllFilesMethodCalled); - } - } -} diff --git a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs index d1171a03c3..26e433e09a 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestCommandBeforeRunTestFixture.cs @@ -153,7 +153,7 @@ namespace UnitTesting.Tests.Tree public void BuildProjectBeforeTestRunIsCreatedWhenRunMethodCalled() { runTestCommand.Run(); - Assert.AreEqual(project, buildProjectBeforeTestRun.Project); + Assert.AreEqual(new[] { project }, buildProjectBeforeTestRun.Projects); } [Test] diff --git a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs index 9007b6c8eb..b80440acf7 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestWithDebuggerCommandTestFixtureBase.cs @@ -7,7 +7,7 @@ using System; using ICSharpCode.Core; -using ICSharpCode.UnitTesting; +using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; using UnitTesting.Tests.Utils; @@ -60,7 +60,7 @@ namespace UnitTesting.Tests.Tree public void ExpectedBuildProjectReturnedFromBuildFactory() { InitBase(); - Assert.AreEqual(buildProject, context.MockBuildProjectFactory.CreateBuildProjectBeforeTestRun(null)); + Assert.AreEqual(buildProject, context.MockBuildProjectFactory.CreateBuildProjectBeforeTestRun(new IProject[0])); } [Test] diff --git a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs index 23f772fb58..52acb2e113 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTestsWithoutBuildingProjectTestFixture.cs @@ -72,11 +72,13 @@ namespace UnitTesting.Tests.Tree } [Test] - public void WhenTestRunCompletedAllFilesAreSaved() + public void WhenTestRunCompletedAllFilesAreNotSavedAgain() { + // feature change 2010/07/05: we save all files only once + // during the build, not whenever a new test run starts context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled = false; runTestCommand.CallTestsCompleted(); - Assert.IsTrue(context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled); + Assert.IsFalse(context.MockSaveAllFilesCommand.IsSaveAllFilesMethodCalled); } } } diff --git a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs index ac8873f378..014d664dd7 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Tree/RunTwoProjectsTestsTestFixture.cs @@ -20,7 +20,6 @@ namespace UnitTesting.Tests.Tree TestProject testProject2; MockCSharpProject project2; MockBuildProjectBeforeTestRun buildProject1; - MockBuildProjectBeforeTestRun buildProject2; [SetUp] public void Init() @@ -41,10 +40,8 @@ namespace UnitTesting.Tests.Tree context.MockUnitTestsPad.AddTestProject(testProject2); buildProject1 = new MockBuildProjectBeforeTestRun(); - buildProject2 = new MockBuildProjectBeforeTestRun(); context.MockBuildProjectFactory.AddBuildProjectBeforeTestRun(buildProject1); - context.MockBuildProjectFactory.AddBuildProjectBeforeTestRun(buildProject2); runTestCommand.Run(); @@ -61,7 +58,8 @@ namespace UnitTesting.Tests.Tree [Test] public void SecondProjectIsBuilt() { - Assert.IsTrue(buildProject2.IsRunMethodCalled); + Assert.IsTrue(buildProject1.IsRunMethodCalled); + Assert.AreEqual(new[] { project1, project2 }, buildProject1.Projects); } [Test] diff --git a/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj b/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj index 48086d912f..d5d3b33a42 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj +++ b/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj @@ -55,6 +55,9 @@ False + + 3.5 + @@ -94,7 +97,6 @@ - diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs index 5f02818ca4..ec274a4617 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectBeforeTestRun.cs @@ -7,13 +7,13 @@ using System; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; using ICSharpCode.UnitTesting; namespace UnitTesting.Tests.Utils { - public class MockBuildProjectBeforeTestRun : BuildProjectBeforeTestRun + public class MockBuildProjectBeforeTestRun : BuildProjectBeforeExecute { - IProject project; bool runMethodCalled; public MockBuildProjectBeforeTestRun() @@ -21,10 +21,7 @@ namespace UnitTesting.Tests.Utils { } - public IProject Project { - get { return project; } - set { project = value; } - } + public IProject[] Projects { get; set; } public void FireBuildCompleteEvent() { diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs index 5f922b745d..f415c7bf0c 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockBuildProjectFactory.cs @@ -7,7 +7,10 @@ using System; using System.Collections.Generic; +using System.Linq; + using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Project.Commands; using ICSharpCode.UnitTesting; namespace UnitTesting.Tests.Utils @@ -16,11 +19,11 @@ namespace UnitTesting.Tests.Utils { List buildProjectInstances = new List(); - public BuildProjectBeforeTestRun CreateBuildProjectBeforeTestRun(IProject project) + public BuildProject CreateBuildProjectBeforeTestRun(IEnumerable projects) { MockBuildProjectBeforeTestRun buildProject = RemoveBuildProjectInstance(); if (buildProject != null) { - buildProject.Project = project; + buildProject.Projects = projects.ToArray(); } return buildProject; } diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs index dd801fc4db..9b65fb4021 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockBuildProjectBeforeTestRunTestFixture.cs @@ -28,7 +28,7 @@ namespace UnitTesting.Tests.Utils.Tests buildProject = new MockBuildProjectBeforeTestRun(); factory.AddBuildProjectBeforeTestRun(buildProject); - createdBuildProject = factory.CreateBuildProjectBeforeTestRun(project) as MockBuildProjectBeforeTestRun; + createdBuildProject = factory.CreateBuildProjectBeforeTestRun(new[] { project }) as MockBuildProjectBeforeTestRun; } [Test] @@ -40,7 +40,7 @@ namespace UnitTesting.Tests.Utils.Tests [Test] public void ProjectPassedToBuildProjectObject() { - Assert.AreEqual(project, buildProject.Project); + Assert.AreEqual(new[] { project }, buildProject.Projects); } [Test] diff --git a/src/AddIns/Analysis/UnitTesting/UnitTesting.csproj b/src/AddIns/Analysis/UnitTesting/UnitTesting.csproj index 3543d1d00f..191ceb2998 100644 --- a/src/AddIns/Analysis/UnitTesting/UnitTesting.csproj +++ b/src/AddIns/Analysis/UnitTesting/UnitTesting.csproj @@ -57,6 +57,7 @@ + @@ -74,7 +75,6 @@ - diff --git a/src/Main/Base/Project/Src/Commands/BuildCommands.cs b/src/Main/Base/Project/Src/Commands/BuildCommands.cs index 327c8297eb..c026c70010 100644 --- a/src/Main/Base/Project/Src/Commands/BuildCommands.cs +++ b/src/Main/Base/Project/Src/Commands/BuildCommands.cs @@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands public class BuildProjectBeforeExecute : BuildProject { - public BuildProjectBeforeExecute(IProject project) : base(project) + public BuildProjectBeforeExecute(IBuildable project) : base(project) { } @@ -162,8 +162,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands public abstract class AbstractProjectBuildMenuCommand : AbstractBuildMenuCommand { - protected IProject targetProject; - protected IProject ProjectToBuild { + protected IBuildable targetProject; + protected IBuildable ProjectToBuild { get { return targetProject ?? ProjectService.CurrentProject; } @@ -180,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands public BuildProject() { } - public BuildProject(IProject targetProject) + public BuildProject(IBuildable targetProject) { this.targetProject = targetProject; } @@ -194,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands public class RebuildProject : BuildProject { public RebuildProject() {} - public RebuildProject(IProject targetProject) : base(targetProject) {} + public RebuildProject(IBuildable targetProject) : base(targetProject) {} public override void StartBuild() {