list and dict test ok
This commit is contained in:
parent
b577d9a226
commit
e58421b2c2
@ -26,7 +26,9 @@ namespace ObservableCollections
|
||||
|
||||
public interface ISynchronizedView<T, TView> : IReadOnlyCollection<(T Value, TView View)>, IDisposable
|
||||
{
|
||||
// TODO:Remove SyncRoot
|
||||
object SyncRoot { get; }
|
||||
|
||||
event NotifyCollectionChangedEventHandler<T>? RoutingCollectionChanged;
|
||||
event Action<NotifyCollectionChangedAction>? CollectionStateChanged;
|
||||
|
||||
|
@ -45,7 +45,7 @@ namespace ObservableCollections.Internal
|
||||
this.filter = filter;
|
||||
foreach (var (value, view) in list)
|
||||
{
|
||||
filter.Invoke(value, view);
|
||||
filter.InvokeOnAttach(value, view);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -125,7 +125,7 @@ namespace ObservableCollections.Internal
|
||||
this.filter = filter;
|
||||
foreach (var (value, view) in array)
|
||||
{
|
||||
filter.Invoke(value, view);
|
||||
filter.InvokeOnAttach(value, view);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -99,5 +99,60 @@ namespace ObservableCollections.Tests
|
||||
view.Select(x => x.Value.Value).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||
view.Select(x => x.View).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FilterTest()
|
||||
{
|
||||
var dict = new ObservableDictionary<int, int>();
|
||||
var view1 = dict.CreateView(x => new ViewContainer<int>(x.Value));
|
||||
var view2 = dict.CreateSortedView(x => x.Key, x => new ViewContainer<int>(x.Value), x => x.Value, true);
|
||||
var view3 = dict.CreateSortedView(x => new ViewContainer<int>(x.Value), viewComparer: Comparer<ViewContainer<int>>.Default);
|
||||
var filter1 = new TestFilter2<int>((x, v) => x.Value % 2 == 0);
|
||||
var filter2 = new TestFilter2<int>((x, v) => x.Value % 2 == 0);
|
||||
var filter3 = new TestFilter2<int>((x, v) => x.Value % 2 == 0);
|
||||
|
||||
dict.Add(10, -12); // 0
|
||||
dict.Add(50, -53); // 1
|
||||
dict.Add(30, -34); // 2
|
||||
dict.Add(20, -25); // 3
|
||||
dict.Add(40, -40); // 4
|
||||
|
||||
view1.AttachFilter(filter1);
|
||||
view2.AttachFilter(filter2);
|
||||
view3.AttachFilter(filter3);
|
||||
|
||||
filter1.CalledWhenTrue.Select(x => x.Item1.Value).Should().Equal(-12, -34, -40);
|
||||
filter2.CalledWhenTrue.Select(x => x.Item1.Value).Should().Equal(-40, -34, -12);
|
||||
filter3.CalledWhenTrue.Select(x => x.Item1.Value).Should().Equal(-40, -34, -12);
|
||||
|
||||
dict.Add(99, -100);
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Add, -100));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Add, -100));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Add, -100));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
dict[10] = -1090;
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -12), (ChangedKind.Add, -1090));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -12), (ChangedKind.Add, -1090));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -12), (ChangedKind.Add, -1090));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
dict.Remove(20);
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -25));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -25));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value)).Should().Equal((ChangedKind.Remove, -25));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
dict.Clear();
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value))
|
||||
.OrderBy(x => x.Value)
|
||||
.Should().Equal((ChangedKind.Remove, -1090), (ChangedKind.Remove, -100), (ChangedKind.Remove, -53), (ChangedKind.Remove, -40), (ChangedKind.Remove, -34));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value))
|
||||
.OrderBy(x => x.Value)
|
||||
.Should().Equal((ChangedKind.Remove, -1090), (ChangedKind.Remove, -100), (ChangedKind.Remove, -53), (ChangedKind.Remove, -40), (ChangedKind.Remove, -34));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value.Value))
|
||||
.OrderBy(x => x.Value)
|
||||
.Should().Equal((ChangedKind.Remove, -1090), (ChangedKind.Remove, -100), (ChangedKind.Remove, -53), (ChangedKind.Remove, -40), (ChangedKind.Remove, -34));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -136,5 +136,87 @@ namespace ObservableCollections.Tests
|
||||
view.Select(x => x.Value).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||
view.Select(x => x.View).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FilterTest()
|
||||
{
|
||||
var list = new ObservableList<int>();
|
||||
var view1 = list.CreateView(x => new ViewContainer<int>(x));
|
||||
var view2 = list.CreateSortedView(x => x, x => new ViewContainer<int>(x), comparer: Comparer<int>.Default);
|
||||
var view3 = list.CreateSortedView(x => x, x => new ViewContainer<int>(x), viewComparer: Comparer<ViewContainer<int>>.Default);
|
||||
list.AddRange(new[] { 10, 21, 30, 44, 45, 66, 90 });
|
||||
|
||||
var filter1 = new TestFilter<int>((x, v) => x % 2 == 0);
|
||||
var filter2 = new TestFilter<int>((x, v) => x % 2 == 0);
|
||||
var filter3 = new TestFilter<int>((x, v) => x % 2 == 0);
|
||||
view1.AttachFilter(filter1);
|
||||
view2.AttachFilter(filter2);
|
||||
view3.AttachFilter(filter3);
|
||||
|
||||
filter1.CalledWhenTrue.Select(x => x.Item1).Should().Equal(10, 30, 44, 66, 90);
|
||||
filter2.CalledWhenTrue.Select(x => x.Item1).Should().Equal(10, 30, 44, 66, 90);
|
||||
filter3.CalledWhenTrue.Select(x => x.Item1).Should().Equal(10, 30, 44, 66, 90);
|
||||
|
||||
filter1.CalledWhenFalse.Select(x => x.Item1).Should().Equal(21, 45);
|
||||
filter2.CalledWhenFalse.Select(x => x.Item1).Should().Equal(21, 45);
|
||||
filter3.CalledWhenFalse.Select(x => x.Item1).Should().Equal(21, 45);
|
||||
|
||||
view1.Select(x => x.Value).Should().Equal(10, 30, 44, 66, 90);
|
||||
view2.Select(x => x.Value).Should().Equal(10, 30, 44, 66, 90);
|
||||
view3.Select(x => x.Value).Should().Equal(10, 30, 44, 66, 90);
|
||||
|
||||
filter1.Clear();
|
||||
filter2.Clear();
|
||||
filter3.Clear();
|
||||
|
||||
list.Add(100);
|
||||
list.AddRange(new[] { 101 });
|
||||
filter1.CalledWhenTrue.Select(x => x.Item1).Should().Equal(100);
|
||||
filter2.CalledWhenTrue.Select(x => x.Item1).Should().Equal(100);
|
||||
filter3.CalledWhenTrue.Select(x => x.Item1).Should().Equal(100);
|
||||
filter1.CalledWhenFalse.Select(x => x.Item1).Should().Equal(101);
|
||||
filter2.CalledWhenFalse.Select(x => x.Item1).Should().Equal(101);
|
||||
filter3.CalledWhenFalse.Select(x => x.Item1).Should().Equal(101);
|
||||
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 100), (ChangedKind.Add, 101));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 100), (ChangedKind.Add, 101));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 100), (ChangedKind.Add, 101));
|
||||
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
list.Insert(0, 1000);
|
||||
list.InsertRange(0, new[] { 999 });
|
||||
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 1000), (ChangedKind.Add, 999));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 1000), (ChangedKind.Add, 999));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Add, 1000), (ChangedKind.Add, 999));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
list.RemoveAt(0);
|
||||
list.RemoveRange(0, 1);
|
||||
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 999), (ChangedKind.Remove, 1000));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 999), (ChangedKind.Remove, 1000));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 999), (ChangedKind.Remove, 1000));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
list[0] = 9999;
|
||||
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 10), (ChangedKind.Add, 9999));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 10), (ChangedKind.Add, 9999));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 10), (ChangedKind.Add, 9999));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
list.Move(3, 0);
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Move, 44));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Move, 44));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Move, 44));
|
||||
foreach (var item in new[] { filter1, filter2, filter3 }) item.CalledOnCollectionChanged.Clear();
|
||||
|
||||
list.Clear();
|
||||
filter1.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 44), (ChangedKind.Remove, 9999), (ChangedKind.Remove, 21), (ChangedKind.Remove, 30), (ChangedKind.Remove, 45), (ChangedKind.Remove, 66), (ChangedKind.Remove, 90), (ChangedKind.Remove, 100), (ChangedKind.Remove, 101));
|
||||
filter2.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 21), (ChangedKind.Remove, 30), (ChangedKind.Remove, 44), (ChangedKind.Remove, 45), (ChangedKind.Remove, 66), (ChangedKind.Remove, 90), (ChangedKind.Remove, 100), (ChangedKind.Remove, 101), (ChangedKind.Remove, 9999));
|
||||
filter3.CalledOnCollectionChanged.Select(x => (x.changedKind, x.value)).Should().Equal((ChangedKind.Remove, 21), (ChangedKind.Remove, 30), (ChangedKind.Remove, 44), (ChangedKind.Remove, 45), (ChangedKind.Remove, 66), (ChangedKind.Remove, 90), (ChangedKind.Remove, 100), (ChangedKind.Remove, 101), (ChangedKind.Remove, 9999));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,4 +29,84 @@ namespace ObservableCollections.Tests
|
||||
return EqualityComparer<T>.Default.Equals(Value, other.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public class TestFilter<T> : ISynchronizedViewFilter<T, ViewContainer<T>>
|
||||
{
|
||||
readonly Func<T, ViewContainer<T>, bool> filter;
|
||||
public List<(T, ViewContainer<T>)> CalledWhenTrue = new();
|
||||
public List<(T, ViewContainer<T>)> CalledWhenFalse = new();
|
||||
public List<(ChangedKind changedKind, T value, ViewContainer<T> view)> CalledOnCollectionChanged = new();
|
||||
|
||||
public TestFilter(Func<T, ViewContainer<T>, bool> filter)
|
||||
{
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
CalledWhenTrue.Clear();
|
||||
CalledWhenFalse.Clear();
|
||||
CalledOnCollectionChanged.Clear();
|
||||
}
|
||||
|
||||
public bool IsMatch(T value, ViewContainer<T> view)
|
||||
{
|
||||
return this.filter.Invoke(value, view);
|
||||
}
|
||||
|
||||
public void OnCollectionChanged(ChangedKind changedKind, T value, ViewContainer<T> view)
|
||||
{
|
||||
CalledOnCollectionChanged.Add((changedKind, value, view));
|
||||
}
|
||||
|
||||
public void WhenTrue(T value, ViewContainer<T> view)
|
||||
{
|
||||
CalledWhenTrue.Add((value, view));
|
||||
}
|
||||
|
||||
public void WhenFalse(T value, ViewContainer<T> view)
|
||||
{
|
||||
CalledWhenFalse.Add((value, view));
|
||||
}
|
||||
}
|
||||
|
||||
public class TestFilter2<T> : ISynchronizedViewFilter<KeyValuePair<T, T>, ViewContainer<T>>
|
||||
{
|
||||
readonly Func<KeyValuePair<T, T>, ViewContainer<T>, bool> filter;
|
||||
public List<(KeyValuePair<T, T>, ViewContainer<T>)> CalledWhenTrue = new();
|
||||
public List<(KeyValuePair<T, T>, ViewContainer<T>)> CalledWhenFalse = new();
|
||||
public List<(ChangedKind changedKind, KeyValuePair<T, T> value, ViewContainer<T> view)> CalledOnCollectionChanged = new();
|
||||
|
||||
public TestFilter2(Func<KeyValuePair<T, T>, ViewContainer<T>, bool> filter)
|
||||
{
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
CalledWhenTrue.Clear();
|
||||
CalledWhenFalse.Clear();
|
||||
CalledOnCollectionChanged.Clear();
|
||||
}
|
||||
|
||||
public bool IsMatch(KeyValuePair<T, T> value, ViewContainer<T> view)
|
||||
{
|
||||
return this.filter.Invoke(value, view);
|
||||
}
|
||||
|
||||
public void OnCollectionChanged(ChangedKind changedKind, KeyValuePair<T, T> value, ViewContainer<T> view)
|
||||
{
|
||||
CalledOnCollectionChanged.Add((changedKind, value, view));
|
||||
}
|
||||
|
||||
public void WhenTrue(KeyValuePair<T, T> value, ViewContainer<T> view)
|
||||
{
|
||||
CalledWhenTrue.Add((value, view));
|
||||
}
|
||||
|
||||
public void WhenFalse(KeyValuePair<T, T> value, ViewContainer<T> view)
|
||||
{
|
||||
CalledWhenFalse.Add((value, view));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user