// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System; using System.Reactive.Linq; using Microsoft.Reactive.Testing; using ReactiveTests.Dummies; using Xunit; namespace ReactiveTests.Tests { public class DeferTest : ReactiveTest { [Fact] public void Defer_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Defer(default(Func>))); ReactiveAssert.Throws(() => Observable.Defer(() => DummyObservable.Instance).Subscribe(null)); ReactiveAssert.Throws(() => Observable.Defer(() => default(IObservable)).Subscribe()); } [Fact] public void Defer_Complete() { var scheduler = new TestScheduler(); var invoked = 0; var xs = default(ITestableObservable); var res = scheduler.Start(() => Observable.Defer(() => { invoked++; xs = scheduler.CreateColdObservable( OnNext(100, scheduler.Clock), OnCompleted(200)); return xs; }) ); res.Messages.AssertEqual( OnNext(300, 200L), OnCompleted(400) ); Assert.Equal(1, invoked); xs.Subscriptions.AssertEqual( Subscribe(200, 400) ); } [Fact] public void Defer_Error() { var scheduler = new TestScheduler(); var invoked = 0; var xs = default(ITestableObservable); var ex = new Exception(); var res = scheduler.Start(() => Observable.Defer(() => { invoked++; xs = scheduler.CreateColdObservable( OnNext(100, scheduler.Clock), OnError(200, ex)); return xs; }) ); res.Messages.AssertEqual( OnNext(300, 200L), OnError(400, ex) ); Assert.Equal(1, invoked); xs.Subscriptions.AssertEqual( Subscribe(200, 400) ); } [Fact] public void Defer_Dispose() { var scheduler = new TestScheduler(); var invoked = 0; var xs = default(ITestableObservable); var res = scheduler.Start(() => Observable.Defer(() => { invoked++; xs = scheduler.CreateColdObservable( OnNext(100, scheduler.Clock), OnNext(200, invoked), OnNext(1100, 1000)); return xs; }) ); res.Messages.AssertEqual( OnNext(300, 200L), OnNext(400, 1L) ); Assert.Equal(1, invoked); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [Fact] public void Defer_Throw() { var scheduler = new TestScheduler(); var invoked = 0; var ex = new Exception(); var res = scheduler.Start(() => Observable.Defer(new Func>(() => { invoked++; throw ex; })) ); res.Messages.AssertEqual( OnError(200, ex) ); Assert.Equal(1, invoked); } } }