DeferAsyncTest.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Linq;
  6. using System.Reactive.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Microsoft.Reactive.Testing;
  10. using Xunit;
  11. namespace ReactiveTests.Tests
  12. {
  13. public class DeferAsyncTest : ReactiveTest
  14. {
  15. [Fact]
  16. public void DeferAsync_ArgumentChecking()
  17. {
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Defer(default(Func<Task<IObservable<int>>>)));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.DeferAsync(default(Func<CancellationToken, Task<IObservable<int>>>)));
  20. }
  21. [Fact]
  22. public void DeferAsync_Simple()
  23. {
  24. var xs = Observable.Defer(() => Task.Factory.StartNew(() => Observable.Return(42)));
  25. var res = xs.ToEnumerable().ToList();
  26. Assert.True(new[] { 42 }.SequenceEqual(res));
  27. }
  28. [Fact]
  29. public void DeferAsync_WithCancel_Simple()
  30. {
  31. var xs = Observable.DeferAsync(ct => Task.Factory.StartNew(() => Observable.Return(42)));
  32. var res = xs.ToEnumerable().ToList();
  33. Assert.True(new[] { 42 }.SequenceEqual(res));
  34. }
  35. [Fact]
  36. public void DeferAsync_WithCancel_Cancel()
  37. {
  38. var N = 10;// 0000;
  39. for (var i = 0; i < N; i++)
  40. {
  41. var e = new ManualResetEvent(false);
  42. var called = false;
  43. var xs = Observable.DeferAsync(ct => Task.Factory.StartNew(() =>
  44. {
  45. e.Set();
  46. while (!ct.IsCancellationRequested)
  47. {
  48. ;
  49. }
  50. return Observable.Defer(() => { called = true; return Observable.Return(42); });
  51. }));
  52. var d = xs.Subscribe(_ => { });
  53. e.WaitOne();
  54. d.Dispose();
  55. Assert.False(called);
  56. }
  57. }
  58. }
  59. }