Skip to content

Commit 8fd1124

Browse files
authored
Concept/Prototype for testing utilities (#870)
1 parent f6a187f commit 8fd1124

10 files changed

Lines changed: 977 additions & 497 deletions

src/DynamicData.Tests/Cache/ExpireAfterFixture.ForSource.cs

Lines changed: 117 additions & 131 deletions
Large diffs are not rendered by default.

src/DynamicData.Tests/Cache/ExpireAfterFixture.ForStream.cs

Lines changed: 174 additions & 149 deletions
Large diffs are not rendered by default.

src/DynamicData.Tests/List/ExpireAfterFixture.cs

Lines changed: 118 additions & 132 deletions
Large diffs are not rendered by default.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System.Collections.Generic;
2+
using System.Reactive.Concurrency;
3+
4+
namespace DynamicData.Tests.Utilities;
5+
6+
public sealed class CacheItemRecordingObserver<TObject, TKey>
7+
: RecordingObserverBase<IChangeSet<TObject, TKey>>
8+
where TObject : notnull
9+
where TKey : notnull
10+
{
11+
private readonly List<IChangeSet<TObject, TKey>> _recordedChangeSets;
12+
private readonly Dictionary<TKey, TObject> _recordedItemsByKey;
13+
private readonly List<TObject> _recordedItemsSorted;
14+
15+
public CacheItemRecordingObserver(IScheduler scheduler)
16+
: base(scheduler)
17+
{
18+
_recordedChangeSets = new();
19+
_recordedItemsByKey = new();
20+
_recordedItemsSorted = new();
21+
}
22+
23+
public IReadOnlyList<IChangeSet<TObject, TKey>> RecordedChangeSets
24+
=> _recordedChangeSets;
25+
26+
public IReadOnlyDictionary<TKey, TObject> RecordedItemsByKey
27+
=> _recordedItemsByKey;
28+
29+
public IReadOnlyList<TObject> RecordedItemsSorted
30+
=> _recordedItemsSorted;
31+
32+
protected override void OnNext(IChangeSet<TObject, TKey> value)
33+
{
34+
if (!HasFinalized)
35+
{
36+
_recordedChangeSets.Add(value);
37+
38+
foreach (var change in value)
39+
{
40+
switch (change.Reason)
41+
{
42+
case ChangeReason.Add:
43+
_recordedItemsByKey.Add(change.Key, change.Current);
44+
if (change.CurrentIndex is not -1)
45+
_recordedItemsSorted.Insert(change.CurrentIndex, change.Current);
46+
break;
47+
48+
case ChangeReason.Moved:
49+
_recordedItemsSorted.RemoveAt(change.PreviousIndex);
50+
_recordedItemsSorted.Insert(change.CurrentIndex, change.Current);
51+
break;
52+
53+
case ChangeReason.Remove:
54+
_recordedItemsByKey.Remove(change.Key);
55+
if (change.CurrentIndex is not -1)
56+
_recordedItemsSorted.RemoveAt(change.CurrentIndex);
57+
break;
58+
59+
case ChangeReason.Update:
60+
_recordedItemsByKey[change.Key] = change.Current;
61+
if (change.CurrentIndex is not -1)
62+
{
63+
_recordedItemsSorted.RemoveAt(change.PreviousIndex);
64+
_recordedItemsSorted.Insert(change.CurrentIndex, change.Current);
65+
}
66+
break;
67+
}
68+
}
69+
}
70+
}
71+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Collections.Generic;
2+
using System.Reactive.Concurrency;
3+
4+
namespace DynamicData.Tests.Utilities;
5+
6+
public sealed class ListItemRecordingObserver<T>
7+
: RecordingObserverBase<IChangeSet<T>>
8+
where T : notnull
9+
{
10+
private readonly List<IChangeSet<T>> _recordedChangeSets;
11+
private readonly List<T> _recordedItems;
12+
13+
public ListItemRecordingObserver(IScheduler scheduler)
14+
: base(scheduler)
15+
{
16+
_recordedChangeSets = new();
17+
_recordedItems = new();
18+
}
19+
20+
public IReadOnlyList<IChangeSet<T>> RecordedChangeSets
21+
=> _recordedChangeSets;
22+
23+
public IReadOnlyList<T> RecordedItems
24+
=> _recordedItems;
25+
26+
protected override void OnNext(IChangeSet<T> value)
27+
{
28+
if (!HasFinalized)
29+
{
30+
_recordedChangeSets.Add(value);
31+
32+
foreach (var change in value)
33+
{
34+
switch (change.Reason)
35+
{
36+
case ListChangeReason.Add:
37+
if (change.Item.CurrentIndex is -1)
38+
_recordedItems.Add(change.Item.Current);
39+
else
40+
_recordedItems.Insert(change.Item.CurrentIndex, change.Item.Current);
41+
break;
42+
43+
case ListChangeReason.AddRange:
44+
if (change.Range.Index is -1)
45+
_recordedItems.AddRange(change.Range);
46+
else
47+
_recordedItems.InsertRange(change.Range.Index, change.Range);
48+
break;
49+
50+
case ListChangeReason.Clear:
51+
_recordedItems.Clear();
52+
break;
53+
54+
case ListChangeReason.Moved:
55+
_recordedItems.RemoveAt(change.Item.PreviousIndex);
56+
_recordedItems.Insert(change.Item.CurrentIndex, change.Item.Current);
57+
break;
58+
59+
case ListChangeReason.Remove:
60+
_recordedItems.RemoveAt(change.Item.CurrentIndex);
61+
break;
62+
63+
case ListChangeReason.RemoveRange:
64+
_recordedItems.RemoveRange(change.Range.Index, change.Range.Count);
65+
break;
66+
67+
case ListChangeReason.Replace:
68+
_recordedItems[change.Item.CurrentIndex] = change.Item.Current;
69+
break;
70+
}
71+
}
72+
}
73+
}
74+
}

0 commit comments

Comments
 (0)