Skip to content

Commit 5918315

Browse files
committed
test: improve tests
1 parent 4b505a9 commit 5918315

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

src/ByteSync.Client/Services/TimeTracking/SynchronizationDataTrackingStrategy.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Reactive.Linq;
1+
using System.Reactive.Concurrency;
2+
using System.Reactive.Linq;
23
using ByteSync.Business.Synchronizations;
34
using ByteSync.Interfaces.Controls.Synchronizations;
45
using ByteSync.Interfaces.Controls.TimeTracking;
@@ -8,10 +9,18 @@ namespace ByteSync.Services.TimeTracking;
89
public class SynchronizationDataTrackingStrategy : IDataTrackingStrategy
910
{
1011
private readonly ISynchronizationService _synchronizationService;
12+
private readonly IScheduler _scheduler;
1113

1214
public SynchronizationDataTrackingStrategy(ISynchronizationService synchronizationService)
1315
{
1416
_synchronizationService = synchronizationService;
17+
_scheduler = Scheduler.Default;
18+
}
19+
20+
public SynchronizationDataTrackingStrategy(ISynchronizationService synchronizationService, IScheduler scheduler)
21+
{
22+
_synchronizationService = synchronizationService;
23+
_scheduler = scheduler;
1524
}
1625

1726
public IObservable<(long IdentifiedSize, long ProcessedSize)> GetDataObservable()
@@ -36,7 +45,7 @@ public SynchronizationDataTrackingStrategy(ISynchronizationService synchronizati
3645
// Sample the source observable every 0.5 seconds, but only for values that can be skipped
3746
var sampled = sharedSource
3847
.Where(canSkip)
39-
.Sample(TimeSpan.FromSeconds(0.5));
48+
.Sample(TimeSpan.FromSeconds(0.5), _scheduler);
4049

4150
// Get the values from the shared source that can not be skipped
4251
var notSkipped = sharedSource

tests/ByteSync.Client.Tests/Services/TimeTracking/SynchronizationDataTrackingStrategyTests.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
using System.Reactive.Concurrency;
12
using ByteSync.Business.Synchronizations;
23
using ByteSync.Interfaces.Controls.Synchronizations;
34
using ByteSync.Services.TimeTracking;
45
using FluentAssertions;
6+
using Microsoft.Reactive.Testing;
57
using Moq;
68
using NUnit.Framework;
79

@@ -10,23 +12,25 @@ namespace ByteSync.Tests.Services.TimeTracking;
1012
[TestFixture]
1113
public class SynchronizationDataTrackingStrategyTests
1214
{
13-
private static (SynchronizationDataTrackingStrategy Sut, SynchronizationProcessData Data) CreateSut()
15+
private static (SynchronizationDataTrackingStrategy Sut, SynchronizationProcessData Data, IScheduler Scheduler) CreateSut(
16+
IScheduler? scheduler = null)
1417
{
1518
var data = new SynchronizationProcessData();
1619

1720
var syncServiceMock = new Mock<ISynchronizationService>();
1821
syncServiceMock.SetupGet(x => x.SynchronizationProcessData).Returns(data);
1922

20-
var sut = new SynchronizationDataTrackingStrategy(syncServiceMock.Object);
23+
var usedScheduler = scheduler ?? new TestScheduler();
24+
var sut = new SynchronizationDataTrackingStrategy(syncServiceMock.Object, usedScheduler);
2125

22-
return (sut, data);
26+
return (sut, data, usedScheduler);
2327
}
2428

2529
[Test]
2630
public void GetDataObservable_InitialEmission_IsZeroTuple()
2731
{
2832
// Arrange
29-
var (sut, data) = CreateSut();
33+
var (sut, data, _) = CreateSut();
3034
var evt = new AutoResetEvent(false);
3135
(long Identified, long Processed)? captured = null;
3236
Exception? error = null;
@@ -57,7 +61,7 @@ public void GetDataObservable_InitialEmission_IsZeroTuple()
5761
public void GetDataObservable_RunningWithZeroProgress_EmitsImmediately()
5862
{
5963
// Arrange
60-
var (sut, data) = CreateSut();
64+
var (sut, data, _) = CreateSut();
6165
var results = new List<(long Identified, long Processed)>();
6266
using var sub = sut.GetDataObservable().Subscribe(results.Add);
6367

@@ -69,8 +73,6 @@ public void GetDataObservable_RunningWithZeroProgress_EmitsImmediately()
6973
});
7074
data.SynchronizationMainStatus.OnNext(SynchronizationProcessStatuses.Running);
7175

72-
Thread.Sleep(200);
73-
7476
// Assert: should include the emitted data (non-skippable path)
7577
results.Should().Contain((1234L, 0L));
7678
}
@@ -79,21 +81,21 @@ public void GetDataObservable_RunningWithZeroProgress_EmitsImmediately()
7981
public void GetDataObservable_RunningWithNonZeroProgress_IsSampled()
8082
{
8183
// Arrange
82-
var (sut, data) = CreateSut();
84+
var (sut, data, scheduler) = CreateSut();
8385

8486
var results = new List<(long Identified, long Processed)>();
8587
using var subscription = sut.GetDataObservable().Subscribe(x => results.Add(x));
8688

8789
// Act: Push a few non-zero updates in quick succession (< 0.5s)
8890
data.SynchronizationMainStatus.OnNext(SynchronizationProcessStatuses.Running);
8991
data.SynchronizationProgress.OnNext(new SynchronizationProgress { TotalVolumeToProcess = 1000, SynchronizedVolume = 10 });
90-
Thread.Sleep(100);
92+
(scheduler as TestScheduler)!.AdvanceBy(TimeSpan.FromMilliseconds(100).Ticks);
9193
data.SynchronizationProgress.OnNext(new SynchronizationProgress { TotalVolumeToProcess = 1000, SynchronizedVolume = 20 });
92-
Thread.Sleep(100);
94+
(scheduler as TestScheduler)!.AdvanceBy(TimeSpan.FromMilliseconds(100).Ticks);
9395
data.SynchronizationProgress.OnNext(new SynchronizationProgress { TotalVolumeToProcess = 1000, SynchronizedVolume = 30 });
9496

95-
// Wait sufficiently long for Sample(0.5s) to produce an emission
96-
Thread.Sleep(1500);
97+
// Advance virtual time beyond 0.5s to trigger Sample(0.5s)
98+
(scheduler as TestScheduler)!.AdvanceBy(TimeSpan.FromSeconds(1).Ticks);
9799

98100
// Assert: we should have at least one sampled emission with the latest values
99101
results.Should().Contain((1000L, 30L));

0 commit comments

Comments
 (0)