// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. #if !NO_REFLECTION_EMIT #if !SILVERLIGHTM7 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reactive; using System.Reactive.Concurrency; using System.Reactive.Joins; using System.Reactive.Linq; using System.Reactive.Subjects; using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; #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 Microsoft.Reactive.Testing; namespace ReactiveTests.Tests { [TestClass] public class QbservableTest { private IQbservable _qbNull = null; private IQbservable _qbMy = new MyQbservable(); private IQbservableProvider _qbp = new MyQbservableProvider(); [TestMethod] public void LocalQueryMethodImplementationTypeAttribute() { var t = typeof(string); var attr = new LocalQueryMethodImplementationTypeAttribute(t); Assert.AreSame(t, attr.TargetType); } [TestMethod] public void Aggregate_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Aggregate(_qbNull, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Aggregate(_qbMy, null)); ReactiveAssert.Throws(() => Qbservable.Aggregate(_qbNull, 1, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Aggregate(_qbMy, 1, null)); } [TestMethod] public void Aggregate() { _qbMy.Aggregate((a, b) => a + b); _qbMy.Aggregate("", (a, b) => a + b); } [TestMethod] public void All_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.All(_qbNull, a => true)); ReactiveAssert.Throws(() => Qbservable.All(_qbMy, null)); } [TestMethod] public void All() { _qbMy.All(a => true); } [TestMethod] public void Amb_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Amb(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Amb(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Amb(default(IQbservableProvider), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Amb(_qbp, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.Amb(default(IQbservableProvider), new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.Amb(_qbp, default(IQueryable>))); } [TestMethod] public void Amb() { _qbMy.Amb(_qbMy); _qbp.Amb(_qbMy, _qbMy); _qbp.Amb(new MyQueryable>()); } [TestMethod] public void And_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.And(_qbNull, _qbMy)); ReactiveAssert.Throws(() => _qbMy.And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbNull)); #if !NO_LARGEARITY ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbNull)); #endif } [TestMethod] public void And() { _qbMy.And(_qbMy); } [TestMethod] public void Any_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Any(_qbNull)); ReactiveAssert.Throws(() => Qbservable.Any(_qbNull, a => true)); ReactiveAssert.Throws(() => Qbservable.Any(_qbMy, null)); } [TestMethod] public void Any() { _qbMy.Any(); _qbMy.Any(a => true); } [TestMethod] public void Average_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Average(default(IQbservable))); } [TestMethod] public void Average() { new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); new MyQbservable().Average(); } [TestMethod] public void BufferWithCount_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Window(_qbNull, 1)); ReactiveAssert.Throws(() => Qbservable.Window(_qbNull, 1, 1)); } [TestMethod] public void BufferWithCount() { _qbMy.Window(1); _qbMy.Window(1, 1); } [TestMethod] public void BufferWithTime_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Buffer(_qbNull, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Buffer(_qbNull, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Buffer(_qbMy, TimeSpan.Zero, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Buffer(_qbNull, TimeSpan.Zero, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Buffer(_qbNull, TimeSpan.Zero, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Buffer(_qbMy, TimeSpan.Zero, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void BufferWithTime() { _qbMy.Buffer(TimeSpan.Zero); _qbMy.Buffer(TimeSpan.Zero, Scheduler.Immediate); _qbMy.Buffer(TimeSpan.Zero, TimeSpan.Zero); _qbMy.Buffer(TimeSpan.Zero, TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void Case_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Case(null, () => 1, new Dictionary>())); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, default(Expression>), new Dictionary>())); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, () => 1, default(Dictionary>))); ReactiveAssert.Throws(() => Qbservable.Case(null, () => 1, new Dictionary>(), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, default(Expression>), new Dictionary>(), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, () => 1, default(Dictionary>), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, () => 1, new Dictionary>(), default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Case(null, () => 1, new Dictionary>(), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, default(Expression>), new Dictionary>(), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, () => 1, default(Dictionary>), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Case(_qbp, () => 1, new Dictionary>(), default(IQbservable))); } [TestMethod] public void Case() { _qbp.Case(() => 1, new Dictionary>()); _qbp.Case(() => 1, new Dictionary>(), Scheduler.Immediate); _qbp.Case(() => 1, new Dictionary>(), _qbMy); } [TestMethod] public void Cast_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Cast(default(MyQbservable))); } [TestMethod] public void Cast() { Qbservable.Cast(new MyQbservable()); } [TestMethod] public void Catch_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Catch(_qbMy, null)); ReactiveAssert.Throws(() => Qbservable.Catch(_qbNull, (Exception ex) => null)); ReactiveAssert.Throws(() => Qbservable.Catch(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Catch(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Catch(default(IQbservableProvider), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Catch(_qbp, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.Catch(default(IQbservableProvider), new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.Catch(_qbp, default(IQueryable>))); } [TestMethod] public void Catch() { _qbMy.Catch((Exception ex) => _qbMy); _qbMy.Catch(_qbMy); _qbp.Catch(_qbMy, _qbMy); _qbp.Catch(new MyQueryable>()); } [TestMethod] public void CombineLatest_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.CombineLatest(_qbNull, _qbMy, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.CombineLatest(_qbMy, _qbNull, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.CombineLatest(_qbMy, _qbMy, default(Expression>))); } [TestMethod] public void CombineLatest() { _qbMy.CombineLatest(_qbMy, (a, b) => a + b); } [TestMethod] public void Contains_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Contains(_qbNull, 1)); ReactiveAssert.Throws(() => Qbservable.Contains(_qbNull, 1, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.Contains(_qbMy, 1, null)); } [TestMethod] public void Contains() { _qbMy.Contains(1); _qbMy.Contains(1, EqualityComparer.Default); } [TestMethod] public void Count_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Count(_qbNull)); } [TestMethod] public void Count() { _qbMy.Count(); } [TestMethod] public void Concat_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Concat(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Concat(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Concat(default(IQbservableProvider), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Concat(_qbp, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.Concat(default(IQbservableProvider), new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.Concat(_qbp, default(IQueryable>))); } [TestMethod] public void Concat() { _qbMy.Concat(_qbMy); _qbp.Concat(_qbMy, _qbMy); _qbp.Concat(new MyQueryable>()); } [TestMethod] public void Create_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Create(null, o => default(Action))); ReactiveAssert.Throws(() => Qbservable.Create(_qbp, default(Expression, Action>>))); } [TestMethod] public void Create() { _qbp.Create(o => default(Action)); } [TestMethod] public void CreateWithDisposable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Create(null, o => default(IDisposable))); ReactiveAssert.Throws(() => Qbservable.Create(_qbp, default(Expression, IDisposable>>))); } [TestMethod] public void CreateWithDisposable() { _qbp.Create(o => default(IDisposable)); } [TestMethod] public void Defer_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Defer(null, () => _qbMy)); ReactiveAssert.Throws(() => Qbservable.Defer(_qbp, default(Expression>>))); } [TestMethod] public void Defer() { _qbp.Defer(() => _qbMy); } [TestMethod] public void Delay_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Delay(_qbNull, DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Delay(_qbNull, DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Delay(_qbMy, DateTimeOffset.Now, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Delay(_qbNull, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Delay(_qbNull, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Delay(_qbMy, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void Delay() { _qbMy.Delay(DateTimeOffset.Now); _qbMy.Delay(TimeSpan.Zero); _qbMy.Delay(DateTimeOffset.Now, Scheduler.Immediate); _qbMy.Delay(TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void Dematerialize_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Dematerialize(default(IQbservable>))); } [TestMethod] public void Dematerialize() { new MyQbservable>().Dematerialize(); } [TestMethod] public void DistinctUntilChanged_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbNull)); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbNull, a => a)); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbNull, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbMy, default(IEqualityComparer))); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbNull, a => a, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbMy, default(Expression>), EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.DistinctUntilChanged(_qbMy, a => a, default(IEqualityComparer))); } [TestMethod] public void DistinctUntilChanged() { _qbMy.DistinctUntilChanged(); _qbMy.DistinctUntilChanged(a => a); _qbMy.DistinctUntilChanged(EqualityComparer.Default); _qbMy.DistinctUntilChanged(a => a, EqualityComparer.Default); } [TestMethod] public void Do_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Do(_qbNull, i => Console.WriteLine(i))); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Do(_qbNull, i => Console.WriteLine(i), ex => Console.WriteLine(ex.Message))); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, default(Expression>), ex => Console.WriteLine(ex.Message))); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, i => Console.WriteLine(i), default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Do(_qbNull, i => Console.WriteLine(i), () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, default(Expression>), () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, i => Console.WriteLine(i), default(Expression))); ReactiveAssert.Throws(() => Qbservable.Do(_qbNull, i => Console.WriteLine(i), ex => Console.WriteLine(ex.Message), () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, default(Expression>), ex => Console.WriteLine(ex.Message), () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, i => Console.WriteLine(i), default(Expression>), () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, i => Console.WriteLine(i), ex => Console.WriteLine(ex.Message), default(Expression))); ReactiveAssert.Throws(() => Qbservable.Do(_qbNull, Observer.Create(i => Console.WriteLine(i)))); ReactiveAssert.Throws(() => Qbservable.Do(_qbMy, default(IObserver))); } [TestMethod] public void Do() { _qbMy.Do(i => Console.WriteLine(i)); _qbMy.Do(i => Console.WriteLine(i), ex => Console.WriteLine(ex.Message)); _qbMy.Do(i => Console.WriteLine(i), () => Console.WriteLine()); _qbMy.Do(i => Console.WriteLine(i), ex => Console.WriteLine(ex.Message), () => Console.WriteLine()); _qbMy.Do(Observer.Create(i => Console.WriteLine(i))); } [TestMethod] public void DoWhile_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.DoWhile(_qbNull, () => true)); ReactiveAssert.Throws(() => Qbservable.DoWhile(_qbMy, null)); } [TestMethod] public void DoWhile() { _qbMy.DoWhile(() => true); } [TestMethod] public void Empty_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Empty(null)); ReactiveAssert.Throws(() => Qbservable.Empty(_qbp, null)); ReactiveAssert.Throws(() => Qbservable.Empty(null, Scheduler.Immediate)); } [TestMethod] public void Empty() { _qbp.Empty(); _qbp.Empty(Scheduler.Immediate); } [TestMethod] public void Finally_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Finally(_qbNull, () => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.Finally(_qbMy, null)); } [TestMethod] public void Finally() { _qbMy.Finally(() => Console.WriteLine()); } [TestMethod] public void For_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.For(null, new[] { 1 }, i => _qbMy)); ReactiveAssert.Throws(() => Qbservable.For(_qbp, default(IEnumerable), i => _qbMy)); ReactiveAssert.Throws(() => Qbservable.For(_qbp, new[] { 1 }, default(Expression>>))); } [TestMethod] public void For() { _qbp.For(new[] { 1 }, i => _qbMy); } [TestMethod] public void FromEvent_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.FromEventPattern(null, "", "Event")); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, null, "Event")); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, "", null)); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(null, e => Console.WriteLine(), e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, null, e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, e => Console.WriteLine(), null)); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(null, e => () => Console.WriteLine(), e => Console.WriteLine(), e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, null, e => Console.WriteLine(), e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, e => () => Console.WriteLine(), null, e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, e => () => Console.WriteLine(), e => Console.WriteLine(), null)); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, default(Expression>), e => Console.WriteLine())); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(_qbp, e => Console.WriteLine(), default(Expression>))); ReactiveAssert.Throws(() => Qbservable.FromEventPattern(null, e => Console.WriteLine(), e => Console.WriteLine())); } [TestMethod] public void FromEvent() { _qbp.FromEventPattern("", "Event"); _qbp.FromEventPattern(e => Console.WriteLine(), e => Console.WriteLine()); _qbp.FromEventPattern(e => () => Console.WriteLine(), a => Console.WriteLine(), a => Console.WriteLine()); _qbp.FromEventPattern(e => Console.WriteLine(), e => Console.WriteLine()); } [TestMethod] public void Generate_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i)); ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, default(IScheduler))); } [TestMethod] public void Generate() { _qbp.Generate(1, i => true, i => i + 1, i => i); _qbp.Generate(1, i => true, i => i + 1, i => i, Scheduler.Immediate); } [TestMethod] public void GenerateWithTime_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i, i => DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i, i => DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>), i => DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i, i => DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i, i => DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i, i => DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>), i => DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, default(Expression>), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i, i => DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, i => DateTimeOffset.Now, null)); ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i, i => TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i, i => TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>), i => TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i, i => TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Generate(null, 1, i => true, i => i + 1, i => i, i => TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, null, i => i + 1, i => i, i => TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, default(Expression>), i => TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, default(Expression>), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, null, i => i, i => TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Generate(_qbp, 1, i => true, i => i + 1, i => i, i => TimeSpan.Zero, null)); } [TestMethod] public void GenerateWithTime() { _qbp.Generate(1, i => true, i => i + 1, i => i, i => DateTimeOffset.Now); _qbp.Generate(1, i => true, i => i + 1, i => i, i => DateTimeOffset.Now, Scheduler.Immediate); _qbp.Generate(1, i => true, i => i + 1, i => i, i => TimeSpan.Zero); _qbp.Generate(1, i => true, i => i + 1, i => i, i => TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void GroupBy_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbNull, x => x)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbNull, x => x, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, default(Expression>), EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, x => x, default(IEqualityComparer))); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbNull, x => x, x => x)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, default(Expression>), x => x)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, x => x, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbNull, x => x, x => x, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, default(Expression>), x => x, EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, x => x, default(Expression>), EqualityComparer.Default)); ReactiveAssert.Throws(() => Qbservable.GroupBy(_qbMy, x => x, x => x, default(IEqualityComparer))); } [TestMethod] public void GroupBy() { _qbMy.GroupBy(x => (double)x); _qbMy.GroupBy(x => (double)x, EqualityComparer.Default); _qbMy.GroupBy(x => (double)x, x => x.ToString()); _qbMy.GroupBy(x => (double)x, x => x.ToString(), EqualityComparer.Default); } [TestMethod] public void If_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.If(null, () => true, _qbMy, _qbMy)); ReactiveAssert.Throws(() => Qbservable.If(_qbp, null, _qbMy, _qbMy)); ReactiveAssert.Throws(() => Qbservable.If(_qbp, () => true, _qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.If(_qbp, () => true, _qbMy, _qbNull)); } [TestMethod] public void If() { _qbp.If(() => true, _qbMy, _qbMy); } [TestMethod] public void Interval_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Interval(null, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Interval(null, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Interval(_qbp, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void Interval() { _qbp.Interval(TimeSpan.Zero); _qbp.Interval(TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void IsEmpty_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.IsEmpty(_qbNull)); } [TestMethod] public void IsEmpty() { _qbMy.IsEmpty(); } [TestMethod] public void Latest_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Latest(_qbNull)); } [TestMethod] public void Latest() { ReactiveAssert.Throws(() => _qbMy.Latest()); new MyQbservableQueryable().Latest(); } [TestMethod] public void LongCount_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.LongCount(_qbNull)); } [TestMethod] public void LongCount() { _qbMy.LongCount(); } [TestMethod] public void Materialize_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Materialize(_qbNull)); } [TestMethod] public void Materialize() { _qbMy.Materialize(); } [TestMethod] public void Max_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Max(null)); ReactiveAssert.Throws(() => Qbservable.Max(null, Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.Max(new MyQbservable(), default(IComparer))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Max(default(IQbservable))); } [TestMethod] public void Max() { new MyQbservable().Max(); new MyQbservable().Max(Comparer.Default); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); new MyQbservable().Max(); } [TestMethod] public void MaxBy_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.MaxBy(default(IQbservable), s => s.Length)); ReactiveAssert.Throws(() => Qbservable.MaxBy(new MyQbservable(), default(Expression>))); ReactiveAssert.Throws(() => Qbservable.MaxBy(default(IQbservable), s => s.Length, Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.MaxBy(new MyQbservable(), default(Expression>), Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.MaxBy(new MyQbservable(), s => s.Length, default(IComparer))); } [TestMethod] public void MaxBy() { new MyQbservable().MaxBy(s => s.Length); new MyQbservable().MaxBy(s => s.Length, Comparer.Default); } [TestMethod] public void Merge_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Merge(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbNull, _qbMy, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbMy, _qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbMy, _qbMy, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Merge(default(IQbservable>))); ReactiveAssert.Throws(() => Qbservable.Merge(default(IQbservableProvider), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.Merge(default(IQbservableProvider), Scheduler.Immediate, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, default(IScheduler), _qbMy)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, Scheduler.Immediate, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.Merge(default(IQbservableProvider), new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, default(IQueryable>))); ReactiveAssert.Throws(() => Qbservable.Merge(default(IQbservableProvider), new MyQueryable>(), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, new MyQueryable>(), default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Merge(_qbp, default(IQueryable>), Scheduler.Immediate)); } [TestMethod] public void Merge() { _qbMy.Merge(_qbMy); _qbMy.Merge(_qbMy, Scheduler.Immediate); new MyQbservable>().Merge(); _qbp.Merge(_qbMy, _qbMy); _qbp.Merge(Scheduler.Immediate, _qbMy, _qbMy); _qbp.Merge(new MyQueryable>()); _qbp.Merge(new MyQueryable>(), Scheduler.Immediate); } [TestMethod] public void Min_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Min(null)); ReactiveAssert.Throws(() => Qbservable.Min(null, Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.Min(new MyQbservable(), default(IComparer))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Min(default(IQbservable))); } [TestMethod] public void Min() { new MyQbservable().Min(); new MyQbservable().Min(Comparer.Default); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); new MyQbservable().Min(); } [TestMethod] public void MinBy_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.MinBy(default(IQbservable), s => s.Length)); ReactiveAssert.Throws(() => Qbservable.MinBy(new MyQbservable(), default(Expression>))); ReactiveAssert.Throws(() => Qbservable.MinBy(default(IQbservable), s => s.Length, Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.MinBy(new MyQbservable(), default(Expression>), Comparer.Default)); ReactiveAssert.Throws(() => Qbservable.MinBy(new MyQbservable(), s => s.Length, default(IComparer))); } [TestMethod] public void MinBy() { new MyQbservable().MinBy(s => s.Length); new MyQbservable().MinBy(s => s.Length, Comparer.Default); } [TestMethod] public void MostRecent_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.MostRecent(_qbNull, 1)); } [TestMethod] public void MostRecent() { ReactiveAssert.Throws(() => _qbMy.MostRecent(1)); new MyQbservableQueryable().MostRecent(1); } [TestMethod] public void Never_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Never(null)); } [TestMethod] public void Never() { _qbp.Never(); } [TestMethod] public void Next_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Next(_qbNull)); } [TestMethod] public void Next() { ReactiveAssert.Throws(() => _qbMy.Next()); new MyQbservableQueryable().Next(); } [TestMethod] public void ObserveOn_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbMy, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbMy, default(SynchronizationContext))); #if !NO_WINDOWS_THREADING ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbMy, default(DispatcherScheduler))); #endif #if HAS_WINFORMS ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbMy, default(ControlScheduler))); ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbNull, new ControlScheduler(new System.Windows.Forms.Form()))); #endif ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbNull, new SynchronizationContext())); #if !NO_WINDOWS_THREADING ReactiveAssert.Throws(() => Qbservable.ObserveOn(_qbNull, DispatcherScheduler.Instance)); #endif } [TestMethod] public void ObserveOn() { _qbMy.ObserveOn(Scheduler.Immediate); _qbMy.ObserveOn(new SynchronizationContext()); #if !NO_WINDOWS_THREADING Qbservable.ObserveOn(_qbMy, DispatcherScheduler.Instance); #endif } [TestMethod] public void OfType_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.OfType(default(MyQbservable))); } [TestMethod] public void OfType() { Qbservable.OfType(new MyQbservable()); } [TestMethod] public void OnErrorResumeNext_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(default(IQbservableProvider), _qbMy)); ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(_qbp, default(IQbservable[]))); ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(default(IQbservableProvider), new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.OnErrorResumeNext(_qbp, default(IQueryable>))); } [TestMethod] public void OnErrorResumeNext() { _qbMy.OnErrorResumeNext(_qbMy); _qbp.OnErrorResumeNext(_qbMy, _qbMy); _qbp.OnErrorResumeNext(new MyQueryable>()); } [TestMethod] public void Range_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Range(null, 0, 10)); ReactiveAssert.Throws(() => Qbservable.Range(null, 0, 10, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Range(_qbp, 0, 10, default(IScheduler))); } [TestMethod] public void Range() { _qbp.Range(0, 10); _qbp.Range(0, 10, Scheduler.Immediate); } [TestMethod] public void RefCount_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.RefCount(null, Observable.Return(1).Multicast(new ReplaySubject()))); ReactiveAssert.Throws(() => Qbservable.RefCount(_qbp, default(IConnectableObservable))); } [TestMethod] public void RefCount() { _qbp.RefCount(Observable.Return(1).Multicast(new ReplaySubject())); } [TestMethod] public void Repeat_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Repeat(null, 0)); ReactiveAssert.Throws(() => Qbservable.Repeat(null, 0, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Repeat(_qbp, 0, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Repeat(null, 0, 10)); ReactiveAssert.Throws(() => Qbservable.Repeat(null, 0, 10, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Repeat(_qbp, 0, 10, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Repeat(_qbNull)); ReactiveAssert.Throws(() => Qbservable.Repeat(_qbNull, 1)); } [TestMethod] public void Repeat() { _qbMy.Repeat(); _qbMy.Repeat(1); _qbp.Repeat(42); _qbp.Repeat(42, 1); _qbp.Repeat(42, Scheduler.Immediate); _qbp.Repeat(42, 1, Scheduler.Immediate); } [TestMethod] public void Retry_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Retry(_qbNull)); ReactiveAssert.Throws(() => Qbservable.Retry(_qbNull, 1)); } [TestMethod] public void Retry() { _qbMy.Retry(); _qbMy.Retry(1); } [TestMethod] public void Return_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Return(null, 1)); ReactiveAssert.Throws(() => Qbservable.Return(null, 1, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Return(_qbp, 1, default(IScheduler))); } [TestMethod] public void Return() { _qbp.Return(1); _qbp.Return(1, Scheduler.Immediate); } [TestMethod] public void Sample_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Sample(_qbNull, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Sample(_qbNull, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Sample(_qbMy, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void Sample() { _qbMy.Sample(TimeSpan.Zero); _qbMy.Sample(TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void Scan_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Scan(_qbNull, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Scan(_qbMy, null)); ReactiveAssert.Throws(() => Qbservable.Scan(_qbNull, 1, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Scan(_qbMy, 1, null)); } [TestMethod] public void Scan() { _qbMy.Scan((a, b) => a + b); _qbMy.Scan("", (a, b) => a + b); } [TestMethod] public void Select_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Select(_qbNull, x => x)); ReactiveAssert.Throws(() => Qbservable.Select(_qbNull, (x, i) => x)); ReactiveAssert.Throws(() => Qbservable.Select(_qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Select(_qbMy, default(Expression>))); } [TestMethod] public void Select() { _qbMy.Select(x => x + 1); _qbMy.Select((x, i) => x + i); } [TestMethod] public void SelectMany_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbNull, x => new[] { "" })); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, default(Expression>>))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbNull, x => Observable.Return(""))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, default(Expression>>))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, _qbNull)); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbNull, x => Observable.Return(""), (x, s) => 0.0)); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, default(Expression>>), (x, s) => 0.0)); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, x => Observable.Return(""), default(Expression>))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbNull, x => Observable.Return(""), x => Observable.Return(""), () => Observable.Return(""))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, default(Expression>>), x => Observable.Return(""), () => Observable.Return(""))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, x => Observable.Return(""), default(Expression>>), () => Observable.Return(""))); ReactiveAssert.Throws(() => Qbservable.SelectMany(_qbMy, x => Observable.Return(""), x => Observable.Return(""), default(Expression>>))); } [TestMethod] public void SelectMany() { _qbMy.SelectMany(x => new[] { "" }); _qbMy.SelectMany(x => Observable.Return("")); _qbMy.SelectMany(_qbMy); _qbMy.SelectMany(x => Observable.Return(""), (x, s) => 0.0); _qbMy.SelectMany(x => Observable.Return(""), x => Observable.Return(""), () => Observable.Return("")); } [TestMethod] public void Skip_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Skip(_qbNull, 1)); } [TestMethod] public void Skip() { _qbMy.Skip(1); } [TestMethod] public void SkipLast_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.SkipLast(_qbNull, 1)); } [TestMethod] public void SkipLast() { _qbMy.SkipLast(1); } [TestMethod] public void SkipUntil_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.SkipUntil(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.SkipUntil(_qbMy, _qbNull)); } [TestMethod] public void SkipUntil() { _qbMy.SkipUntil(_qbMy); } [TestMethod] public void SkipWhile_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.SkipWhile(_qbNull, x => true)); ReactiveAssert.Throws(() => Qbservable.SkipWhile(_qbMy, default(Expression>))); } [TestMethod] public void SkipWhile() { _qbMy.SkipWhile(x => true); } [TestMethod] public void StartWith_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.StartWith(_qbNull, new[] { 1 })); ReactiveAssert.Throws(() => Qbservable.StartWith(_qbMy, default(int[]))); ReactiveAssert.Throws(() => Qbservable.StartWith(_qbNull, Scheduler.Immediate, new[] { 1 })); ReactiveAssert.Throws(() => Qbservable.StartWith(_qbMy, default(IScheduler), new[] { 1 })); ReactiveAssert.Throws(() => Qbservable.StartWith(_qbMy, Scheduler.Immediate, default(int[]))); } [TestMethod] public void StartWith() { Ignore(_qbMy.StartWith(1, 2, 3)); Ignore(_qbMy.StartWith(Scheduler.Immediate, 1, 2, 3)); } [TestMethod] public void SubscribeOn_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbMy, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbMy, default(SynchronizationContext))); #if !NO_WINDOWS_THREADING ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbMy, default(DispatcherScheduler))); #endif ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbNull, new SynchronizationContext())); #if !NO_WINDOWS_THREADING ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbNull, DispatcherScheduler.Instance)); #endif #if HAS_WINFORMS ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbMy, default(ControlScheduler))); ReactiveAssert.Throws(() => Qbservable.SubscribeOn(_qbNull, new ControlScheduler(new System.Windows.Forms.Form()))); #endif } [TestMethod] public void SubscribeOn() { _qbMy.SubscribeOn(Scheduler.Immediate); _qbMy.SubscribeOn(new SynchronizationContext()); #if !NO_WINDOWS_THREADING Qbservable.SubscribeOn(_qbMy, DispatcherScheduler.Instance); #endif #if HAS_WINFORMS _qbMy.SubscribeOn(new ControlScheduler(new System.Windows.Forms.Form())); #endif } [TestMethod] public void Sum_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); ReactiveAssert.Throws(() => Qbservable.Sum(default(IQbservable))); } [TestMethod] public void Sum() { new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); new MyQbservable().Sum(); } [TestMethod] public void Switch_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Switch(default(IQbservable>))); } [TestMethod] public void Switch() { new MyQbservable>().Switch(); } [TestMethod] public void Synchronize_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Synchronize(_qbNull)); ReactiveAssert.Throws(() => Qbservable.Synchronize(_qbNull, "")); ReactiveAssert.Throws(() => Qbservable.Synchronize(_qbMy, null)); } [TestMethod] public void Synchronize() { _qbMy.Synchronize(); _qbMy.Synchronize(""); } [TestMethod] public void Take_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Take(_qbNull, 1)); } [TestMethod] public void Take() { _qbMy.Take(1); } [TestMethod] public void TakeLast_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.TakeLast(_qbNull, 1)); } [TestMethod] public void TakeLast() { _qbMy.TakeLast(1); } [TestMethod] public void TakeUntil_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.TakeUntil(_qbNull, _qbMy)); ReactiveAssert.Throws(() => Qbservable.TakeUntil(_qbMy, _qbNull)); } [TestMethod] public void TakeUntil() { _qbMy.TakeUntil(_qbMy); } [TestMethod] public void TakeWhile_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.TakeWhile(_qbNull, x => true)); ReactiveAssert.Throws(() => Qbservable.TakeWhile(_qbMy, default(Expression>))); } [TestMethod] public void TakeWhile() { _qbMy.TakeWhile(x => true); } [TestMethod] public void Throttle_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Throttle(_qbNull, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Throttle(_qbNull, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Throttle(_qbMy, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void Throttle() { _qbMy.Throttle(TimeSpan.Zero); _qbMy.Throttle(TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void Throw_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Throw(null, new Exception())); ReactiveAssert.Throws(() => Qbservable.Throw(_qbp, null)); ReactiveAssert.Throws(() => Qbservable.Throw(null, new Exception(), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Throw(_qbp, null, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Throw(_qbp, new Exception(), default(IScheduler))); } [TestMethod] public void Throw() { _qbp.Throw(new Exception()); _qbp.Throw(new Exception(), Scheduler.Immediate); } [TestMethod] public void TimeInterval_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.TimeInterval(_qbNull)); ReactiveAssert.Throws(() => Qbservable.TimeInterval(_qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.TimeInterval(_qbMy, default(IScheduler))); } [TestMethod] public void TimeInterval() { _qbMy.TimeInterval(); _qbMy.TimeInterval(Scheduler.Immediate); } [TestMethod] public void Timeout_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, DateTimeOffset.Now, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, TimeSpan.Zero, _qbMy)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, DateTimeOffset.Now, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, TimeSpan.Zero, _qbNull)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, DateTimeOffset.Now, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, TimeSpan.Zero, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, DateTimeOffset.Now, _qbMy, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbNull, TimeSpan.Zero, _qbMy, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, DateTimeOffset.Now, _qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, TimeSpan.Zero, _qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, DateTimeOffset.Now, _qbMy, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timeout(_qbMy, TimeSpan.Zero, _qbMy, default(IScheduler))); } [TestMethod] public void Timeout() { _qbMy.Timeout(DateTimeOffset.Now); _qbMy.Timeout(TimeSpan.Zero); _qbMy.Timeout(DateTimeOffset.Now, _qbMy); _qbMy.Timeout(TimeSpan.Zero, _qbMy); _qbMy.Timeout(DateTimeOffset.Now, Scheduler.Immediate); _qbMy.Timeout(TimeSpan.Zero, Scheduler.Immediate); _qbMy.Timeout(DateTimeOffset.Now, _qbMy, Scheduler.Immediate); _qbMy.Timeout(TimeSpan.Zero, _qbMy, Scheduler.Immediate); } [TestMethod] public void Timer_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Timer(null, DateTimeOffset.Now)); ReactiveAssert.Throws(() => Qbservable.Timer(null, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Timer(null, DateTimeOffset.Now, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timer(_qbp, DateTimeOffset.Now, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timer(null, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timer(_qbp, TimeSpan.Zero, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timer(null, DateTimeOffset.Now, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Timer(null, TimeSpan.Zero, TimeSpan.Zero)); ReactiveAssert.Throws(() => Qbservable.Timer(null, DateTimeOffset.Now, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timer(_qbp, DateTimeOffset.Now, TimeSpan.Zero, default(IScheduler))); ReactiveAssert.Throws(() => Qbservable.Timer(null, TimeSpan.Zero, TimeSpan.Zero, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timer(_qbp, TimeSpan.Zero, TimeSpan.Zero, default(IScheduler))); } [TestMethod] public void Timer() { _qbp.Timer(DateTimeOffset.Now); _qbp.Timer(TimeSpan.Zero); _qbp.Timer(DateTimeOffset.Now, Scheduler.Immediate); _qbp.Timer(TimeSpan.Zero, Scheduler.Immediate); _qbp.Timer(DateTimeOffset.Now, TimeSpan.Zero); _qbp.Timer(TimeSpan.Zero, TimeSpan.Zero); _qbp.Timer(DateTimeOffset.Now, TimeSpan.Zero, Scheduler.Immediate); _qbp.Timer(TimeSpan.Zero, TimeSpan.Zero, Scheduler.Immediate); } [TestMethod] public void Timestamp_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Timestamp(_qbNull)); ReactiveAssert.Throws(() => Qbservable.Timestamp(_qbNull, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.Timestamp(_qbMy, default(IScheduler))); } [TestMethod] public void Timestamp() { _qbMy.Timestamp(); _qbMy.Timestamp(Scheduler.Immediate); } [TestMethod] public void ToObservable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.ToObservable(null, new[] { 1 })); ReactiveAssert.Throws(() => Qbservable.ToObservable(_qbp, default(IEnumerable))); ReactiveAssert.Throws(() => Qbservable.ToObservable(null, new[] { 1 }, Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.ToObservable(_qbp, default(IEnumerable), Scheduler.Immediate)); ReactiveAssert.Throws(() => Qbservable.ToObservable(_qbp, new[] { 1 }, default(IScheduler))); } [TestMethod] public void ToObservable() { _qbp.ToObservable(new[] { 1 }); _qbp.ToObservable(new[] { 1 }, Scheduler.Immediate); } [TestMethod] public void ToQueryable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.ToQueryable(_qbNull)); } [TestMethod] public void ToQueryable() { ReactiveAssert.Throws(() => _qbMy.ToQueryable()); new MyQbservableQueryable().ToQueryable(); } [TestMethod] public void ToQbservable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.ToQbservable(default(IQueryable))); } [TestMethod] public void ToQbservable() { ReactiveAssert.Throws(() => new[] { 1 }.AsQueryable().ToQbservable()); new MyQueryable().ToQbservable(); } [TestMethod] public void Using_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Using(null, () => new MyDisposable(), x => Observable.Return(x.ToString()))); ReactiveAssert.Throws(() => Qbservable.Using(_qbp, default(Expression>), x => Observable.Return(x.ToString()))); ReactiveAssert.Throws(() => Qbservable.Using(_qbp, () => new MyDisposable(), default(Expression>>))); } class MyDisposable : IDisposable { public void Dispose() { throw new NotImplementedException(); } } [TestMethod] public void Using() { _qbp.Using(() => new MyDisposable(), x => Observable.Return(x.ToString())); } [TestMethod] public void Where_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Where(_qbNull, x => true)); ReactiveAssert.Throws(() => Qbservable.Where(_qbNull, (x, i) => true)); ReactiveAssert.Throws(() => Qbservable.Where(_qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Where(_qbMy, default(Expression>))); } [TestMethod] public void Where() { _qbMy.Where(x => true); _qbMy.Where((x, i) => true); } [TestMethod] public void While_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.While(null, () => true, _qbMy)); ReactiveAssert.Throws(() => Qbservable.While(_qbp, default(Expression>), _qbMy)); ReactiveAssert.Throws(() => Qbservable.While(_qbp, () => true, _qbNull)); } [TestMethod] public void While() { _qbp.While(() => true, _qbMy); } [TestMethod] public void Zip_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Zip(_qbNull, _qbMy, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Zip(_qbMy, _qbNull, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Zip(_qbMy, _qbMy, default(Expression>))); ReactiveAssert.Throws(() => Qbservable.Zip(_qbNull, new[] { 1 }, (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Zip(_qbMy, default(IEnumerable), (a, b) => a + b)); ReactiveAssert.Throws(() => Qbservable.Zip(_qbMy, new[] { 1 }, default(Expression>))); } [TestMethod] public void Zip() { _qbMy.Zip(_qbMy, (a, b) => a + b); _qbMy.Zip(new[] { 1 }, (a, b) => a + b); } [TestMethod] public void AsObservable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.AsObservable(_qbNull)); } [TestMethod] public void AsObservable() { Assert.AreSame(_qbMy.AsObservable(), _qbMy); } [TestMethod] public void Join_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.When(null, _qbMy.Then(x => x))); ReactiveAssert.Throws(() => Qbservable.When(_qbp, default(QueryablePlan[]))); ReactiveAssert.Throws(() => Qbservable.When(null, new MyQueryable>())); ReactiveAssert.Throws(() => Qbservable.When(_qbp, default(IQueryable>))); } [TestMethod] public void Join() { _qbp.When(new MyQueryable>()); _qbp.When( _qbMy.Then((t0) => 1), _qbMy.And(_qbMy).Then((t0, t1) => 1), _qbMy.And(_qbMy).And(_qbMy).Then((t0, t1, t2) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3) => 1) #if !NO_LARGEARITY , _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) => 1), _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) => 1) #endif ); } [TestMethod] public void Then_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.Then(_qbNull, default(Expression>))); ReactiveAssert.Throws(() => _qbMy.Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); #if !NO_LARGEARITY ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); ReactiveAssert.Throws(() => _qbMy.And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).And(_qbMy).Then(default(Expression>))); #endif } [TestMethod] public void AsQbservable_ArgumentNullChecks() { ReactiveAssert.Throws(() => Qbservable.AsQbservable(null)); } [TestMethod] public void AsQbservable_CreateQuery_ArgumentChecks() { var xs = Observable.Return(1).AsQbservable(); ReactiveAssert.Throws(() => xs.Provider.CreateQuery(null)); ReactiveAssert.Throws(() => xs.Provider.CreateQuery(Expression.Constant(1))); } [TestMethod] public void AsQbservable_ToString() { var xs = Observable.Return(1); var ys = xs.AsQbservable(); Assert.AreEqual(ys.ToString(), xs.ToString()); var ex = Expression.Constant(xs); var zs = ys.Provider.CreateQuery(ex); Assert.AreEqual(zs.ToString(), ex.ToString()); var ns = ys.Provider.CreateQuery(Expression.Constant(null, typeof(IObservable))); Assert.AreEqual(ns.ToString(), "null"); var ws = ys.Where(x => true); Assert.AreEqual(ws.Expression.ToString(), ws.ToString()); } [TestMethod] public void Qbservable_Subscribe_Source() { var xs = Observable.Return(1).AsQbservable(); var _x = 0; xs.ForEach(x => _x = x); Assert.AreEqual(_x, 1); } [TestMethod] public void Qbservable_VariousOperators() { var xs = Observable.Return(1).AsQbservable(); Assert.IsTrue(xs.Where(x => true).ToEnumerable().SequenceEqual(new[] { 1 }), "Where"); Assert.IsTrue(xs.Select(x => x.ToString()).ToEnumerable().SequenceEqual(new[] { "1" }), "Select"); Assert.IsTrue(xs.Take(1).ToEnumerable().SequenceEqual(new[] { 1 }), "Take"); Assert.IsTrue(xs.Sum().ToEnumerable().SequenceEqual(new[] { 1 }), "Sum"); Assert.IsTrue(xs.Amb(xs).ToEnumerable().SequenceEqual(new[] { 1 }), "Amb"); Assert.IsTrue(xs.Concat(xs).ToEnumerable().SequenceEqual(new[] { 1, 1 }), "Concat"); Assert.IsTrue(xs.Aggregate("", (s, i) => s + i).ToEnumerable().SequenceEqual(new[] { "1" }), "Aggregate"); Assert.IsTrue(xs.Where(x => true).Concat(xs.Where(x => false)).ToEnumerable().SequenceEqual(new[] { 1 }), "Concat/Where"); Assert.IsTrue(xs.SelectMany(x => xs).ToEnumerable().SequenceEqual(new[] { 1 }), "SelectMany"); Assert.IsTrue(xs.GroupBy(x => x).SelectMany(g => g).ToEnumerable().SequenceEqual(new[] { 1 }), "GroupBy/SelectMany"); Assert.IsTrue(xs.GroupBy(x => x, x => x).SelectMany(g => g).ToEnumerable().SequenceEqual(new[] { 1 }), "GroupBy/SelectMany (more generics)"); // TODO: IQueryable ones } [TestMethod] public void Qbservable_ProviderOperators() { var xs = Observable.Return(1).AsQbservable(); Assert.IsTrue(Qbservable.Provider.Amb(xs, xs, xs).ToEnumerable().SequenceEqual(new[] { 1 }), "Amb (n-ary)"); Assert.IsTrue(Qbservable.Provider.Concat(xs, xs, xs).ToEnumerable().SequenceEqual(new[] { 1, 1, 1 }), "Concat (n-ary)"); ReactiveAssert.Throws(() => Qbservable.Provider.Throw(new MyException()).ForEach(_ => { })); } class MyException : Exception { } [TestMethod] public void Qbservable_JoinPatterns() { var xs = Observable.Return(1).AsQbservable(); var ys = Observable.Return(2).AsQbservable(); var zs = Observable.Return(3).AsQbservable(); Assert.IsTrue(Qbservable.Provider.When(xs.And(ys).Then((x, y) => x + y)).ToEnumerable().SequenceEqual(new[] { 3 }), "Join"); Assert.IsTrue(Qbservable.Provider.When(xs.And(ys).And(zs).Then((x, y, z) => x + y + z)).ToEnumerable().SequenceEqual(new[] { 6 }), "Join"); } [TestMethod] public void Qbservable_MoreProviderFun() { Assert.IsTrue( Qbservable.Provider.Concat( Qbservable.Provider.Return(1).Where(x => x > 0).Select(x => x + 1), Qbservable.Provider.Return(2).Where(x => x < 2), Qbservable.Provider.Throw(new Exception()) ) .Catch((Exception ex) => Qbservable.Provider.Return(3)) .ToEnumerable() .SequenceEqual(new[] { 2, 3 }) ); } [TestMethod] public void Qbservable_AsQbservable_ToQueryable() { var xs = Observable.Range(0, 10).Where(x => x > 5).AsQbservable().Select(x => x + 1); var ys = xs.ToQueryable().OrderByDescending(x => x); Assert.IsTrue(ys.SequenceEqual(new[] { 10, 9, 8, 7 })); } [TestMethod] public void Qbservable_AsQbservable_ToQueryable_Errors() { var provider = (IQueryProvider)Qbservable.Provider; ReactiveAssert.Throws(() => provider.Execute(Expression.Constant(1))); ReactiveAssert.Throws(() => provider.Execute(Expression.Constant(1))); ReactiveAssert.Throws(() => provider.CreateQuery(Expression.Constant(1))); ReactiveAssert.Throws(() => provider.CreateQuery(Expression.Constant(1))); ReactiveAssert.Throws(() => provider.CreateQuery(new[] { 0 }.AsQueryable().Reverse().Expression)); ReactiveAssert.Throws(() => provider.CreateQuery(Qbservable.Provider.Return(1).Expression)); } [TestMethod] public void Qbservable_TwoProviders_Amb() { var xs = Observable.Return(1).AsQbservable(); var ys = new EmptyQbservable().Where(x => true); xs.Amb(ys).ForEach(_ => { }); ys.Amb(xs).ForEach(_ => { }); xs.Concat(ys.Provider.Amb(xs)).ForEach(_ => { }); } private void Ignore(IQbservable q) { } [TestMethod] public void Qbservable_Observable_Parity() { var obs = typeof(Observable).GetMethods(BindingFlags.Public | BindingFlags.Static).ToList(); var qbs = typeof(Qbservable).GetMethods(BindingFlags.Public | BindingFlags.Static).ToList(); var onlyInObs = obs.Select(m => m.Name).Except(qbs.Select(m => m.Name)).Except(new[] { "First", "FirstOrDefault", "Last", "LastOrDefault", "Single", "SingleOrDefault", "ForEach", "Subscribe", "GetEnumerator", "ToEnumerable", "Multicast", "GetAwaiter", "ToEvent", "ToEventPattern", "ForEachAsync", "Wait", "RunAsync", "ToListObservable" }).ToList(); var onlyInQbs = qbs.Select(m => m.Name).Except(obs.Select(m => m.Name)).Except(new[] { "ToQueryable", "ToQbservable", "get_Provider", "AsQbservable" }).ToList(); Assert.IsTrue(onlyInObs.Count == 0, "Missing Qbservable operator: " + string.Join(", ", onlyInObs.ToArray())); Assert.IsTrue(onlyInQbs.Count == 0, "Missing Observable operator: " + string.Join(", ", onlyInQbs.ToArray())); var obgs = obs.GroupBy(m => m.Name); var qbgs = qbs.GroupBy(m => m.Name); var mtch = (from o in obgs where o.Key != "And" && o.Key != "Then" && o.Key != "When" join q in qbgs on o.Key equals q.Key select new { Name = o.Key, Observable = o.ToList(), Qbservable = q.ToList() }) .ToList(); Func filterReturn = t => { if (t.IsGenericType) { var gd = t.GetGenericTypeDefinition(); if ( gd == typeof(ListObservable<>) || gd == typeof(IConnectableObservable<>)) return false; } return true; }; foreach (var group in mtch) { if (group.Name == "FromAsyncPattern" || group.Name == "ToAsync") { Assert.AreEqual(group.Observable.Count, group.Qbservable.Count, "Mismatch overload count between Qbservable and Observable for " + group.Name); continue; } var oss = group.Observable.Where(m => filterReturn(m.ReturnType)).Select(m => GetSignature(m, false)).OrderBy(x => x).ToList(); var qss = group.Qbservable.Select(m => GetSignature(m, true)).OrderBy(x => x).ToList(); Assert.IsTrue(oss.SequenceEqual(qss), "Mismatch between Qbservable and Observable for " + group.Name); } } public static string GetSignature(MethodInfo m, bool correct) { var ps = m.GetParameters(); var pss = ps.AsEnumerable(); if (correct && ps.Length > 0 && ps[0].ParameterType == typeof(IQbservableProvider)) pss = pss.Skip(1); var gens = m.IsGenericMethod ? string.Format("<{0}>", string.Join(", ", m.GetGenericArguments().Select(a => GetTypeName(a, correct)).ToArray())) : ""; var pars = string.Join(", ", pss.Select(p => (Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? "params " : "") + GetTypeName(p.ParameterType, correct) + " " + p.Name).ToArray()); if (Attribute.IsDefined(m, typeof(ExtensionAttribute))) { if (pars.StartsWith("IQbservable") || pars.StartsWith("IQueryable")) pars = "this " + pars; } return string.Format("{0} {1}{2}({3})", GetTypeName(m.ReturnType, correct), m.Name, gens, pars); } public static string GetTypeName(Type t, bool correct) { if (t.IsGenericType) { var gtd = t.GetGenericTypeDefinition(); if (gtd == typeof(Expression<>)) return GetTypeName(t.GetGenericArguments()[0], false); var args = string.Join(", ", t.GetGenericArguments().Select(a => GetTypeName(a, false)).ToArray()); var len = t.Name.IndexOf('`'); var name = len >= 0 ? t.Name.Substring(0, len) : t.Name; if (correct && name == "IQbservable") name = "IObservable"; if (correct && name == "IQueryable") name = "IEnumerable"; return string.Format("{0}<{1}>", name, args); } if (t.IsArray) { return GetTypeName(t.GetElementType(), correct) + "[]"; } return t.Name; } [TestMethod] public void Qbservable_Extensibility_Combinator() { var res1 = Observable.Return(42).AsQbservable().Foo(x => x / 2).AsObservable().Single(); Assert.AreEqual(21, res1); var res2 = Observable.Return(3).AsQbservable().Bar().AsObservable().Single(); Assert.AreEqual("***", res2); } [TestMethod] public void Qbservable_Extensibility_Constructor() { var res1 = Qbservable.Provider.Qux(42).AsObservable().Single(); Assert.AreEqual(42, res1); } [TestMethod] public void Qbservable_Extensibility_Missing() { try { Observable.Return(42).AsQbservable().Baz(x => x).AsObservable().Single(); } catch (InvalidOperationException) { return; } Assert.Fail(); } } public static class MyExt { public static IQbservable Foo(this IQbservable source, Expression> f) { return source.Provider.CreateQuery( Expression.Call( ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(T), typeof(R)), source.Expression, f ) ); } public static IObservable Foo(this IObservable source, Func f) { return source.Select(f); } public static IQbservable Bar(this IQbservable source) { return source.Provider.CreateQuery( Expression.Call( (MethodInfo)MethodInfo.GetCurrentMethod(), source.Expression ) ); } public static IObservable Bar(this IObservable source) { return source.Select(x => new string('*', x)); } public static IQbservable Qux(this IQbservableProvider provider, T value) { return provider.CreateQuery( Expression.Call( ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(T)), Expression.Constant(provider, typeof(IQbservableProvider)), Expression.Constant(value, typeof(T)) ) ); } public static IObservable Qux(T value) { return Observable.Return(value); } public static IQbservable Baz(this IQbservable source, Expression> f) { return source.Provider.CreateQuery( Expression.Call( ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(T), typeof(R)), source.Expression, f ) ); } } class MyQbservable : IQbservable { public MyQbservable() { Expression = Expression.Constant(this); } public MyQbservable(Expression expression) { Expression = expression; } public Type ElementType { get { return typeof(T); } } public Expression Expression { get; private set; } public IQbservableProvider Provider { get { return new MyQbservableProvider(); } } public IDisposable Subscribe(IObserver observer) { throw new NotImplementedException(); } } class MyQbservableProvider : IQbservableProvider { public IQbservable CreateQuery(Expression expression) { return new MyQbservable(expression); } } class MyQbservableQueryable : IQbservable { public MyQbservableQueryable() { Expression = Expression.Constant(this); } public MyQbservableQueryable(Expression expression) { Expression = expression; } public Type ElementType { get { return typeof(T); } } public Expression Expression { get; private set; } public IQbservableProvider Provider { get { return new MyQbservableQueryableProvider(); } } public IDisposable Subscribe(IObserver observer) { throw new NotImplementedException(); } } class MyQueryable : IQueryable { public MyQueryable() { Expression = Expression.Constant(this); } public MyQueryable(Expression expression) { Expression = expression; } public Expression Expression { get; private set; } public IEnumerator GetEnumerator() { throw new NotImplementedException(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public Type ElementType { get { return typeof(T); } } IQueryProvider IQueryable.Provider { get { return new MyQbservableQueryableProvider(); } } } class MyQbservableQueryableProvider : IQbservableProvider, IQueryProvider { public IQbservable CreateQuery(Expression expression) { return new MyQbservable(expression); } IQueryable IQueryProvider.CreateQuery(Expression expression) { return new MyQueryable(expression); } public IQueryable CreateQuery(Expression expression) { throw new NotImplementedException(); } public TResult Execute(Expression expression) { throw new NotImplementedException(); } public object Execute(Expression expression) { throw new NotImplementedException(); } } class EmptyQbservable : IQbservable, IQbservableProvider { private Expression _expression; public EmptyQbservable() { _expression = Expression.Constant(this); } public EmptyQbservable(Expression expression) { _expression = expression; } public Type ElementType { get { return typeof(T); } } public Expression Expression { get { return _expression; } } public IQbservableProvider Provider { get { return this; } } public IDisposable Subscribe(IObserver observer) { observer.OnCompleted(); return new MyD(); } class MyD : IDisposable { public void Dispose() { } } public IQbservable CreateQuery(Expression expression) { return new EmptyQbservable(expression); } } } #endif #endif