Index: src/Plugins/Wti/Wti.Data/Wti.Data.csproj =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- src/Plugins/Wti/Wti.Data/Wti.Data.csproj (.../Wti.Data.csproj) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ src/Plugins/Wti/Wti.Data/Wti.Data.csproj (.../Wti.Data.csproj) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -56,6 +56,10 @@ + + {82b61d20-fd4b-49be-9252-5bf6e3ee4666} + DelftTools.Shell.Core + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} DelftTools.Utils Index: src/Plugins/Wti/Wti.Data/WtiProject.cs =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- src/Plugins/Wti/Wti.Data/WtiProject.cs (.../WtiProject.cs) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ src/Plugins/Wti/Wti.Data/WtiProject.cs (.../WtiProject.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -1,14 +1,43 @@ -using DelftTools.Utils; +using System; +using System.Collections.Generic; +using DelftTools.Shell.Core; +using DelftTools.Utils; + namespace Wti.Data { - public class WtiProject : INameable + public class WtiProject : INameable, IObservable { + private IList observers = new List(); + public WtiProject() { Name = "WTI 2017 project"; } public string Name { get; set; } + + #region IObservable + + public void Attach(IObserver observer) + { + observers.Add(observer); + } + + public void Detach(IObserver observer) + { + observers.Remove(observer); + } + + public void NotifyObservers() + { + foreach (var observer in observers) + { + observer.UpdateObserver(); + } + } + + #endregion + } } \ No newline at end of file Index: src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs =================================================================== diff -u -rde830d165e579ad499b766e36eb280aac8820653 -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs (.../WtiProjectNodePresenter.cs) (revision de830d165e579ad499b766e36eb280aac8820653) +++ src/Plugins/Wti/Wti.Forms/NodePresenters/WtiProjectNodePresenter.cs (.../WtiProjectNodePresenter.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -48,7 +48,9 @@ public void OnNodeRenamed(object nodeData, string newName) { var project = (WtiProject)nodeData; + project.Name = newName; + project.NotifyObservers(); } public void OnNodeChecked(ITreeNode node) Index: src/Plugins/Wti/Wti.Forms/PropertyClasses/WtiProjectProperties.cs =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- src/Plugins/Wti/Wti.Forms/PropertyClasses/WtiProjectProperties.cs (.../WtiProjectProperties.cs) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ src/Plugins/Wti/Wti.Forms/PropertyClasses/WtiProjectProperties.cs (.../WtiProjectProperties.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -15,6 +15,7 @@ set { data.Name = value; + data.NotifyObservers(); } } } Index: test/Plugins/Wti/Wti.Data.Test/Wti.Data.Test.csproj =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- test/Plugins/Wti/Wti.Data.Test/Wti.Data.Test.csproj (.../Wti.Data.Test.csproj) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ test/Plugins/Wti/Wti.Data.Test/Wti.Data.Test.csproj (.../Wti.Data.Test.csproj) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -51,6 +51,9 @@ ..\..\..\..\lib\nunit.framework.dll + + ..\..\..\..\lib\Rhino.Mocks.dll + @@ -64,6 +67,10 @@ + + {82b61d20-fd4b-49be-9252-5bf6e3ee4666} + DelftTools.Shell.Core + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} DelftTools.Utils Index: test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs (.../WtiProjectTest.cs) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ test/Plugins/Wti/Wti.Data.Test/WtiProjectTest.cs (.../WtiProjectTest.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -1,7 +1,12 @@ -using DelftTools.Utils; +using System; +using DelftTools.Shell.Core; +using DelftTools.Utils; + using NUnit.Framework; +using Rhino.Mocks; + namespace Wti.Data.Test { [TestFixture] @@ -15,7 +20,48 @@ // assert Assert.IsInstanceOf(project); + Assert.IsInstanceOf(project); Assert.AreEqual("WTI 2017 project", project.Name); } + + [Test] + public void NotifyObservers_ObserverAttachedToProject_ObserverIsNotified() + { + // setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var project = new WtiProject(); + project.Attach(observer); + + // call + project.NotifyObservers(); + + // assert + mocks.VerifyAll(); + } + + [Test] + public void NotifyObservers_ObserverHasBeenDetached_ObserverShouldNotBeNotified() + { + // setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + + var project = new WtiProject(); + project.Attach(observer); + project.Detach(observer); + + // call + project.NotifyObservers(); + + // assert + mocks.VerifyAll(); // Expect no calls on observer + } + + } } \ No newline at end of file Index: test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs =================================================================== diff -u -rde830d165e579ad499b766e36eb280aac8820653 -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs (.../WtiProjectNodePresenterTest.cs) (revision de830d165e579ad499b766e36eb280aac8820653) +++ test/Plugins/Wti/Wti.Forms.Test/NodePresenters/WtiProjectNodePresenterTest.cs (.../WtiProjectNodePresenterTest.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -110,19 +110,26 @@ } [Test] - public void OnNodeRenamed_WithData_SetProjectName() + public void OnNodeRenamed_WithData_SetProjectNameWithNotification() { // setup + var mocks = new MockRepository(); + var projectObserver = mocks.StrictMock(); + projectObserver.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + var nodePresenter = new WtiProjectNodePresenter(); var project = new WtiProject(); + project.Attach(projectObserver); // call const string newName = "New Name"; nodePresenter.OnNodeRenamed(project, newName); // assert Assert.AreEqual(newName, project.Name); + mocks.VerifyAll(); } [Test] Index: test/Plugins/Wti/Wti.Forms.Test/PropertyClasses/WtiProjectPropertiesTest.cs =================================================================== diff -u -ra4ac4e49268888b50f6f9606a1b8dd8225e1b24f -rfdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade --- test/Plugins/Wti/Wti.Forms.Test/PropertyClasses/WtiProjectPropertiesTest.cs (.../WtiProjectPropertiesTest.cs) (revision a4ac4e49268888b50f6f9606a1b8dd8225e1b24f) +++ test/Plugins/Wti/Wti.Forms.Test/PropertyClasses/WtiProjectPropertiesTest.cs (.../WtiProjectPropertiesTest.cs) (revision fdc45df8cf7ca4dba62fb6e96b5cf8ef7ab73ade) @@ -1,7 +1,10 @@ -using DelftTools.Shell.Gui; +using DelftTools.Shell.Core; +using DelftTools.Shell.Gui; using NUnit.Framework; +using Rhino.Mocks; + using Wti.Data; using Wti.Forms.PropertyClasses; @@ -37,17 +40,24 @@ } [Test] - public void SetProperties_WithData_UpdateData() + public void SetProperties_WithData_UpdateDataAndNotifyObservers() { // setup + var mocks = new MockRepository(); + var projectObserver = mocks.StrictMock(); + projectObserver.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + var project = new WtiProject(); + project.Attach(projectObserver); var properties = new WtiProjectProperties { Data = project }; // call & Assert const string newName = "Test"; properties.Name = newName; Assert.AreEqual(newName, project.Name); + mocks.VerifyAll(); }