/Exploration.Tests/Exploration/RXfixture.cs

https://github.com/GunioRobot/InRetail · C# · 243 lines · 198 code · 42 blank · 3 comment · 3 complexity · 67aff0f109cfefb224ebc8a571b44384 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using InRetail.UiCore.Extensions;
  10. using NUnit.Framework;
  11. namespace Tests.InRetail.Exploration
  12. {
  13. [TestFixture]
  14. public class RXfixture
  15. {
  16. [Test]
  17. public void ObservableImplementation()
  18. {
  19. var observable = new MyObservable();
  20. Action<string> print = (v) => Debug.WriteLine(v);
  21. IDisposable subscribe1 = observable.Subscribe(print);
  22. Thread.Sleep(9000);
  23. //var subject = observable.Record();
  24. Debug.WriteLine("");
  25. IDisposable subscribe2 = observable.Subscribe(print);
  26. IDisposable subscribe3 = observable.Subscribe(print);
  27. Thread.Sleep(2000);
  28. subscribe1.Dispose();
  29. subscribe2.Dispose();
  30. subscribe3.Dispose();
  31. Thread.Sleep(1000);
  32. //subject.Subscribe((v) => Debug.WriteLine("Recorded" +v));
  33. Thread.Sleep(1000);
  34. }
  35. [Test]
  36. public void TaskTest()
  37. {
  38. IObservable<Foo> observable = Observable.Create<Foo>((o) =>
  39. {
  40. Task task = Task.Factory.StartNew(() =>
  41. {
  42. for (
  43. int
  44. i
  45. =
  46. 0;
  47. i <
  48. Int32
  49. .
  50. MaxValue;
  51. i
  52. ++)
  53. {
  54. o
  55. .
  56. OnNext
  57. (new Foo
  58. {
  59. Id
  60. =
  61. i
  62. });
  63. }
  64. });
  65. Action unsubscribe = () =>
  66. {
  67. Debug.WriteLine(
  68. "Dispose");
  69. o.OnCompleted();
  70. task.Dispose();
  71. };
  72. return unsubscribe;
  73. });
  74. IDisposable disposable = observable.Subscribe((f) => Debug.WriteLine(f.Id));
  75. Thread.Sleep(2000);
  76. disposable.Dispose();
  77. Thread.Sleep(2000);
  78. }
  79. [Test]
  80. public void Test()
  81. {
  82. var ints = new[] { 1, 2, 3, 4, 5 };
  83. IObservable<int> enumerable = ints.SelectMany(x => x % 2 != 0 ? new[] { x } : new int[] { }).ToObservable();
  84. IObservable<int> observable = ints.ToObservable();
  85. IDisposable subscribe = observable.Subscribe(x => Debug.WriteLine(x.ToString()));
  86. IDisposable subscribe2 = enumerable.Subscribe(x => Debug.WriteLine(x.ToString()));
  87. }
  88. [Test]
  89. public void WebRequestTest()
  90. {
  91. WebRequest request = WebRequest.Create("http://www.google.ge/");
  92. IObservable<string> html = from response in request.GetResponseAsync()
  93. let responseStream = response.GetResponseStream()
  94. let reader = new StreamReader(responseStream)
  95. select reader.ReadToEnd();
  96. IDisposable htmlSub = html.Subscribe(x => Debug.WriteLine(x));
  97. Thread.Sleep(2000);
  98. }
  99. [Test]
  100. public void ZipTest()
  101. {
  102. //Observable.Context = SynchronizationContext.Current;
  103. var si = new Subject<int>();
  104. var ss = new Subject<string>();
  105. IObservable<string> zo = si.Zip(ss, (i, s) => i.ToString() + s);
  106. string output = "";
  107. Action<string> actual = (s) => output += s;
  108. si.Subscribe(x => actual(x.ToString()));
  109. ss.Subscribe(x => actual(x.ToString()));
  110. zo.Subscribe(x => actual(x.ToString()));
  111. si.OnNext(1);
  112. ss.OnNext("a");
  113. ss.OnNext("b");
  114. ss.OnNext("c");
  115. ss.OnNext("d");
  116. si.OnNext(2);
  117. si.OnNext(3);
  118. si.OnNext(4);
  119. string expected = "1a1abcd22b33c44d";
  120. Thread.Sleep(1000);
  121. Assert.AreEqual(expected, output);
  122. }
  123. [Test]
  124. public void AmbTest()
  125. {
  126. var enumerable0 = CreateRandomEnumerable("Acho").ToObservable();
  127. var enumerable1 = CreateRandomEnumerable("foo").ToObservable();
  128. var enumerable2 = CreateRandomEnumerable("bar").ToObservable();
  129. var pattern = Observable.Amb(enumerable0, enumerable1, enumerable2);
  130. pattern.Subscribe(Console.WriteLine);
  131. Thread.Sleep(1000);
  132. }
  133. IEnumerable<T> CreateRandomEnumerable<T>(T value)
  134. {
  135. var random = new Random();
  136. Thread.Sleep(random.Next(1, 10));
  137. yield return value;
  138. }
  139. }
  140. public class MyObservable : IObservable<String>
  141. {
  142. private readonly object _lockobj = new object();
  143. private readonly List<IObserver<string>> _observers = new List<IObserver<string>>();
  144. public MyObservable()
  145. {
  146. Run();
  147. }
  148. public IDisposable Subscribe(IObserver<string> observer)
  149. {
  150. lock (_lockobj)
  151. {
  152. _observers.Add(observer);
  153. }
  154. return new MySubscriptionDisposable(() =>
  155. {
  156. lock (_lockobj)
  157. {
  158. _observers.Remove(observer);
  159. }
  160. });
  161. }
  162. private void MyTask()
  163. {
  164. for (int i = 1; i < 100; i++)
  165. {
  166. _observers.Each(o => o.OnNext(i.ToString()));
  167. Thread.Sleep(100);
  168. }
  169. _observers.Each(o => o.OnCompleted());
  170. }
  171. private void Run()
  172. {
  173. Task.Factory.StartNew(
  174. MyTask);
  175. }
  176. public class MySubscriptionDisposable : IDisposable
  177. {
  178. private readonly Action _action;
  179. public MySubscriptionDisposable(Action action)
  180. {
  181. _action = action;
  182. }
  183. public void Dispose()
  184. {
  185. _action();
  186. }
  187. }
  188. }
  189. public static class ObservableEx
  190. {
  191. public static IObservable<WebResponse> GetResponseAsync(this WebRequest request)
  192. {
  193. return Observable.FromAsyncPattern(request.BeginGetResponse, ar => request.EndGetResponse(ar))();
  194. }
  195. }
  196. public class Foo
  197. {
  198. public int Id { get; set; }
  199. public string Name { get; set; }
  200. }
  201. }