Mercurial > silverbladetech
diff SilverlightValidation/SilverlightValidation.Tests/TestSupport/NotifyPropertyChangedEventWatcher.cs @ 97:1adc1ae981ea
Tests added to SilverlightValidation.Tests
author | stevenhollidge <stevenhollidge@hotmail.com> |
---|---|
date | Sat, 05 May 2012 16:39:00 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SilverlightValidation/SilverlightValidation.Tests/TestSupport/NotifyPropertyChangedEventWatcher.cs Sat May 05 16:39:00 2012 +0100 @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq.Expressions; + +namespace SilverlightValidation.Tests.TestSupport +{ + /// <summary> + /// A helper class used by NotifyPropertyChangedAssertHelper to monitor PropertyChangedEvent notifications. + /// </summary> + public class NotifyPropertyChangedEventWatcher : Disposable + { + private readonly Dictionary<string, int> _raisedCounts = new Dictionary<string, int>(); + + // A reference to the instance of the class implementing INotifyPropertyChanged + private INotifyPropertyChanged _model; + + /// <summary> + /// Initializes a new instance of the <see cref = "NotifyPropertyChangedEventWatcher" /> class. + /// </summary> + /// <param name = "model">The model.</param> + public NotifyPropertyChangedEventWatcher(INotifyPropertyChanged model) + { + if (model == null) throw new ArgumentNullException("model"); + + _model = model; + _model.PropertyChanged += OnPropertyChanged; + } + + [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters"), + SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures")] + public int GetRaisedCount<T>(Expression<Func<T>> propertyExpression) + { + return GetRaisedCount(PropertySupport.ExtractPropertyName(propertyExpression)); + } + + public int GetRaisedCount(string propertyName) + { + propertyName = string.IsNullOrEmpty(propertyName) ? string.Empty : propertyName; + + PropertySupport.VerifyPropertyName(_model, propertyName); + + return _raisedCounts.ContainsKey(propertyName) ? _raisedCounts[propertyName] : 0; + } + + private void RecordPropertyChanged(string propertyName) + { + if (_raisedCounts.ContainsKey(propertyName)) + { + _raisedCounts[propertyName]++; + } + else + { + _raisedCounts[propertyName] = 1; + } + } + + /// <summary> + /// The OnPropertyChanged event handler. + /// </summary> + /// <remarks> + /// Records how many times the monitored property name has changed. + /// </remarks> + private void OnPropertyChanged(object sender, PropertyChangedEventArgs eventArgs) + { + // If PropertyName is null or string.Empty then it's the 'all properties' changed event. + RecordPropertyChanged(string.IsNullOrEmpty(eventArgs.PropertyName) ? string.Empty : eventArgs.PropertyName); + } + + /// <summary> + /// Releases unmanaged and - optionally - managed resources + /// </summary> + /// <param name = "disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> + protected override void Dispose(bool disposing) + { + if (null != _model) + { + var model = _model; + _model = null; + model.PropertyChanged -= OnPropertyChanged; + } + } + + /// <summary> + /// Traces the event counts. + /// </summary> + [Conditional("DEBUG")] + public void TraceEventCounts() + { + foreach (var pair in _raisedCounts) + { + string name = string.IsNullOrEmpty(pair.Key) ? "all properties" : pair.Key; + int value = pair.Value; + + Debug.WriteLine(string.Format( + CultureInfo.InvariantCulture, @"Property '{0}' raised {1} times.", name, value)); + } + } + } +} \ No newline at end of file