mirror of
https://github.com/Cysharp/R3.git
synced 2026-10-28 23:12:29 +08:00
92 lines
2.5 KiB
C#
92 lines
2.5 KiB
C#
using System.Reactive.Linq;
|
|
|
|
namespace R3.Tests.OperatorTests;
|
|
|
|
public class TakeLastTest(ITestOutputHelper helper)
|
|
{
|
|
[Fact]
|
|
public async Task Take()
|
|
{
|
|
var xs = await Observable.Range(1, 10).TakeLast(3).ToArrayAsync();
|
|
xs.ShouldBe([8, 9, 10]);
|
|
}
|
|
|
|
[Fact]
|
|
public void TakeTime()
|
|
{
|
|
var timeProvider = new FakeTimeProvider();
|
|
|
|
var publisher = new Subject<int>();
|
|
var list = publisher.TakeLast(TimeSpan.FromSeconds(3), timeProvider).ToLiveList();
|
|
|
|
publisher.OnNext(1);
|
|
publisher.OnNext(10);
|
|
list.AssertEqual([]);
|
|
|
|
timeProvider.Advance(TimeSpan.FromSeconds(2));
|
|
publisher.OnNext(100);
|
|
publisher.OnNext(1000);
|
|
|
|
timeProvider.Advance(TimeSpan.FromSeconds(2));
|
|
publisher.OnNext(2);
|
|
publisher.OnNext(20);
|
|
|
|
publisher.OnCompleted();
|
|
|
|
list.AssertEqual([100, 1000, 2, 20]);
|
|
list.AssertIsCompleted();
|
|
}
|
|
|
|
[Fact]
|
|
public void TakeFrame2()
|
|
{
|
|
var frameProvider = new FakeFrameProvider();
|
|
var cts = new CancellationTokenSource();
|
|
|
|
var list = Observable.EveryUpdate(frameProvider, cts.Token)
|
|
.Select(x => frameProvider.GetFrameCount())
|
|
.TakeLastFrame(3, frameProvider)
|
|
.ToLiveList();
|
|
|
|
frameProvider.Advance(3); // 0, 1, 2
|
|
list.AssertEqual([]);
|
|
|
|
frameProvider.Advance(2); // 3, 4
|
|
frameProvider.Advance(1); // 5
|
|
|
|
cts.Cancel(); // stop and OnCompleted
|
|
|
|
list.AssertEqual([3, 4, 5]);
|
|
list.AssertIsCompleted();
|
|
}
|
|
|
|
//[Fact]
|
|
//public async Task DisposeQueue()
|
|
//{
|
|
// var defaultHandler = ObservableSystem.GetUnhandledExceptionHandler();
|
|
// Exception? exception = null;
|
|
// ObservableSystem.RegisterUnhandledExceptionHandler(ex =>
|
|
// {
|
|
// exception = ex;
|
|
// });
|
|
// try
|
|
// {
|
|
// var status = Observable.Interval(TimeSpan.FromMilliseconds(100)).Index();
|
|
// var doSomething = Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(5);
|
|
|
|
// var end = new TaskCompletionSource();
|
|
// status.TakeUntil(doSomething.TakeLast(1)).Subscribe(_ => end.TrySetResult());
|
|
|
|
// await end.Task;
|
|
// await Task.Delay(TimeSpan.FromMilliseconds(500));
|
|
|
|
// exception!.ShouldBeNull();
|
|
// // helper.WriteLine(exception!.Message);
|
|
// }
|
|
// finally
|
|
// {
|
|
// ObservableSystem.RegisterUnhandledExceptionHandler(defaultHandler);
|
|
// }
|
|
//}
|
|
}
|