/// <summary> /// window function and scheduler for testing. /// </summary> /// <returns></returns> private static async Task test2() { var scheduler = new TestScheduler(); var bandStatus = new BehaviorSubject <Status>(Status.Disconnected); var closingWindowCondition = bandStatus.Where(i => i != Status.Disconnected).DistinctUntilChanged(); var openingWindowCondition = bandStatus.Where(i => i == Status.Disconnected).DistinctUntilChanged(); var condition = bandStatus.Window(openingWindowCondition, _ => closingWindowCondition); var idx = 0; var initialdt = scheduler.Now; var signalingSub = new Subject <Unit>(); condition .ObserveOn(scheduler) .Subscribe(w => { initialdt = scheduler.Now; Console.WriteLine($"Window {idx++} is here"); w.Subscribe(_ => { }, () => { Console.WriteLine($">>>>> Window {idx} closing"); if (scheduler.Now - initialdt > TimeSpan.FromSeconds(3)) { signalingSub.OnNext(Unit.Default); } }); }); ///How to use DateTime with TestSchedular? : IScheduler.Now signalingSub.Subscribe(_ => Console.WriteLine(">>>>>>> valid disconnection happened <<<<<<<")); //behavior: when connected, and if there has been x amount of time in disconnection, tick. //Even though the tighter condition would be that //if more than x sec has passed in disconnected state, this subject should tick already. //It doesn't make sense with Disconnected since we're upgrading. //so this behavior is ok. Console.WriteLine("first disconnected to open the window"); bandStatus.OnNext(Status.Disconnected); scheduler.AdvanceBy(TimeSpan.FromSeconds(4).Ticks); Console.WriteLine("4 sec delay in Disconnected state, then Connected, done. Now it's valid time."); bandStatus.OnNext(Status.Connected); Console.WriteLine("===============\nnow Connected"); Console.WriteLine("rest 1 sec"); scheduler.AdvanceBy(TimeSpan.FromSeconds(1).Ticks); bandStatus.OnNext(Status.Disconnected); scheduler.AdvanceBy(TimeSpan.FromSeconds(2).Ticks); bandStatus.OnNext(Status.Connected); Console.WriteLine("2 sec of disconnection happened. No tick should happen."); }