153 lines
4.5 KiB
C#
153 lines
4.5 KiB
C#
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
|||
|
|
|||
|
#if HAS_AWAIT
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Reactive;
|
|||
|
using System.Reactive.Concurrency;
|
|||
|
using System.Reactive.Linq;
|
|||
|
using System.Reactive.Subjects;
|
|||
|
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 class ObservableAwaiterTest : ReactiveTest
|
|||
|
{
|
|||
|
[TestMethod]
|
|||
|
public void Await_ArgumentChecking()
|
|||
|
{
|
|||
|
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetAwaiter<int>(null));
|
|||
|
ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetAwaiter(Observable.Empty<int>()).OnCompleted(null));
|
|||
|
}
|
|||
|
|
|||
|
[TestMethod]
|
|||
|
public void Await()
|
|||
|
{
|
|||
|
var scheduler = new TestScheduler();
|
|||
|
|
|||
|
var xs = scheduler.CreateHotObservable(
|
|||
|
OnNext(20, -1),
|
|||
|
OnNext(150, 0),
|
|||
|
OnNext(220, 1),
|
|||
|
OnNext(290, 2),
|
|||
|
OnNext(340, 3),
|
|||
|
OnCompleted<int>(410)
|
|||
|
);
|
|||
|
|
|||
|
var awaiter = default(AsyncSubject<int>);
|
|||
|
var result = default(int);
|
|||
|
var t = long.MaxValue;
|
|||
|
|
|||
|
scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
|
|||
|
scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; result = awaiter.GetResult(); }));
|
|||
|
|
|||
|
scheduler.Start();
|
|||
|
|
|||
|
Assert.AreEqual(410, t);
|
|||
|
Assert.AreEqual(3, result);
|
|||
|
|
|||
|
xs.Subscriptions.AssertEqual(
|
|||
|
Subscribe(100)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
[TestMethod]
|
|||
|
public void Await_Error()
|
|||
|
{
|
|||
|
var scheduler = new TestScheduler();
|
|||
|
|
|||
|
var ex = new Exception();
|
|||
|
|
|||
|
var xs = scheduler.CreateHotObservable(
|
|||
|
OnNext(20, -1),
|
|||
|
OnNext(150, 0),
|
|||
|
OnNext(220, 1),
|
|||
|
OnNext(290, 2),
|
|||
|
OnNext(340, 3),
|
|||
|
OnError<int>(410, ex)
|
|||
|
);
|
|||
|
|
|||
|
var awaiter = default(AsyncSubject<int>);
|
|||
|
var t = long.MaxValue;
|
|||
|
|
|||
|
scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
|
|||
|
scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; ReactiveAssert.Throws(ex, () => awaiter.GetResult()); }));
|
|||
|
|
|||
|
scheduler.Start();
|
|||
|
|
|||
|
Assert.AreEqual(410, t);
|
|||
|
|
|||
|
xs.Subscriptions.AssertEqual(
|
|||
|
Subscribe(100)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
[TestMethod]
|
|||
|
public void Await_Never()
|
|||
|
{
|
|||
|
var scheduler = new TestScheduler();
|
|||
|
|
|||
|
var xs = scheduler.CreateHotObservable(
|
|||
|
OnNext(20, -1),
|
|||
|
OnNext(150, 0),
|
|||
|
OnNext(220, 1),
|
|||
|
OnNext(290, 2),
|
|||
|
OnNext(340, 3)
|
|||
|
);
|
|||
|
|
|||
|
var awaiter = default(AsyncSubject<int>);
|
|||
|
var hasValue = default(bool);
|
|||
|
var t = long.MaxValue;
|
|||
|
|
|||
|
scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
|
|||
|
scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; awaiter.GetResult(); hasValue = true; }));
|
|||
|
|
|||
|
scheduler.Start();
|
|||
|
|
|||
|
Assert.AreEqual(long.MaxValue, t);
|
|||
|
Assert.IsFalse(hasValue);
|
|||
|
|
|||
|
xs.Subscriptions.AssertEqual(
|
|||
|
Subscribe(100)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
[TestMethod]
|
|||
|
public void Await_Empty()
|
|||
|
{
|
|||
|
var scheduler = new TestScheduler();
|
|||
|
|
|||
|
var xs = scheduler.CreateHotObservable(
|
|||
|
OnCompleted<int>(300)
|
|||
|
);
|
|||
|
|
|||
|
var awaiter = default(AsyncSubject<int>);
|
|||
|
var t = long.MaxValue;
|
|||
|
|
|||
|
scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
|
|||
|
scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; ReactiveAssert.Throws<InvalidOperationException>(() => awaiter.GetResult()); }));
|
|||
|
|
|||
|
scheduler.Start();
|
|||
|
|
|||
|
Assert.AreEqual(300, t);
|
|||
|
|
|||
|
xs.Subscriptions.AssertEqual(
|
|||
|
Subscribe(100)
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endif
|