// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Reactive; using System.Reactive.Concurrency; using System.Reactive.Linq; using Microsoft.Reactive.Testing; #if NUNIT using NUnit.Framework; using TestClassAttribute = NUnit.Framework.TestFixtureAttribute; using TestMethodAttribute = NUnit.Framework.TestAttribute; using TestInitializeAttribute = NUnit.Framework.SetUpAttribute; #else using Microsoft.VisualStudio.TestTools.UnitTesting; #endif using ReactiveTests.Dummies; namespace ReactiveTests.Tests { [TestClass] public partial class ObservableAggregateTest : ReactiveTest { #region + Aggregate + [TestMethod] public void Aggregate_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Aggregate(default(IObservable), 1, (x, y) => x + y)); ReactiveAssert.Throws(() => Observable.Aggregate(DummyObservable.Instance, 1, default(Func))); ReactiveAssert.Throws(() => Observable.Aggregate(default(IObservable), (x, y) => x + y)); ReactiveAssert.Throws(() => Observable.Aggregate(DummyObservable.Instance, default(Func))); ReactiveAssert.Throws(() => Observable.Aggregate(default(IObservable), 1, (x, y) => x + y, x => x)); ReactiveAssert.Throws(() => Observable.Aggregate(DummyObservable.Instance, 1, default(Func), x => x)); ReactiveAssert.Throws(() => Observable.Aggregate(DummyObservable.Instance, 1, (x, y) => x + y, default(Func))); } [TestMethod] public void AggregateWithSeed_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x) ); res.Messages.AssertEqual( OnNext(250, 42), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithSeed_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 24), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x) ); res.Messages.AssertEqual( OnNext(250, 42 + 24), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithSeed_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void AggregateWithSeed_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void AggregateWithSeed_Range() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x) ); res.Messages.AssertEqual( OnNext(260, 42 + Enumerable.Range(0, 5).Sum()), OnCompleted(260) ); xs.Subscriptions.AssertEqual( Subscribe(200, 260) ); } [TestMethod] public void AggregateWithSeed_AccumulatorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate(0, (acc, x) => { if (x < 3) return acc + x; throw ex; }) ); res.Messages.AssertEqual( OnError(240, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void AggregateWithSeedAndResult_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x, x => x * 5) ); res.Messages.AssertEqual( OnNext(250, 42 * 5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithSeedAndResult_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 24), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x, x => x * 5) ); res.Messages.AssertEqual( OnNext(250, (42 + 24) * 5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithSeedAndResult_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x, x => x * 5) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void AggregateWithSeedAndResult_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x, x => x * 5) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void AggregateWithSeedAndResult_Range() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate(42, (acc, x) => acc + x, x => x * 5) ); res.Messages.AssertEqual( OnNext(260, (42 + Enumerable.Range(0, 5).Sum()) * 5), OnCompleted(260) ); xs.Subscriptions.AssertEqual( Subscribe(200, 260) ); } [TestMethod] public void AggregateWithSeedAndResult_AccumulatorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate(0, (acc, x) => { if (x < 3) return acc + x; throw ex; }, x => x * 5) ); res.Messages.AssertEqual( OnError(240, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void AggregateWithSeedAndResult_ResultSelectorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate(0, (acc, x) => acc + x, x => { throw ex; }) ); res.Messages.AssertEqual( OnError(260, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 260) ); } [TestMethod] public void AggregateWithoutSeed_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => acc + x) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithoutSeed_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 24), OnCompleted(250) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => acc + x) ); res.Messages.AssertEqual( OnNext(250, 24), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void AggregateWithoutSeed_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => acc + x) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void AggregateWithoutSeed_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => acc + x) ); res.Messages.AssertEqual( ); } [TestMethod] public void AggregateWithoutSeed_Range() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => acc + x) ); res.Messages.AssertEqual( OnNext(260, Enumerable.Range(0, 5).Sum()), OnCompleted(260) ); xs.Subscriptions.AssertEqual( Subscribe(200, 260) ); } [TestMethod] public void AggregateWithoutSeed_AccumulatorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 0), OnNext(220, 1), OnNext(230, 2), OnNext(240, 3), OnNext(250, 4), OnCompleted(260) ); var res = scheduler.Start(() => xs.Aggregate((acc, x) => { if (x < 3) return acc + x; throw ex; }) ); res.Messages.AssertEqual( OnError(240, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } #endregion #region + All + [TestMethod] public void All_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.All(DummyObservable.Instance, default(Func))); ReactiveAssert.Throws(() => Observable.All(default(IObservable), x => true)); } [TestMethod] public void All_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, true), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void All_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, true), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void All_ReturnNotMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(210, false), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void All_SomeNoneMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnNext(220, -3), OnNext(230, -4), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(210, false), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void All_SomeMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnNext(220, 3), OnNext(230, -4), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(210, false), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void All_SomeAllMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, true), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void All_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void All_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.All(x => x > 0) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void All_PredicateThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.All(x => { if (x < 4) return true; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + Any + [TestMethod] public void Any_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Any(default(IObservable))); ReactiveAssert.Throws(() => Observable.Any(DummyObservable.Instance, default(Func))); ReactiveAssert.Throws(() => Observable.Any(default(IObservable), x => true)); } [TestMethod] public void Any_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any() ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Any_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any() ); res.Messages.AssertEqual( OnNext(210, true), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Any_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Any() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Any_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Any() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Any_Predicate_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Any_Predicate_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnNext(210, true), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Any_Predicate_ReturnNotMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Any_Predicate_SomeNoneMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnNext(220, -3), OnNext(230, -4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Any_Predicate_SomeMatch() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnNext(220, 3), OnNext(230, -4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnNext(220, true), OnCompleted(220) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Any_Predicate_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Any_Predicate_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Any(x => x > 0) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Any_Predicate_PredicateThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, -2), OnNext(220, 3), OnNext(230, -4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Any(x => { if (x != -4) return false; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + Average + [TestMethod] public void Average_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(int))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(double))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(float))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(decimal))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(long))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(int?))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(double?))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(float?))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(decimal?))); ReactiveAssert.Throws(() => Observable.Average(default(IObservable), _ => default(long?))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Average(Observable.Empty(), default(Func))); } [TestMethod] public void Average_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 3), OnNext(220, 4), OnNext(230, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 3.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 3L), OnNext(220, 4L), OnNext(230, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 3.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 3.0), OnNext(220, 4.0), OnNext(230, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 3.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 3f), OnNext(220, 4f), OnNext(230, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 3f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 3m), OnNext(220, 4m), OnNext(230, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, 3m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Nullable_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)null), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)3), OnNext(220, (int?)null), OnNext(230, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Nullable_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Nullable_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)null), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)3L), OnNext(220, (long?)null), OnNext(230, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Nullable_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Nullable_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)null), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)3.0), OnNext(220, (double?)null), OnNext(230, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (double?)2.5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Nullable_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Nullable_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (float?)null), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)3f), OnNext(220, (float?)null), OnNext(230, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (float?)2.5f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Nullable_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Average_Nullable_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (decimal?)null), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)3m), OnNext(220, (decimal?)null), OnNext(230, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2.5m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Average_Nullable_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Average_Nullable_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m) ); var res = scheduler.Start(() => xs.Average() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #if !NO_PERF [TestMethod] public void Average_InjectOverflow_Int32() { var xs = Observable.Return(42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Int64() { var xs = Observable.Return(42L, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Double() { var xs = Observable.Return(42.0, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Single() { var xs = Observable.Return(42.0f, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Decimal() { var xs = Observable.Return(42.0m, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Int32_Nullable() { var xs = Observable.Return((int?)42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Int64_Nullable() { var xs = Observable.Return((long?)42L, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Double_Nullable() { var xs = Observable.Return((double?)42.0, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Single_Nullable() { var xs = Observable.Return((float?)42.0f, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } [TestMethod] public void Average_InjectOverflow_Decimal_Nullable() { var xs = Observable.Return((decimal?)42.0m, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).Average(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } class OverflowInjection : IObservable { private readonly IObservable _source; private readonly object _initialCount; public OverflowInjection(IObservable source, object initialCount) { _source = source; _initialCount = initialCount; } public IDisposable Subscribe(IObserver observer) { var f = observer.GetType().GetField("_count", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); f.SetValue(observer, _initialCount); return _source.Subscribe(observer); } } #endif [TestMethod] public void Average_Selector_Regular_Int32() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => (int)x.Length)); res.Messages.AssertEqual( OnNext(240, 2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Int64() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => (long)x.Length)); res.Messages.AssertEqual( OnNext(240, 2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Single() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => (float)x.Length)); res.Messages.AssertEqual( OnNext(240, 2.0f), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Double() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => (double)x.Length)); res.Messages.AssertEqual( OnNext(240, 2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Decimal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => (decimal)x.Length)); res.Messages.AssertEqual( OnNext(240, 2.0m), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Int32_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(int?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Int64_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(long?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Single_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(float?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (float?)2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Double_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(double?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Average_Selector_Regular_Decimal_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "b"), OnNext(220, "fo"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(decimal?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (decimal?)2.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } #endregion #region + Contains + [TestMethod] public void Contains_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Contains(default(IObservable), 42)); ReactiveAssert.Throws(() => Observable.Contains(default(IObservable), 42, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.Contains(DummyObservable.Instance, 42, null)); } [TestMethod] public void Contains_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(42) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Contains_ReturnPositive() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(2) ); res.Messages.AssertEqual( OnNext(210, true), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Contains_ReturnNegative() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(-2) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Contains_SomePositive() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(3) ); res.Messages.AssertEqual( OnNext(220, true), OnCompleted(220) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Contains_SomeNegative() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(-3) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Contains_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Contains(42) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Contains_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Contains(42) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Contains_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2) ); var res = scheduler.Start(() => xs.Contains(42, new ContainsComparerThrows()) ); res.Messages.AssertEqual( OnError(210, e => e is NotImplementedException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } class ContainsComparerThrows : IEqualityComparer { public bool Equals(int x, int y) { throw new NotImplementedException(); } public int GetHashCode(int obj) { throw new NotImplementedException(); } } [TestMethod] public void Contains_ComparerContainsValue() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 3), OnNext(220, 4), OnNext(230, 8), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(42, new ContainsComparerMod2()) ); res.Messages.AssertEqual( OnNext(220, true), OnCompleted(220) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Contains_ComparerDoesNotContainValue() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 4), OnNext(230, 8), OnCompleted(250) ); var res = scheduler.Start(() => xs.Contains(21, new ContainsComparerMod2()) ); res.Messages.AssertEqual( OnNext(250, false), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } class ContainsComparerMod2 : IEqualityComparer { public bool Equals(int x, int y) { return x % 2 == y % 2; } public int GetHashCode(int obj) { return obj.GetHashCode(); } } #endregion #region + Count + [TestMethod] public void Count_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Count(default(IObservable))); ReactiveAssert.Throws(() => Observable.Count(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.Count(DummyObservable.Instance, default(Func))); } [TestMethod] public void Count_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count() ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count() ); res.Messages.AssertEqual( OnNext(250, 1), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count() ); res.Messages.AssertEqual( OnNext(250, 3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Count() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Count_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Count() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #if !NO_PERF [TestMethod] public void Count_InjectOverflow() { var xs = Observable.Return(42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, int.MaxValue).Count(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } #endif [TestMethod] public void Count_Predicate_Empty_True() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(_ => true) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Empty_False() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(_ => false) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Return_True() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(_ => true) ); res.Messages.AssertEqual( OnNext(250, 1), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Return_False() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(_ => false) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Some_All() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(x => x < 10) ); res.Messages.AssertEqual( OnNext(250, 3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Some_None() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(x => x > 10) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Some_Even() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Count(x => x % 2 == 0) ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Count_Predicate_Throw_True() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Count(_ => true) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Count_Predicate_Throw_False() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Count(_ => false) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Count_Predicate_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Count(_ => true) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Count_Predicate_PredicateThrows() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(230, 3), OnCompleted(240) ); var ex = new Exception(); var res = scheduler.Start(() => xs.Count(x => { if (x == 3) throw ex; return true; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #if !NO_PERF [TestMethod] public void Count_Predicate_InjectOverflow() { var xs = Observable.Return(42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, int.MaxValue).Count(_ => true); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } #endif #endregion #region + ElementAt + [TestMethod] public void ElementAt_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ElementAt(default(IObservable), 2)); ReactiveAssert.Throws(() => Observable.ElementAt(DummyObservable.Instance, -1)); } [TestMethod] public void ElementAt_First() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAt(0) ); res.Messages.AssertEqual( OnNext(280, 42), OnCompleted(280) ); xs.Subscriptions.AssertEqual( Subscribe(200, 280) ); } [TestMethod] public void ElementAt_Other() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAt(2) ); res.Messages.AssertEqual( OnNext(470, 44), OnCompleted(470) ); xs.Subscriptions.AssertEqual( Subscribe(200, 470) ); } [TestMethod] public void ElementAt_OutOfRange() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAt(3) ); res.Messages.AssertEqual( OnError(600, e => e is ArgumentOutOfRangeException) ); } [TestMethod] public void ElementAt_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnError(420, ex) ); var res = scheduler.Start(() => xs.ElementAt(3) ); res.Messages.AssertEqual( OnError(420, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 420) ); } #endregion #region + ElementAtOrDefault + [TestMethod] public void ElementAtOrDefault_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ElementAtOrDefault(default(IObservable), 2)); ReactiveAssert.Throws(() => Observable.ElementAtOrDefault(DummyObservable.Instance, -1)); } [TestMethod] public void ElementAtOrDefault_First() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAtOrDefault(0) ); res.Messages.AssertEqual( OnNext(280, 42), OnCompleted(280) ); xs.Subscriptions.AssertEqual( Subscribe(200, 280) ); } [TestMethod] public void ElementAtOrDefault_Other() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAtOrDefault(2) ); res.Messages.AssertEqual( OnNext(470, 44), OnCompleted(470) ); xs.Subscriptions.AssertEqual( Subscribe(200, 470) ); } [TestMethod] public void ElementAtOrDefault_OutOfRange() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnNext(470, 44), OnCompleted(600) ); var res = scheduler.Start(() => xs.ElementAtOrDefault(3) ); res.Messages.AssertEqual( OnNext(600, 0), OnCompleted(600) ); xs.Subscriptions.AssertEqual( Subscribe(200, 600) ); } [TestMethod] public void ElementAtOrDefault_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(280, 42), OnNext(360, 43), OnError(420, ex) ); var res = scheduler.Start(() => xs.ElementAtOrDefault(3) ); res.Messages.AssertEqual( OnError(420, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 420) ); } #endregion #region + FirstAsync + [TestMethod] public void FirstAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.FirstAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.FirstAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.FirstAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void FirstAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void FirstAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync() ); res.Messages.AssertEqual( OnNext(210, 2), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync() ); res.Messages.AssertEqual( OnNext(210, 2), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.FirstAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstAsync_Predicate() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnNext(220, 3), OnCompleted(220) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void FirstAsync_Predicate_None() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync(x => x > 10) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void FirstAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnError(220, ex) ); var res = scheduler.Start(() => xs.FirstAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void FirstAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstAsync(x => { if (x < 4) return false; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + FirstOrDefaultAsync + [TestMethod] public void FirstOrDefaultAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.FirstOrDefaultAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.FirstOrDefaultAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.FirstOrDefaultAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void FirstOrDefaultAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void FirstOrDefaultAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(210, 2), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstOrDefaultAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(210, 2), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstOrDefaultAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void FirstOrDefaultAsync_Predicate() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnNext(220, 3), OnCompleted(220) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void FirstOrDefaultAsync_Predicate_None() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync(x => x > 10) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void FirstOrDefaultAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnError(220, ex) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void FirstOrDefaultAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.FirstOrDefaultAsync(x => { if (x < 4) return false; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + IsEmpty + [TestMethod] public void IsEmpty_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.IsEmpty(default(IObservable))); } [TestMethod] public void IsEmpty_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.IsEmpty() ); res.Messages.AssertEqual( OnNext(250, true), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void IsEmpty_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.IsEmpty() ); res.Messages.AssertEqual( OnNext(210, false), OnCompleted(210) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void IsEmpty_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.IsEmpty() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void IsEmpty_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.IsEmpty() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #endregion #region + LastAsync + [TestMethod] public void LastAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.LastAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.LastAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.LastAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void LastAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync() ); res.Messages.AssertEqual( OnNext(250, 3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LastAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LastAsync_Predicate() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnNext(250, 5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastAsync_Predicate_None() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync(x => x > 10) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LastAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LastAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastAsync(x => { if (x < 4) return x % 2 == 1; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + LastOrDefaultAsync + [TestMethod] public void LastOrDefaultAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.LastOrDefaultAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.LastOrDefaultAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.LastOrDefaultAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void LastOrDefaultAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastOrDefaultAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastOrDefaultAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastOrDefaultAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LastOrDefaultAsync_Predicate() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnNext(250, 5), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastOrDefaultAsync_Predicate_None() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync(x => x > 10) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LastOrDefaultAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync(x => x > 10) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LastOrDefaultAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.LastOrDefaultAsync(x => { if (x < 4) return x % 2 == 1; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + LongCount + [TestMethod] public void LongCount_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.LongCount(default(IObservable))); ReactiveAssert.Throws(() => Observable.LongCount(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.LongCount(DummyObservable.Instance, default(Func))); } [TestMethod] public void LongCount_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount() ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount() ); res.Messages.AssertEqual( OnNext(250, 1L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount() ); res.Messages.AssertEqual( OnNext(250, 3L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LongCount() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LongCount_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.LongCount() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #if !NO_PERF [TestMethod] public void LongCount_InjectOverflow() { var xs = Observable.Return(42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).LongCount(); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } #endif [TestMethod] public void LongCount_Predicate_Empty_True() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(_ => true) ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Empty_False() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(_ => false) ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Return_True() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(_ => true) ); res.Messages.AssertEqual( OnNext(250, 1L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Return_False() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(_ => false) ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Some_All() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(x => x < 10) ); res.Messages.AssertEqual( OnNext(250, 3L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Some_None() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(x => x > 10) ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Some_Even() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.LongCount(x => x % 2 == 0) ); res.Messages.AssertEqual( OnNext(250, 2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void LongCount_Predicate_Throw_True() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LongCount(_ => true) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LongCount_Predicate_Throw_False() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.LongCount(_ => false) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void LongCount_Predicate_Never() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.LongCount(_ => true) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void LongCount_Predicate_PredicateThrows() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(230, 3), OnCompleted(240) ); var ex = new Exception(); var res = scheduler.Start(() => xs.LongCount(x => { if (x == 3) throw ex; return true; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #if !NO_PERF [TestMethod] public void LongCount_Predicate_InjectOverflow() { var xs = Observable.Return(42, ThreadPoolScheduler.Instance); var res = new OverflowInjection(xs, long.MaxValue).LongCount(_ => true); ReactiveAssert.Throws(() => res.ForEach(_ => { })); } #endif #endregion #region + Max + [TestMethod] public void Max_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(int))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(double))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(float))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(decimal))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(long))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(int?))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(double?))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(float?))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(decimal?))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => default(long?))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), Comparer.Default)); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(IComparer))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => "")); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Max(default(IObservable), _ => "", Comparer.Default)); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), default(Func), Comparer.Default)); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), _ => "", default(IComparer))); } [TestMethod] public void Max_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 3), OnNext(220, 4), OnNext(230, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 3L), OnNext(220, 4L), OnNext(230, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 4L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 3f), OnNext(220, 4f), OnNext(230, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 4f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 3.0), OnNext(220, 4.0), OnNext(230, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 4.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 3m), OnNext(220, 4m), OnNext(230, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, 4m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Nullable_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, default(int?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int32_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)4), OnNext(230, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int32_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)2), OnNext(230, (int?)4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_GeneralNullableMaxTest_LhsIsNull() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_GeneralNullableMaxTest_RhsIsNull() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnNext(220, (int?)null), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_GeneralNullableMaxTest_Less() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnNext(220, (int?)3), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_GeneralNullableMaxTest_Greater() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)3), OnNext(220, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (int?)3), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Nullable_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Nullable_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, default(long?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (long?)2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int64_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)null), OnNext(220, (long?)4L), OnNext(230, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (long?)4L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int64_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)null), OnNext(220, (long?)2L), OnNext(230, (long?)4L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (long?)4L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Nullable_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Nullable_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, default(float?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Float_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)null), OnNext(220, (float?)4f), OnNext(230, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (float?)4f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Float_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)null), OnNext(220, (float?)2f), OnNext(230, (float?)4f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (float?)4f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Nullable_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Nullable_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, default(double?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Double_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)null), OnNext(220, (double?)4.0), OnNext(230, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (double?)4.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Double_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)null), OnNext(220, (double?)2.0), OnNext(230, (double?)4.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (double?)4.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Nullable_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Max_Nullable_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, default(decimal?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Decimal_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)null), OnNext(220, (decimal?)4m), OnNext(230, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (decimal?)4m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Decimal_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)null), OnNext(220, (decimal?)2m), OnNext(230, (decimal?)4m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, (decimal?)4m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Max_Nullable_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Max_Nullable_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxOfT_Reference_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); #if !NO_PERF // BREAKING CHANGE v2 > v1.x - Behavior for reference types res.Messages.AssertEqual( OnNext(250, default(string)), OnCompleted(250) ); #else res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); #endif xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, "c"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnNext(250, new DateTime(2003, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxOfT_Value_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxOfT_Reference_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z") ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxOfT_Value_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now) ); var res = scheduler.Start(() => xs.Max() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxOfT_Reference_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); #if !NO_PERF // BREAKING CHANGE v2 > v1.x - Behavior for reference types res.Messages.AssertEqual( OnNext(250, default(string)), OnCompleted(250) ); #else res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); #endif xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Value_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxOfT_Reference_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxOfT_Value_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnError(210, ex) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxOfT_Reference_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z") ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxOfT_Value_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now) ); var res = scheduler.Start(() => xs.Max(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxOfT_Reference_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void MaxOfT_Value_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Max(new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Max_Selector_Regular_Int32() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => (int)x.Length)); res.Messages.AssertEqual( OnNext(240, 3), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Int64() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => (long)x.Length)); res.Messages.AssertEqual( OnNext(240, 3L), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Single() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => (float)x.Length)); res.Messages.AssertEqual( OnNext(240, 3.0f), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Double() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => (double)x.Length)); res.Messages.AssertEqual( OnNext(240, 3.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Decimal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => (decimal)x.Length)); res.Messages.AssertEqual( OnNext(240, 3.0m), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Int32_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(int?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (int?)3), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Int64_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(long?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (long?)3.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Single_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(float?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (float?)3.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Double_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(double?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)3.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Max_Selector_Regular_Decimal_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(decimal?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (decimal?)3.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void MaxOfT_Selector_Regular() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "bar"), OnNext(220, "qux"), OnNext(230, "foo"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => new string(x.Reverse().ToArray()))); res.Messages.AssertEqual( OnNext(240, "xuq"), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void MaxOfT_Selector_Regular_Comparer() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "bar"), OnNext(220, "qux"), OnNext(230, "foo"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Max(x => new string(x.Reverse().ToArray()), new ReverseComparer(Comparer.Default))); res.Messages.AssertEqual( OnNext(240, "oof"), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } #endregion #region + MaxBy + [TestMethod] public void MaxBy_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.MaxBy(default(IObservable), x => x)); ReactiveAssert.Throws(() => Observable.MaxBy(DummyObservable.Instance, default(Func))); ReactiveAssert.Throws(() => Observable.MaxBy(default(IObservable), x => x, Comparer.Default)); ReactiveAssert.Throws(() => Observable.MaxBy(DummyObservable.Instance, default(Func), Comparer.Default)); ReactiveAssert.Throws(() => Observable.MaxBy(DummyObservable.Instance, x => x, null)); } [TestMethod] public void MaxBy_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.Count == 0), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "a"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(4, "c")), OnNext(230, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(4, "c"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Multiple() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(215, new KeyValuePair(2, "d")), OnNext(220, new KeyValuePair(3, "c")), OnNext(225, new KeyValuePair(2, "y")), OnNext(230, new KeyValuePair(4, "a")), OnNext(235, new KeyValuePair(4, "r")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(4, "a"), new KeyValuePair(4, "r"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnError>(210, ex) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxBy_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxBy_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.Count == 0), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "a"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(4, "c")), OnNext(230, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "a"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MaxBy_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnError>(210, ex) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxBy_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MaxBy_SelectorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(2, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy, int>(x => { throw ex; }) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MaxBy_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(2, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MaxBy(x => x.Key, new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError>>(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } #endregion #region + Min + [TestMethod] public void Min_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(int))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(double))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(float))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(decimal))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(long))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(int?))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(double?))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(float?))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(decimal?))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => default(long?))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), Comparer.Default)); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(IComparer))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => "")); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Min(default(IObservable), _ => "", Comparer.Default)); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), default(Func), Comparer.Default)); ReactiveAssert.Throws(() => Observable.Min(Observable.Empty(), _ => "", default(IComparer))); } [TestMethod] public void Min_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 3), OnNext(220, 2), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 3L), OnNext(220, 2L), OnNext(230, 4L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 3f), OnNext(220, 2f), OnNext(230, 4f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 3.0), OnNext(220, 2.0), OnNext(230, 4.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 3m), OnNext(220, 2m), OnNext(230, 4m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, 2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Nullable_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, default(int?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int32_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)2), OnNext(230, (int?)4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int32_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)4), OnNext(230, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_GeneralNullableMinTest_LhsIsNull() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)null), OnNext(220, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_GeneralNullableMinTest_RhsIsNull() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnNext(220, (int?)null), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_GeneralNullableMinTest_Less() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnNext(220, (int?)3), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_GeneralNullableMinTest_Greater() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)3), OnNext(220, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Nullable_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Nullable_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, default(long?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (long?)2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int64_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)null), OnNext(220, (long?)2L), OnNext(230, (long?)4L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (long?)2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int64_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)null), OnNext(220, (long?)4L), OnNext(230, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (long?)2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Nullable_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Nullable_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, default(float?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Float_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)null), OnNext(220, (float?)2f), OnNext(230, (float?)4f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Float_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)null), OnNext(220, (float?)4f), OnNext(230, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Nullable_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Nullable_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, default(double?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Double_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)null), OnNext(220, (double?)2.0), OnNext(230, (double?)4.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Double_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)null), OnNext(220, (double?)4.0), OnNext(230, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Nullable_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Min_Nullable_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, default(decimal?)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Decimal_Some1() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)null), OnNext(220, (decimal?)2m), OnNext(230, (decimal?)4m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Decimal_Some2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)null), OnNext(220, (decimal?)4m), OnNext(230, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Min_Nullable_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Min_Nullable_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinOfT_Reference_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); #if !NO_PERF // BREAKING CHANGE v2 > v1.x - Behavior for reference types res.Messages.AssertEqual( OnNext(250, default(string)), OnCompleted(250) ); #else res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); #endif xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinOfT_Value_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinOfT_Reference_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z") ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinOfT_Value_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now) ); var res = scheduler.Start(() => xs.Min() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinOfT_Reference_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); #if !NO_PERF // BREAKING CHANGE v2 > v1.x - Behavior for reference types res.Messages.AssertEqual( OnNext(250, default(string)), OnCompleted(250) ); #else res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); #endif xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, "a"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, new DateTime(1983, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, "c"), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Value_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext(250, new DateTime(2003, 2, 11)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinOfT_Reference_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinOfT_Value_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnError(210, ex) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinOfT_Reference_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z") ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinOfT_Value_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now) ); var res = scheduler.Start(() => xs.Min(new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinOfT_Reference_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, "z"), OnNext(210, "b"), OnNext(220, "c"), OnNext(230, "a"), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void MinOfT_Value_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, DateTime.Now), OnNext(210, new DateTime(1993, 2, 11)), OnNext(220, new DateTime(2003, 2, 11)), OnNext(230, new DateTime(1983, 2, 11)), OnCompleted(250) ); var res = scheduler.Start(() => xs.Min(new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Min_Selector_Regular_Int32() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => (int)x.Length)); res.Messages.AssertEqual( OnNext(240, 1), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Int64() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => (long)x.Length)); res.Messages.AssertEqual( OnNext(240, 1L), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Single() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => (float)x.Length)); res.Messages.AssertEqual( OnNext(240, 1.0f), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Double() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => (double)x.Length)); res.Messages.AssertEqual( OnNext(240, 1.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Decimal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => (decimal)x.Length)); res.Messages.AssertEqual( OnNext(240, 1.0m), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Int32_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(int?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (int?)1), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Int64_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(long?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (long?)1.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Single_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(float?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (float?)1.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Double_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(double?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)1.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Min_Selector_Regular_Decimal_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(decimal?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (decimal?)1.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void MinOfT_Selector_Regular() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "qux"), OnNext(220, "foo"), OnNext(230, "bar"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => new string(x.Reverse().ToArray()))); res.Messages.AssertEqual( OnNext(240, "oof"), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void MinOfT_Selector_Regular_Comparer() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "qux"), OnNext(220, "foo"), OnNext(230, "bar"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Min(x => new string(x.Reverse().ToArray()), new ReverseComparer(Comparer.Default))); res.Messages.AssertEqual( OnNext(240, "xuq"), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } #endregion #region + MinBy + [TestMethod] public void MinBy_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.MinBy(default(IObservable), x => x)); ReactiveAssert.Throws(() => Observable.MinBy(DummyObservable.Instance, default(Func))); ReactiveAssert.Throws(() => Observable.MinBy(default(IObservable), x => x, Comparer.Default)); ReactiveAssert.Throws(() => Observable.MinBy(DummyObservable.Instance, default(Func), Comparer.Default)); ReactiveAssert.Throws(() => Observable.MinBy(DummyObservable.Instance, x => x, null)); } [TestMethod] public void MinBy_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.Count == 0), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "a"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(2, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "c"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Multiple() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(215, new KeyValuePair(2, "d")), OnNext(220, new KeyValuePair(3, "c")), OnNext(225, new KeyValuePair(2, "y")), OnNext(230, new KeyValuePair(4, "a")), OnNext(235, new KeyValuePair(4, "r")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "d"), new KeyValuePair(2, "y"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnError>(210, ex) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinBy_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinBy_Comparer_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.Count == 0), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Comparer_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(2, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(2, "a"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Comparer_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(20, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnNext>>(250, x => x.SequenceEqual(new[] { new KeyValuePair(20, "c"), })), OnCompleted>>(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void MinBy_Comparer_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnError>(210, ex) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinBy_Comparer_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ReverseComparer(Comparer.Default)) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void MinBy_SelectorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(2, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy, int>(x => { throw ex; }) ); res.Messages.AssertEqual( OnError>>(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void MinBy_ComparerThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, new KeyValuePair(1, "z")), OnNext(210, new KeyValuePair(3, "b")), OnNext(220, new KeyValuePair(2, "c")), OnNext(230, new KeyValuePair(4, "a")), OnCompleted>(250) ); var res = scheduler.Start(() => xs.MinBy(x => x.Key, new ThrowingComparer(ex)) ); res.Messages.AssertEqual( OnError>>(220, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } class ReverseComparer : IComparer { private IComparer _comparer; public ReverseComparer(IComparer comparer) { _comparer = comparer; } public int Compare(T x, T y) { return -_comparer.Compare(x, y); } } class ThrowingComparer : IComparer { private Exception _ex; public ThrowingComparer(Exception ex) { _ex = ex; } public int Compare(T x, T y) { throw _ex; } } #endregion #region + SequenceEqual + [TestMethod] public void SequenceEqual_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.SequenceEqual(default(IObservable), DummyObservable.Instance)); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, default(IObservable))); ReactiveAssert.Throws(() => Observable.SequenceEqual(default(IObservable), DummyObservable.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, default(IObservable), EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, DummyObservable.Instance, default(IEqualityComparer))); ReactiveAssert.Throws(() => Observable.SequenceEqual(default(IObservable), new[] { 42 })); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, default(IEnumerable))); ReactiveAssert.Throws(() => Observable.SequenceEqual(default(IObservable), new[] { 42 }, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, default(IEnumerable), EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.SequenceEqual(DummyObservable.Instance, new[] { 42 }, default(IEqualityComparer))); } [TestMethod] public void SequenceEqual_Observable_Equal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnCompleted(720) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(720, true), OnCompleted(720) ); xs.Subscriptions.AssertEqual( Subscribe(200, 720) ); ys.Subscriptions.AssertEqual( Subscribe(200, 720) ); } [TestMethod] public void SequenceEqual_Observable_Equal_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnCompleted(720) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(720, true), OnCompleted(720) ); xs.Subscriptions.AssertEqual( Subscribe(200, 720) ); ys.Subscriptions.AssertEqual( Subscribe(200, 720) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_Left() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 0), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnCompleted(720) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); ys.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_Left_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 0), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnCompleted(720) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); ys.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_Right() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnNext(350, 8) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(510, false), OnCompleted(510) ); xs.Subscriptions.AssertEqual( Subscribe(200, 510) ); ys.Subscriptions.AssertEqual( Subscribe(200, 510) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_Right_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnNext(350, 8) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(510, false), OnCompleted(510) ); xs.Subscriptions.AssertEqual( Subscribe(200, 510) ); ys.Subscriptions.AssertEqual( Subscribe(200, 510) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_2() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnNext(490, 8), OnNext(520, 9), OnNext(580, 10), OnNext(600, 11) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnNext(350, 9), OnNext(400, 9), OnNext(410, 10), OnNext(490, 11), OnNext(550, 12), OnNext(560, 13) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(490, false), OnCompleted(490) ); xs.Subscriptions.AssertEqual( Subscribe(200, 490) ); ys.Subscriptions.AssertEqual( Subscribe(200, 490) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_2_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnNext(490, 8), OnNext(520, 9), OnNext(580, 10), OnNext(600, 11) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(280, 4), OnNext(300, 5), OnNext(330, 6), OnNext(340, 7), OnNext(350, 9), OnNext(400, 9), OnNext(410, 10), OnNext(490, 11), OnNext(550, 12), OnNext(560, 13) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(490, false), OnCompleted(490) ); xs.Subscriptions.AssertEqual( Subscribe(200, 490) ); ys.Subscriptions.AssertEqual( Subscribe(200, 490) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_3() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnCompleted(330) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(400, 4), OnCompleted(420) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(420, false), OnCompleted(420) ); xs.Subscriptions.AssertEqual( Subscribe(200, 420) ); ys.Subscriptions.AssertEqual( Subscribe(200, 420) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_3_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnCompleted(330) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(400, 4), OnCompleted(420) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(420, false), OnCompleted(420) ); xs.Subscriptions.AssertEqual( Subscribe(200, 420) ); ys.Subscriptions.AssertEqual( Subscribe(200, 420) ); } [TestMethod] public void SequenceEqual_Observable_ComparerThrows() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnCompleted(330) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(400, 4), OnCompleted(420) ); var ex = new Exception(); var res = scheduler.Start(() => xs.SequenceEqual(ys, new ThrowComparer(ex)) ); res.Messages.AssertEqual( OnError(270, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 270) ); ys.Subscriptions.AssertEqual( Subscribe(200, 270) ); } [TestMethod] public void SequenceEqual_Observable_ComparerThrows_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnCompleted(330) ); var ys = scheduler.CreateHotObservable( OnNext(90, 1), OnNext(270, 3), OnNext(400, 4), OnCompleted(420) ); var ex = new Exception(); var res = scheduler.Start(() => ys.SequenceEqual(xs, new ThrowComparer(ex)) ); res.Messages.AssertEqual( OnError(270, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 270) ); ys.Subscriptions.AssertEqual( Subscribe(200, 270) ); } class ThrowComparer : IEqualityComparer { private Exception _ex; public ThrowComparer(Exception ex) { _ex = ex; } public bool Equals(int x, int y) { throw _ex; } public int GetHashCode(int obj) { throw new NotImplementedException(); } } [TestMethod] public void SequenceEqual_Observable_NotEqual_4() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(250, 1), OnCompleted(300) ); var ys = scheduler.CreateHotObservable( OnNext(290, 1), OnNext(310, 2), OnCompleted(350) ); var res = scheduler.Start(() => xs.SequenceEqual(ys) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); ys.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Observable_NotEqual_4_Sym() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(250, 1), OnCompleted(300) ); var ys = scheduler.CreateHotObservable( OnNext(290, 1), OnNext(310, 2), OnCompleted(350) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); ys.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Observable_Left_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(250, 1), OnError(300, ex) ); var ys = scheduler.CreateHotObservable( OnNext(290, 1), OnNext(310, 2), OnCompleted(350) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnError(300, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 300) ); ys.Subscriptions.AssertEqual( Subscribe(200, 300) ); } [TestMethod] public void SequenceEqual_Observable_Right_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(290, 1), OnNext(310, 2), OnCompleted(350) ); var ys = scheduler.CreateHotObservable( OnNext(250, 1), OnError(300, ex) ); var res = scheduler.Start(() => ys.SequenceEqual(xs) ); res.Messages.AssertEqual( OnError(300, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 300) ); ys.Subscriptions.AssertEqual( Subscribe(200, 300) ); } [TestMethod] public void SequenceEqual_Enumerable_Equal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4, 5, 6, 7 }) ); res.Messages.AssertEqual( OnNext(510, true), OnCompleted(510) ); xs.Subscriptions.AssertEqual( Subscribe(200, 510) ); } [TestMethod] public void SequenceEqual_Enumerable_NotEqual_Elements() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4, 9, 6, 7 }) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Enumerable_Comparer_Equal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3 - 2, 4, 5, 6 + 42, 7 - 6 }, new OddEvenComparer()) ); res.Messages.AssertEqual( OnNext(510, true), OnCompleted(510) ); xs.Subscriptions.AssertEqual( Subscribe(200, 510) ); } [TestMethod] public void SequenceEqual_Enumerable_Comparer_NotEqual() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3 - 2, 4, 5 + 9, 6 + 42, 7 - 6 }, new OddEvenComparer()) ); res.Messages.AssertEqual( OnNext(310, false), OnCompleted(310) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); } class OddEvenComparer : IEqualityComparer { public bool Equals(int x, int y) { return x % 2 == y % 2; } public int GetHashCode(int obj) { return (obj % 2).GetHashCode(); } } [TestMethod] public void SequenceEqual_Enumerable_Comparer_Throws() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var ex = new Exception(); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4, 5, 6, 7 }, new ThrowingComparer(5, ex)) ); res.Messages.AssertEqual( OnError(310, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); } class ThrowingComparer : IEqualityComparer { private int _x; private Exception _ex; public ThrowingComparer(int x, Exception ex) { _x = x; _ex = ex; } public bool Equals(int x, int y) { if (x == _x) throw _ex; return x == y; } public int GetHashCode(int obj) { return obj.GetHashCode(); } } [TestMethod] public void SequenceEqual_Enumerable_NotEqual_TooLong() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4, 5, 6, 7, 8 }) ); res.Messages.AssertEqual( OnNext(510, false), OnCompleted(510) ); xs.Subscriptions.AssertEqual( Subscribe(200, 510) ); } [TestMethod] public void SequenceEqual_Enumerable_NotEqual_TooShort() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnNext(310, 5), OnNext(340, 6), OnNext(450, 7), OnCompleted(510) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4, 5, 6 }) ); res.Messages.AssertEqual( OnNext(450, false), OnCompleted(450) ); xs.Subscriptions.AssertEqual( Subscribe(200, 450) ); } [TestMethod] public void SequenceEqual_Enumerable_OnError() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnError(310, ex) ); var res = scheduler.Start(() => xs.SequenceEqual(new[] { 3, 4 }) ); res.Messages.AssertEqual( OnError(310, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); } [TestMethod] public void SequenceEqual_Enumerable_IteratorThrows1() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnNext(290, 4), OnCompleted(310) ); var res = scheduler.Start(() => xs.SequenceEqual(Throw(ex)) ); res.Messages.AssertEqual( OnError(290, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 290) ); } [TestMethod] public void SequenceEqual_Enumerable_IteratorThrows2() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnCompleted(310) ); var res = scheduler.Start(() => xs.SequenceEqual(Throw(ex)) ); res.Messages.AssertEqual( OnError(310, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 310) ); } private IEnumerable Throw(Exception ex) { yield return 3; throw ex; } [TestMethod] public void SequenceEqual_Enumerable_GetEnumeratorThrows() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(190, 2), OnNext(240, 3), OnCompleted(310) ); var res = scheduler.Start(() => xs.SequenceEqual(new RogueEnumerable(ex)) ); res.Messages.AssertEqual( OnError(200, ex) ); xs.Subscriptions.AssertEqual( ); } #endregion #region + SingleAsync + [TestMethod] public void SingleAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.SingleAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.SingleAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.SingleAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void SingleAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync() ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync() ); res.Messages.AssertEqual( OnError(220, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void SingleAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.SingleAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void SingleAsync_Predicate() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(240, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void SingleAsync_Predicate_Empty() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(250, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleAsync_Predicate_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync(x => x == 4) ); res.Messages.AssertEqual( OnNext(250, 4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.SingleAsync(x => x > 10) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void SingleAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleAsync(x => { if (x < 4) return false; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + SingleOrDefaultAsync + [TestMethod] public void SingleOrDefaultAsync_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.SingleOrDefaultAsync(default(IObservable))); ReactiveAssert.Throws(() => Observable.SingleOrDefaultAsync(default(IObservable), _ => true)); ReactiveAssert.Throws(() => Observable.SingleOrDefaultAsync(DummyObservable.Instance, default(Func))); } [TestMethod] public void SingleOrDefaultAsync_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleOrDefaultAsync_One() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleOrDefaultAsync_Many() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync() ); res.Messages.AssertEqual( OnError(220, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void SingleOrDefaultAsync_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void SingleOrDefaultAsync_Predicate() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnError(240, e => e is InvalidOperationException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void SingleOrDefaultAsync_Predicate_Empty() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => x % 2 == 1) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleOrDefaultAsync_Predicate_One() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => x == 4) ); res.Messages.AssertEqual( OnNext(250, 4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleOrDefaultAsync_Predicate_None() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => x > 10) ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void SingleOrDefaultAsync_Predicate_Throw() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => x > 10) ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void SingleOrDefaultAsync_PredicateThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnNext(240, 5), OnCompleted(250) ); var res = scheduler.Start(() => xs.SingleOrDefaultAsync(x => { if (x < 4) return false; throw ex; }) ); res.Messages.AssertEqual( OnError(230, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 230) ); } #endregion #region + Sum + [TestMethod] public void Sum_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(int))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(double))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(float))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(decimal))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(long))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(int?))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(double?))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(float?))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(decimal?))); ReactiveAssert.Throws(() => Observable.Sum(default(IObservable), _ => default(long?))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); ReactiveAssert.Throws(() => Observable.Sum(Observable.Empty(), default(Func))); } [TestMethod] public void Sum_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, 2), OnNext(220, 3), OnNext(230, 4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2 + 3 + 4), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int32_Overflow() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnNext(210, int.MaxValue), OnNext(220, 1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(220, e => e is OverflowException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Sum_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, 2L), OnNext(220, 3L), OnNext(230, 4L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2L + 3L + 4L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Int64_Overflow() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnNext(210, long.MaxValue), OnNext(220, 1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(220, e => e is OverflowException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Sum_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1L) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 0f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnNext(210, 2f), OnNext(220, 3f), OnNext(230, 4f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2f + 3f + 4f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1f) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 0.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnNext(210, 2.0), OnNext(220, 3.0), OnNext(230, 4.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2.0 + 3.0 + 4.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1.0) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 0m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnNext(210, 2m), OnNext(220, 3m), OnNext(230, 4m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, 2m + 3m + 4m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, 1m) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Nullable_Int32_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (int?)0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int32_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (int?)2), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int32_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)2), OnNext(220, (int?)null), OnNext(230, (int?)4), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (int?)(2 + 4)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int32_Overflow() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnNext(210, (int?)int.MaxValue), OnNext(220, (int?)1), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(220, e => e is OverflowException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Sum_Nullable_Int32_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Nullable_Int32_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (int?)1) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Nullable_Int64_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (long?)0L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int64_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)2L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (long?)2L), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int64_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)2L), OnNext(220, (long?)null), OnNext(230, (long?)4L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (long?)(2L + 4L)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Int64_Overflow() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnNext(210, (long?)long.MaxValue), OnNext(220, (long?)1L), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(220, e => e is OverflowException) ); xs.Subscriptions.AssertEqual( Subscribe(200, 220) ); } [TestMethod] public void Sum_Nullable_Int64_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Nullable_Int64_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (long?)1L) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Nullable_Float_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (float?)0f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Float_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)2f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (float?)2f), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Float_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnNext(210, (float?)2f), OnNext(220, (float?)null), OnNext(230, (float?)4f), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (float?)(2f + 4f)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Float_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Nullable_Float_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (float?)1f) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Nullable_Double_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (double?)0.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Double_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)2.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (double?)2.0), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Double_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnNext(210, (double?)2.0), OnNext(220, (double?)null), OnNext(230, (double?)4.0), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (double?)(2.0 + 4.0)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Double_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Nullable_Double_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (double?)1.0) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Nullable_Decimal_Empty() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (decimal?)0m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Decimal_Return() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)2m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (decimal?)2m), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Decimal_Some() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnNext(210, (decimal?)2m), OnNext(220, (decimal?)null), OnNext(230, (decimal?)4m), OnCompleted(250) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnNext(250, (decimal?)(2m + 4m)), OnCompleted(250) ); xs.Subscriptions.AssertEqual( Subscribe(200, 250) ); } [TestMethod] public void Sum_Nullable_Decimal_Throw() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m), OnError(210, ex) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( OnError(210, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 210) ); } [TestMethod] public void Sum_Nullable_Decimal_Never() { var ex = new Exception(); var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(150, (decimal?)1m) ); var res = scheduler.Start(() => xs.Sum() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void Sum_Selector_Regular_Int32() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => (int)x.Length)); res.Messages.AssertEqual( OnNext(240, 6), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Int64() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => (long)x.Length)); res.Messages.AssertEqual( OnNext(240, 6L), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Single() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => (float)x.Length)); res.Messages.AssertEqual( OnNext(240, 6.0f), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Double() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => (double)x.Length)); res.Messages.AssertEqual( OnNext(240, 6.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Decimal() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => (decimal)x.Length)); res.Messages.AssertEqual( OnNext(240, 6.0m), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Int32_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(int?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (int?)4), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Int64_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(long?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (long?)4.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Single_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(float?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (float?)4.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Double_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(double?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (double?)4.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } [TestMethod] public void Sum_Selector_Regular_Decimal_Nullable() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(210, "fo"), OnNext(220, "b"), OnNext(230, "qux"), OnCompleted(240) ); var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(decimal?) : x.Length)); res.Messages.AssertEqual( OnNext(240, (decimal?)4.0), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } #endregion #region + ToArray + [TestMethod] public void ToArray_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ToArray(null)); } [TestMethod] public void ToArray_Completed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(660) ); var res = scheduler.Start(() => xs.ToArray() ); res.Messages.AssertEqual( OnNext(660, a => a.SequenceEqual(new[] { 2, 3, 4, 5 })), OnCompleted(660) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToArray_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnError(660, ex) ); var res = scheduler.Start(() => xs.ToArray() ); res.Messages.AssertEqual( OnError(660, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToArray_Disposed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5) ); var res = scheduler.Start(() => xs.ToArray() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #endregion #region + ToDictionary + [TestMethod] public void ToDictionary_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ToDictionary(null, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, null, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, DummyFunc.Instance, null)); ReactiveAssert.Throws(() => Observable.ToDictionary(null, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, null)); ReactiveAssert.Throws(() => Observable.ToDictionary(null, DummyFunc.Instance, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, null, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, DummyFunc.Instance, null, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, DummyFunc.Instance, DummyFunc.Instance, null)); ReactiveAssert.Throws(() => Observable.ToDictionary(null, DummyFunc.Instance, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, null, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToDictionary(DummyObservable.Instance, DummyFunc.Instance, null)); } [TestMethod] public void ToDictionary_Completed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(660) ); var res = scheduler.Start(() => xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer.Default) ); res.Messages.AssertEqual( OnNext>(660, d => { return d.Count == 4 && d[4] == 8 && d[6] == 12 && d[8] == 16 && d[10] == 20; }), OnCompleted>(660) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToDictionary_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnError(660, ex) ); var res = scheduler.Start(() => xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(660, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToDictionary_KeySelectorThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(600) ); var res = scheduler.Start(() => xs.ToDictionary(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(440, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 440) ); } [TestMethod] public void ToDictionary_ElementSelectorThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(600) ); var res = scheduler.Start(() => xs.ToDictionary(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(440, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 440) ); } [TestMethod] public void ToDictionary_Disposed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5) ); var res = scheduler.Start(() => xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer.Default) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void ToDictionary_MultipleAdd() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(660) ); var res = scheduler.Start(() => xs.ToDictionary(x => x % 2, x => x * 2, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(440, e => true) ); xs.Subscriptions.AssertEqual( Subscribe(200, 440) ); } [TestMethod] public void ToDictionary_Default() { var d1 = Observable.Range(1, 10).ToDictionary(x => x.ToString()).First(); Assert.AreEqual(7, d1["7"]); var d2 = Observable.Range(1, 10).ToDictionary(x => x.ToString(), x => x * 2).First(); Assert.AreEqual(18, d2["9"]); var d3 = Observable.Range(1, 10).ToDictionary(x => x.ToString(), EqualityComparer.Default).First(); Assert.AreEqual(7, d3["7"]); } #endregion #region + ToList + [TestMethod] public void ToList_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ToList(null)); } [TestMethod] public void ToList_Completed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(660) ); var res = scheduler.Start(() => xs.ToList() ); res.Messages.AssertEqual( OnNext>(660, l => l.SequenceEqual(new[] { 2, 3, 4, 5 })), OnCompleted>(660) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToList_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnError(660, ex) ); var res = scheduler.Start(() => xs.ToList() ); res.Messages.AssertEqual( OnError>(660, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToList_Disposed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5) ); var res = scheduler.Start(() => xs.ToList() ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } #endregion #region + ToLookup + [TestMethod] public void ToLookup_ArgumentChecking() { ReactiveAssert.Throws(() => Observable.ToLookup(null, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, null, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, DummyFunc.Instance, null)); ReactiveAssert.Throws(() => Observable.ToLookup(null, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, null)); ReactiveAssert.Throws(() => Observable.ToLookup(null, DummyFunc.Instance, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, null, DummyFunc.Instance, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, DummyFunc.Instance, null, EqualityComparer.Default)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, DummyFunc.Instance, DummyFunc.Instance, null)); ReactiveAssert.Throws(() => Observable.ToLookup(null, DummyFunc.Instance, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, null, DummyFunc.Instance)); ReactiveAssert.Throws(() => Observable.ToLookup(DummyObservable.Instance, DummyFunc.Instance, null)); } [TestMethod] public void ToLookup_Completed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(660) ); var res = scheduler.Start(() => xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer.Default) ); res.Messages.AssertEqual( OnNext>(660, d => { return d.Count == 2 && d[0].SequenceEqual(new[] { 4, 8 }) && d[1].SequenceEqual(new[] { 6, 10 }); }), OnCompleted>(660) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToLookup_Error() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnError(660, ex) ); var res = scheduler.Start(() => xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(660, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 660) ); } [TestMethod] public void ToLookup_KeySelectorThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(600) ); var res = scheduler.Start(() => xs.ToLookup(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(440, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 440) ); } [TestMethod] public void ToLookup_ElementSelectorThrows() { var scheduler = new TestScheduler(); var ex = new Exception(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5), OnCompleted(600) ); var res = scheduler.Start(() => xs.ToLookup(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer.Default) ); res.Messages.AssertEqual( OnError>(440, ex) ); xs.Subscriptions.AssertEqual( Subscribe(200, 440) ); } [TestMethod] public void ToLookup_Disposed() { var scheduler = new TestScheduler(); var xs = scheduler.CreateHotObservable( OnNext(110, 1), OnNext(220, 2), OnNext(330, 3), OnNext(440, 4), OnNext(550, 5) ); var res = scheduler.Start(() => xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer.Default) ); res.Messages.AssertEqual( ); xs.Subscriptions.AssertEqual( Subscribe(200, 1000) ); } [TestMethod] public void ToLookup_Default() { var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First(); d1["0"].AssertEqual(2, 4, 6, 8, 10); var d2 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString(), x => x * 2).First(); d2["1"].AssertEqual(2, 6, 10, 14, 18); var d3 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString(), EqualityComparer.Default).First(); d3["0"].AssertEqual(2, 4, 6, 8, 10); } [TestMethod] public void ToLookup_Contains() { var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First(); Assert.IsTrue(d1.Contains("1")); Assert.IsFalse(d1.Contains("2")); } [TestMethod] public void ToLookup_Groups() { var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First(); foreach (var g in d1) { if (g.Key == "0") { g.AssertEqual(2, 4, 6, 8, 10); } else if (g.Key == "1") { g.AssertEqual(1, 3, 5, 7, 9); } else Assert.Fail("Unknown group."); } } [TestMethod] public void ToLookup_Groups_2() { var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First(); foreach (IGrouping g in ((System.Collections.IEnumerable)d1)) { if (g.Key == "0") { var l = new List(); foreach (int v in ((System.Collections.IEnumerable)g)) l.Add(v); l.AssertEqual(2, 4, 6, 8, 10); } else if (g.Key == "1") { var l = new List(); foreach (int v in ((System.Collections.IEnumerable)g)) l.Add(v); l.AssertEqual(1, 3, 5, 7, 9); } else Assert.Fail("Unknown group."); } } #endregion } }