SelectorTests_Class.cs 4.2 KB

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