// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System; using System.Reactive.Concurrency; using System.Reactive.Linq; using Microsoft.Reactive.Testing; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace ReactiveTests.Tests { [TestClass] public partial class ObservableExtensionsTest : ReactiveTest { #region Subscribe [TestMethod] public void Subscribe_ArgumentChecking() { var someObservable = Observable.Empty(); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(default(IObservable))); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(default(IObservable), _ => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, default(Action))); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(default(IObservable), _ => { }, () => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, default(Action), () => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, _ => { }, default(Action))); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(default(IObservable), _ => { }, (Exception _) => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, default(Action), (Exception _) => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, _ => { }, default(Action))); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(default(IObservable), _ => { }, (Exception _) => { }, () => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, default(Action), (Exception _) => { }, () => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, _ => { }, default(Action), () => { })); ReactiveAssert.Throws(() => ObservableExtensions.Subscribe(someObservable, _ => { }, (Exception _) => { }, default(Action))); } [TestMethod] public void Subscribe_None_Return() { Observable.Return(1, Scheduler.Immediate).Subscribe(); } [TestMethod] public void Subscribe_None_Throw() { var ex = new Exception(); var xs = Observable.Throw(ex, Scheduler.Immediate); ReactiveAssert.Throws(ex, () => xs.Subscribe()); } [TestMethod] public void Subscribe_None_Empty() { Observable.Empty(Scheduler.Immediate).Subscribe((int _) => { Assert.Fail(); }); } [TestMethod] public void Subscribe_OnNext_Return() { int _x = -1; Observable.Return(42, Scheduler.Immediate).Subscribe((int x) => { _x = x; }); Assert.AreEqual(42, _x); } [TestMethod] public void Subscribe_OnNext_Throw() { var ex = new Exception(); var xs = Observable.Throw(ex, Scheduler.Immediate); ReactiveAssert.Throws(ex, () => xs.Subscribe(_ => { Assert.Fail(); })); } [TestMethod] public void Subscribe_OnNext_Empty() { Observable.Empty(Scheduler.Immediate).Subscribe((int _) => { Assert.Fail(); }); } [TestMethod] public void Subscribe_OnNextOnCompleted_Return() { bool finished = false; int _x = -1; Observable.Return(42, Scheduler.Immediate).Subscribe((int x) => { _x = x; }, () => { finished = true; }); Assert.AreEqual(42, _x); Assert.IsTrue(finished); } [TestMethod] public void Subscribe_OnNextOnCompleted_Throw() { var ex = new Exception(); var xs = Observable.Throw(ex, Scheduler.Immediate); ReactiveAssert.Throws(ex, () => xs.Subscribe(_ => { Assert.Fail(); }, () => { Assert.Fail(); })); } [TestMethod] public void Subscribe_OnNextOnCompleted_Empty() { bool finished = false; Observable.Empty(Scheduler.Immediate).Subscribe((int _) => { Assert.Fail(); }, () => { finished = true; }); Assert.IsTrue(finished); } #endregion } }