using System.Collections.Generic; using System.ComponentModel; using Developpez.Dotnet.ComponentModel; using NUnit.Framework; namespace Developpez.Dotnet.Tests.ComponentModel { [TestFixture] public class NotifyPropertyChangedExtensionsTests { #region Test class public class Dummy : INotifyPropertyChanged { public Dummy() { this.SetDependenciesFor(() => B) .DependsOn(() => A) .Affects(() => C) .Raise(OnPropertyChanged); } private string _a; public string A { get { return _a; } set { if (value != _a) { _a = value; OnPropertyChanged("A"); } } } public string B { get { return A + " world"; } } public string C { get { return B + " !"; } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged.Raise(this, propertyName); } } #endregion [Test] public void Test_DependentPropertiesAreNotified() { Dummy d = new Dummy(); List changedProperties = new List(); d.PropertyChanged += (sender, e) => changedProperties.Add(e.PropertyName); d.A = "Hello"; Assert.IsTrue(changedProperties.Contains("A")); Assert.IsTrue(changedProperties.Contains("B")); Assert.IsTrue(changedProperties.Contains("C")); } [Test] public void Test_OnPropertyChanged() { Dummy d = new Dummy(); List changedProperties = new List(); PropertyChangedEventHandler handler = (sender, e) => changedProperties.Add(e.PropertyName); using (d.OnPropertyChanged(() => d.A, handler)) using (d.OnPropertyChanged(() => d.B, handler)) using (d.OnPropertyChanged(() => d.C, handler)) { // Vérifie que les handlers sont appelés d.A = "Foo"; Assert.IsTrue(changedProperties.Contains("A")); Assert.IsTrue(changedProperties.Contains("B")); Assert.IsTrue(changedProperties.Contains("C")); } // Vérifie que les handlers ne sont plus appelés après // la fin du bloc using changedProperties.Clear(); d.A = "Bar"; Assert.AreEqual(0, changedProperties.Count); } } }