using System; using System.Collections.Generic; using System.Collections.Specialized; namespace ObservableCollections.Tests { public struct ViewContainer : IEquatable>, IComparable> { public ViewContainer(T value) { Value = value; } public T Value { get; } public static implicit operator ViewContainer(T value) => new(value); public override int GetHashCode() { return Value.GetHashCode(); } public int CompareTo(ViewContainer other) { return Comparer.Default.Compare(Value, other.Value); } public bool Equals(ViewContainer other) { return EqualityComparer.Default.Equals(Value, other.Value); } } public class TestFilter : ISynchronizedViewFilter> { readonly Func, bool> filter; public List<(T, ViewContainer)> CalledWhenTrue = new(); public List<(T, ViewContainer)> CalledWhenFalse = new(); public List<(NotifyCollectionChangedAction changedAction, T value, ViewContainer view, int index, int oldIndex)> CalledOnCollectionChanged = new(); public TestFilter(Func, bool> filter) { this.filter = filter; } public void Clear() { CalledWhenTrue.Clear(); CalledWhenFalse.Clear(); CalledOnCollectionChanged.Clear(); } public bool IsMatch(T value, ViewContainer view) { return this.filter.Invoke(value, view); } public void OnCollectionChanged(NotifyCollectionChangedAction changedAction, T value, ViewContainer view, in NotifyCollectionChangedEventArgs eventArgs) { CalledOnCollectionChanged.Add((changedAction, value, view, eventArgs.NewStartingIndex, eventArgs.OldStartingIndex)); } public void WhenTrue(T value, ViewContainer view) { CalledWhenTrue.Add((value, view)); } public void WhenFalse(T value, ViewContainer view) { CalledWhenFalse.Add((value, view)); } } public class TestFilter2 : ISynchronizedViewFilter, ViewContainer> { readonly Func, ViewContainer, bool> filter; public List<(KeyValuePair, ViewContainer)> CalledWhenTrue = new(); public List<(KeyValuePair, ViewContainer)> CalledWhenFalse = new(); public List<(NotifyCollectionChangedAction changedAction, KeyValuePair value, ViewContainer view)> CalledOnCollectionChanged = new(); public TestFilter2(Func, ViewContainer, bool> filter) { this.filter = filter; } public void Clear() { CalledWhenTrue.Clear(); CalledWhenFalse.Clear(); CalledOnCollectionChanged.Clear(); } public bool IsMatch(KeyValuePair value, ViewContainer view) { return this.filter.Invoke(value, view); } public void OnCollectionChanged(NotifyCollectionChangedAction changedAction, KeyValuePair value, ViewContainer view, in NotifyCollectionChangedEventArgs> eventArgs) { CalledOnCollectionChanged.Add((changedAction, value, view)); } public void WhenTrue(KeyValuePair value, ViewContainer view) { CalledWhenTrue.Add((value, view)); } public void WhenFalse(KeyValuePair value, ViewContainer view) { CalledWhenFalse.Add((value, view)); } } }