ExpressionObserverTests_Observable.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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.Linq;
  6. using System.Reactive.Subjects;
  7. using Avalonia.Data;
  8. using Avalonia.Markup.Data;
  9. using Avalonia.UnitTests;
  10. using Xunit;
  11. namespace Avalonia.Markup.UnitTests.Data
  12. {
  13. public class ExpressionObserverTests_Observable
  14. {
  15. [Fact]
  16. public void Should_Get_Simple_Observable_Value()
  17. {
  18. using (var sync = UnitTestSynchronizationContext.Begin())
  19. {
  20. var source = new BehaviorSubject<string>("foo");
  21. var data = new { Foo = source };
  22. var target = new ExpressionObserver(data, "Foo");
  23. var result = new List<object>();
  24. var sub = target.Subscribe(x => result.Add(x));
  25. source.OnNext("bar");
  26. sync.ExecutePostedCallbacks();
  27. Assert.Equal(new[] { "foo", "bar" }, result);
  28. }
  29. }
  30. [Fact]
  31. public void Should_Get_Property_Value_From_Observable()
  32. {
  33. using (var sync = UnitTestSynchronizationContext.Begin())
  34. {
  35. var data = new Class1();
  36. var target = new ExpressionObserver(data, "Next.Foo");
  37. var result = new List<object>();
  38. var sub = target.Subscribe(x => result.Add(x));
  39. data.Next.OnNext(new Class2("foo"));
  40. sync.ExecutePostedCallbacks();
  41. Assert.Equal(new[] { "foo" }, result);
  42. sub.Dispose();
  43. Assert.Equal(0, data.PropertyChangedSubscriptionCount);
  44. }
  45. }
  46. [Fact]
  47. public void Should_Get_Simple_Observable_Value_With_DataValidation_Enabled()
  48. {
  49. using (var sync = UnitTestSynchronizationContext.Begin())
  50. {
  51. var source = new BehaviorSubject<string>("foo");
  52. var data = new { Foo = source };
  53. var target = new ExpressionObserver(data, "Foo", true);
  54. var result = new List<object>();
  55. var sub = target.Subscribe(x => result.Add(x));
  56. source.OnNext("bar");
  57. sync.ExecutePostedCallbacks();
  58. // What does it mean to have data validation on an observable? Without a use-case
  59. // it's hard to know what to do here so for the moment the value is returned.
  60. Assert.Equal(new[] { "foo", "bar" }, result);
  61. }
  62. }
  63. [Fact]
  64. public void Should_Get_Property_Value_From_Observable_With_DataValidation_Enabled()
  65. {
  66. using (var sync = UnitTestSynchronizationContext.Begin())
  67. {
  68. var data = new Class1();
  69. var target = new ExpressionObserver(data, "Next.Foo", true);
  70. var result = new List<object>();
  71. var sub = target.Subscribe(x => result.Add(x));
  72. data.Next.OnNext(new Class2("foo"));
  73. sync.ExecutePostedCallbacks();
  74. Assert.Equal(new[] { "foo" }, result);
  75. sub.Dispose();
  76. Assert.Equal(0, data.PropertyChangedSubscriptionCount);
  77. }
  78. }
  79. private class Class1 : NotifyingBase
  80. {
  81. public Subject<Class2> Next { get; } = new Subject<Class2>();
  82. }
  83. private class Class2 : NotifyingBase
  84. {
  85. public Class2(string foo)
  86. {
  87. Foo = foo;
  88. }
  89. public string Foo { get; }
  90. }
  91. }
  92. }