ExpressionObserverTests_Lifetime.cs 3.6 KB

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