PageRenderTime 50ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/System.Reactive.Tests/System.Reactive.Subjects/SubjectSequenceTest.cs

https://github.com/gshackles/mono-reactive
C# | 119 lines | 109 code | 10 blank | 0 comment | 11 complexity | 15a16c9841b83e76fb6675eb0a22f739 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Reactive;
  5. using System.Reactive.Disposables;
  6. using System.Reactive.Linq;
  7. using System.Threading;
  8. using NUnit.Framework;
  9. namespace System.Reactive.Subjects.Tests
  10. {
  11. [TestFixture]
  12. public class SubjectSequenceTest
  13. {
  14. [Flags]
  15. enum Subjects
  16. {
  17. Simple = 1,
  18. Replay = 2,
  19. ProcessAll = 3,
  20. Behavior = 4,
  21. Async = 8,
  22. All = 15,
  23. }
  24. void RunTest<T> (Subjects target, Action<ISubject<T>> action)
  25. {
  26. if ((target & Subjects.Simple) != 0)
  27. action (new Subject<T> ());
  28. if ((target & Subjects.Replay) != 0)
  29. action (new ReplaySubject<T> ());
  30. if ((target & Subjects.Behavior) != 0)
  31. action (new BehaviorSubject<T> (default (T)));
  32. if ((target & Subjects.Async) != 0)
  33. action (new AsyncSubject<T> ());
  34. }
  35. [Test]
  36. public void NoOnNextAfterOnCompleted ()
  37. {
  38. RunTest<int> (Subjects.ProcessAll | Subjects.Async, sub => {
  39. sub.Subscribe (v => Assert.Fail ("should not raise OnNext : " + sub));
  40. sub.OnCompleted ();
  41. sub.OnNext (0);
  42. });
  43. }
  44. [Test]
  45. public void NoOnNextAfterOnError ()
  46. {
  47. RunTest<int> (Subjects.ProcessAll | Subjects.Async, sub => {
  48. bool error = false;
  49. sub.Subscribe (v => Assert.Fail ("should not raise OnNext : " + sub), ex => error = true, () => Assert.Fail ("should not complete : " + sub));
  50. sub.OnError (new Exception ());
  51. sub.OnNext (0);
  52. Assert.IsTrue (error, "#1: " + sub);
  53. });
  54. }
  55. [Test]
  56. public void OnNextAfterOnCompletedIgnored ()
  57. {
  58. RunTest<int> (Subjects.ProcessAll, sub => {
  59. int i = 0;
  60. sub.Subscribe (v => i += v);
  61. sub.OnNext (3);
  62. sub.OnNext (4);
  63. sub.OnCompleted ();
  64. sub.OnNext (5);
  65. Assert.AreEqual (7, i, "#1 " + sub);
  66. });
  67. }
  68. [Test]
  69. public void NoOnCompletedAfterOnCompleted ()
  70. {
  71. RunTest<int> (Subjects.All, sub => {
  72. bool completed = false;
  73. sub.Subscribe (v => {}, () => {if (completed) Assert.Fail ("Should not complete twice : " + sub); else completed = true; });
  74. sub.OnCompleted ();
  75. sub.OnCompleted ();
  76. });
  77. }
  78. [Test]
  79. public void NoOnErrorAfterOnCompleted ()
  80. {
  81. RunTest<int> (Subjects.All, sub => {
  82. sub.Subscribe (v => {}, ex => Assert.Fail ("Should not raise error after OnCompleted : " + sub));
  83. sub.OnCompleted ();
  84. sub.OnError (new Exception ("foo"));
  85. });
  86. }
  87. [Test]
  88. public void NoOnErrorAfterOnError ()
  89. {
  90. RunTest<int> (Subjects.All, sub => {
  91. bool error = false;
  92. sub.Subscribe (v => {}, ex => { if (error) Assert.Fail ("Should not raise error after OnCompleted"); else error = true; }, () => Assert.Fail ("should not complete : " + sub));
  93. sub.OnError (new Exception ("foo"));
  94. sub.OnError (new Exception ("foo"));
  95. });
  96. }
  97. [Test]
  98. public void NoOnCompleteAfterOnError ()
  99. {
  100. RunTest<int> (Subjects.All, sub => {
  101. bool error = false;
  102. sub.Subscribe (v => {}, ex => error = true, () => Assert.Fail ("should not complete : " + sub));
  103. sub.OnError (new Exception ("foo"));
  104. sub.OnError (new Exception ("foo"));
  105. Assert.IsTrue (error, "#1 : " + sub);
  106. });
  107. }
  108. }
  109. }