diff --git a/Assets/Tests/AsyncTest.cs b/Assets/Tests/AsyncTest.cs index b6f1833b..248ebad5 100644 --- a/Assets/Tests/AsyncTest.cs +++ b/Assets/Tests/AsyncTest.cs @@ -395,6 +395,40 @@ IEnumerator ChildCoroutineEnumerator() yield return new WaitForSeconds(3); } + [UnityTest] + public IEnumerator ToObservable() => UniTask.ToCoroutine(async () => + { + var completedTaskObserver = new ToObservableObserver(); + completedTaskObserver.OnNextCalled.Should().BeFalse(); + completedTaskObserver.OnCompletedCalled.Should().BeFalse(); + completedTaskObserver.OnErrorCalled.Should().BeFalse(); + UniTask.CompletedTask.ToObservable().Subscribe(completedTaskObserver); + completedTaskObserver.OnNextCalled.Should().BeTrue(); + completedTaskObserver.OnCompletedCalled.Should().BeTrue(); + completedTaskObserver.OnErrorCalled.Should().BeFalse(); + + var delayFrameTaskObserver = new ToObservableObserver(); + UniTask.DelayFrame(1).ToObservable().Subscribe(delayFrameTaskObserver); + delayFrameTaskObserver.OnNextCalled.Should().BeFalse(); + delayFrameTaskObserver.OnCompletedCalled.Should().BeFalse(); + delayFrameTaskObserver.OnErrorCalled.Should().BeFalse(); + await UniTask.DelayFrame(1); + delayFrameTaskObserver.OnNextCalled.Should().BeTrue(); + delayFrameTaskObserver.OnCompletedCalled.Should().BeTrue(); + delayFrameTaskObserver.OnErrorCalled.Should().BeFalse(); + }); + + class ToObservableObserver : IObserver + { + public bool OnNextCalled { get; private set; } + public bool OnCompletedCalled { get; private set; } + public bool OnErrorCalled { get; private set; } + + public void OnNext(T value) => OnNextCalled = true; + public void OnCompleted() => OnCompletedCalled = true; + public void OnError(Exception error) => OnErrorCalled = true; + } + #endif #endif } diff --git a/Assets/UniRx.Async/UniTaskObservableExtensions.cs b/Assets/UniRx.Async/UniTaskObservableExtensions.cs index a0890934..2c5dd499 100644 --- a/Assets/UniRx.Async/UniTaskObservableExtensions.cs +++ b/Assets/UniRx.Async/UniTaskObservableExtensions.cs @@ -257,6 +257,7 @@ public ReturnObservable(T value) public IDisposable Subscribe(IObserver observer) { observer.OnNext(value); + observer.OnCompleted(); return EmptyDisposable.Instance; } }