using System; using System.IO; using DelftTools.Shell.Core; using DelftTools.Shell.Core.Dao; using DeltaShell.Core.Services; using NUnit.Framework; using Rhino.Mocks; using SharpTestsEx; namespace DeltaShell.Tests.Core.Services { /// /// Move MRU tests tot separate test case /// [TestFixture] public class ProjectServiceTest { private MockRepository mocks; private IProjectRepository repository; private IProjectRepositoryFactory factory; [SetUp] public void SetUpMocks() { mocks = new MockRepository(); repository = mocks.DynamicMock(); factory = mocks.Stub(); Expect.Call(factory.CreateNew()).Return(repository).Repeat.Once(); } [Test] public void CreateNewProjectShouldCreateATemporaryProject() { var newProject = new Project(); repository.Expect(r => r.GetProject()).Return(newProject).Repeat.Any(); Expect.Call(repository.Path).Repeat.Any().Return(""); mocks.ReplayAll(); var projectService = new ProjectService(factory); var project = projectService.CreateNewProjectInTemporaryFolder(); mocks.VerifyAll(); Assert.IsTrue(project.IsTemporary, "project should be temporary"); } [Test] public void CloseProjectClosesRepository() { var project = new Project("project"); Expect.Call(repository.Path).Repeat.Any().Return("a_path"); Expect.Call(repository.IsOpen).Return(true); Expect.Call(repository.Close); mocks.ReplayAll(); var projectService = new ProjectService(factory); projectService.Close(project); mocks.VerifyAll(); } [Test] public void SaveProjectAsTemporyProjectShouldMarkProjectAsNotTemporary() { var project = new Project("project") { IsTemporary = true }; Expect.Call(repository.Path).Return("a_path").Repeat.Any(); Expect.Call(delegate { repository.SaveAs(null, Path.GetFullPath("myproject.dsproj")); }).IgnoreArguments().Repeat.Once(); mocks.ReplayAll(); var projectService = new ProjectService(factory); projectService.SaveProjectAs(project, "myproject.dsproj"); mocks.VerifyAll(); Assert.IsFalse(project.IsTemporary); } [Test] public void SaveProjectToSameLocation() { var project = new Project("project") { IsChanged = true }; Expect.Call(repository.Path).Repeat.Any().Return(Path.GetFullPath("myproject.dsproj")); Expect.Call(delegate { repository.SaveOrUpdate(project); }).Repeat.Once(); mocks.ReplayAll(); var projectService = new ProjectService(factory); projectService.SaveProjectAs(project, "myproject.dsproj"); mocks.VerifyAll(); } [Test] public void DisposeShouldCallDisposeOfRepository() { Expect.Call(repository.IsOpen).Return(true); Expect.Call(() => repository.Dispose()); mocks.ReplayAll(); var projectService = new ProjectService(factory); projectService.Dispose(); mocks.VerifyAll(); } [Test] public void FireSavingAndSavedEvents() { Expect.Call(repository.Path).Return(@"C:\mockpath").Repeat.Any(); mocks.ReplayAll(); var savedCallCount = 0; var savingCallCount = 0; var projectService = new ProjectService(factory); projectService.ProjectSaved += delegate { savedCallCount++; }; projectService.ProjectSaving += delegate { savingCallCount++; }; var project = new Project(); projectService.Save(project); mocks.VerifyAll(); savedCallCount.Should().Be.EqualTo(1); savingCallCount.Should().Be.EqualTo(1); } [Test] public void FailingSaveShouldFireFailEvent() { Expect.Call(repository.Path).Return(@"C:\mockpath").Repeat.Any(); Expect.Call(() => repository.SaveOrUpdate(Arg.Is.Anything)) .IgnoreArguments() .Throw(new Exception("save failed")) .Repeat.Any(); mocks.ReplayAll(); var savedCallCount = 0; var savingCallCount = 0; var saveFailedCallCount = 0; var projectService = new ProjectService(factory); projectService.ProjectSaved += delegate { savedCallCount++; }; projectService.ProjectSaving += delegate { savingCallCount++; }; projectService.ProjectSaveFailed += delegate { saveFailedCallCount++; }; var project = new Project(); Assert.Throws(() => projectService.Save(project)); mocks.VerifyAll(); savingCallCount.Should().Be.EqualTo(1); savedCallCount.Should().Be.EqualTo(0); saveFailedCallCount.Should().Be.EqualTo(1); } } }