1
0

AsyncTests.Conversions.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. #if !NO_TPL
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using Microsoft.VisualStudio.TestTools.UnitTesting;
  8. using System.Threading;
  9. namespace Tests
  10. {
  11. public partial class AsyncTests
  12. {
  13. [TestMethod]
  14. public void ToAsyncEnumerable_Null()
  15. {
  16. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ToAsyncEnumerable<int>(default(IEnumerable<int>)));
  17. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ToAsyncEnumerable<int>(default(IObservable<int>)));
  18. }
  19. [TestMethod]
  20. public void ToAsyncEnumerable1()
  21. {
  22. var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable();
  23. var e = xs.GetEnumerator();
  24. HasNext(e, 1);
  25. HasNext(e, 2);
  26. HasNext(e, 3);
  27. HasNext(e, 4);
  28. NoNext(e);
  29. }
  30. [TestMethod]
  31. public void ToAsyncEnumerable2()
  32. {
  33. var ex = new Exception("Bang");
  34. var xs = ToAsyncEnumerable_Sequence(ex).ToAsyncEnumerable();
  35. var e = xs.GetEnumerator();
  36. HasNext(e, 42);
  37. AssertThrows<Exception>(() => e.MoveNext().Wait(), ex_ => ((AggregateException)ex_).InnerExceptions.Single() == ex);
  38. }
  39. private IEnumerable<int> ToAsyncEnumerable_Sequence(Exception e)
  40. {
  41. yield return 42;
  42. throw e;
  43. }
  44. [TestMethod]
  45. public void ToAsyncEnumerable3()
  46. {
  47. var subscribed = false;
  48. var xs = new MyObservable<int>(obs =>
  49. {
  50. subscribed = true;
  51. obs.OnNext(42);
  52. obs.OnCompleted();
  53. return new MyDisposable(() => { });
  54. }).ToAsyncEnumerable();
  55. Assert.IsFalse(subscribed);
  56. var e = xs.GetEnumerator();
  57. Assert.IsTrue(subscribed);
  58. HasNext(e, 42);
  59. NoNext(e);
  60. }
  61. [TestMethod]
  62. public void ToAsyncEnumerable4()
  63. {
  64. var ex = new Exception("Bang!");
  65. var subscribed = false;
  66. var xs = new MyObservable<int>(obs =>
  67. {
  68. subscribed = true;
  69. obs.OnError(ex);
  70. return new MyDisposable(() => { });
  71. }).ToAsyncEnumerable();
  72. Assert.IsFalse(subscribed);
  73. var e = xs.GetEnumerator();
  74. Assert.IsTrue(subscribed);
  75. AssertThrows<Exception>(() => e.MoveNext().Wait(), ex_ => ((AggregateException)ex_).InnerExceptions.Single() == ex);
  76. }
  77. class MyObservable<T> : IObservable<T>
  78. {
  79. private Func<IObserver<T>, IDisposable> _subscribe;
  80. public MyObservable(Func<IObserver<T>, IDisposable> subscribe)
  81. {
  82. _subscribe = subscribe;
  83. }
  84. public IDisposable Subscribe(IObserver<T> observer)
  85. {
  86. return _subscribe(observer);
  87. }
  88. }
  89. class MyDisposable : IDisposable
  90. {
  91. private Action _dispose;
  92. public MyDisposable(Action dispose)
  93. {
  94. _dispose = dispose;
  95. }
  96. public void Dispose()
  97. {
  98. _dispose();
  99. }
  100. }
  101. [TestMethod]
  102. public void ToEnumerable_Null()
  103. {
  104. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ToEnumerable<int>(null));
  105. }
  106. [TestMethod]
  107. public void ToEnumerable1()
  108. {
  109. var xs = AsyncEnumerable.Return(42).ToEnumerable();
  110. Assert.IsTrue(xs.SequenceEqual(new[] { 42 }));
  111. }
  112. [TestMethod]
  113. public void ToEnumerable2()
  114. {
  115. var xs = AsyncEnumerable.Empty<int>().ToEnumerable();
  116. Assert.IsTrue(xs.SequenceEqual(new int[0]));
  117. }
  118. [TestMethod]
  119. public void ToEnumerable3()
  120. {
  121. var ex = new Exception("Bang");
  122. var xs = AsyncEnumerable.Throw<int>(ex).ToEnumerable();
  123. AssertThrows<Exception>(() => xs.GetEnumerator().MoveNext(), ex_ => ((AggregateException)ex_).InnerExceptions.Single() == ex);
  124. }
  125. #if !NO_RXINTERFACES
  126. [TestMethod]
  127. public void ToObservable_Null()
  128. {
  129. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.ToObservable<int>(null));
  130. }
  131. [TestMethod]
  132. public void ToObservable1()
  133. {
  134. var fail = false;
  135. var evt = new ManualResetEvent(false);
  136. var xs = AsyncEnumerable.Empty<int>().ToObservable();
  137. xs.Subscribe(new MyObserver<int>(
  138. x =>
  139. {
  140. fail = true;
  141. },
  142. ex =>
  143. {
  144. fail = true;
  145. evt.Set();
  146. },
  147. () =>
  148. {
  149. evt.Set();
  150. }
  151. ));
  152. evt.WaitOne();
  153. Assert.IsFalse(fail);
  154. }
  155. [TestMethod]
  156. public void ToObservable2()
  157. {
  158. var lst = new List<int>();
  159. var fail = false;
  160. var evt = new ManualResetEvent(false);
  161. var xs = AsyncEnumerable.Return(42).ToObservable();
  162. xs.Subscribe(new MyObserver<int>(
  163. x =>
  164. {
  165. lst.Add(x);
  166. },
  167. ex =>
  168. {
  169. fail = true;
  170. evt.Set();
  171. },
  172. () =>
  173. {
  174. evt.Set();
  175. }
  176. ));
  177. evt.WaitOne();
  178. Assert.IsFalse(fail);
  179. Assert.IsTrue(lst.SequenceEqual(new[] { 42 }));
  180. }
  181. [TestMethod]
  182. public void ToObservable3()
  183. {
  184. var lst = new List<int>();
  185. var fail = false;
  186. var evt = new ManualResetEvent(false);
  187. var xs = AsyncEnumerable.Range(0, 10).ToObservable();
  188. xs.Subscribe(new MyObserver<int>(
  189. x =>
  190. {
  191. lst.Add(x);
  192. },
  193. ex =>
  194. {
  195. fail = true;
  196. evt.Set();
  197. },
  198. () =>
  199. {
  200. evt.Set();
  201. }
  202. ));
  203. evt.WaitOne();
  204. Assert.IsFalse(fail);
  205. Assert.IsTrue(lst.SequenceEqual(Enumerable.Range(0, 10)));
  206. }
  207. [TestMethod]
  208. public void ToObservable4()
  209. {
  210. var ex1 = new Exception("Bang!");
  211. var ex_ = default(Exception);
  212. var fail = false;
  213. var evt = new ManualResetEvent(false);
  214. var xs = AsyncEnumerable.Throw<int>(ex1).ToObservable();
  215. xs.Subscribe(new MyObserver<int>(
  216. x =>
  217. {
  218. fail = true;
  219. },
  220. ex =>
  221. {
  222. ex_ = ex;
  223. evt.Set();
  224. },
  225. () =>
  226. {
  227. fail = true;
  228. evt.Set();
  229. }
  230. ));
  231. evt.WaitOne();
  232. Assert.IsFalse(fail);
  233. Assert.AreEqual(ex1, ((AggregateException)ex_).InnerExceptions.Single());
  234. }
  235. class MyObserver<T> : IObserver<T>
  236. {
  237. private Action<T> _onNext;
  238. private Action<Exception> _onError;
  239. private Action _onCompleted;
  240. public MyObserver(Action<T> onNext, Action<Exception> onError, Action onCompleted)
  241. {
  242. _onNext = onNext;
  243. _onError = onError;
  244. _onCompleted = onCompleted;
  245. }
  246. public void OnCompleted()
  247. {
  248. _onCompleted();
  249. }
  250. public void OnError(Exception error)
  251. {
  252. _onError(error);
  253. }
  254. public void OnNext(T value)
  255. {
  256. _onNext(value);
  257. }
  258. }
  259. #endif
  260. }
  261. }
  262. #endif