Skip to content

Commit 6770d44

Browse files
authored
feature: Change TransformAsync implementation to be more similar to normal Transform (#625)
Add TransformOnRefresh option to List.TransformAsync
1 parent 4c68e18 commit 6770d44

5 files changed

Lines changed: 338 additions & 178 deletions

File tree

src/DynamicData.Tests/List/TransformAsyncFixture.cs

100644100755
Lines changed: 130 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System;
2+
using System.Linq;
23
using System.Threading.Tasks;
34

45
using DynamicData.Tests.Domain;
6+
using FluentAssertions;
7+
using Xunit;
58

69
namespace DynamicData.Tests.List;
710

@@ -35,90 +38,131 @@ public void Dispose()
3538
3639
*/
3740

38-
//[Fact]
39-
//public async Task Add()
40-
//{
41-
// var person = new Person("Adult1", 50);
42-
// _source.Add(person);
43-
44-
// _results.Messages.Count.Should().Be(1, "Should be 1 updates");
45-
// _results.Data.Count.Should().Be(1, "Should be 1 item in the cache");
46-
47-
// var transformed = await _transformFactory(person);
48-
// _results.Data.Items.First().Should().Be(transformed, "Should be same person");
49-
//}
50-
51-
//[Fact]
52-
//public void Remove()
53-
//{
54-
// const string key = "Adult1";
55-
// var person = new Person(key, 50);
56-
57-
// _source.Add(person);
58-
// _source.Remove(person);
59-
60-
// _results.Messages.Count.Should().Be(2, "Should be 2 updates");
61-
// _results.Messages.Count.Should().Be(2, "Should be 2 updates");
62-
// _results.Messages[0].Adds.Should().Be(1, "Should be 80 addes");
63-
// _results.Messages[1].Removes.Should().Be(1, "Should be 80 removes");
64-
// _results.Data.Count.Should().Be(0, "Should be nothing cached");
65-
//}
66-
67-
//[Fact]
68-
//public void Update()
69-
//{
70-
// const string key = "Adult1";
71-
// var newperson = new Person(key, 50);
72-
// var updated = new Person(key, 51);
73-
74-
// _source.Add(newperson);
75-
// _source.Add(updated);
76-
77-
// _results.Messages.Count.Should().Be(2, "Should be 2 updates");
78-
// _results.Messages[0].Adds.Should().Be(1, "Should be 1 adds");
79-
// _results.Messages[0].Replaced.Should().Be(0, "Should be 1 update");
80-
//}
81-
82-
//[Fact]
83-
//public async Task BatchOfUniqueUpdates()
84-
//{
85-
// var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
86-
87-
// _source.AddRange(people);
88-
89-
// _results.Messages.Count.Should().Be(1, "Should be 1 updates");
90-
// _results.Messages[0].Adds.Should().Be(100, "Should return 100 adds");
91-
92-
// var tasks = people.Select(_transformFactory);
93-
// var result = await Task.WhenAll(tasks);
94-
95-
// var transformed = result.OrderBy(p => p.Age).ToArray();
96-
// _results.Data.Items.OrderBy(p => p.Age).Should().BeEquivalentTo(_results.Data.Items.OrderBy(p => p.Age), "Incorrect transform result");
97-
//}
98-
99-
//[Fact]
100-
//public void SameKeyChanges()
101-
//{
102-
// var people = Enumerable.Range(1, 10).Select(i => new Person("Name", i)).ToArray();
103-
104-
// _source.AddRange(people);
105-
106-
// _results.Messages.Count.Should().Be(1, "Should be 1 updates");
107-
// _results.Messages[0].Adds.Should().Be(10, "Should return 10 adds");
108-
// _results.Data.Count.Should().Be(10, "Should result in 10 records");
109-
//}
110-
111-
//[Fact]
112-
//public void Clear()
113-
//{
114-
// var people = Enumerable.Range(1, 100).Select(l => new Person("Name" + l, l)).ToArray();
115-
116-
// _source.AddRange(people);
117-
// _source.Clear();
118-
119-
// _results.Messages.Count.Should().Be(2, "Should be 2 updates");
120-
// _results.Messages[0].Adds.Should().Be(100, "Should be 80 addes");
121-
// _results.Messages[1].Removes.Should().Be(100, "Should be 80 removes");
122-
// _results.Data.Count.Should().Be(0, "Should be nothing cached");
123-
//}
41+
[Fact]
42+
public async Task Add()
43+
{
44+
var person = new Person("Adult1", 50);
45+
_source.Add(person);
46+
47+
_results.Messages.Count.Should().Be(1, "Should be 1 updates");
48+
_results.Data.Count.Should().Be(1, "Should be 1 item in the cache");
49+
50+
var transformed = await _transformFactory(person);
51+
_results.Data.Items.First().Should().Be(transformed, "Should be same person");
52+
}
53+
54+
[Fact]
55+
public void Remove()
56+
{
57+
const string key = "Adult1";
58+
var person = new Person(key, 50);
59+
60+
_source.Add(person);
61+
_source.Remove(person);
62+
63+
_results.Messages.Count.Should().Be(2, "Should be 2 updates");
64+
_results.Messages.Count.Should().Be(2, "Should be 2 updates");
65+
_results.Messages[0].Adds.Should().Be(1, "Should be 80 addes");
66+
_results.Messages[1].Removes.Should().Be(1, "Should be 80 removes");
67+
_results.Data.Count.Should().Be(0, "Should be nothing cached");
68+
}
69+
70+
[Fact]
71+
public void Update()
72+
{
73+
const string key = "Adult1";
74+
var newperson = new Person(key, 50);
75+
var updated = new Person(key, 51);
76+
77+
_source.Add(newperson);
78+
_source.Add(updated);
79+
80+
_results.Messages.Count.Should().Be(2, "Should be 2 updates");
81+
_results.Messages[0].Adds.Should().Be(1, "Should be 1 adds");
82+
_results.Messages[0].Replaced.Should().Be(0, "Should be 1 update");
83+
}
84+
85+
[Fact]
86+
public async Task BatchOfUniqueUpdates()
87+
{
88+
var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
89+
90+
_source.AddRange(people);
91+
92+
_results.Messages.Count.Should().Be(1, "Should be 1 updates");
93+
_results.Messages[0].Adds.Should().Be(100, "Should return 100 adds");
94+
95+
var tasks = people.Select(_transformFactory);
96+
var result = await Task.WhenAll(tasks);
97+
98+
var transformed = result.OrderBy(p => p.Age).ToArray();
99+
_results.Data.Items.OrderBy(p => p.Age).Should().BeEquivalentTo(_results.Data.Items.OrderBy(p => p.Age), "Incorrect transform result");
100+
}
101+
102+
[Fact]
103+
public void SameKeyChanges()
104+
{
105+
var people = Enumerable.Range(1, 10).Select(i => new Person("Name", i)).ToArray();
106+
107+
_source.AddRange(people);
108+
109+
_results.Messages.Count.Should().Be(1, "Should be 1 updates");
110+
_results.Messages[0].Adds.Should().Be(10, "Should return 10 adds");
111+
_results.Data.Count.Should().Be(10, "Should result in 10 records");
112+
}
113+
114+
[Fact]
115+
public void Clear()
116+
{
117+
var people = Enumerable.Range(1, 100).Select(l => new Person("Name" + l, l)).ToArray();
118+
119+
_source.AddRange(people);
120+
_source.Clear();
121+
122+
_results.Messages.Count.Should().Be(2, "Should be 2 updates");
123+
_results.Messages[0].Adds.Should().Be(100, "Should be 80 addes");
124+
_results.Messages[1].Removes.Should().Be(100, "Should be 80 removes");
125+
_results.Data.Count.Should().Be(0, "Should be nothing cached");
126+
}
127+
128+
/// <summary>
129+
/// This test is disabled as it was flaky.
130+
/// https://github.com/reactivemarbles/DynamicData/pull/625
131+
/// </summary>
132+
[Fact]
133+
private void TransformOnRefresh()
134+
{
135+
var items = Enumerable.Range(1, 100).Select(i => new Person("Person" + i, 1)).ToArray();
136+
137+
//result should only be true when all items are set to true
138+
using var list = new SourceList<Person>();
139+
using var results = list.Connect().AutoRefresh(p => p.Age)
140+
.TransformAsync(Task.FromResult, transformOnRefresh: true).AsAggregator();
141+
list.AddRange(items);
142+
143+
results.Data.Count.Should().Be(100);
144+
results.Messages.Count.Should().Be(1);
145+
146+
items[0].Age = 10;
147+
results.Data.Count.Should().Be(100);
148+
results.Messages.Count.Should().Be(2);
149+
150+
results.Messages[1].First().Reason.Should().Be(ListChangeReason.Replace);
151+
152+
//remove an item and check no change is fired
153+
var toRemove = items[1];
154+
list.Remove(toRemove);
155+
results.Data.Count.Should().Be(99);
156+
results.Messages.Count.Should().Be(3);
157+
toRemove.Age = 100;
158+
results.Messages.Count.Should().Be(3);
159+
160+
//add it back in and check it updates
161+
list.Add(toRemove);
162+
results.Messages.Count.Should().Be(4);
163+
toRemove.Age = 101;
164+
results.Messages.Count.Should().Be(5);
165+
166+
results.Messages.Last().First().Reason.Should().Be(ListChangeReason.Replace);
167+
}
124168
}

src/DynamicData.Tests/List/TransformFixture.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,41 @@ public void MultipleSubscribersShouldNotShareState()
162162
transformed.Transform(o => o).Subscribe();
163163
transformed.Transform(o => o).Subscribe();
164164
}
165+
166+
[Fact]
167+
public void TransformOnRefresh()
168+
{
169+
var items = Enumerable.Range(1, 100).Select(i => new Person("Person" + i, 1)).ToArray();
170+
171+
//result should only be true when all items are set to true
172+
using var list = new SourceList<Person>();
173+
using var results = list.Connect().AutoRefresh(p => p.Age)
174+
.Transform(v => v, transformOnRefresh: true).AsAggregator();
175+
list.AddRange(items);
176+
177+
results.Data.Count.Should().Be(100);
178+
results.Messages.Count.Should().Be(1);
179+
180+
items[0].Age = 10;
181+
results.Data.Count.Should().Be(100);
182+
results.Messages.Count.Should().Be(2);
183+
184+
results.Messages[1].First().Reason.Should().Be(ListChangeReason.Replace);
185+
186+
//remove an item and check no change is fired
187+
var toRemove = items[1];
188+
list.Remove(toRemove);
189+
results.Data.Count.Should().Be(99);
190+
results.Messages.Count.Should().Be(3);
191+
toRemove.Age = 100;
192+
results.Messages.Count.Should().Be(3);
193+
194+
//add it back in and check it updates
195+
list.Add(toRemove);
196+
results.Messages.Count.Should().Be(4);
197+
toRemove.Age = 101;
198+
results.Messages.Count.Should().Be(5);
199+
200+
results.Messages.Last().First().Reason.Should().Be(ListChangeReason.Replace);
201+
}
165202
}

0 commit comments

Comments
 (0)