PageRenderTime 75ms CodeModel.GetById 49ms RepoModel.GetById 1ms app.codeStats 0ms

/Silverlight4/Infrastructure/TestFramework/UnitTesting/TestServiceProvider.cs

https://github.com/kvervo/HorizontalLoopingSelector
C# | 259 lines | 119 code | 23 blank | 117 comment | 7 complexity | db98932d4449db0812ba9633baaa2717 MD5 | raw file
  1. // (c) Copyright Microsoft Corporation.
  2. // This source is subject to the Microsoft Public License (Ms-PL).
  3. // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
  4. // All other rights reserved.
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Diagnostics.CodeAnalysis;
  8. using System.Globalization;
  9. using System.Linq;
  10. using Microsoft.Silverlight.Testing.Service;
  11. namespace Microsoft.Silverlight.Testing.Harness
  12. {
  13. /// <summary>
  14. /// A system that provides test services.
  15. /// </summary>
  16. public class TestServiceProvider : ProviderBase
  17. {
  18. /// <summary>
  19. /// The dictionary of services registered with this provider instance.
  20. /// </summary>
  21. private Dictionary<object, ProviderBase> _services;
  22. /// <summary>
  23. /// Gets or sets a unique test run identifier, if any is present.
  24. /// </summary>
  25. public string UniqueTestRunIdentifier { get; set; }
  26. /// <summary>
  27. /// Gets or sets an integer value that can be used to manage simple
  28. /// reference counting services.
  29. /// </summary>
  30. internal int BusyServiceReferenceCounter { get; set; }
  31. /// <summary>
  32. /// Initializes a new test service provider instance.
  33. /// </summary>
  34. public TestServiceProvider() : base(null, "All Test Services")
  35. {
  36. _services = new Dictionary<object, ProviderBase>();
  37. }
  38. /// <summary>
  39. /// Initializes the provider and all of its test services.
  40. /// </summary>
  41. public override void Initialize()
  42. {
  43. InitializeAllServices();
  44. }
  45. /// <summary>
  46. /// Initialize all services and features synchronously.
  47. /// </summary>
  48. public void InitializeAllServices()
  49. {
  50. // Find and wire up the first un-initialized provider
  51. if (_services.Values.Count(i => ! i.Initialized) > 0)
  52. {
  53. ProviderBase pb = _services.Values.First(i => ! i.Initialized);
  54. pb.InitializeCompleted += (sender, e) => InitializeAllServices();
  55. pb.Initialize();
  56. }
  57. else
  58. {
  59. // Fires the initialization finished event
  60. base.Initialize();
  61. }
  62. }
  63. /// <summary>
  64. /// Register a new service that the test service should expose.
  65. /// </summary>
  66. /// <param name="feature">Known feature type.</param>
  67. /// <param name="serviceInstance">Instance of the feature's
  68. /// <see cref='ProviderBase' /> type.</param>
  69. public void RegisterService(TestServiceFeature feature, ProviderBase serviceInstance)
  70. {
  71. _services.Add(feature, serviceInstance);
  72. }
  73. /// <summary>
  74. /// Register a new service that the test service should expose.
  75. /// </summary>
  76. /// <param name="featureName">String name of the feature if the known
  77. /// enum value does not exist.</param>
  78. /// <param name="serviceInstance">Instance of the feature's
  79. /// <see cref='ProviderBase' /> type.</param>
  80. public void RegisterService(string featureName, ProviderBase serviceInstance)
  81. {
  82. _services.Add(featureName, serviceInstance);
  83. }
  84. /// <summary>
  85. /// Unregisters a feature.
  86. /// </summary>
  87. /// <param name="feature">Known feature type.</param>
  88. public void UnregisterService(TestServiceFeature feature)
  89. {
  90. _services.Remove(feature);
  91. }
  92. /// <summary>
  93. /// Unregisters a feature.
  94. /// </summary>
  95. /// <param name="featureName">Known feature type string.</param>
  96. public void UnregisterService(string featureName)
  97. {
  98. _services.Remove(featureName);
  99. }
  100. /// <summary>
  101. /// Check if a requested feature is supported by the test service
  102. /// provider.
  103. /// </summary>
  104. /// <param name="feature">Feature of interest.</param>
  105. /// <returns>A value indicating whether the feature exists.</returns>
  106. public bool HasService(TestServiceFeature feature)
  107. {
  108. return (GetServiceInternal(feature) != null);
  109. }
  110. /// <summary>
  111. /// Check if a requested feature is supported by the test service
  112. /// provider.
  113. /// </summary>
  114. /// <param name="featureName">Feature of interest.</param>
  115. /// <returns>A value indicating whether the feature exists.</returns>
  116. public bool HasService(string featureName)
  117. {
  118. return (GetServiceInternal(featureName) != null);
  119. }
  120. /// <summary>
  121. /// Retrieve a feature. An exception will be thrown if the service
  122. /// does not exist.
  123. /// </summary>
  124. /// <typeparam name="TService">Type of a service, ProviderBase.</typeparam>
  125. /// <param name="feature">The feature of interest.</param>
  126. /// <returns>Returns the feature, cast properly.</returns>
  127. [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Simplifies calling code.")]
  128. public TService GetService<TService>(TestServiceFeature feature)
  129. where TService : ProviderBase
  130. {
  131. RequireService(feature);
  132. return GetService(feature) as TService;
  133. }
  134. /// <summary>
  135. /// Retrieve a feature.
  136. /// </summary>
  137. /// <param name="feature">Feature of interest.</param>
  138. /// <returns>The feature's provider.</returns>
  139. public ProviderBase GetService(TestServiceFeature feature)
  140. {
  141. return GetServiceInternal(feature);
  142. }
  143. /// <summary>
  144. /// Retrieve a feature.
  145. /// </summary>
  146. /// <param name="featureName">Feature of interest.</param>
  147. /// <returns>The service or null if one was not present.</returns>
  148. public ProviderBase GetService(string featureName)
  149. {
  150. return GetServiceInternal(featureName);
  151. }
  152. /// <summary>
  153. /// Require a feature, or throw an exception if it isn't available.
  154. /// </summary>
  155. /// <param name="feature">Feature of interest.</param>
  156. /// <param name="requiredType">The required type.</param>
  157. /// <returns>The service or null if one was not present.</returns>
  158. public ProviderBase RequireService(TestServiceProvider feature, Type requiredType)
  159. {
  160. return RequireServiceInternal(feature, requiredType);
  161. }
  162. /// <summary>
  163. /// Require a feature, or throw an exception if it isn't available.
  164. /// </summary>
  165. /// <param name="featureName">Feature of interest.</param>
  166. /// <param name="requiredType">The required type.</param>
  167. /// <returns>The service or null if one was not present.</returns>
  168. public ProviderBase RequireService(string featureName, Type requiredType)
  169. {
  170. return RequireServiceInternal(featureName, requiredType);
  171. }
  172. /// <summary>
  173. /// Require a feature or interest.
  174. /// </summary>
  175. /// <param name="feature">Feature of interest.</param>
  176. /// <returns>The service or null if one was not present.</returns>
  177. public ProviderBase RequireService(TestServiceFeature feature)
  178. {
  179. return RequireServiceInternal(feature);
  180. }
  181. /// <summary>
  182. /// Requires a service.
  183. /// </summary>
  184. /// <param name="featureName">Feature of interest.</param>
  185. /// <returns>The service or null if one was not present.</returns>
  186. public ProviderBase RequireService(string featureName)
  187. {
  188. return RequireServiceInternal(featureName);
  189. }
  190. /// <summary>
  191. /// Check for and required the presence of a service. Throws an
  192. /// InvalidOperationException message if the service is unavailable.
  193. /// </summary>
  194. /// <param name="feature">Feature of interest.</param>
  195. /// <returns>The service or null if one was not present.</returns>
  196. private ProviderBase RequireServiceInternal(object feature)
  197. {
  198. ProviderBase service = GetServiceInternal(feature);
  199. if (service == null)
  200. {
  201. throw new InvalidOperationException(
  202. String.Format(CultureInfo.InvariantCulture, "The test service feature \"{0}\" is not available, and is required for an operation.", feature.ToString()));
  203. }
  204. return service;
  205. }
  206. /// <summary>
  207. /// Require a specific feature, and that it can be cast properly.
  208. /// </summary>
  209. /// <param name="feature">Feature of interest.</param>
  210. /// <param name="cast">The type to verify assignment for a cast.</param>
  211. /// <returns>The service or null if one was not present.</returns>
  212. private ProviderBase RequireServiceInternal(object feature, Type cast)
  213. {
  214. ProviderBase pb = RequireServiceInternal(feature);
  215. Type pbt = pb.GetType();
  216. if (!cast.IsAssignableFrom(pbt))
  217. {
  218. throw new InvalidOperationException("A required test service feature was present, but not of the proper type for this application.");
  219. }
  220. return pb;
  221. }
  222. /// <summary>
  223. /// Looks for a specific service.
  224. /// </summary>
  225. /// <param name="feature">Feature of interest.</param>
  226. /// <returns>The service or null if one was not present.</returns>
  227. private ProviderBase GetServiceInternal(object feature)
  228. {
  229. if (_services.ContainsKey(feature))
  230. {
  231. return _services[feature];
  232. }
  233. return null;
  234. }
  235. }
  236. }