-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImmutableDataStateTests.cs
More file actions
146 lines (121 loc) · 4.41 KB
/
ImmutableDataStateTests.cs
File metadata and controls
146 lines (121 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using NUnit.Framework;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Immutable;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
[TestFixture]
public class DataStateTests
{
private ServiceProvider _serviceProvider;
private IDataStateManager _stateManager;
[SetUp]
public void Setup()
{
var services = new ServiceCollection();
services.AddSingleton<IDataStateManager, DataStateManager>();
services.AddHostedService<DataProducerService>();
services.AddHostedService<DataConsumerService>();
_serviceProvider = services.BuildServiceProvider();
_stateManager = _serviceProvider.GetRequiredService<IDataStateManager>();
}
[TearDown]
public void TearDown()
{
_serviceProvider.Dispose();
}
[Test]
public void DataStateManager_InitialState_IsEmpty()
{
// Arrange & Act
var state = _stateManager.GetCurrentState();
// Assert
Assert.That(state, Is.Not.Null);
Assert.That(state, Is.Empty);
}
[Test]
public void DataStateManager_UpdateState_AddsItem()
{
// Arrange
var newItem = new DataItem(1, "TestValue");
// Act
_stateManager.UpdateState(current => current.Add(newItem));
var state = _stateManager.GetCurrentState();
// Assert
Assert.That(state.Count, Is.EqualTo(1));
Assert.That(state[0], Is.EqualTo(newItem));
}
[Test]
public void DataStateManager_OnStateChanged_FiresOnUpdate()
{
// Arrange
var wasCalled = false;
ImmutableList<DataItem> receivedState = null;
_stateManager.OnStateChanged += state =>
{
wasCalled = true;
receivedState = state;
};
var newItem = new DataItem(2, "TestValue2");
// Act
_stateManager.UpdateState(current => current.Add(newItem));
// Assert
Assert.That(wasCalled, Is.True);
Assert.That(receivedState, Is.Not.Null);
Assert.That(receivedState.Count, Is.EqualTo(1));
Assert.That(receivedState[0], Is.EqualTo(newItem));
}
[Test]
public async Task DataProducerService_AddsItemsOverTime()
{
// Arrange
var producer = _serviceProvider.GetRequiredService<IHostedService>() as DataProducerService;
var cts = new CancellationTokenSource();
// Act
await producer.StartAsync(cts.Token);
await Task.Delay(5000); // Wait 5 seconds to allow some items to be produced
await producer.StopAsync(cts.Token);
// Assert
var state = _stateManager.GetCurrentState();
Assert.That(state.Count, Is.GreaterThan(0));
Assert.That(state.Count, Is.LessThanOrEqualTo(3)); // Should produce 2-3 items in 5 seconds (2s interval)
}
[Test]
public async Task DataConsumerService_ReceivesStateUpdates()
{
// Arrange
var consumer = _serviceProvider.GetRequiredService<IHostedService>(s => s is DataConsumerService)
as DataConsumerService;
var cts = new CancellationTokenSource();
var updateReceived = new TaskCompletionSource<bool>();
_stateManager.OnStateChanged += _ => updateReceived.TrySetResult(true);
// Act
await consumer.StartAsync(cts.Token);
_stateManager.UpdateState(current => current.Add(new DataItem(3, "TestValue3")));
// Wait for update with timeout
var completed = await Task.WhenAny(updateReceived.Task, Task.Delay(1000));
await consumer.StopAsync(cts.Token);
// Assert
Assert.That(completed, Is.EqualTo(updateReceived.Task), "Consumer should have received state update");
}
[Test]
public void DataStateManager_ConcurrentUpdates_MaintainsConsistency()
{
// Arrange
var updateCount = 100;
var tasks = new Task[updateCount];
// Act
for (int i = 0; i < updateCount; i++)
{
var id = i;
tasks[i] = Task.Run(() =>
_stateManager.UpdateState(current =>
current.Add(new DataItem(id, $"Value-{id}"))));
}
Task.WaitAll(tasks);
// Assert
var state = _stateManager.GetCurrentState();
Assert.That(state.Count, Is.EqualTo(updateCount));
Assert.That(state, Is.Unique); // All items should be distinct
}
}