/V2.2/trunk/CAL/Desktop/Composite.Presentation.Tests/Regions/Behaviors/DelayedRegionCreationBehaviorFixture.cs

# · C# · 206 lines · 146 code · 44 blank · 16 comment · 2 complexity · 66b13971775954afe04d7fb441ed003b MD5 · raw file

  1. //===================================================================================
  2. // Microsoft patterns & practices
  3. // Composite Application Guidance for Windows Presentation Foundation and Silverlight
  4. //===================================================================================
  5. // Copyright (c) Microsoft Corporation. All rights reserved.
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
  7. // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
  8. // LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  9. // FITNESS FOR A PARTICULAR PURPOSE.
  10. //===================================================================================
  11. // The example companies, organizations, products, domain names,
  12. // e-mail addresses, logos, people, places, and events depicted
  13. // herein are fictitious. No association with any real company,
  14. // organization, product, domain name, email address, logo, person,
  15. // places, or events is intended or should be inferred.
  16. //===================================================================================
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Linq;
  20. using System.Windows;
  21. using System.Windows.Controls;
  22. using Microsoft.Practices.Composite.Presentation.Regions;
  23. using Microsoft.Practices.Composite.Presentation.Regions.Behaviors;
  24. using Microsoft.Practices.Composite.Presentation.Tests.Mocks;
  25. using Microsoft.Practices.Composite.Regions;
  26. using Microsoft.VisualStudio.TestTools.UnitTesting;
  27. namespace Microsoft.Practices.Composite.Presentation.Tests.Regions.Behaviors
  28. {
  29. [TestClass]
  30. public class DelayedRegionCreationBehaviorFixture
  31. {
  32. private DelayedRegionCreationBehavior GetBehavior(DependencyObject control, MockRegionManagerAccessor accessor, MockRegionAdapter adapter)
  33. {
  34. var mappings = new RegionAdapterMappings();
  35. mappings.RegisterMapping(control.GetType(), adapter);
  36. var behavior = new DelayedRegionCreationBehavior(mappings);
  37. behavior.RegionManagerAccessor = accessor;
  38. behavior.TargetElement = control;
  39. return behavior;
  40. }
  41. private DelayedRegionCreationBehavior GetBehavior(DependencyObject control, MockRegionManagerAccessor accessor)
  42. {
  43. return GetBehavior(control, accessor, new MockRegionAdapter());
  44. }
  45. [TestMethod]
  46. public void RegionWillNotGetCreatedTwiceWhenThereAreMoreRegions()
  47. {
  48. var control1 = new MockFrameworkElement();
  49. var control2 = new MockFrameworkElement();
  50. var accessor = new MockRegionManagerAccessor
  51. {
  52. GetRegionName = d => d == control1 ? "Region1" : "Region2"
  53. };
  54. var adapter = new MockRegionAdapter();
  55. adapter.Accessor = accessor;
  56. var behavior1 = this.GetBehavior(control1, accessor, adapter);
  57. var behavior2 = this.GetBehavior(control2, accessor, adapter);
  58. behavior1.Attach();
  59. behavior2.Attach();
  60. accessor.UpdateRegions();
  61. Assert.IsTrue(adapter.CreatedRegions.Contains("Region1"));
  62. Assert.IsTrue(adapter.CreatedRegions.Contains("Region2"));
  63. Assert.AreEqual(1, adapter.CreatedRegions.Count((name) => name == "Region2"));
  64. }
  65. [TestMethod]
  66. public void RegionGetsCreatedWhenAccessingRegions()
  67. {
  68. var control = new MockFrameworkElement();
  69. var accessor = new MockRegionManagerAccessor
  70. {
  71. GetRegionName = d => "myRegionName"
  72. };
  73. var behavior = this.GetBehavior(control, accessor);
  74. behavior.Attach();
  75. accessor.UpdateRegions();
  76. Assert.IsNotNull(RegionManager.GetObservableRegion(control).Value);
  77. Assert.IsInstanceOfType(RegionManager.GetObservableRegion(control).Value, typeof(IRegion));
  78. }
  79. [TestMethod]
  80. public void RegionDoesNotGetCreatedTwiceWhenUpdatingRegions()
  81. {
  82. var control = new MockFrameworkElement();
  83. var accessor = new MockRegionManagerAccessor
  84. {
  85. GetRegionName = d => "myRegionName"
  86. };
  87. var behavior = this.GetBehavior(control, accessor);
  88. behavior.Attach();
  89. accessor.UpdateRegions();
  90. IRegion region = RegionManager.GetObservableRegion(control).Value;
  91. accessor.UpdateRegions();
  92. Assert.AreSame(region, RegionManager.GetObservableRegion(control).Value);
  93. }
  94. [TestMethod]
  95. public void BehaviorDoesNotPreventControlFromBeingGarbageCollected()
  96. {
  97. var control = new MockFrameworkElement();
  98. WeakReference controlWeakReference = new WeakReference(control);
  99. var accessor = new MockRegionManagerAccessor
  100. {
  101. GetRegionName = d => "myRegionName"
  102. };
  103. var behavior = this.GetBehavior(control, accessor);
  104. behavior.Attach();
  105. Assert.IsTrue(controlWeakReference.IsAlive);
  106. GC.KeepAlive(control);
  107. control = null;
  108. GC.Collect();
  109. Assert.IsFalse(controlWeakReference.IsAlive);
  110. }
  111. [TestMethod]
  112. public void BehaviorDoesNotPreventControlFromBeingGarbageCollectedWhenRegionWasCreated()
  113. {
  114. var control = new MockFrameworkElement();
  115. WeakReference controlWeakReference = new WeakReference(control);
  116. var accessor = new MockRegionManagerAccessor
  117. {
  118. GetRegionName = d => "myRegionName"
  119. };
  120. var behavior = this.GetBehavior(control, accessor);
  121. behavior.Attach();
  122. accessor.UpdateRegions();
  123. Assert.IsTrue(controlWeakReference.IsAlive);
  124. GC.KeepAlive(control);
  125. control = null;
  126. GC.Collect();
  127. Assert.IsFalse(controlWeakReference.IsAlive);
  128. }
  129. [TestMethod]
  130. public void BehaviorShouldUnhookEventWhenDetaching()
  131. {
  132. var control = new MockFrameworkElement();
  133. var accessor = new MockRegionManagerAccessor
  134. {
  135. GetRegionName = d => "myRegionName",
  136. };
  137. var behavior = this.GetBehavior(control, accessor);
  138. behavior.Attach();
  139. int startingCount = accessor.GetSubscribersCount();
  140. behavior.Detach();
  141. Assert.AreEqual<int>(startingCount - 1, accessor.GetSubscribersCount());
  142. }
  143. [TestMethod]
  144. public void ShouldCleanupBehaviorOnceRegionIsCreated()
  145. {
  146. var control = new MockFrameworkElement();
  147. var accessor = new MockRegionManagerAccessor
  148. {
  149. GetRegionName = d => "myRegionName"
  150. };
  151. var behavior = this.GetBehavior(control, accessor);
  152. WeakReference behaviorWeakReference = new WeakReference(behavior);
  153. behavior.Attach();
  154. accessor.UpdateRegions();
  155. Assert.IsTrue(behaviorWeakReference.IsAlive);
  156. GC.KeepAlive(behavior);
  157. behavior = null;
  158. GC.Collect();
  159. Assert.IsFalse(behaviorWeakReference.IsAlive);
  160. }
  161. }
  162. }