diff --git a/R3.sln b/R3.sln index 59c34609..fb61e44b 100644 --- a/R3.sln +++ b/R3.sln @@ -13,7 +13,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp1", "sandbox\Cons EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0544806B-3BB4-43CF-8277-BC612F32208D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "R3.Tests", "tests\R3.Tests\R3.Tests.csproj", "{42F7C4F7-3BB3-4DC8-8285-9DFF7E93BC4B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "R3.Tests", "tests\R3.Tests\R3.Tests.csproj", "{42F7C4F7-3BB3-4DC8-8285-9DFF7E93BC4B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C7327A31-448F-4A7D-9AC6-C06F5AA03D02}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + README.md = README.md + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/README.md b/README.md index 10ea5e18..8e1d3a70 100644 --- a/README.md +++ b/README.md @@ -3,33 +3,15 @@ Third Generation of Reactive Extensions. ```csharp -public abstract class Event +public abstract class Event { - public IDisposable Subscribe(Subscriber subscriber); + public IDisposable Subscribe(Subscriber subscriber); } -public abstract class Subscriber : IDisposable +public abstract class Subscriber : IDisposable { - public void OnNext(TMessage message); + public void OnNext(T value); public void OnErrorResume(Exception error); -} - -// Completable -public abstract class CompletableEvent -{ - public IDisposable Subscribe(Subscriber subscriber) -} - -public abstract class Subscriber : IDisposable -{ - public void OnNext(TMessage message); - public void OnErrorResume(Exception error); - public void OnCompleted(TComplete complete); + public void OnCompleted(Result result); } ``` - -```csharp -// similar as IObserver -CompletableEvent> -``` - diff --git a/src/R3/EventSubscribeExtensions.cs b/src/R3/EventSubscribeExtensions.cs index ba1172e9..907b8059 100644 --- a/src/R3/EventSubscribeExtensions.cs +++ b/src/R3/EventSubscribeExtensions.cs @@ -68,7 +68,7 @@ internal sealed class AnonymousRSubscriber(Action onNext, Action(Action onNext, Action [DebuggerStepThrough] protected override void OnNextCore(T value) { - onNext(message); + onNext(value); } [DebuggerStepThrough] diff --git a/src/R3/Factories/Return.cs b/src/R3/Factories/Return.cs index 9a589228..21170cde 100644 --- a/src/R3/Factories/Return.cs +++ b/src/R3/Factories/Return.cs @@ -48,14 +48,8 @@ sealed class _Return(T value, Subscriber subscriber) : IDisposable static void NextTick(object? state) { var self = (_Return)state!; - if (self.subscriber.OnNext(self.value)) - { - self.subscriber.OnCompleted(); - } - else - { - self.subscriber.OnCompleted(Result.Failure); - } + self.subscriber.OnNext(self.value); + self.subscriber.OnCompleted(); } public void Dispose() diff --git a/src/R3/Factories/ToCompletableEvent.cs b/src/R3/Factories/ToCompletableEvent.cs deleted file mode 100644 index aa9521c0..00000000 --- a/src/R3/Factories/ToCompletableEvent.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace R3; - -public static partial class Event -{ - public static Event ToCompletableEvent(this Task task) - { - return new ToCompletableEvent(task); - } -} - -internal sealed class ToCompletableEvent(Task task) : Event -{ - protected override IDisposable SubscribeCore(Subscriber subscriber) - { - var subscription = new CancellationDisposable(); - SubscribeTask(subscriber, subscription.Token); - return subscription; - } - - async void SubscribeTask(Subscriber subscriber, CancellationToken cancellationToken) - { - TMessage? result; - try - { - result = await task.WaitAsync(cancellationToken); - } - catch (Exception ex) - { - subscriber.OnCompleted(Result.Failure(ex)); - return; - } - - subscriber.OnNext(result); - subscriber.OnCompleted(Result.Success(default)); - } -} diff --git a/src/R3/Factories/ToEvent.cs b/src/R3/Factories/ToEvent.cs index 99e77ce9..3eacc15f 100644 --- a/src/R3/Factories/ToEvent.cs +++ b/src/R3/Factories/ToEvent.cs @@ -2,21 +2,58 @@ public static partial class Event { - public static Event ToEvent(this IEnumerable source) + public static Event ToCompletableEvent(this Task task) { - return new ToEvent(source); + return new TaskToEvent(task); + } + + public static Event ToEvent(this IEnumerable source) + { + return new EnumerableToEvent(source); + } +} + +internal sealed class TaskToEvent(Task task) : Event +{ + protected override IDisposable SubscribeCore(Subscriber subscriber) + { + var subscription = new CancellationDisposable(); + SubscribeTask(subscriber, subscription.Token); + return subscription; + } + + async void SubscribeTask(Subscriber subscriber, CancellationToken cancellationToken) + { + T? result; + try + { + result = await task.WaitAsync(cancellationToken); + } + catch (Exception ex) + { + if (ex is OperationCanceledException oce && oce.CancellationToken == cancellationToken) // disposed. + { + return; + } + + subscriber.OnCompleted(ex); + return; + } + + subscriber.OnNext(result); + subscriber.OnCompleted(); } } -internal class ToEvent(IEnumerable source) : Event +internal class EnumerableToEvent(IEnumerable source) : Event { - protected override IDisposable SubscribeCore(Subscriber subscriber) + protected override IDisposable SubscribeCore(Subscriber subscriber) { foreach (var message in source) { - subscriber.OnNext(value); + subscriber.OnNext(message); } - subscriber.OnCompleted(default); + subscriber.OnCompleted(); return Disposable.Empty; } } diff --git a/src/R3/LiveList.cs b/src/R3/LiveList.cs index 403fa092..87882dd3 100644 --- a/src/R3/LiveList.cs +++ b/src/R3/LiveList.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; namespace R3; @@ -24,12 +23,21 @@ public sealed class LiveList : IReadOnlyList, IDisposable readonly int bufferSize; bool isCompleted; - Result? completedValue; + Result completedValue; - [MemberNotNullWhen(true, nameof(CompletedValue))] public bool IsCompleted => isCompleted; - public Result? CompletedValue => completedValue; + public Result CompletedValue + { + get + { + lock (list) + { + if (!isCompleted) throw new InvalidOperationException("LiveList is not completed, you should check IsCompleted."); + return completedValue; + } + } + } public LiveList(Event source) { diff --git a/src/R3/Operators/DoOnCompleted.cs b/src/R3/Operators/DoOnCompleted.cs index 66c3e060..9ac8dc88 100644 --- a/src/R3/Operators/DoOnCompleted.cs +++ b/src/R3/Operators/DoOnCompleted.cs @@ -4,6 +4,15 @@ public static partial class EventExtensions { // TODO: more accurate impl // TODO: with state + + + // TODO: other file. + public static Event CancelOnCompleted(this Event source, CancellationTokenSource cancellationTokenSource) + { + return new DoOnCompleted(source, _ => cancellationTokenSource.Cancel()); + } + + public static Event DoOnCompleted(this Event source, Action action) { return new DoOnCompleted(source, action); diff --git a/src/R3/Operators/OnErrorAsComplete.cs b/src/R3/Operators/OnErrorAsComplete.cs deleted file mode 100644 index 357ad0cb..00000000 --- a/src/R3/Operators/OnErrorAsComplete.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace R3; - -public static partial class EventExtensions -{ - public static Event> OnErrorAsComplete(this Event source) - { - return new OnErrorAsComplete(source); - } -} - -internal class OnErrorAsComplete(Event source) : Event> -{ - protected override IDisposable SubscribeCore(Subscriber> subscriber) - { - return source.Subscribe(new _OnErrorAsComplete(subscriber)); - } - - sealed class _OnErrorAsComplete(Subscriber> subscriber) : Subscriber - { - protected override void OnNextCore(T value) - { - subscriber.OnNext(value); - } - - protected override void OnErrorResumeCore(Exception error) - { - subscriber.OnCompleted(Result.Failure(error)); - } - - protected override void OnCompletedCore(Result complete) - { - subscriber.OnCompleted(Result.Success(complete)); - } - } -} diff --git a/src/R3/Operators/OnErrorResumeAsFailure.cs b/src/R3/Operators/OnErrorResumeAsFailure.cs new file mode 100644 index 00000000..cb41de6c --- /dev/null +++ b/src/R3/Operators/OnErrorResumeAsFailure.cs @@ -0,0 +1,35 @@ +namespace R3; + +public static partial class EventExtensions +{ + public static Event OnErrorResumeAsFailure(this Event source) + { + return new OnErrorResumeAsFailure(source); + } +} + +internal class OnErrorResumeAsFailure(Event source) : Event +{ + protected override IDisposable SubscribeCore(Subscriber subscriber) + { + return source.Subscribe(new _OnErrorAsComplete(subscriber)); + } + + sealed class _OnErrorAsComplete(Subscriber subscriber) : Subscriber + { + protected override void OnNextCore(T value) + { + subscriber.OnNext(value); + } + + protected override void OnErrorResumeCore(Exception error) + { + subscriber.OnCompleted(error); + } + + protected override void OnCompletedCore(Result complete) + { + subscriber.OnCompleted(complete); + } + } +} diff --git a/src/R3/Operators/Select.cs b/src/R3/Operators/Select.cs index 501de3f3..fb1430d9 100644 --- a/src/R3/Operators/Select.cs +++ b/src/R3/Operators/Select.cs @@ -6,41 +6,26 @@ public static partial class EventExtensions // TODO: CompletableEvent.Select // TODO: Element index overload - // TODO: Select for Result - - - public static Event Select( - this Event source, - Func messageSelector) - { - return new Select(source, messageSelector, Stubs.ReturnSelf); - } - - public static Event Select( + public static Event Select( this Event source, - Func messageSelector, - Func completeSelector) + Func selector) { - return new Select(source, messageSelector, completeSelector); + return new Select(source, selector); } } -internal sealed class Select( - Event source, - Func messageSelector, - Func completeSelector - ) : Event +internal sealed class Select(Event source, Func selector) : Event { - protected override IDisposable SubscribeCore(Subscriber subscriber) + protected override IDisposable SubscribeCore(Subscriber subscriber) { - return source.Subscribe(new _Select(subscriber, messageSelector, completeSelector)); + return source.Subscribe(new _Select(subscriber, selector)); } - class _Select(Subscriber subscriber, Func messageSelector, Func completeSelector) : Subscriber + class _Select(Subscriber subscriber, Func selector) : Subscriber { protected override void OnNextCore(T value) { - subscriber.OnNext(messageSelector(message)); + subscriber.OnNext(selector(value)); } protected override void OnErrorResumeCore(Exception error) @@ -48,9 +33,9 @@ protected override void OnErrorResumeCore(Exception error) subscriber.OnErrorResume(error); } - protected override void OnCompletedCore(Result complete) + protected override void OnCompletedCore(Result result) { - subscriber.OnCompleted(completeSelector(complete)); + subscriber.OnCompleted(result); } } } diff --git a/src/R3/Operators/Take.cs b/src/R3/Operators/Take.cs index 3d8ec430..7db94d80 100644 --- a/src/R3/Operators/Take.cs +++ b/src/R3/Operators/Take.cs @@ -2,30 +2,20 @@ public static partial class EventExtensions { - public static Event Take(this Event source, int count) + public static Event Take(this Event source, int count) { - return new Take(source, count, default, null); - } - - public static Event Take(this Event source, int count interruptMessage) - { - return new Take(source, count, interruptMessage, null); - } - - public static Event Take(this Event source, int count, Func interruptMessageFactory) - { - return new Take(source, count, default!, interruptMessageFactory); + return new Take(source, count); } } -internal sealed class Take(Event source, int count interruptMessage, Func? interruptMessageFactory) : Event +internal sealed class Take(Event source, int count) : Event { protected override IDisposable SubscribeCore(Subscriber subscriber) { - return source.Subscribe(new _Take(subscriber, count, interruptMessage, interruptMessageFactory)); + return source.Subscribe(new _Take(subscriber, count)); } - sealed class _Take(Subscriber subscriber, int count interruptMessage, Func? interruptMessageFactory) : Subscriber, IDisposable + sealed class _Take(Subscriber subscriber, int count) : Subscriber, IDisposable { int remaining = count; @@ -38,14 +28,7 @@ protected override void OnNextCore(T value) } else { - if (interruptMessageFactory != null) - { - subscriber.OnCompleted(interruptMessageFactory()); - } - else - { - subscriber.OnCompleted(interruptMessage); - } + subscriber.OnCompleted(); } } @@ -54,9 +37,9 @@ protected override void OnErrorResumeCore(Exception error) subscriber.OnErrorResume(error); } - protected override void OnCompletedCore(Result complete) + protected override void OnCompletedCore(Result result) { - subscriber.OnCompleted(complete); + subscriber.OnCompleted(result); } } } diff --git a/src/R3/Operators/ToObservable.cs b/src/R3/Operators/ToObservable.cs index 2c0f2640..646b1da1 100644 --- a/src/R3/Operators/ToObservable.cs +++ b/src/R3/Operators/ToObservable.cs @@ -3,51 +3,20 @@ public static partial class EventExtensions { // TODO: more overload? - public static IObservable ToObservable(this Event source) + public static IObservable ToObservable(this Event source) { return new ToObservable(source); } - - public static IObservable ToObservable(this Event source) - { - return new ToObservableR(source); - } -} - -internal sealed class ToObservable(Event source) : IObservable -{ - public IDisposable Subscribe(IObserver observer) - { - return source.Subscribe(new ObserverToSubscriber(observer)); - } - - sealed class ObserverToSubscriber(IObserver observer) : Subscriber - { - protected override void OnNextCore(T value) - { - observer.OnNext(value); - } - - protected override void OnErrorResumeCore(Exception error) - { - observer.OnError(error); - } - - protected override void OnCompletedCore(Unit complete) - { - observer.OnCompleted(); - } - } } -internal sealed class ToObservableR(Event source) : IObservable +internal sealed class ToObservable(Event source) : IObservable { public IDisposable Subscribe(IObserver observer) { return source.Subscribe(new ObserverToSubscriber(observer)); } - sealed class ObserverToSubscriber(IObserver observer) : Subscriber + sealed class ObserverToSubscriber(IObserver observer) : Subscriber { protected override void OnNextCore(T value) { @@ -59,11 +28,11 @@ protected override void OnErrorResumeCore(Exception error) observer.OnError(error); } - protected override void OnCompletedCore(Result complete) + protected override void OnCompletedCore(Result result) { - if (complete.IsFailure) + if (result.IsFailure) { - observer.OnError(complete.Exception); + observer.OnError(result.Exception); } else { @@ -72,4 +41,3 @@ protected override void OnCompletedCore(Result complete) } } } - diff --git a/src/R3/Operators/Where.cs b/src/R3/Operators/Where.cs index a6f8665c..8a31466f 100644 --- a/src/R3/Operators/Where.cs +++ b/src/R3/Operators/Where.cs @@ -2,7 +2,7 @@ public static partial class EventExtensions { - public static Event Where(this Event source, Func predicate) + public static Event Where(this Event source, Func predicate) { if (source is Where where) { @@ -14,27 +14,27 @@ public static Event Where(this Event source, Func predi return new Where(source, predicate); } - public static Event Where(this Event source, Func predicate) + public static Event Where(this Event source, Func predicate) { return new WhereIndexed(source, predicate); } } -internal sealed class Where(Event source, Func predicate) : Event +internal sealed class Where(Event source, Func predicate) : Event { internal Event source = source; - internal Func predicate = predicate; + internal Func predicate = predicate; protected override IDisposable SubscribeCore(Subscriber subscriber) { return source.Subscribe(new _Where(subscriber, predicate)); } - class _Where(Subscriber subscriber, Func predicate) : Subscriber + class _Where(Subscriber subscriber, Func predicate) : Subscriber { protected override void OnNextCore(T value) { - if (predicate(message)) + if (predicate(value)) { subscriber.OnNext(value); } @@ -45,27 +45,27 @@ protected override void OnErrorResumeCore(Exception error) subscriber.OnErrorResume(error); } - protected override void OnCompletedCore(Result complete) + protected override void OnCompletedCore(Result result) { - subscriber.OnCompleted(complete); + subscriber.OnCompleted(result); } } } -internal sealed class WhereIndexed(Event source, Func predicate) : Event +internal sealed class WhereIndexed(Event source, Func predicate) : Event { protected override IDisposable SubscribeCore(Subscriber subscriber) { return source.Subscribe(new _Where(subscriber, predicate)); } - class _Where(Subscriber subscriber, Func predicate) : Subscriber + class _Where(Subscriber subscriber, Func predicate) : Subscriber { int index = 0; protected override void OnNextCore(T value) { - if (predicate(message, index++)) + if (predicate(value, index++)) { subscriber.OnNext(value); } @@ -76,9 +76,9 @@ protected override void OnErrorResumeCore(Exception error) subscriber.OnErrorResume(error); } - protected override void OnCompletedCore(Result complete) + protected override void OnCompletedCore(Result result) { - subscriber.OnCompleted(complete); + subscriber.OnCompleted(result); } } } diff --git a/src/R3/Publisher.cs b/src/R3/Publisher.cs index f2b0a16d..159faa7a 100644 --- a/src/R3/Publisher.cs +++ b/src/R3/Publisher.cs @@ -11,7 +11,7 @@ public interface IEventPublisher public sealed class Publisher : Event, IEventPublisher, IDisposable { int calledCompleted = 0; - Result? completeValue; + Result completeValue; FreeListCore<_CompletablePublisher> list; readonly object completedLock = new object(); @@ -77,7 +77,7 @@ protected override IDisposable SubscribeCore(Subscriber subscriber) { if (Volatile.Read(ref calledCompleted) != 0) { - subscriber.OnCompleted(completeValue!); + subscriber.OnCompleted(completeValue); return Disposable.Empty; } @@ -95,6 +95,8 @@ void Unsubscribe(_CompletablePublisher subscription) public void Dispose() { + // TODO: when dispose, call OnCompleted to dispose all subscribers. + list.Dispose(); } diff --git a/src/R3/PublisherExtensions.cs b/src/R3/PublisherExtensions.cs index d7d13228..3a351c02 100644 --- a/src/R3/PublisherExtensions.cs +++ b/src/R3/PublisherExtensions.cs @@ -6,4 +6,9 @@ public static void PublishOnCompleted(this Publisher publisher) { publisher.PublishOnCompleted(default); } + + public static void PublishOnCompleted(this Publisher publisher, Exception exception) + { + publisher.PublishOnCompleted(Result.Failure(exception)); + } } diff --git a/src/R3/ReactiveProperty.cs b/src/R3/ReactiveProperty.cs index 14de0c7d..2c127c85 100644 --- a/src/R3/ReactiveProperty.cs +++ b/src/R3/ReactiveProperty.cs @@ -94,7 +94,7 @@ sealed class Subscription(ReactiveProperty? parent, Subscriber subscriber) public int removeKey; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void OnNext(T message) + public void OnNext(T value) { subscriber.OnNext(value); } diff --git a/src/R3/Result.cs b/src/R3/Result.cs index 4f29951e..e95502f7 100644 --- a/src/R3/Result.cs +++ b/src/R3/Result.cs @@ -3,7 +3,7 @@ namespace R3; -// default is Succeeded +// default(Result) is Succeeded public readonly struct Result { public static Result Success => default; @@ -17,7 +17,7 @@ public readonly struct Result [MemberNotNullWhen(true, nameof(Exception))] public bool IsFailure => Exception != null; - public Result(Exception? exception) + public Result(Exception exception) { this.Exception = exception; } diff --git a/src/R3/Unit.cs b/src/R3/Unit.cs index 21f9eac2..ccd66c04 100644 --- a/src/R3/Unit.cs +++ b/src/R3/Unit.cs @@ -4,12 +4,12 @@ { public static readonly Unit Default = default; - public static bool operator ==(Unit first second) + public static bool operator ==(Unit first, Unit second) { return true; } - public static bool operator !=(Unit first second) + public static bool operator !=(Unit first, Unit second) { return false; } diff --git a/tests/R3.Tests/FactoryTests/EmptyTest.cs b/tests/R3.Tests/FactoryTests/EmptyTest.cs index 5b6476ed..146daf1e 100644 --- a/tests/R3.Tests/FactoryTests/EmptyTest.cs +++ b/tests/R3.Tests/FactoryTests/EmptyTest.cs @@ -18,7 +18,7 @@ public void EmptyWithTime() using var list = Event.Empty(TimeSpan.FromSeconds(5), fakeTime).ToLiveList(); fakeTime.Advance(TimeSpan.FromSeconds(4)); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); fakeTime.Advance(TimeSpan.FromSeconds(1)); list.AssertIsCompleted(); diff --git a/tests/R3.Tests/FactoryTests/NeverTest.cs b/tests/R3.Tests/FactoryTests/NeverTest.cs index e14091fc..75eb878e 100644 --- a/tests/R3.Tests/FactoryTests/NeverTest.cs +++ b/tests/R3.Tests/FactoryTests/NeverTest.cs @@ -8,12 +8,4 @@ public void Never() using var list = Event.Never().ToLiveList(); list.AssertEqual([]); } - - // NeverComplete test - [Fact] - public void NeverComplete() - { - using var list = Event.Never().ToLiveList(); - list.AssertIsNoResultd(); - } } diff --git a/tests/R3.Tests/FactoryTests/RangeTest.cs b/tests/R3.Tests/FactoryTests/RangeTest.cs index 4e4dc6d5..efb3b69c 100644 --- a/tests/R3.Tests/FactoryTests/RangeTest.cs +++ b/tests/R3.Tests/FactoryTests/RangeTest.cs @@ -33,7 +33,7 @@ public void Stop() using var list = Event.Range(0, int.MaxValue, cts.Token) .Take(5) - .DoOnCompleted(() => cts.Cancel()) + .CancelOnCompleted(cts) .ToLiveList(); list.AssertEqual([0, 1, 2, 3, 4]); diff --git a/tests/R3.Tests/FactoryTests/RepeatTest.cs b/tests/R3.Tests/FactoryTests/RepeatTest.cs index c042832d..8cfffffc 100644 --- a/tests/R3.Tests/FactoryTests/RepeatTest.cs +++ b/tests/R3.Tests/FactoryTests/RepeatTest.cs @@ -24,7 +24,7 @@ public void Stop() using var list = Event.Repeat("foo", int.MaxValue, cts.Token) .Take(5) - .DoOnCompleted(() => cts.Cancel()) + .CancelOnCompleted(cts) .ToLiveList(); list.AssertEqual(["foo", "foo", "foo", "foo", "foo"]); diff --git a/tests/R3.Tests/FactoryTests/ReturnOnCompletedTest.cs b/tests/R3.Tests/FactoryTests/ReturnOnCompletedTest.cs index 4a281bd6..7bf3269e 100644 --- a/tests/R3.Tests/FactoryTests/ReturnOnCompletedTest.cs +++ b/tests/R3.Tests/FactoryTests/ReturnOnCompletedTest.cs @@ -8,24 +8,22 @@ public class ReturnOnCompletedTest public void ReturnOnCompleted() { { - using var list = Event.ReturnOnCompleted("foo").ToLiveList(); + using var list = Event.ReturnOnCompleted(Result.Success).ToLiveList(); list.AssertEqual([]); list.AssertIsCompleted(); - list.AsserResultdValue("foo"); } { var fakeTime = new FakeTimeProvider(); - using var list = Event.ReturnOnCompleted("foo", TimeSpan.FromSeconds(5), fakeTime).ToLiveList(); + using var list = Event.ReturnOnCompleted(Result.Success, TimeSpan.FromSeconds(5), fakeTime).ToLiveList(); fakeTime.Advance(TimeSpan.FromSeconds(4)); list.AssertEqual([]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); fakeTime.Advance(TimeSpan.FromSeconds(1)); list.AssertEqual([]); list.AssertIsCompleted(); - list.AsserResultdValue("foo"); } } } diff --git a/tests/R3.Tests/FactoryTests/ReturnTest.cs b/tests/R3.Tests/FactoryTests/ReturnTest.cs index 9f1e1bee..130b2fe0 100644 --- a/tests/R3.Tests/FactoryTests/ReturnTest.cs +++ b/tests/R3.Tests/FactoryTests/ReturnTest.cs @@ -27,7 +27,7 @@ public void Return() fakeTime.Advance(TimeSpan.FromSeconds(4)); list.AssertEqual([]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); fakeTime.Advance(TimeSpan.FromSeconds(1)); list.AssertEqual([10]); @@ -51,25 +51,23 @@ public void ReturnThreadPoolScheduleOptimized() public void ReturnOnCompleted() { { - using var list = Event.Return(0, "foo").ToLiveList(); + using var list = Event.Return(0).ToLiveList(); list.AssertEqual([0]); list.AssertIsCompleted(); - list.AsserResultdValue("foo"); } { var fakeTime = new FakeTimeProvider(); - using var list = Event.Return(10, "foo", TimeSpan.FromSeconds(5), fakeTime).ToLiveList(); + using var list = Event.Return(10, TimeSpan.FromSeconds(5), fakeTime).ToLiveList(); list.AssertEqual([]); fakeTime.Advance(TimeSpan.FromSeconds(4)); list.AssertEqual([]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); fakeTime.Advance(TimeSpan.FromSeconds(1)); list.AssertEqual([10]); list.AssertIsCompleted(); - list.AsserResultdValue("foo"); } } } diff --git a/tests/R3.Tests/FactoryTests/ThrowTest.cs b/tests/R3.Tests/FactoryTests/ThrowTest.cs index 1c481a3c..18fe276d 100644 --- a/tests/R3.Tests/FactoryTests/ThrowTest.cs +++ b/tests/R3.Tests/FactoryTests/ThrowTest.cs @@ -21,7 +21,7 @@ public void Throw() fakeTime.Advance(TimeSpan.FromSeconds(4)); list.AssertEqual([]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); fakeTime.Advance(TimeSpan.FromSeconds(1)); list.AssertEqual([]); diff --git a/tests/R3.Tests/OperatorTests/AggregateTest.cs b/tests/R3.Tests/OperatorTests/AggregateTest.cs index c6c6a710..e3db7d74 100644 --- a/tests/R3.Tests/OperatorTests/AggregateTest.cs +++ b/tests/R3.Tests/OperatorTests/AggregateTest.cs @@ -9,7 +9,7 @@ public async Task Aggreagte() { var publisher = new Publisher(); - var listTask = publisher.AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x, _) => x); + var listTask = publisher.AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x) => x); publisher.PublishOnNext(1); publisher.PublishOnNext(2); @@ -19,7 +19,7 @@ public async Task Aggreagte() listTask.Status.Should().Be(TaskStatus.WaitingForActivation); - publisher.PublishOnCompleted(Unit.Default); + publisher.PublishOnCompleted(); (await listTask).Should().Equal(1, 2, 3, 4, 5); } @@ -28,7 +28,7 @@ public async Task Aggreagte() public async Task ImmediateCompleted() { var range = Event.Range(1, 5); - var listTask = range.AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x, _) => x); + var listTask = range.AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x) => x); (await listTask).Should().Equal(1, 2, 3, 4, 5); } @@ -43,7 +43,7 @@ public async Task BeforeCanceled() var listTask = publisher .DoOnDisposed(() => isDisposed = true) - .AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x, _) => x, cts.Token); + .AggregateAsync(new List(), (x, i) => { x.Add(i); return x; }, (x) => x, cts.Token); isDisposed.Should().BeTrue(); @@ -108,7 +108,7 @@ public async Task Min() { if (x == 3) throw new Exception("foo"); return x; - }).OnErrorAsComplete(); + }).OnErrorResumeAsFailure(); await Assert.ThrowsAsync(async () => await error.MinAsync()); } @@ -130,7 +130,7 @@ public async Task Max() { if (x == 3) throw new Exception("foo"); return x; - }).OnErrorAsComplete(); + }).OnErrorResumeAsFailure(); await Assert.ThrowsAsync(async () => await error.MaxAsync()); } @@ -155,7 +155,7 @@ public async Task MinMax() { if (x == 3) throw new Exception("foo"); return x; - }).OnErrorAsComplete(); + }).OnErrorResumeAsFailure(); await Assert.ThrowsAsync(async () => await error.MinMaxAsync()); } @@ -176,7 +176,7 @@ public async Task Sum() { if (x == 3) throw new Exception("foo"); return x; - }).OnErrorAsComplete(); + }).OnErrorResumeAsFailure(); await Assert.ThrowsAsync(async () => await error.MinAsync()); } @@ -197,7 +197,7 @@ public async Task Avg() { if (x == 3) throw new Exception("foo"); return x; - }).OnErrorAsComplete(); + }).OnErrorResumeAsFailure(); await Assert.ThrowsAsync(async () => await error.AverageAsync()); } @@ -207,14 +207,14 @@ public async Task WaitAsync() var source = new int[] { 1, 10, 1, 3, 4, 6, 7, 4 }.ToEvent(); await source.WaitAsync(); - var p = new Publisher(); + var p = new Publisher(); var task = p.WaitAsync(); p.PublishOnNext(10); p.PublishOnNext(20); p.PublishOnNext(30); - p.PublishOnCompleted("foo"); + p.PublishOnCompleted(); - (await task).Should().Be("foo"); + await task; } } diff --git a/tests/R3.Tests/OperatorTests/ToListTest.cs b/tests/R3.Tests/OperatorTests/ToListTest.cs index 4b42b5a8..7ff0575c 100644 --- a/tests/R3.Tests/OperatorTests/ToListTest.cs +++ b/tests/R3.Tests/OperatorTests/ToListTest.cs @@ -17,7 +17,7 @@ public async Task ToList() listTask.Status.Should().Be(TaskStatus.WaitingForActivation); - publisher.PublishOnCompleted(Unit.Default); + publisher.PublishOnCompleted(); (await listTask).Should().Equal(1, 2, 3, 4, 5); } @@ -83,7 +83,7 @@ public async Task ToArray() listTask.Status.Should().Be(TaskStatus.WaitingForActivation); - publisher.PublishOnCompleted(Unit.Default); + publisher.PublishOnCompleted(); (await listTask).Should().Equal(1, 2, 3, 4, 5); } diff --git a/tests/R3.Tests/OperatorTests/WhereTest.cs b/tests/R3.Tests/OperatorTests/WhereTest.cs index 4d537b21..7af07ffa 100644 --- a/tests/R3.Tests/OperatorTests/WhereTest.cs +++ b/tests/R3.Tests/OperatorTests/WhereTest.cs @@ -50,7 +50,7 @@ public void WhereCompletable() p.PublishOnNext(30); list.AssertEqual([1, 3]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); p.PublishOnCompleted(default); @@ -84,7 +84,7 @@ public void WhereCompletableIndexed() p.PublishOnNext(8); list.AssertEqual([1, 5, 8]); - list.AssertIsNoResultd(); + list.AssertIsNoResulted(); p.PublishOnCompleted(default); diff --git a/tests/R3.Tests/_TestHelper.cs b/tests/R3.Tests/_TestHelper.cs index c554ebc6..7e8ce0cc 100644 --- a/tests/R3.Tests/_TestHelper.cs +++ b/tests/R3.Tests/_TestHelper.cs @@ -5,23 +5,18 @@ namespace R3.Tests; public static class _TestHelper { - public static void AssertEqual(this LiveList list, params T[] expected) + public static void AssertEqual(this LiveList list, params T[] expected) { list.Should().Equal(expected); } - public static void AssertIsCompleted(this LiveList list) + public static void AssertIsCompleted(this LiveList list) { list.IsCompleted.Should().BeTrue(); } - public static void AssertIsNoResultd(this LiveList list) + public static void AssertIsNoResulted(this LiveList list) { list.IsCompleted.Should().BeFalse(); } - - public static void AsserResultdValue(this LiveList list, TC value) - { - list.CompletedValue.Should().Be(value); - } }