From e513629abbdf6421f95a6526f19a3499af49cb51 Mon Sep 17 00:00:00 2001 From: TORISOUP Date: Thu, 1 May 2025 22:11:26 +0900 Subject: [PATCH] fix: AsObservable immediately calls Dispose on completion --- src/R3/Operators/AsObservable.cs | 29 ++++++++++++++++++- .../OperatorTests/AsObservableTest.cs | 18 +++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/R3/Operators/AsObservable.cs b/src/R3/Operators/AsObservable.cs index 2c1c92a3..e3196c6b 100644 --- a/src/R3/Operators/AsObservable.cs +++ b/src/R3/Operators/AsObservable.cs @@ -22,7 +22,32 @@ internal sealed class AsObservable(Observable observable) : Observable { protected override IDisposable SubscribeCore(Observer observer) { - return observable.Subscribe(observer.Wrap()); + return observable.Subscribe(new AsObservableObserver(observer)); + } + + sealed class AsObservableObserver(Observer observer) : Observer + { + protected override bool AutoDisposeOnCompleted => false; + + protected override void OnNextCore(T value) + { + observer.OnNext(value); + } + + protected override void OnErrorResumeCore(Exception error) + { + observer.OnErrorResume(error); + } + + protected override void OnCompletedCore(Result result) + { + observer.OnCompleted(result); + } + + protected override void DisposeCore() + { + observer.Dispose(); + } } } @@ -35,6 +60,8 @@ public IDisposable Subscribe(IObserver observer) sealed class ObserverToObserver(IObserver observer) : Observer { + protected override bool AutoDisposeOnCompleted => false; + protected override void OnNextCore(T value) { observer.OnNext(value); diff --git a/tests/R3.Tests/OperatorTests/AsObservableTest.cs b/tests/R3.Tests/OperatorTests/AsObservableTest.cs index b91d2d28..d13b406d 100644 --- a/tests/R3.Tests/OperatorTests/AsObservableTest.cs +++ b/tests/R3.Tests/OperatorTests/AsObservableTest.cs @@ -18,9 +18,25 @@ public void AsObservable() } [Fact] - public void AsSystemObservable() + public void AsObservableWithDelay() { + var p = new Subject(); + var fakeFrameProvider = new FakeFrameProvider(); + + var l = p.AsObservable().DelayFrame(1, fakeFrameProvider).ToLiveList(); + p.OnNext(1); + p.OnNext(2); + p.OnNext(3); + p.OnCompleted(); + fakeFrameProvider.Advance(); + l.AssertEqual([1, 2, 3]); + l.AssertIsCompleted(); + } + + [Fact] + public void AsSystemObservable() + { { var p = new Subject(); var l = new List();