Files
Pat Tullmann 0cb742dafb binfmt-detector-cli: rewrite to support PE32+ binaries (#38)
Rewrite with hard-coded offsets into the PE file format to discern
if a binary is PE32 or PE32+, and then to determine if it contains
a "CLR Data Directory" entry that looks valid.

Tested with PE32 and PE32+ compiled Mono binaries, PE32 and PE32+ native
binaries, and a random assortment of garbage files.

Former-commit-id: 9e7ac86ec84f653a2f79b87183efd5b0ebda001b
2023-10-16 20:16:47 +02:00

14473 lines
390 KiB
C#

// 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<ArgumentNullException>(() => Observable.Aggregate<int, int>(default(IObservable<int>), 1, (x, y) => x + y));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int>(DummyObservable<int>.Instance, 1, default(Func<int, int, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int>(default(IObservable<int>), (x, y) => x + y));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int>(DummyObservable<int>.Instance, default(Func<int, int, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(default(IObservable<int>), 1, (x, y) => x + y, x => x));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(DummyObservable<int>.Instance, 1, default(Func<int, int, int>), x => x));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(DummyObservable<int>.Instance, 1, (x, y) => x + y, default(Func<int, int>)));
}
[TestMethod]
public void AggregateWithSeed_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnNext(250, 42),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnNext<int>(250, 42 + 24),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(260)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnNext(260, 42 + Enumerable.Range(0, 5).Sum()),
OnCompleted<int>(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<int>(260)
);
var res = scheduler.Start(() =>
xs.Aggregate(0, (acc, x) => { if (x < 3) return acc + x; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
);
res.Messages.AssertEqual(
OnNext(250, 42 * 5),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
);
res.Messages.AssertEqual(
OnNext<int>(250, (42 + 24) * 5),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(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<int>(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<int>(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<int>(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<int>(260)
);
var res = scheduler.Start(() =>
xs.Aggregate<int, int, int>(0, (acc, x) => acc + x, x => { throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate((acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Aggregate((acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnNext<int>(250, 24),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Aggregate((acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(260)
);
var res = scheduler.Start(() =>
xs.Aggregate((acc, x) => acc + x)
);
res.Messages.AssertEqual(
OnNext(260, Enumerable.Range(0, 5).Sum()),
OnCompleted<int>(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<int>(260)
);
var res = scheduler.Start(() =>
xs.Aggregate((acc, x) => { if (x < 3) return acc + x; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(240, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
#endregion
#region + All +
[TestMethod]
public void All_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.All(DummyObservable<int>.Instance, default(Func<int, bool>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.All(default(IObservable<int>), x => true));
}
[TestMethod]
public void All_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(210, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(210, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(210, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, true),
OnCompleted<bool>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.All(x => x > 0)
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.All(x => { if (x < 4) return true; throw ex; })
);
res.Messages.AssertEqual(
OnError<bool>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + Any +
[TestMethod]
public void Any_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(DummyObservable<int>.Instance, default(Func<int, bool>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(default(IObservable<int>), x => true));
}
[TestMethod]
public void Any_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Any()
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any()
);
res.Messages.AssertEqual(
OnNext(210, true),
OnCompleted<bool>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Any()
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(210, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnNext(220, true),
OnCompleted<bool>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Any(x => x > 0)
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Any(x => { if (x != -4) return false; throw ex; })
);
res.Messages.AssertEqual(
OnError<bool>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + Average +
[TestMethod]
public void Average_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(int)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(int?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
}
[TestMethod]
public void Average_Int32_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 3.0),
OnCompleted<double>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 3.0),
OnCompleted<double>(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<long>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 3.0),
OnCompleted<double>(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<double>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 2f),
OnCompleted<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 3f),
OnCompleted<float>(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<float>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<float>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 2m),
OnCompleted<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, 3m),
OnCompleted<decimal>(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<decimal>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<decimal>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)null),
OnCompleted<double?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.5),
OnCompleted<double?>(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<int?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)null),
OnCompleted<double?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.5),
OnCompleted<double?>(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<long?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)null),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.5),
OnCompleted<double?>(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<double?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<double?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (float?)null),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2.5f),
OnCompleted<float?>(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<float?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<float?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)null),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2.5m),
OnCompleted<decimal?>(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<decimal?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Average()
);
res.Messages.AssertEqual(
OnError<decimal?>(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<int>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Int64()
{
var xs = Observable.Return(42L, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<long>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Double()
{
var xs = Observable.Return(42.0, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<double>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Single()
{
var xs = Observable.Return(42.0f, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<float>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Decimal()
{
var xs = Observable.Return(42.0m, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<decimal>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Int32_Nullable()
{
var xs = Observable.Return((int?)42, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<int?>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Int64_Nullable()
{
var xs = Observable.Return((long?)42L, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<long?>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Double_Nullable()
{
var xs = Observable.Return((double?)42.0, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<double?>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Single_Nullable()
{
var xs = Observable.Return((float?)42.0f, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<float?>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
[TestMethod]
public void Average_InjectOverflow_Decimal_Nullable()
{
var xs = Observable.Return((decimal?)42.0m, ThreadPoolScheduler.Instance);
var res = new OverflowInjection<decimal?>(xs, long.MaxValue).Average();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
class OverflowInjection<T> : IObservable<T>
{
private readonly IObservable<T> _source;
private readonly object _initialCount;
public OverflowInjection(IObservable<T> source, object initialCount)
{
_source = source;
_initialCount = initialCount;
}
public IDisposable Subscribe(IObserver<T> 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<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => (int)x.Length));
res.Messages.AssertEqual(
OnNext(240, 2.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Int64()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => (long)x.Length));
res.Messages.AssertEqual(
OnNext(240, 2.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Single()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => (float)x.Length));
res.Messages.AssertEqual(
OnNext(240, 2.0f),
OnCompleted<float>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Double()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => (double)x.Length));
res.Messages.AssertEqual(
OnNext(240, 2.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Decimal()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => (decimal)x.Length));
res.Messages.AssertEqual(
OnNext(240, 2.0m),
OnCompleted<decimal>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Int32_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(int?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)2.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Int64_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(long?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)2.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Single_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(float?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (float?)2.0),
OnCompleted<float?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Double_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(double?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)2.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Average_Selector_Regular_Decimal_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "b"),
OnNext(220, "fo"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(decimal?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (decimal?)2.0),
OnCompleted<decimal?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
#endregion
#region + Contains +
[TestMethod]
public void Contains_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default(IObservable<int>), 42));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default(IObservable<int>), 42, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(DummyObservable<int>.Instance, 42, null));
}
[TestMethod]
public void Contains_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(42)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(2)
);
res.Messages.AssertEqual(
OnNext(210, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(-2)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(3)
);
res.Messages.AssertEqual(
OnNext(220, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(-3)
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Contains(42)
);
res.Messages.AssertEqual(
OnError<bool>(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<bool>(210, e => e is NotImplementedException)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 210)
);
}
class ContainsComparerThrows : IEqualityComparer<int>
{
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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(42, new ContainsComparerMod2())
);
res.Messages.AssertEqual(
OnNext(220, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Contains(21, new ContainsComparerMod2())
);
res.Messages.AssertEqual(
OnNext(250, false),
OnCompleted<bool>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
class ContainsComparerMod2 : IEqualityComparer<int>
{
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<ArgumentNullException>(() => Observable.Count(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Count(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Count(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void Count_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Count()
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count()
);
res.Messages.AssertEqual(
OnNext(250, 1),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count()
);
res.Messages.AssertEqual(
OnNext(250, 3),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Count()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(xs, int.MaxValue).Count();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
#endif
[TestMethod]
public void Count_Predicate_Empty_True()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(_ => true)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(_ => false)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(_ => true)
);
res.Messages.AssertEqual(
OnNext(250, 1),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(_ => false)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(x => x < 10)
);
res.Messages.AssertEqual(
OnNext(250, 3),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(x => x > 10)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Count(x => x % 2 == 0)
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Count(_ => true)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Count(_ => false)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(240)
);
var ex = new Exception();
var res = scheduler.Start(() =>
xs.Count(x =>
{
if (x == 3)
throw ex;
return true;
})
);
res.Messages.AssertEqual(
OnError<int>(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<int>(xs, int.MaxValue).Count(_ => true);
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
#endif
#endregion
#region + ElementAt +
[TestMethod]
public void ElementAt_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ElementAt(default(IObservable<int>), 2));
ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.ElementAt(DummyObservable<int>.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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAt(0)
);
res.Messages.AssertEqual(
OnNext(280, 42),
OnCompleted<int>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAt(2)
);
res.Messages.AssertEqual(
OnNext(470, 44),
OnCompleted<int>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAt(3)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(420, ex)
);
var res = scheduler.Start(() =>
xs.ElementAt(3)
);
res.Messages.AssertEqual(
OnError<int>(420, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 420)
);
}
#endregion
#region + ElementAtOrDefault +
[TestMethod]
public void ElementAtOrDefault_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ElementAtOrDefault(default(IObservable<int>), 2));
ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.ElementAtOrDefault(DummyObservable<int>.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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAtOrDefault(0)
);
res.Messages.AssertEqual(
OnNext(280, 42),
OnCompleted<int>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAtOrDefault(2)
);
res.Messages.AssertEqual(
OnNext(470, 44),
OnCompleted<int>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ElementAtOrDefault(3)
);
res.Messages.AssertEqual(
OnNext(600, 0),
OnCompleted<int>(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<int>(420, ex)
);
var res = scheduler.Start(() =>
xs.ElementAtOrDefault(3)
);
res.Messages.AssertEqual(
OnError<int>(420, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 420)
);
}
#endregion
#region + FirstAsync +
[TestMethod]
public void FirstAsync_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void FirstAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync()
);
res.Messages.AssertEqual(
OnNext(210, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync()
);
res.Messages.AssertEqual(
OnNext(210, 2),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.FirstAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnNext(220, 3),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(220, ex)
);
var res = scheduler.Start(() =>
xs.FirstAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstAsync(x => { if (x < 4) return false; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + FirstOrDefaultAsync +
[TestMethod]
public void FirstOrDefaultAsync_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void FirstOrDefaultAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(210, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(210, 2),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnNext(220, 3),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(220, ex)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.FirstOrDefaultAsync(x => { if (x < 4) return false; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + IsEmpty +
[TestMethod]
public void IsEmpty_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.IsEmpty(default(IObservable<int>)));
}
[TestMethod]
public void IsEmpty_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.IsEmpty()
);
res.Messages.AssertEqual(
OnNext(250, true),
OnCompleted<bool>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.IsEmpty()
);
res.Messages.AssertEqual(
OnNext(210, false),
OnCompleted<bool>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.IsEmpty()
);
res.Messages.AssertEqual(
OnError<bool>(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<ArgumentNullException>(() => Observable.LastAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void LastAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync()
);
res.Messages.AssertEqual(
OnNext(250, 3),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LastAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnNext(250, 5),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LastAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastAsync(x => { if (x < 4) return x % 2 == 1; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + LastOrDefaultAsync +
[TestMethod]
public void LastOrDefaultAsync_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void LastOrDefaultAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 3),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnNext(250, 5),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LastOrDefaultAsync(x => { if (x < 4) return x % 2 == 1; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + LongCount +
[TestMethod]
public void LongCount_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void LongCount_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount()
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount()
);
res.Messages.AssertEqual(
OnNext(250, 1L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount()
);
res.Messages.AssertEqual(
OnNext(250, 3L),
OnCompleted<long>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LongCount()
);
res.Messages.AssertEqual(
OnError<long>(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<int>(xs, long.MaxValue).LongCount();
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
#endif
[TestMethod]
public void LongCount_Predicate_Empty_True()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => true)
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => false)
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => true)
);
res.Messages.AssertEqual(
OnNext(250, 1L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => false)
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(x => x < 10)
);
res.Messages.AssertEqual(
OnNext(250, 3L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(x => x > 10)
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.LongCount(x => x % 2 == 0)
);
res.Messages.AssertEqual(
OnNext(250, 2L),
OnCompleted<long>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => true)
);
res.Messages.AssertEqual(
OnError<long>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.LongCount(_ => false)
);
res.Messages.AssertEqual(
OnError<long>(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<int>(240)
);
var ex = new Exception();
var res = scheduler.Start(() =>
xs.LongCount(x =>
{
if (x == 3)
throw ex;
return true;
})
);
res.Messages.AssertEqual(
OnError<long>(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<int>(xs, long.MaxValue).LongCount(_ => true);
ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
}
#endif
#endregion
#region + Max +
[TestMethod]
public void Max_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(int)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(double)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(float)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(decimal)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(long)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(int?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(double?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(float?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(decimal?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(long?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), Comparer<DateTime>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(IComparer<DateTime>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => ""));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, string>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => "", Comparer<string>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, string>), Comparer<string>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), _ => "", default(IComparer<string>)));
}
[TestMethod]
public void Max_Int32_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 4),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<int>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 2L),
OnCompleted<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 4L),
OnCompleted<long>(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<long>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<long>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 2f),
OnCompleted<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 4f),
OnCompleted<float>(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<float>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<float>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 4.0),
OnCompleted<double>(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<double>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<double>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 2m),
OnCompleted<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, 4m),
OnCompleted<decimal>(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<decimal>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<decimal>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, default(int?)),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)4),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)4),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)3),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (int?)3),
OnCompleted<int?>(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<int?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<int?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, default(long?)),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (long?)2L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (long?)4L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (long?)4L),
OnCompleted<long?>(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<long?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<long?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, default(float?)),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (float?)4f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (float?)4f),
OnCompleted<float?>(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<float?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<float?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, default(double?)),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (double?)4.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (double?)4.0),
OnCompleted<double?>(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<double?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<double?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, default(decimal?)),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)4m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)4m),
OnCompleted<decimal?>(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<decimal?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<decimal?>(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<string>(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<string>(250)
);
#else
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, "c"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(2003, 2, 11)),
OnCompleted<DateTime>(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<string>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max()
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
);
#if !NO_PERF
// BREAKING CHANGE v2 > v1.x - Behavior for reference types
res.Messages.AssertEqual(
OnNext(250, default(string)),
OnCompleted<string>(250)
);
#else
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(210, ex)
);
var res = scheduler.Start(() =>
xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(Comparer<string>.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<DateTime>(Comparer<DateTime>.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<string>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ThrowingComparer<string>(ex))
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Max(new ThrowingComparer<DateTime>(ex))
);
res.Messages.AssertEqual(
OnError<DateTime>(220, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 220)
);
}
[TestMethod]
public void Max_Selector_Regular_Int32()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => (int)x.Length));
res.Messages.AssertEqual(
OnNext(240, 3),
OnCompleted<int>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Int64()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => (long)x.Length));
res.Messages.AssertEqual(
OnNext(240, 3L),
OnCompleted<long>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Single()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => (float)x.Length));
res.Messages.AssertEqual(
OnNext(240, 3.0f),
OnCompleted<float>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Double()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => (double)x.Length));
res.Messages.AssertEqual(
OnNext(240, 3.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Decimal()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => (decimal)x.Length));
res.Messages.AssertEqual(
OnNext(240, 3.0m),
OnCompleted<decimal>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Int32_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(int?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (int?)3),
OnCompleted<int?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Int64_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(long?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (long?)3.0),
OnCompleted<long?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Single_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(float?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (float?)3.0),
OnCompleted<float?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Double_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(double?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)3.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Max_Selector_Regular_Decimal_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(decimal?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (decimal?)3.0),
OnCompleted<decimal?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void MaxOfT_Selector_Regular()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "bar"),
OnNext(220, "qux"),
OnNext(230, "foo"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => new string(x.Reverse().ToArray())));
res.Messages.AssertEqual(
OnNext(240, "xuq"),
OnCompleted<string>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void MaxOfT_Selector_Regular_Comparer()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "bar"),
OnNext(220, "qux"),
OnNext(230, "foo"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Max(x => new string(x.Reverse().ToArray()), new ReverseComparer<string>(Comparer<string>.Default)));
res.Messages.AssertEqual(
OnNext(240, "oof"),
OnCompleted<string>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
#endregion
#region + MaxBy +
[TestMethod]
public void MaxBy_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(default(IObservable<int>), x => x));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, default(Func<int, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(default(IObservable<int>), x => x, Comparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, default(Func<int, int>), Comparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, x => x, null));
}
[TestMethod]
public void MaxBy_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MaxBy_Return()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "a"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MaxBy_Some()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(4, "c")),
OnNext(230, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(4, "c"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MaxBy_Multiple()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(215, new KeyValuePair<int, string>(2, "d")),
OnNext(220, new KeyValuePair<int, string>(3, "c")),
OnNext(225, new KeyValuePair<int, string>(2, "y")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnNext(235, new KeyValuePair<int, string>(4, "r")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(4, "a"),
new KeyValuePair<int, string>(4, "r"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnError<KeyValuePair<int, string>>(210, ex)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key)
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(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<int, string>(1, "z")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "a"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(4, "c")),
OnNext(230, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "a"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnError<KeyValuePair<int, string>>(210, ex)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z"))
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(2, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy<KeyValuePair<int, string>, int>(x => { throw ex; })
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(2, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MaxBy(x => x.Key, new ThrowingComparer<int>(ex))
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(220, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 220)
);
}
#endregion
#region + Min +
[TestMethod]
public void Min_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(int)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(double)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(float)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(decimal)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(long)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(int?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(double?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(float?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(decimal?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(long?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), Comparer<DateTime>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(IComparer<DateTime>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => ""));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, string>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => "", Comparer<string>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, string>), Comparer<string>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), _ => "", default(IComparer<string>)));
}
[TestMethod]
public void Min_Int32_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<int>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2L),
OnCompleted<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2L),
OnCompleted<long>(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<long>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<long>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2f),
OnCompleted<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2f),
OnCompleted<float>(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<float>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<float>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<double>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<double>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2m),
OnCompleted<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, 2m),
OnCompleted<decimal>(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<decimal>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<decimal>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, default(int?)),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<int?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, default(long?)),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (long?)2L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (long?)2L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (long?)2L),
OnCompleted<long?>(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<long?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<long?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, default(float?)),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<float?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, default(double?)),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<double?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, default(decimal?)),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<decimal?>(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<string>(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<string>(250)
);
#else
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min()
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
);
#if !NO_PERF
// BREAKING CHANGE v2 > v1.x - Behavior for reference types
res.Messages.AssertEqual(
OnNext(250, default(string)),
OnCompleted<string>(250)
);
#else
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnNext(250, "a"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(1983, 2, 11)),
OnCompleted<DateTime>(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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnNext(250, "c"),
OnCompleted<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnNext(250, new DateTime(2003, 2, 11)),
OnCompleted<DateTime>(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<string>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(210, ex)
);
var res = scheduler.Start(() =>
xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
);
res.Messages.AssertEqual(
OnError<DateTime>(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<string>(Comparer<string>.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<DateTime>(Comparer<DateTime>.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<string>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ThrowingComparer<string>(ex))
);
res.Messages.AssertEqual(
OnError<string>(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<DateTime>(250)
);
var res = scheduler.Start(() =>
xs.Min(new ThrowingComparer<DateTime>(ex))
);
res.Messages.AssertEqual(
OnError<DateTime>(220, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 220)
);
}
[TestMethod]
public void Min_Selector_Regular_Int32()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => (int)x.Length));
res.Messages.AssertEqual(
OnNext(240, 1),
OnCompleted<int>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Int64()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => (long)x.Length));
res.Messages.AssertEqual(
OnNext(240, 1L),
OnCompleted<long>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Single()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => (float)x.Length));
res.Messages.AssertEqual(
OnNext(240, 1.0f),
OnCompleted<float>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Double()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => (double)x.Length));
res.Messages.AssertEqual(
OnNext(240, 1.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Decimal()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => (decimal)x.Length));
res.Messages.AssertEqual(
OnNext(240, 1.0m),
OnCompleted<decimal>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Int32_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(int?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (int?)1),
OnCompleted<int?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Int64_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(long?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (long?)1.0),
OnCompleted<long?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Single_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(float?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (float?)1.0),
OnCompleted<float?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Double_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(double?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)1.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Min_Selector_Regular_Decimal_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(decimal?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (decimal?)1.0),
OnCompleted<decimal?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void MinOfT_Selector_Regular()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "qux"),
OnNext(220, "foo"),
OnNext(230, "bar"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => new string(x.Reverse().ToArray())));
res.Messages.AssertEqual(
OnNext(240, "oof"),
OnCompleted<string>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void MinOfT_Selector_Regular_Comparer()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "qux"),
OnNext(220, "foo"),
OnNext(230, "bar"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Min(x => new string(x.Reverse().ToArray()), new ReverseComparer<string>(Comparer<string>.Default)));
res.Messages.AssertEqual(
OnNext(240, "xuq"),
OnCompleted<string>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
#endregion
#region + MinBy +
[TestMethod]
public void MinBy_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(default(IObservable<int>), x => x));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, default(Func<int, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(default(IObservable<int>), x => x, Comparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, default(Func<int, int>), Comparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, x => x, null));
}
[TestMethod]
public void MinBy_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MinBy_Return()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "a"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MinBy_Some()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(2, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "c"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(250)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 250)
);
}
[TestMethod]
public void MinBy_Multiple()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, new KeyValuePair<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(215, new KeyValuePair<int, string>(2, "d")),
OnNext(220, new KeyValuePair<int, string>(3, "c")),
OnNext(225, new KeyValuePair<int, string>(2, "y")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnNext(235, new KeyValuePair<int, string>(4, "r")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key)
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "d"),
new KeyValuePair<int, string>(2, "y"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnError<KeyValuePair<int, string>>(210, ex)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key)
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(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<int, string>(1, "z")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(2, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(2, "a"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(20, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
new KeyValuePair<int, string>(20, "c"),
})),
OnCompleted<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnError<KeyValuePair<int, string>>(210, ex)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z"))
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(2, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy<KeyValuePair<int, string>, int>(x => { throw ex; })
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(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<int, string>(1, "z")),
OnNext(210, new KeyValuePair<int, string>(3, "b")),
OnNext(220, new KeyValuePair<int, string>(2, "c")),
OnNext(230, new KeyValuePair<int, string>(4, "a")),
OnCompleted<KeyValuePair<int, string>>(250)
);
var res = scheduler.Start(() =>
xs.MinBy(x => x.Key, new ThrowingComparer<int>(ex))
);
res.Messages.AssertEqual(
OnError<IList<KeyValuePair<int, string>>>(220, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 220)
);
}
class ReverseComparer<T> : IComparer<T>
{
private IComparer<T> _comparer;
public ReverseComparer(IComparer<T> comparer)
{
_comparer = comparer;
}
public int Compare(T x, T y)
{
return -_comparer.Compare(x, y);
}
}
class ThrowingComparer<T> : IComparer<T>
{
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<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), DummyObservable<int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), DummyObservable<int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IObservable<int>), EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(IEqualityComparer<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), new[] { 42 }));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IEnumerable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), new[] { 42 }, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IEnumerable<int>), EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, new[] { 42 }, default(IEqualityComparer<int>)));
}
[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<int>(510)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(280, 4),
OnNext(300, 5),
OnNext(330, 6),
OnNext(340, 7),
OnCompleted<int>(720)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(ys)
);
res.Messages.AssertEqual(
OnNext(720, true),
OnCompleted<bool>(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<int>(510)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(280, 4),
OnNext(300, 5),
OnNext(330, 6),
OnNext(340, 7),
OnCompleted<int>(720)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnNext(720, true),
OnCompleted<bool>(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<int>(510)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(280, 4),
OnNext(300, 5),
OnNext(330, 6),
OnNext(340, 7),
OnCompleted<int>(720)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(ys)
);
res.Messages.AssertEqual(
OnNext(310, false),
OnCompleted<bool>(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<int>(510)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(280, 4),
OnNext(300, 5),
OnNext(330, 6),
OnNext(340, 7),
OnCompleted<int>(720)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnNext(310, false),
OnCompleted<bool>(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<int>(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<bool>(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<int>(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<bool>(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<bool>(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<bool>(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<int>(330)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(400, 4),
OnCompleted<int>(420)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(ys)
);
res.Messages.AssertEqual(
OnNext(420, false),
OnCompleted<bool>(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<int>(330)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(400, 4),
OnCompleted<int>(420)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnNext(420, false),
OnCompleted<bool>(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<int>(330)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(400, 4),
OnCompleted<int>(420)
);
var ex = new Exception();
var res = scheduler.Start(() =>
xs.SequenceEqual(ys, new ThrowComparer(ex))
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(330)
);
var ys = scheduler.CreateHotObservable(
OnNext(90, 1),
OnNext(270, 3),
OnNext(400, 4),
OnCompleted<int>(420)
);
var ex = new Exception();
var res = scheduler.Start(() =>
ys.SequenceEqual(xs, new ThrowComparer(ex))
);
res.Messages.AssertEqual(
OnError<bool>(270, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 270)
);
ys.Subscriptions.AssertEqual(
Subscribe(200, 270)
);
}
class ThrowComparer : IEqualityComparer<int>
{
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<int>(300)
);
var ys = scheduler.CreateHotObservable(
OnNext(290, 1),
OnNext(310, 2),
OnCompleted<int>(350)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(ys)
);
res.Messages.AssertEqual(
OnNext(310, false),
OnCompleted<bool>(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<int>(300)
);
var ys = scheduler.CreateHotObservable(
OnNext(290, 1),
OnNext(310, 2),
OnCompleted<int>(350)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnNext(310, false),
OnCompleted<bool>(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<int>(300, ex)
);
var ys = scheduler.CreateHotObservable(
OnNext(290, 1),
OnNext(310, 2),
OnCompleted<int>(350)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(350)
);
var ys = scheduler.CreateHotObservable(
OnNext(250, 1),
OnError<int>(300, ex)
);
var res = scheduler.Start(() =>
ys.SequenceEqual(xs)
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(510)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new[] { 3, 4, 5, 6, 7 })
);
res.Messages.AssertEqual(
OnNext(510, true),
OnCompleted<bool>(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<int>(510)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new[] { 3, 4, 9, 6, 7 })
);
res.Messages.AssertEqual(
OnNext(310, false),
OnCompleted<bool>(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<int>(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<bool>(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<int>(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<bool>(310)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 310)
);
}
class OddEvenComparer : IEqualityComparer<int>
{
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<int>(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<bool>(310, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 310)
);
}
class ThrowingComparer : IEqualityComparer<int>
{
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<int>(510)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new[] { 3, 4, 5, 6, 7, 8 })
);
res.Messages.AssertEqual(
OnNext(510, false),
OnCompleted<bool>(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<int>(510)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new[] { 3, 4, 5, 6 })
);
res.Messages.AssertEqual(
OnNext(450, false),
OnCompleted<bool>(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<int>(310, ex)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new[] { 3, 4 })
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(310)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(Throw(ex))
);
res.Messages.AssertEqual(
OnError<bool>(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<int>(310)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(Throw(ex))
);
res.Messages.AssertEqual(
OnError<bool>(310, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 310)
);
}
private IEnumerable<int> 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<int>(310)
);
var res = scheduler.Start(() =>
xs.SequenceEqual(new RogueEnumerable<int>(ex))
);
res.Messages.AssertEqual(
OnError<bool>(200, ex)
);
xs.Subscriptions.AssertEqual(
);
}
#endregion
#region + SingleAsync +
[TestMethod]
public void SingleAsync_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void SingleAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.SingleAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync(x => x == 4)
);
res.Messages.AssertEqual(
OnNext(250, 4),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.SingleAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleAsync(x => { if (x < 4) return false; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + SingleOrDefaultAsync +
[TestMethod]
public void SingleOrDefaultAsync_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(default(IObservable<int>), _ => true));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
}
[TestMethod]
public void SingleOrDefaultAsync_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => x % 2 == 1)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => x == 4)
);
res.Messages.AssertEqual(
OnNext(250, 4),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => x > 10)
);
res.Messages.AssertEqual(
OnError<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.SingleOrDefaultAsync(x => { if (x < 4) return false; throw ex; })
);
res.Messages.AssertEqual(
OnError<int>(230, ex)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 230)
);
}
#endregion
#region + Sum +
[TestMethod]
public void Sum_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<long?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(int)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(double)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(float)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(decimal)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(long)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(int?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(double?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(float?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(decimal?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(long?)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
}
[TestMethod]
public void Sum_Int32_Empty()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable(
OnNext(150, 1),
OnCompleted<int>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 0),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2 + 3 + 4),
OnCompleted<int>(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<int>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<int>(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<int>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<int>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 0L),
OnCompleted<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2L),
OnCompleted<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2L + 3L + 4L),
OnCompleted<long>(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<long>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<long>(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<long>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<long>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 0f),
OnCompleted<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2f),
OnCompleted<float>(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<float>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2f + 3f + 4f),
OnCompleted<float>(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<float>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<float>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 0.0),
OnCompleted<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2.0),
OnCompleted<double>(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<double>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2.0 + 3.0 + 4.0),
OnCompleted<double>(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<double>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<double>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 0m),
OnCompleted<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2m),
OnCompleted<decimal>(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<decimal>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, 2m + 3m + 4m),
OnCompleted<decimal>(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<decimal>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<decimal>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (int?)0),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (int?)2),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (int?)(2 + 4)),
OnCompleted<int?>(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<int?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<int?>(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<int?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<int?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (long?)0L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (long?)2L),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (long?)(2L + 4L)),
OnCompleted<long?>(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<long?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<long?>(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<long?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<long?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (float?)0f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (float?)2f),
OnCompleted<float?>(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<float?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (float?)(2f + 4f)),
OnCompleted<float?>(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<float?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<float?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (double?)0.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (double?)2.0),
OnCompleted<double?>(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<double?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (double?)(2.0 + 4.0)),
OnCompleted<double?>(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<double?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<double?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)0m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)2m),
OnCompleted<decimal?>(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<decimal?>(250)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnNext(250, (decimal?)(2m + 4m)),
OnCompleted<decimal?>(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<decimal?>(210, ex)
);
var res = scheduler.Start(() =>
xs.Sum()
);
res.Messages.AssertEqual(
OnError<decimal?>(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<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => (int)x.Length));
res.Messages.AssertEqual(
OnNext(240, 6),
OnCompleted<int>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Int64()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => (long)x.Length));
res.Messages.AssertEqual(
OnNext(240, 6L),
OnCompleted<long>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Single()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => (float)x.Length));
res.Messages.AssertEqual(
OnNext(240, 6.0f),
OnCompleted<float>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Double()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => (double)x.Length));
res.Messages.AssertEqual(
OnNext(240, 6.0),
OnCompleted<double>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Decimal()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => (decimal)x.Length));
res.Messages.AssertEqual(
OnNext(240, 6.0m),
OnCompleted<decimal>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Int32_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(int?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (int?)4),
OnCompleted<int?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Int64_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(long?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (long?)4.0),
OnCompleted<long?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Single_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(float?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (float?)4.0),
OnCompleted<float?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Double_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(double?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (double?)4.0),
OnCompleted<double?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
[TestMethod]
public void Sum_Selector_Regular_Decimal_Nullable()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateHotObservable<string>(
OnNext(210, "fo"),
OnNext(220, "b"),
OnNext(230, "qux"),
OnCompleted<string>(240)
);
var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(decimal?) : x.Length));
res.Messages.AssertEqual(
OnNext(240, (decimal?)4.0),
OnCompleted<decimal?>(240)
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 240)
);
}
#endregion
#region + ToArray +
[TestMethod]
public void ToArray_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToArray<int>(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<int>(660)
);
var res = scheduler.Start(() =>
xs.ToArray()
);
res.Messages.AssertEqual(
OnNext<int[]>(660, a => a.SequenceEqual(new[] { 2, 3, 4, 5 })),
OnCompleted<int[]>(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<int>(660, ex)
);
var res = scheduler.Start(() =>
xs.ToArray()
);
res.Messages.AssertEqual(
OnError<int[]>(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<ArgumentNullException>(() => Observable.ToDictionary<int, int>(null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, null, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(null, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.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<int>(660)
);
var res = scheduler.Start(() =>
xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnNext<IDictionary<int, int>>(660, d =>
{
return d.Count == 4
&& d[4] == 8
&& d[6] == 12
&& d[8] == 16
&& d[10] == 20;
}),
OnCompleted<IDictionary<int, int>>(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<int>(660, ex)
);
var res = scheduler.Start(() =>
xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<IDictionary<int, int>>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ToDictionary(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<IDictionary<int, int>>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ToDictionary(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<IDictionary<int, int>>(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<int>.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<int>(660)
);
var res = scheduler.Start(() =>
xs.ToDictionary(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<IDictionary<int, int>>(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<string>.Default).First();
Assert.AreEqual(7, d3["7"]);
}
#endregion
#region + ToList +
[TestMethod]
public void ToList_ArgumentChecking()
{
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToList<int>(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<int>(660)
);
var res = scheduler.Start(() =>
xs.ToList()
);
res.Messages.AssertEqual(
OnNext<IList<int>>(660, l => l.SequenceEqual(new[] { 2, 3, 4, 5 })),
OnCompleted<IList<int>>(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<int>(660, ex)
);
var res = scheduler.Start(() =>
xs.ToList()
);
res.Messages.AssertEqual(
OnError<IList<int>>(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<ArgumentNullException>(() => Observable.ToLookup<int, int>(null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, null, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(null, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null, EqualityComparer<int>.Default));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, null));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance));
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.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<int>(660)
);
var res = scheduler.Start(() =>
xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnNext<ILookup<int, int>>(660, d =>
{
return d.Count == 2
&& d[0].SequenceEqual(new[] { 4, 8 })
&& d[1].SequenceEqual(new[] { 6, 10 });
}),
OnCompleted<ILookup<int, int>>(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<int>(660, ex)
);
var res = scheduler.Start(() =>
xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<ILookup<int, int>>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ToLookup(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<ILookup<int, int>>(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<int>(600)
);
var res = scheduler.Start(() =>
xs.ToLookup(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer<int>.Default)
);
res.Messages.AssertEqual(
OnError<ILookup<int, int>>(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<int>.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<string>.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<string, int> g in ((System.Collections.IEnumerable)d1))
{
if (g.Key == "0")
{
var l = new List<int>();
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<int>();
foreach (int v in ((System.Collections.IEnumerable)g)) l.Add(v);
l.AssertEqual(1, 3, 5, 7, 9);
}
else
Assert.Fail("Unknown group.");
}
}
#endregion
}
}