ResourceDictionaryTests.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using System;
  2. using Avalonia.Controls;
  3. using Moq;
  4. using Xunit;
  5. namespace Avalonia.Styling.UnitTests
  6. {
  7. public class ResourceDictionaryTests
  8. {
  9. [Fact]
  10. public void Cannot_Add_Null_Key()
  11. {
  12. var target = new ResourceDictionary();
  13. Assert.Throws<ArgumentNullException>(() => target.Add(null, "null"));
  14. }
  15. [Fact]
  16. public void Can_Add_Null_Value()
  17. {
  18. var target = new ResourceDictionary();
  19. target.Add("null", null);
  20. }
  21. [Fact]
  22. public void TryGetResource_Should_Find_Resource()
  23. {
  24. var target = new ResourceDictionary
  25. {
  26. { "foo", "bar" },
  27. };
  28. Assert.True(target.TryGetResource("foo", out var result));
  29. Assert.Equal("bar", result);
  30. }
  31. [Fact]
  32. public void TryGetResource_Should_Find_Resource_From_Merged_Dictionary()
  33. {
  34. var target = new ResourceDictionary
  35. {
  36. MergedDictionaries =
  37. {
  38. new ResourceDictionary
  39. {
  40. { "foo", "bar" },
  41. }
  42. }
  43. };
  44. Assert.True(target.TryGetResource("foo", out var result));
  45. Assert.Equal("bar", result);
  46. }
  47. [Fact]
  48. public void TryGetResource_Should_Find_Resource_From_Itself_Before_Merged_Dictionary()
  49. {
  50. var target = new ResourceDictionary
  51. {
  52. { "foo", "bar" },
  53. };
  54. target.MergedDictionaries.Add(new ResourceDictionary
  55. {
  56. { "foo", "baz" },
  57. });
  58. Assert.True(target.TryGetResource("foo", out var result));
  59. Assert.Equal("bar", result);
  60. }
  61. [Fact]
  62. public void TryGetResource_Should_Find_Resource_From_Later_Merged_Dictionary()
  63. {
  64. var target = new ResourceDictionary
  65. {
  66. MergedDictionaries =
  67. {
  68. new ResourceDictionary
  69. {
  70. { "foo", "bar" },
  71. },
  72. new ResourceDictionary
  73. {
  74. { "foo", "baz" },
  75. }
  76. }
  77. };
  78. Assert.True(target.TryGetResource("foo", out var result));
  79. Assert.Equal("baz", result);
  80. }
  81. [Fact]
  82. public void NotifyHostedResourcesChanged_Should_Be_Called_On_AddOwner()
  83. {
  84. var host = new Mock<IResourceHost>();
  85. var target = new ResourceDictionary { { "foo", "bar" } };
  86. ((IResourceProvider)target).AddOwner(host.Object);
  87. host.Verify(x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()));
  88. }
  89. [Fact]
  90. public void NotifyHostedResourcesChanged_Should_Be_Called_On_RemoveOwner()
  91. {
  92. var host = new Mock<IResourceHost>();
  93. var target = new ResourceDictionary { { "foo", "bar" } };
  94. ((IResourceProvider)target).AddOwner(host.Object);
  95. host.Invocations.Clear();
  96. ((IResourceProvider)target).RemoveOwner(host.Object);
  97. host.Verify(x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()));
  98. }
  99. [Fact]
  100. public void NotifyHostedResourcesChanged_Should_Be_Called_On_Resource_Add()
  101. {
  102. var host = new Mock<IResourceHost>();
  103. var target = new ResourceDictionary(host.Object);
  104. host.Invocations.Clear();
  105. target.Add("foo", "bar");
  106. host.Verify(x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()));
  107. }
  108. [Fact]
  109. public void NotifyHostedResourcesChanged_Should_Be_Called_On_MergedDictionary_Add()
  110. {
  111. var host = new Mock<IResourceHost>();
  112. var target = new ResourceDictionary(host.Object);
  113. host.Invocations.Clear();
  114. target.MergedDictionaries.Add(new ResourceDictionary
  115. {
  116. { "foo", "bar" },
  117. });
  118. host.Verify(
  119. x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()),
  120. Times.Once);
  121. }
  122. [Fact]
  123. public void NotifyHostedResourcesChanged_Should_Not_Be_Called_On_Empty_MergedDictionary_Add()
  124. {
  125. var host = new Mock<IResourceHost>();
  126. var target = new ResourceDictionary(host.Object);
  127. host.Invocations.Clear();
  128. target.MergedDictionaries.Add(new ResourceDictionary());
  129. host.Verify(
  130. x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()),
  131. Times.Never);
  132. }
  133. [Fact]
  134. public void NotifyHostedResourcesChanged_Should_Be_Called_On_MergedDictionary_Remove()
  135. {
  136. var host = new Mock<IResourceHost>();
  137. var target = new ResourceDictionary(host.Object)
  138. {
  139. MergedDictionaries =
  140. {
  141. new ResourceDictionary { { "foo", "bar" } },
  142. }
  143. };
  144. host.Invocations.Clear();
  145. target.MergedDictionaries.RemoveAt(0);
  146. host.Verify(
  147. x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()),
  148. Times.Once);
  149. }
  150. [Fact]
  151. public void NotifyHostedResourcesChanged_Should_Be_Called_On_MergedDictionary_Resource_Add()
  152. {
  153. var host = new Mock<IResourceHost>();
  154. var target = new ResourceDictionary(host.Object)
  155. {
  156. MergedDictionaries =
  157. {
  158. new ResourceDictionary(),
  159. }
  160. };
  161. host.Invocations.Clear();
  162. ((IResourceDictionary)target.MergedDictionaries[0]).Add("foo", "bar");
  163. host.Verify(
  164. x => x.NotifyHostedResourcesChanged(It.IsAny<ResourcesChangedEventArgs>()),
  165. Times.Once);
  166. }
  167. [Fact]
  168. public void Sets_Added_MergedDictionary_Owner()
  169. {
  170. var host = new Mock<IResourceHost>();
  171. var target = new ResourceDictionary(host.Object);
  172. target.MergedDictionaries.Add(new ResourceDictionary());
  173. Assert.Same(host.Object, target.Owner);
  174. Assert.Same(host.Object, ((ResourceDictionary)target.MergedDictionaries[0]).Owner);
  175. }
  176. [Fact]
  177. public void AddOwner_Sets_MergedDictionary_Owner()
  178. {
  179. var host = new Mock<IResourceHost>();
  180. var target = new ResourceDictionary
  181. {
  182. MergedDictionaries =
  183. {
  184. new ResourceDictionary(),
  185. }
  186. };
  187. ((IResourceProvider)target).AddOwner(host.Object);
  188. Assert.Same(host.Object, target.Owner);
  189. Assert.Same(host.Object, ((ResourceDictionary)target.MergedDictionaries[0]).Owner);
  190. }
  191. [Fact]
  192. public void RemoveOwner_Clears_MergedDictionary_Owner()
  193. {
  194. var host = new Mock<IResourceHost>();
  195. var target = new ResourceDictionary(host.Object)
  196. {
  197. MergedDictionaries =
  198. {
  199. new ResourceDictionary(),
  200. }
  201. };
  202. ((IResourceProvider)target).RemoveOwner(host.Object);
  203. Assert.Null(target.Owner);
  204. Assert.Null(((ResourceDictionary)target.MergedDictionaries[0]).Owner);
  205. }
  206. }
  207. }