SelectorTests_Class.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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.NotNull(match.Activator);
  35. Assert.True(await match.Activator.Take(1));
  36. }
  37. [Fact]
  38. public async Task Class_Doesnt_Match_Control_Without_Class()
  39. {
  40. var control = new Control1
  41. {
  42. Classes = { "bar" },
  43. };
  44. var target = default(Selector).Class("foo");
  45. var match = target.Match(control);
  46. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  47. Assert.NotNull(match.Activator);
  48. Assert.False(await match.Activator.Take(1));
  49. }
  50. [Fact]
  51. public async Task Class_Matches_Control_With_TemplatedParent()
  52. {
  53. var control = new Control1
  54. {
  55. Classes = { "foo" },
  56. TemplatedParent = new Button(),
  57. };
  58. var target = default(Selector).Class("foo");
  59. var match = target.Match(control);
  60. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  61. Assert.NotNull(match.Activator);
  62. Assert.True(await match.Activator.Take(1));
  63. }
  64. [Fact]
  65. public async Task Class_Tracks_Additions()
  66. {
  67. var control = new Control1();
  68. var target = default(Selector).Class("foo");
  69. var activator = target.Match(control).Activator;
  70. Assert.NotNull(activator);
  71. var observable = activator.ToObservable();
  72. Assert.False(await observable.Take(1));
  73. control.Classes.Add("foo");
  74. Assert.True(await observable.Take(1));
  75. }
  76. [Fact]
  77. public async Task Class_Tracks_Removals()
  78. {
  79. var control = new Control1
  80. {
  81. Classes = { "foo" },
  82. };
  83. var target = default(Selector).Class("foo");
  84. var activator = target.Match(control).Activator;
  85. Assert.NotNull(activator);
  86. var observable = activator.ToObservable();
  87. Assert.True(await observable.Take(1));
  88. control.Classes.Remove("foo");
  89. Assert.False(await observable.Take(1));
  90. }
  91. [Fact]
  92. public async Task Multiple_Classes()
  93. {
  94. var control = new Control1();
  95. var target = default(Selector).Class("foo").Class("bar");
  96. var activator = target.Match(control).Activator;
  97. Assert.NotNull(activator);
  98. var observable = activator.ToObservable();
  99. Assert.False(await observable.Take(1));
  100. control.Classes.Add("foo");
  101. Assert.False(await observable.Take(1));
  102. control.Classes.Add("bar");
  103. Assert.True(await observable.Take(1));
  104. control.Classes.Remove("bar");
  105. Assert.False(await observable.Take(1));
  106. }
  107. [Fact]
  108. public void Only_Notifies_When_Result_Changes()
  109. {
  110. // Test for #1698
  111. var control = new Control1
  112. {
  113. Classes = { "foo" },
  114. };
  115. var target = default(Selector).Class("foo");
  116. var activator = target.Match(control).Activator;
  117. Assert.NotNull(activator);
  118. var result = new List<bool>();
  119. using (activator.Subscribe(x => result.Add(x)))
  120. {
  121. control.Classes.Add("bar");
  122. control.Classes.Remove("foo");
  123. }
  124. Assert.Equal(new[] { true, false }, result);
  125. }
  126. public class Control1 : Control
  127. {
  128. }
  129. }
  130. }