RequiredCreationPolicyTests.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // -----------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. // -----------------------------------------------------------------------
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel.Composition;
  7. using System.ComponentModel.Composition.Factories;
  8. using System.ComponentModel.Composition.Hosting;
  9. using System.Linq;
  10. using System.Linq.Expressions;
  11. using System.UnitTesting;
  12. using Microsoft.VisualStudio.TestTools.UnitTesting;
  13. namespace Tests.Integration
  14. {
  15. [TestClass]
  16. public class RequiredCreationPolicyTests
  17. {
  18. // Matrix that details which policy to use for a given part to satisfy a given import.
  19. // Part.Any Part.Shared Part.NonShared
  20. // Import.Any Shared Shared NonShared
  21. // Import.Shared Shared Shared N/A
  22. // Import.NonShared NonShared N/A NonShared
  23. public interface ICreationPolicyExport
  24. {
  25. }
  26. [Export(typeof(ICreationPolicyExport))]
  27. public class CreationPolicyAnyExportImplicit : ICreationPolicyExport
  28. {
  29. }
  30. [Export(typeof(ICreationPolicyExport))]
  31. [PartCreationPolicy(CreationPolicy.Any)]
  32. public class CreationPolicyAnyExportExplicit : ICreationPolicyExport
  33. {
  34. }
  35. [Export(typeof(ICreationPolicyExport))]
  36. [PartCreationPolicy(CreationPolicy.Shared)]
  37. public class CreationPolicySharedExport : ICreationPolicyExport
  38. {
  39. }
  40. [Export(typeof(ICreationPolicyExport))]
  41. [PartCreationPolicy(CreationPolicy.NonShared)]
  42. public class CreationPolicyNonSharedExport : ICreationPolicyExport
  43. {
  44. }
  45. [Export]
  46. public class RequiredAnyImporterImplicit
  47. {
  48. [ImportMany]
  49. public IEnumerable<ICreationPolicyExport> Exports { get; set; }
  50. }
  51. [Export]
  52. public class RequiredAnyImporterExplicit
  53. {
  54. [ImportMany(RequiredCreationPolicy = CreationPolicy.Any)]
  55. public IEnumerable<ICreationPolicyExport> Exports { get; set; }
  56. }
  57. [Export]
  58. public class RequiredSharedImporter
  59. {
  60. [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)]
  61. public IEnumerable<ICreationPolicyExport> Exports { get; set; }
  62. }
  63. [Export]
  64. public class RequiredNonSharedImporter
  65. {
  66. [ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
  67. public IEnumerable<ICreationPolicyExport> Exports { get; set; }
  68. }
  69. private static CompositionContainer CreateDefaultContainer()
  70. {
  71. return ContainerFactory.CreateWithAttributedCatalog(
  72. typeof(ICreationPolicyExport),
  73. typeof(CreationPolicyAnyExportImplicit),
  74. typeof(CreationPolicyAnyExportExplicit),
  75. typeof(CreationPolicySharedExport),
  76. typeof(CreationPolicyNonSharedExport),
  77. typeof(RequiredAnyImporterImplicit),
  78. typeof(RequiredAnyImporterExplicit),
  79. typeof(RequiredSharedImporter),
  80. typeof(RequiredNonSharedImporter));
  81. }
  82. [TestMethod]
  83. public void RequiredAnyImporterImplicit_ShouldIncludeAll()
  84. {
  85. var container = CreateDefaultContainer();
  86. var importer = container.GetExportedValue<RequiredAnyImporterImplicit>();
  87. EnumerableAssert.AreEqual(
  88. importer.Exports.Select(obj => obj.GetType()),
  89. typeof(CreationPolicyAnyExportImplicit),
  90. typeof(CreationPolicyAnyExportExplicit),
  91. typeof(CreationPolicySharedExport),
  92. typeof(CreationPolicyNonSharedExport));
  93. }
  94. [TestMethod]
  95. public void RequiredAnyImporterExplicit_ShouldIncludeAll()
  96. {
  97. var container = CreateDefaultContainer();
  98. var importer = container.GetExportedValue<RequiredAnyImporterExplicit>();
  99. EnumerableAssert.AreEqual(
  100. importer.Exports.Select(obj => obj.GetType()),
  101. typeof(CreationPolicyAnyExportImplicit),
  102. typeof(CreationPolicyAnyExportExplicit),
  103. typeof(CreationPolicySharedExport),
  104. typeof(CreationPolicyNonSharedExport));
  105. }
  106. [TestMethod]
  107. public void RequiredSharedImporter_ShouldFilterNonShared()
  108. {
  109. var container = CreateDefaultContainer();
  110. var importer = container.GetExportedValue<RequiredSharedImporter>();
  111. EnumerableAssert.AreEqual(
  112. importer.Exports.Select(obj => obj.GetType()),
  113. typeof(CreationPolicyAnyExportImplicit),
  114. typeof(CreationPolicyAnyExportExplicit),
  115. typeof(CreationPolicySharedExport));
  116. }
  117. [TestMethod]
  118. public void RequiredNonSharedImporter_ShouldFilterShared()
  119. {
  120. var container = CreateDefaultContainer();
  121. var importer = container.GetExportedValue<RequiredNonSharedImporter>();
  122. EnumerableAssert.AreEqual(
  123. importer.Exports.Select(obj => obj.GetType()),
  124. typeof(CreationPolicyAnyExportImplicit),
  125. typeof(CreationPolicyAnyExportExplicit),
  126. typeof(CreationPolicyNonSharedExport));
  127. }
  128. }
  129. }