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
|
public interface ISynchronizedView<T, TView> : IReadOnlyCollection<(T Value, TView View)>, IDisposable
|
||||||
{
|
{
|
||||||
|
// TODO:Remove SyncRoot
|
||||||
object SyncRoot { get; }
|
object SyncRoot { get; }
|
||||||
|
|
||||||
event NotifyCollectionChangedEventHandler<T>? RoutingCollectionChanged;
|
event NotifyCollectionChangedEventHandler<T>? RoutingCollectionChanged;
|
||||||
event Action<NotifyCollectionChangedAction>? CollectionStateChanged;
|
event Action<NotifyCollectionChangedAction>? CollectionStateChanged;
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ namespace ObservableCollections.Internal
|
|||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
foreach (var (value, view) in list)
|
foreach (var (value, view) in list)
|
||||||
{
|
{
|
||||||
filter.Invoke(value, view);
|
filter.InvokeOnAttach(value, view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,7 +125,7 @@ namespace ObservableCollections.Internal
|
|||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
foreach (var (value, view) in array)
|
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.Value.Value).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||||
view.Select(x => x.View).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.Value).Should().Equal(60, 50, 40, 30, 20, 10);
|
||||||
view.Select(x => x.View).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);
|
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