SelectorTests_Class.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System.Collections.Generic;
  2. using System.Reactive.Linq;
  3. using System.Threading.Tasks;
  4. using Avalonia.Controls;
  5. using Avalonia.Styling;
  6. using Moq;
  7. using Xunit;
  8. namespace Avalonia.Base.UnitTests.Styling
  9. {
  10. public class SelectorTests_Class
  11. {
  12. [Fact]
  13. public void Class_Selector_Should_Have_Correct_String_Representation()
  14. {
  15. var target = default(Selector).Class("foo");
  16. Assert.Equal(".foo", target.ToString());
  17. }
  18. [Fact]
  19. public void PesudoClass_Selector_Should_Have_Correct_String_Representation()
  20. {
  21. var target = default(Selector).Class(":foo");
  22. Assert.Equal(":foo", target.ToString());
  23. }
  24. [Fact]
  25. public async Task Class_Matches_Control_With_Class()
  26. {
  27. var control = new Control1
  28. {
  29. Classes = { "foo" },
  30. };
  31. var target = default(Selector).Class("foo");
  32. var match = target.Match(control);
  33. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  34. Assert.True(await match.Activator.Take(1));
  35. }
  36. [Fact]
  37. public async Task Class_Doesnt_Match_Control_Without_Class()
  38. {
  39. var control = new Control1
  40. {
  41. Classes = { "bar" },
  42. };
  43. var target = default(Selector).Class("foo");
  44. var match = target.Match(control);
  45. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  46. Assert.False(await match.Activator.Take(1));
  47. }
  48. [Fact]
  49. public async Task Class_Matches_Control_With_TemplatedParent()
  50. {
  51. var control = new Control1
  52. {
  53. Classes = { "foo" },
  54. TemplatedParent = new Button(),
  55. };
  56. var target = default(Selector).Class("foo");
  57. var match = target.Match(control);
  58. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  59. Assert.True(await match.Activator.Take(1));
  60. }
  61. [Fact]
  62. public async Task Class_Tracks_Additions()
  63. {
  64. var control = new Control1();
  65. var target = default(Selector).Class("foo");
  66. var activator = target.Match(control).Activator.ToObservable();
  67. Assert.False(await activator.Take(1));
  68. control.Classes.Add("foo");
  69. Assert.True(await activator.Take(1));
  70. }
  71. [Fact]
  72. public async Task Class_Tracks_Removals()
  73. {
  74. var control = new Control1
  75. {
  76. Classes = { "foo" },
  77. };
  78. var target = default(Selector).Class("foo");
  79. var activator = target.Match(control).Activator.ToObservable();
  80. Assert.True(await activator.Take(1));
  81. control.Classes.Remove("foo");
  82. Assert.False(await activator.Take(1));
  83. }
  84. [Fact]
  85. public async Task Multiple_Classes()
  86. {
  87. var control = new Control1();
  88. var target = default(Selector).Class("foo").Class("bar");
  89. var activator = target.Match(control).Activator.ToObservable();
  90. Assert.False(await activator.Take(1));
  91. control.Classes.Add("foo");
  92. Assert.False(await activator.Take(1));
  93. control.Classes.Add("bar");
  94. Assert.True(await activator.Take(1));
  95. control.Classes.Remove("bar");
  96. Assert.False(await activator.Take(1));
  97. }
  98. [Fact]
  99. public void Only_Notifies_When_Result_Changes()
  100. {
  101. // Test for #1698
  102. var control = new Control1
  103. {
  104. Classes = { "foo" },
  105. };
  106. var target = default(Selector).Class("foo");
  107. var activator = target.Match(control).Activator;
  108. var result = new List<bool>();
  109. using (activator.Subscribe(x => result.Add(x)))
  110. {
  111. control.Classes.Add("bar");
  112. control.Classes.Remove("foo");
  113. }
  114. Assert.Equal(new[] { true, false }, result);
  115. }
  116. public class Control1 : Control
  117. {
  118. }
  119. }
  120. }