// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Joins; using System.Reactive.Linq; using Microsoft.Reactive.Testing; using Microsoft.VisualStudio.TestTools.UnitTesting; using Assert = Xunit.Assert; #pragma warning disable IDE0028 // Simplify collection initialization. We want to be clear about what kinds of collections are in use in these tests. namespace ReactiveTests.Tests { [TestClass] public class WhenTest : ReactiveTest { [TestMethod] public void When_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.When(null)); ReactiveAssert.Throws(() => Observable.When((IEnumerable>)null)); } [TestMethod] public void WhenMultipleDataSymmetric() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, 1), OnNext(220, 2), OnNext(230, 3), OnCompleted(240) ); var ys = scheduler.CreateHotObservable( OnNext(240, 4), OnNext(250, 5), OnNext(260, 6), OnCompleted(270) ); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y) ) ); res.Messages.AssertEqual( OnNext(240, 1 + 4), OnNext(250, 2 + 5), OnNext(260, 3 + 6), OnCompleted(270) ); } [TestMethod] public void WhenMultipleDataAsymmetric() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, 1), OnNext(220, 2), OnNext(230, 3), OnCompleted(240) ); var ys = scheduler.CreateHotObservable( OnNext(240, 4), OnNext(250, 5), OnCompleted(270) ); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y) ) ); res.Messages.AssertEqual( OnNext(240, 1 + 4), OnNext(250, 2 + 5), OnCompleted(270) ); } [TestMethod] public void WhenEmptyEmpty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnCompleted(240) ); var ys = scheduler.CreateHotObservable( OnCompleted(270) ); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y) ) ); res.Messages.AssertEqual( OnCompleted(270) ); } [TestMethod] public void WhenNeverNever() { var scheduler = new TestScheduler(); var xs = Observable.Never(); var ys = Observable.Never().AsObservable(); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y) ) ); res.Messages.AssertEqual( ); } [TestMethod] public void WhenThrowNonEmpty() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnError(240, ex) ); var ys = scheduler.CreateHotObservable( OnCompleted(270) ); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y) ) ); res.Messages.AssertEqual( OnError(240, ex) ); } [TestMethod] public void ComplicatedWhen() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, 1), OnNext(220, 2), OnNext(230, 3), OnCompleted(240) ); var ys = scheduler.CreateHotObservable( OnNext(240, 4), OnNext(250, 5), OnNext(260, 6), OnCompleted(270) ); var zs = scheduler.CreateHotObservable( OnNext(220, 7), OnNext(230, 8), OnNext(240, 9), OnCompleted(300) ); var res = scheduler.Start(() => Observable.When( xs.And(ys).Then((x, y) => x + y), xs.And(zs).Then((x, z) => x * z), ys.And(zs).Then((y, z) => y - z) ) ); res.Messages.AssertEqual( OnNext(220, 1 * 7), OnNext(230, 2 * 8), OnNext(240, 3 + 4), OnNext(250, 5 - 9), OnCompleted(300) ); } [TestMethod] public void When_PlansIteratorThrows() { var ex = new Exception(); var _e = default(Exception); GetPlans(ex).When().Subscribe(_ => { }, e => { _e = e; }); Assert.Same(_e, ex); } private IEnumerable> GetPlans(Exception ex) { if (ex != null) { throw ex; } yield break; } [TestMethod] public void SameSource() { var source = Observable.Range(1, 5); var list = Observable.When(source.And(source).Then((a, b) => a + b)) .ToList().First(); Assert.Equal(new List() { 2, 4, 6, 8, 10 }, list); } } }