ExpressionObserverTests_Lifetime.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reactive;
  4. using System.Reactive.Linq;
  5. using System.Reactive.Subjects;
  6. using Microsoft.Reactive.Testing;
  7. using Avalonia.Data.Core;
  8. using Xunit;
  9. using Avalonia.Markup.Parsers;
  10. namespace Avalonia.Base.UnitTests.Data.Core
  11. {
  12. public class ExpressionObserverTests_Lifetime
  13. {
  14. [Fact]
  15. public void Should_Complete_When_Source_Observable_Completes()
  16. {
  17. var source = new BehaviorSubject<object>(1);
  18. var target = ExpressionObserver.Create<object, object>(source, o => o);
  19. var completed = false;
  20. target.Subscribe(_ => { }, () => completed = true);
  21. source.OnCompleted();
  22. Assert.True(completed);
  23. }
  24. [Fact]
  25. public void Should_Complete_When_Source_Observable_Errors()
  26. {
  27. var source = new BehaviorSubject<object>(1);
  28. var target = ExpressionObserver.Create<object, object>(source, o => o);
  29. var completed = false;
  30. target.Subscribe(_ => { }, () => completed = true);
  31. source.OnError(new Exception());
  32. Assert.True(completed);
  33. }
  34. [Fact]
  35. public void Should_Complete_When_Update_Observable_Completes()
  36. {
  37. var update = new Subject<ValueTuple>();
  38. var target = ExpressionObserver.Create(() => 1, o => o, update);
  39. var completed = false;
  40. target.Subscribe(_ => { }, () => completed = true);
  41. update.OnCompleted();
  42. Assert.True(completed);
  43. }
  44. [Fact]
  45. public void Should_Complete_When_Update_Observable_Errors()
  46. {
  47. var update = new Subject<ValueTuple>();
  48. var target = ExpressionObserver.Create(() => 1, o => o, update);
  49. var completed = false;
  50. target.Subscribe(_ => { }, () => completed = true);
  51. update.OnError(new Exception());
  52. Assert.True(completed);
  53. }
  54. [Fact]
  55. public void Should_Unsubscribe_From_Source_Observable()
  56. {
  57. var scheduler = new TestScheduler();
  58. var source = scheduler.CreateColdObservable(
  59. OnNext(1, new { Foo = "foo" }));
  60. var target = ExpressionObserver.Create(source, o => o.Foo);
  61. var result = new List<object>();
  62. using (target.Subscribe(x => result.Add(x)))
  63. using (target.Subscribe(_ => { }))
  64. {
  65. scheduler.Start();
  66. }
  67. Assert.Equal(new[] { "foo" }, result);
  68. Assert.All(source.Subscriptions, x => Assert.NotEqual(Subscription.Infinite, x.Unsubscribe));
  69. }
  70. [Fact]
  71. public void Should_Unsubscribe_From_Update_Observable()
  72. {
  73. var scheduler = new TestScheduler();
  74. var update = scheduler.CreateColdObservable<ValueTuple>();
  75. var data = new { Foo = "foo" };
  76. var target = ExpressionObserver.Create(() => data, o => o.Foo, update);
  77. var result = new List<object>();
  78. using (target.Subscribe(x => result.Add(x)))
  79. using (target.Subscribe(_ => { }))
  80. {
  81. scheduler.Start();
  82. }
  83. Assert.Equal(new[] { "foo" }, result);
  84. Assert.All(update.Subscriptions, x => Assert.NotEqual(Subscription.Infinite, x.Unsubscribe));
  85. GC.KeepAlive(data);
  86. }
  87. private static Recorded<Notification<T>> OnNext<T>(long time, T value)
  88. {
  89. return new Recorded<Notification<T>>(time, Notification.CreateOnNext<T>(value));
  90. }
  91. }
  92. }