// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using Microsoft.Reactive.Testing; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace ReactiveTests.Tests { [TestClass] public class MaxTest : ReactiveTest { [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)); 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, 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, Comparer.Default)); ReactiveAssert.Throws(() => Observable.Max(Observable.Empty(), _ => "", default)); } [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_LhsNull() { 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_RhsNull() { 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 => 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) ); // Note: AsEnumerable required because on .NET 10 SDK (C# 14) but when targetting .NET 8, we hit the // issue at https://github.com/dotnet/runtime/issues/107723 and don't have access to the fix // implemented in https://github.com/dotnet/runtime/pull/107957 // When test projects no longer target any version of .NET older than 10.0, we can revert this, // removing the AsEnumerable. var res = scheduler.Start(() => xs.Max(x => new string(x.ToCharArray().AsEnumerable().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) ); // Note: AsEnumerable required because on .NET 10 SDK (C# 14) but when targetting .NET 8, we hit the // issue at https://github.com/dotnet/runtime/issues/107723 and don't have access to the fix // implemented in https://github.com/dotnet/runtime/pull/107957 // When test projects no longer target any version of .NET older than 10.0, we can revert this, // removing the AsEnumerable. var res = scheduler.Start(() => xs.Max(x => new string(x.ToCharArray().AsEnumerable().Reverse().ToArray()), new ReverseComparer(Comparer.Default))); res.Messages.AssertEqual( OnNext(240, "oof"), OnCompleted(240) ); xs.Subscriptions.AssertEqual( Subscribe(200, 240) ); } } internal class ReverseComparer : IComparer { private readonly IComparer _comparer; public ReverseComparer(IComparer comparer) { _comparer = comparer; } public int Compare(T x, T y) { return -_comparer.Compare(x, y); } } internal class ThrowingComparer : IComparer { private readonly Exception _ex; public ThrowingComparer(Exception ex) { _ex = ex; } public int Compare(T x, T y) { throw _ex; } } }