ExpressionObserverTests_Negation.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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.Reactive.Linq;
  5. using System.Threading.Tasks;
  6. using Avalonia.Data;
  7. using Avalonia.Data.Core;
  8. using Xunit;
  9. namespace Avalonia.Base.UnitTests.Data.Core
  10. {
  11. public class ExpressionObserverTests_Negation
  12. {
  13. [Fact]
  14. public async Task Should_Negate_Boolean_Value()
  15. {
  16. var data = new { Foo = true };
  17. var target = new ExpressionObserver(data, "!Foo");
  18. var result = await target.Take(1);
  19. Assert.False((bool)result);
  20. GC.KeepAlive(data);
  21. }
  22. [Fact]
  23. public async Task Should_Negate_0()
  24. {
  25. var data = new { Foo = 0 };
  26. var target = new ExpressionObserver(data, "!Foo");
  27. var result = await target.Take(1);
  28. Assert.True((bool)result);
  29. GC.KeepAlive(data);
  30. }
  31. [Fact]
  32. public async Task Should_Negate_1()
  33. {
  34. var data = new { Foo = 1 };
  35. var target = new ExpressionObserver(data, "!Foo");
  36. var result = await target.Take(1);
  37. Assert.False((bool)result);
  38. GC.KeepAlive(data);
  39. }
  40. [Fact]
  41. public async Task Should_Negate_False_String()
  42. {
  43. var data = new { Foo = "false" };
  44. var target = new ExpressionObserver(data, "!Foo");
  45. var result = await target.Take(1);
  46. Assert.True((bool)result);
  47. GC.KeepAlive(data);
  48. }
  49. [Fact]
  50. public async Task Should_Negate_True_String()
  51. {
  52. var data = new { Foo = "True" };
  53. var target = new ExpressionObserver(data, "!Foo");
  54. var result = await target.Take(1);
  55. Assert.False((bool)result);
  56. GC.KeepAlive(data);
  57. }
  58. [Fact]
  59. public async Task Should_Return_BindingNotification_For_String_Not_Convertible_To_Boolean()
  60. {
  61. var data = new { Foo = "foo" };
  62. var target = new ExpressionObserver(data, "!Foo");
  63. var result = await target.Take(1);
  64. Assert.Equal(
  65. new BindingNotification(
  66. new InvalidCastException($"Unable to convert 'foo' to bool."),
  67. BindingErrorType.Error),
  68. result);
  69. GC.KeepAlive(data);
  70. }
  71. [Fact]
  72. public async Task Should_Return_BindingNotification_For_Value_Not_Convertible_To_Boolean()
  73. {
  74. var data = new { Foo = new object() };
  75. var target = new ExpressionObserver(data, "!Foo");
  76. var result = await target.Take(1);
  77. Assert.Equal(
  78. new BindingNotification(
  79. new InvalidCastException($"Unable to convert 'System.Object' to bool."),
  80. BindingErrorType.Error),
  81. result);
  82. GC.KeepAlive(data);
  83. }
  84. [Fact]
  85. public void SetValue_Should_Return_False_For_Invalid_Value()
  86. {
  87. var data = new { Foo = "foo" };
  88. var target = new ExpressionObserver(data, "!Foo");
  89. target.Subscribe(_ => { });
  90. Assert.False(target.SetValue("bar"));
  91. GC.KeepAlive(data);
  92. }
  93. [Fact]
  94. public void Can_SetValue_For_Valid_Value()
  95. {
  96. var data = new Test { Foo = true };
  97. var target = new ExpressionObserver(data, "!Foo");
  98. target.Subscribe(_ => { });
  99. Assert.True(target.SetValue(true));
  100. Assert.False(data.Foo);
  101. }
  102. private class Test
  103. {
  104. public bool Foo { get; set; }
  105. }
  106. }
  107. }