Forge
csharp4405de34
1using CascadeIDE.Cockpit.DataBus;
2using Xunit;
3
4namespace CascadeIDE.Tests;
5
6public sealed class InMemoryDataBusTests
7{
8 [Fact]
9 public void Publish_sync_mode_delivers_immediately()
10 {
11 using var bus = new InMemoryDataBus(asynchronousDispatch: false);
12 var delivered = false;
13 using var sub = bus.Subscribe<BuildStateChanged>(evt => delivered = evt.IsBuilding);
14
15 bus.Publish(new BuildStateChanged(true));
16
17 Assert.True(delivered);
18 }
19
20 [Fact]
21 public void Publish_sync_mode_isolates_faulty_subscriber()
22 {
23 using var bus = new InMemoryDataBus(asynchronousDispatch: false);
24 var delivered = false;
25 using var sub1 = bus.Subscribe<BuildStateChanged>(_ => throw new InvalidOperationException("boom"));
26 using var sub2 = bus.Subscribe<BuildStateChanged>(evt => delivered = evt.IsBuilding);
27
28 bus.Publish(new BuildStateChanged(true));
29
30 Assert.True(delivered);
31 }
32
33 [Fact]
34 public void Publish_async_mode_eventually_delivers()
35 {
36 using var bus = new InMemoryDataBus(asynchronousDispatch: true);
37 var delivered = 0;
38 using var sub = bus.Subscribe<BuildStateChanged>(evt =>
39 {
40 if (evt.IsBuilding)
41 Interlocked.Exchange(ref delivered, 1);
42 });
43
44 bus.Publish(new BuildStateChanged(true));
45
46 Assert.True(SpinWait.SpinUntil(() => Volatile.Read(ref delivered) == 1, millisecondsTimeout: 1000));
47 }
48}
49
View only · write via MCP/CIDE