StyleActivatorTests.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright (c) The Perspex Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Reactive;
  6. using System.Reactive.Linq;
  7. using Microsoft.Reactive.Testing;
  8. using Xunit;
  9. namespace Perspex.Styling.UnitTests
  10. {
  11. public class StyleActivatorTests : ReactiveTest
  12. {
  13. [Fact]
  14. public void Activator_Should_Subscribe_To_Inputs_On_First_Subscription()
  15. {
  16. var scheduler = new TestScheduler();
  17. var source = scheduler.CreateColdObservable<bool>();
  18. var target = StyleActivator.And(new[] { source });
  19. Assert.Equal(0, source.Subscriptions.Count);
  20. target.Subscribe(_ => { });
  21. Assert.Equal(1, source.Subscriptions.Count);
  22. }
  23. [Fact]
  24. public void Activator_Should_Unsubscribe_From_Inputs_After_Last_Subscriber_Completes()
  25. {
  26. var scheduler = new TestScheduler();
  27. var source = scheduler.CreateColdObservable<bool>();
  28. var target = StyleActivator.And(new[] { source });
  29. var dispose = target.Subscribe(_ => { });
  30. Assert.Equal(1, source.Subscriptions.Count);
  31. Assert.Equal(Subscription.Infinite, source.Subscriptions[0].Unsubscribe);
  32. dispose.Dispose();
  33. Assert.Equal(1, source.Subscriptions.Count);
  34. Assert.Equal(0, source.Subscriptions[0].Unsubscribe);
  35. }
  36. [Fact]
  37. public void Activator_And_Should_Follow_Single_Input()
  38. {
  39. var inputs = new[] { new TestSubject<bool>(false) };
  40. var target = StyleActivator.And(inputs);
  41. var result = new TestObserver<bool>();
  42. target.Subscribe(result);
  43. Assert.False(result.GetValue());
  44. inputs[0].OnNext(true);
  45. Assert.True(result.GetValue());
  46. inputs[0].OnNext(false);
  47. Assert.False(result.GetValue());
  48. inputs[0].OnNext(true);
  49. Assert.True(result.GetValue());
  50. Assert.Equal(1, inputs[0].SubscriberCount);
  51. }
  52. [Fact]
  53. public void Activator_And_Should_AND_Multiple_Inputs()
  54. {
  55. var inputs = new[]
  56. {
  57. new TestSubject<bool>(false),
  58. new TestSubject<bool>(false),
  59. new TestSubject<bool>(true),
  60. };
  61. var target = StyleActivator.And(inputs);
  62. var result = new TestObserver<bool>();
  63. target.Subscribe(result);
  64. Assert.False(result.GetValue());
  65. inputs[0].OnNext(true);
  66. inputs[1].OnNext(true);
  67. Assert.True(result.GetValue());
  68. inputs[0].OnNext(false);
  69. Assert.False(result.GetValue());
  70. Assert.Equal(1, inputs[0].SubscriberCount);
  71. Assert.Equal(1, inputs[1].SubscriberCount);
  72. Assert.Equal(1, inputs[2].SubscriberCount);
  73. }
  74. [Fact]
  75. public void Activator_Or_Should_Follow_Single_Input()
  76. {
  77. var inputs = new[] { new TestSubject<bool>(false) };
  78. var target = StyleActivator.Or(inputs);
  79. var result = new TestObserver<bool>();
  80. target.Subscribe(result);
  81. Assert.False(result.GetValue());
  82. inputs[0].OnNext(true);
  83. Assert.True(result.GetValue());
  84. inputs[0].OnNext(false);
  85. Assert.False(result.GetValue());
  86. inputs[0].OnNext(true);
  87. Assert.True(result.GetValue());
  88. Assert.Equal(1, inputs[0].SubscriberCount);
  89. }
  90. [Fact]
  91. public void Activator_Or_Should_OR_Multiple_Inputs()
  92. {
  93. var inputs = new[]
  94. {
  95. new TestSubject<bool>(false),
  96. new TestSubject<bool>(false),
  97. new TestSubject<bool>(true),
  98. };
  99. var target = StyleActivator.Or(inputs);
  100. var result = new TestObserver<bool>();
  101. target.Subscribe(result);
  102. Assert.True(result.GetValue());
  103. inputs[2].OnNext(false);
  104. Assert.False(result.GetValue());
  105. inputs[0].OnNext(true);
  106. Assert.True(result.GetValue());
  107. Assert.Equal(1, inputs[0].SubscriberCount);
  108. Assert.Equal(1, inputs[1].SubscriberCount);
  109. Assert.Equal(1, inputs[2].SubscriberCount);
  110. }
  111. [Fact]
  112. public void Activator_Or_Should_Not_Unsubscribe_All_When_Input_Completes_On_False()
  113. {
  114. var inputs = new[]
  115. {
  116. new TestSubject<bool>(false),
  117. new TestSubject<bool>(false),
  118. new TestSubject<bool>(true),
  119. };
  120. var target = StyleActivator.Or(inputs);
  121. var result = new TestObserver<bool>();
  122. target.Subscribe(result);
  123. Assert.True(result.GetValue());
  124. inputs[2].OnNext(false);
  125. Assert.False(result.GetValue());
  126. inputs[2].OnCompleted();
  127. Assert.Equal(1, inputs[0].SubscriberCount);
  128. Assert.Equal(1, inputs[1].SubscriberCount);
  129. Assert.Equal(0, inputs[2].SubscriberCount);
  130. }
  131. [Fact]
  132. public void Completed_Activator_Should_Signal_OnCompleted()
  133. {
  134. var inputs = new[]
  135. {
  136. Observable.Return(false),
  137. };
  138. var target = StyleActivator.Or(inputs);
  139. var completed = false;
  140. target.Subscribe(_ => { }, () => completed = true);
  141. Assert.True(completed);
  142. }
  143. }
  144. }