PageRenderTime 35ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/mcs/class/System.ComponentModel.Composition/Tests/ComponentModelUnitTest/System/ComponentModel/Composition/CompositionContainerTests.cs

https://bitbucket.org/danipen/mono
C# | 2998 lines | 2298 code | 673 blank | 27 comment | 2 complexity | eafdfad5cf3fe070986bfd888a4a30ce MD5 | raw file
Possible License(s): Unlicense, Apache-2.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0
  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.Linq;
  8. using System.Linq.Expressions;
  9. using System.Runtime.Serialization;
  10. using Microsoft.VisualStudio.TestTools.UnitTesting;
  11. using System.ComponentModel.Composition.Factories;
  12. using System.UnitTesting;
  13. using System.ComponentModel.Composition.AttributedModel;
  14. using System.ComponentModel.Composition.Hosting;
  15. using System.ComponentModel.Composition.Primitives;
  16. using System.ComponentModel.Composition.UnitTesting;
  17. namespace System.ComponentModel.Composition
  18. {
  19. [TestClass]
  20. public class CompositionContainerTests
  21. {
  22. [TestMethod]
  23. public void Constructor2_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
  24. {
  25. ExceptionAssert.ThrowsArgument<ArgumentException>("providers", () =>
  26. {
  27. new CompositionContainer(new ExportProvider[] { null });
  28. });
  29. }
  30. [TestMethod]
  31. public void Constructor3_ArrayWithNullElementAsProvidersArgument_ShouldThrowArgumentException()
  32. {
  33. var catalog = CatalogFactory.Create();
  34. ExceptionAssert.ThrowsArgument<ArgumentException>("providers", () =>
  35. {
  36. new CompositionContainer(catalog, new ExportProvider[] { null });
  37. });
  38. }
  39. [TestMethod]
  40. public void Constructor2_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
  41. {
  42. var providers = new ExportProvider[] { ExportProviderFactory.Create() };
  43. var container = new CompositionContainer(providers);
  44. providers[0] = null;
  45. Assert.IsNotNull(container.Providers[0]);
  46. }
  47. [TestMethod]
  48. public void Constructor3_ArrayAsProvidersArgument_ShouldNotAllowModificationAfterConstruction()
  49. {
  50. var providers = new ExportProvider[] { ExportProviderFactory.Create() };
  51. var container = new CompositionContainer(CatalogFactory.Create(), providers);
  52. providers[0] = null;
  53. Assert.IsNotNull(container.Providers[0]);
  54. }
  55. [TestMethod]
  56. public void Constructor1_ShouldSetProvidersPropertyToEmptyCollection()
  57. {
  58. var container = new CompositionContainer();
  59. EnumerableAssert.IsEmpty(container.Providers);
  60. }
  61. [TestMethod]
  62. public void Constructor2_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
  63. {
  64. var container = new CompositionContainer(new ExportProvider[0]);
  65. EnumerableAssert.IsEmpty(container.Providers);
  66. }
  67. [TestMethod]
  68. public void Constructor3_EmptyArrayAsProvidersArgument_ShouldSetProvidersPropertyToEmpty()
  69. {
  70. var container = new CompositionContainer(CatalogFactory.Create(), new ExportProvider[0]);
  71. EnumerableAssert.IsEmpty(container.Providers);
  72. }
  73. [TestMethod]
  74. public void Constructor1_ShouldSetCatalogPropertyToNull()
  75. {
  76. var container = new CompositionContainer();
  77. Assert.IsNull(container.Catalog);
  78. }
  79. [TestMethod]
  80. public void Constructor2_ShouldSetCatalogPropertyToNull()
  81. {
  82. var container = new CompositionContainer(new ExportProvider[0]);
  83. Assert.IsNull(container.Catalog);
  84. }
  85. [TestMethod]
  86. public void Constructor3_NullAsCatalogArgument_ShouldSetCatalogPropertyToNull()
  87. {
  88. var container = new CompositionContainer((ComposablePartCatalog)null, new ExportProvider[0]);
  89. Assert.IsNull(container.Catalog);
  90. }
  91. [TestMethod]
  92. public void Constructor3_ValueAsCatalogArgument_ShouldSetCatalogProperty()
  93. {
  94. var expectations = Expectations.GetCatalogs();
  95. foreach (var e in expectations)
  96. {
  97. var container = new CompositionContainer(e, new ExportProvider[0]);
  98. Assert.AreSame(e, container.Catalog);
  99. }
  100. }
  101. [TestMethod]
  102. public void Catalog_WhenDisposed_ShouldThrowObjectDisposed()
  103. {
  104. var container = CreateCompositionContainer();
  105. container.Dispose();
  106. ExceptionAssert.ThrowsDisposed(container, () =>
  107. {
  108. var catalog = container.Catalog;
  109. });
  110. }
  111. [TestMethod]
  112. public void Providers_WhenDisposed_ShouldThrowObjectDisposed()
  113. {
  114. var container = CreateCompositionContainer();
  115. container.Dispose();
  116. ExceptionAssert.ThrowsDisposed(container, () =>
  117. {
  118. var providers = container.Providers;
  119. });
  120. }
  121. [TestMethod]
  122. [Ignore]
  123. [WorkItem(579990)] // NullReferenceException
  124. public void ExportsChanged_Add_WhenDisposed_ShouldThrowObjectDisposed()
  125. {
  126. var container = CreateCompositionContainer();
  127. container.Dispose();
  128. ExceptionAssert.ThrowsDisposed(container, () =>
  129. {
  130. container.ExportsChanged += (o, s) => { };
  131. });
  132. }
  133. [TestMethod]
  134. [Ignore]
  135. [WorkItem(579990)] // NullReferenceException
  136. public void ExportsChanged_Remove_WhenDisposed_ShouldThrowObjectDisposed()
  137. {
  138. var container = CreateCompositionContainer();
  139. container.Dispose();
  140. ExceptionAssert.ThrowsDisposed(container, () =>
  141. {
  142. container.ExportsChanged -= (o, s) => { };
  143. });
  144. }
  145. [TestMethod]
  146. public void AddPart1_ImportOnlyPart_ShouldNotGetGarbageCollected()
  147. {
  148. var container = CreateCompositionContainer();
  149. var import = PartFactory.CreateImporter("Value", ImportCardinality.ZeroOrMore);
  150. CompositionBatch batch = new CompositionBatch();
  151. batch.AddPart(import);
  152. container.Compose(batch);
  153. var weakRef = new WeakReference(import);
  154. import = null;
  155. GC.Collect();
  156. GC.WaitForPendingFinalizers();
  157. Assert.IsNotNull(weakRef.Target, "Import only part should not have been collected!");
  158. GC.KeepAlive(container);
  159. }
  160. [TestMethod]
  161. public void Compose_WhenContainerDisposed_ShouldThrowObjectDisposed()
  162. {
  163. var container = CreateCompositionContainer();
  164. container.Dispose();
  165. CompositionBatch batch = new CompositionBatch();
  166. ExceptionAssert.ThrowsDisposed(container, () =>
  167. {
  168. container.Compose(batch);
  169. });
  170. }
  171. [TestMethod]
  172. public void GetExportOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  173. {
  174. var container = CreateCompositionContainer();
  175. container.Dispose();
  176. ExceptionAssert.ThrowsDisposed(container, () =>
  177. {
  178. container.GetExport<string>();
  179. });
  180. }
  181. [TestMethod]
  182. public void GetExportOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  183. {
  184. var container = CreateCompositionContainer();
  185. container.Dispose();
  186. ExceptionAssert.ThrowsDisposed(container, () =>
  187. {
  188. container.GetExport<string>("Contract");
  189. });
  190. }
  191. [TestMethod]
  192. public void GetExportOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  193. {
  194. var container = CreateCompositionContainer();
  195. container.Dispose();
  196. ExceptionAssert.ThrowsDisposed(container, () =>
  197. {
  198. container.GetExport<string, object>();
  199. });
  200. }
  201. [TestMethod]
  202. public void GetExportOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  203. {
  204. var container = CreateCompositionContainer();
  205. container.Dispose();
  206. ExceptionAssert.ThrowsDisposed(container, () =>
  207. {
  208. container.GetExport<string, object>("Contract");
  209. });
  210. }
  211. [TestMethod]
  212. public void GetExports1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  213. {
  214. var container = CreateCompositionContainer();
  215. container.Dispose();
  216. var definition = ImportDefinitionFactory.Create();
  217. ExceptionAssert.ThrowsDisposed(container, () =>
  218. {
  219. container.GetExports(definition);
  220. });
  221. }
  222. [TestMethod]
  223. public void GetExports2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  224. {
  225. var container = CreateCompositionContainer();
  226. container.Dispose();
  227. ExceptionAssert.ThrowsDisposed(container, () =>
  228. {
  229. container.GetExports(typeof(string), typeof(object), "Contract");
  230. });
  231. }
  232. [TestMethod]
  233. public void GetExportsOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  234. {
  235. var container = CreateCompositionContainer();
  236. container.Dispose();
  237. ExceptionAssert.ThrowsDisposed(container, () =>
  238. {
  239. container.GetExports<string>();
  240. });
  241. }
  242. [TestMethod]
  243. public void GetExportsOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  244. {
  245. var container = CreateCompositionContainer();
  246. container.Dispose();
  247. ExceptionAssert.ThrowsDisposed(container, () =>
  248. {
  249. container.GetExports<string>("Contract");
  250. });
  251. }
  252. [TestMethod]
  253. public void GetExportsOfTTMetadataView1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  254. {
  255. var container = CreateCompositionContainer();
  256. container.Dispose();
  257. ExceptionAssert.ThrowsDisposed(container, () =>
  258. {
  259. container.GetExports<string, object>();
  260. });
  261. }
  262. [TestMethod]
  263. public void GetExportsOfTTMetadataView2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  264. {
  265. var container = CreateCompositionContainer();
  266. container.Dispose();
  267. ExceptionAssert.ThrowsDisposed(container, () =>
  268. {
  269. container.GetExports<string, object>("Contract");
  270. });
  271. }
  272. [TestMethod]
  273. public void GetExportedValueOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  274. {
  275. var container = CreateCompositionContainer();
  276. container.Dispose();
  277. ExceptionAssert.ThrowsDisposed(container, () =>
  278. {
  279. container.GetExportedValue<string>();
  280. });
  281. }
  282. [TestMethod]
  283. public void GetExportedValueOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  284. {
  285. var container = CreateCompositionContainer();
  286. container.Dispose();
  287. ExceptionAssert.ThrowsDisposed(container, () =>
  288. {
  289. container.GetExportedValue<string>("Contract");
  290. });
  291. }
  292. [TestMethod]
  293. public void GetExportedValueOrDefaultOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  294. {
  295. var container = CreateCompositionContainer();
  296. container.Dispose();
  297. ExceptionAssert.ThrowsDisposed(container, () =>
  298. {
  299. container.GetExportedValueOrDefault<string>();
  300. });
  301. }
  302. [TestMethod]
  303. public void GetExportedValueOrDefaultOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  304. {
  305. var container = CreateCompositionContainer();
  306. container.Dispose();
  307. ExceptionAssert.ThrowsDisposed(container, () =>
  308. {
  309. container.GetExportedValueOrDefault<string>("Contract");
  310. });
  311. }
  312. [TestMethod]
  313. public void GetExportedValuesOfT1_WhenContainerDisposed_ShouldThrowObjectDisposed()
  314. {
  315. var container = CreateCompositionContainer();
  316. container.Dispose();
  317. ExceptionAssert.ThrowsDisposed(container, () =>
  318. {
  319. container.GetExportedValues<string>();
  320. });
  321. }
  322. [TestMethod]
  323. public void GetExportedValuesOfT2_WhenContainerDisposed_ShouldThrowObjectDisposed()
  324. {
  325. var container = CreateCompositionContainer();
  326. container.Dispose();
  327. ExceptionAssert.ThrowsDisposed(container, () =>
  328. {
  329. container.GetExportedValues<string>("Contract");
  330. });
  331. }
  332. [TestMethod]
  333. public void GetExports1_NullAsImportDefinitionArgument_ShouldThrowArgumentNull()
  334. {
  335. var container = CreateCompositionContainer();
  336. ExceptionAssert.ThrowsArgument<ArgumentNullException>("definition", () =>
  337. {
  338. container.GetExports((ImportDefinition)null);
  339. });
  340. }
  341. [TestMethod]
  342. public void GetExports2_NullAsTypeArgument_ShouldThrowArgumentNull()
  343. {
  344. var container = CreateCompositionContainer();
  345. ExceptionAssert.ThrowsArgument<ArgumentNullException>("type", () =>
  346. {
  347. container.GetExports((Type)null, typeof(string), "ContractName");
  348. });
  349. }
  350. [TestMethod]
  351. public void GetExportOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  352. {
  353. var container = CreateCompositionContainer();
  354. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  355. {
  356. container.GetExport<string>();
  357. });
  358. }
  359. [TestMethod]
  360. public void GetExportOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  361. {
  362. var container = CreateCompositionContainer();
  363. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  364. {
  365. container.GetExport<string>("Contract");
  366. });
  367. }
  368. [TestMethod]
  369. public void GetExportOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  370. {
  371. var container = CreateCompositionContainer();
  372. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  373. {
  374. container.GetExport<string, object>();
  375. });
  376. }
  377. [TestMethod]
  378. public void GetExportOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  379. {
  380. var container = CreateCompositionContainer();
  381. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  382. {
  383. container.GetExport<string, object>("Contract");
  384. });
  385. }
  386. [TestMethod]
  387. public void GetExports1_DefinitionAskingForExactlyOneContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  388. {
  389. var container = CreateCompositionContainer();
  390. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
  391. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  392. {
  393. container.GetExports(definition);
  394. });
  395. }
  396. [TestMethod]
  397. public void GetExports1_DefinitionAskingForExactlyZeroOrOneContractThatDoesNotExist_ShouldReturnEmpty()
  398. {
  399. var container = CreateCompositionContainer();
  400. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
  401. var exports = container.GetExports(definition);
  402. EnumerableAssert.IsEmpty(exports);
  403. }
  404. [TestMethod]
  405. public void GetExports1_DefinitionAskingForExactlyZeroOrMoreContractThatDoesNotExist_ShouldReturnEmpty()
  406. {
  407. var container = CreateCompositionContainer();
  408. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
  409. var exports = container.GetExports(definition);
  410. EnumerableAssert.IsEmpty(exports);
  411. }
  412. [TestMethod]
  413. public void GetExports2_AskingForContractThatDoesNotExist_ShouldReturnNoExports()
  414. {
  415. var container = CreateCompositionContainer();
  416. var exports = container.GetExports(typeof(string), (Type)null, "Contract");
  417. EnumerableAssert.IsEmpty(exports);
  418. }
  419. [TestMethod]
  420. public void GetExportsOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  421. {
  422. var container = CreateCompositionContainer();
  423. var exports = container.GetExports<string>();
  424. EnumerableAssert.IsEmpty(exports);
  425. }
  426. [TestMethod]
  427. public void GetExportsOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  428. {
  429. var container = CreateCompositionContainer();
  430. var exports = container.GetExports<string>("Contract");
  431. EnumerableAssert.IsEmpty(exports);
  432. }
  433. [TestMethod]
  434. public void GetExportsOfTTMetadataView1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  435. {
  436. var container = CreateCompositionContainer();
  437. var exports = container.GetExports<string, object>();
  438. EnumerableAssert.IsEmpty(exports);
  439. }
  440. [TestMethod]
  441. public void GetExportsOfTTMetadataView2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  442. {
  443. var container = CreateCompositionContainer();
  444. var exports = container.GetExports<string, object>("Contract");
  445. EnumerableAssert.IsEmpty(exports);
  446. }
  447. [TestMethod]
  448. public void GetExportedValueOfT1_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  449. {
  450. var container = CreateCompositionContainer();
  451. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  452. {
  453. container.GetExportedValue<string>();
  454. });
  455. }
  456. [TestMethod]
  457. public void GetExportedValueOfT2_AskingForContractThatDoesNotExist_ShouldThrowCardinalityMismatch()
  458. {
  459. var container = CreateCompositionContainer();
  460. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  461. {
  462. container.GetExportedValue<string>("Contract");
  463. });
  464. }
  465. [TestMethod]
  466. public void GetExportedValueOrDefaultOfT1_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
  467. {
  468. var container = CreateCompositionContainer();
  469. var exportedValue = container.GetExportedValueOrDefault<string>();
  470. Assert.IsNull(exportedValue);
  471. }
  472. [TestMethod]
  473. public void GetExportedValueOrDefaultOfT2_AskingForStringContractThatDoesNotExist_ShouldReturnNull()
  474. {
  475. var container = CreateCompositionContainer();
  476. var exportedValue = container.GetExportedValueOrDefault<string>("Contract");
  477. Assert.IsNull(exportedValue);
  478. }
  479. [TestMethod]
  480. public void GetExportedValueOrDefaultOfT1_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
  481. {
  482. var container = CreateCompositionContainer();
  483. var exportedValue = container.GetExportedValueOrDefault<int>();
  484. Assert.AreEqual(0, exportedValue);
  485. }
  486. [TestMethod]
  487. public void GetExportedValueOrDefaultOfT2_AskingForInt32ContractThatDoesNotExist_ShouldReturnZero()
  488. {
  489. var container = CreateCompositionContainer();
  490. var exportedValue = container.GetExportedValueOrDefault<int>("Contract");
  491. Assert.AreEqual(0, exportedValue);
  492. }
  493. [TestMethod]
  494. public void GetExportedValuesOfT1_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  495. {
  496. var container = CreateCompositionContainer();
  497. var exports = container.GetExportedValues<string>();
  498. EnumerableAssert.IsEmpty(exports);
  499. }
  500. [TestMethod]
  501. public void GetExportedValuesOfT2_AskingForContractThatDoesNotExist_ShouldReturnEmpty()
  502. {
  503. var container = CreateCompositionContainer();
  504. var exports = container.GetExports<string>("Contract");
  505. EnumerableAssert.IsEmpty(exports);
  506. }
  507. [TestMethod]
  508. public void GetExportOfT1_AskingForContractWithOneExport_ShouldReturnExport()
  509. {
  510. var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value"));
  511. var export = container.GetExport<string>();
  512. Assert.AreEqual("Value", export.Value);
  513. }
  514. [TestMethod]
  515. public void GetExportOfT2_AskingForContractWithOneExport_ShouldReturnExport()
  516. {
  517. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  518. var export = container.GetExport<string>("Contract");
  519. Assert.AreEqual("Value", export.Value);
  520. }
  521. [TestMethod]
  522. public void GetExportOfTTMetadataView1_AskingForContractWithOneExport_ShouldReturnExport()
  523. {
  524. var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value"));
  525. var export = container.GetExport<string, object>();
  526. Assert.AreEqual("Value", export.Value);
  527. }
  528. [TestMethod]
  529. public void GetExportOfTTMetadataView2_AskingForContractWithOneExport_ShouldReturnExport()
  530. {
  531. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  532. var export = container.GetExport<string, object>("Contract");
  533. Assert.AreEqual("Value", export.Value);
  534. }
  535. [TestMethod]
  536. public void GetExports1_AskingForExactlyOneContractWithOneExport_ShouldReturnExport()
  537. {
  538. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  539. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
  540. var exports = container.GetExports(definition);
  541. ExportsAssert.AreEqual(exports, "Value");
  542. }
  543. [TestMethod]
  544. public void GetExports1_AskingForZeroOrOneContractWithOneExport_ShouldReturnExport()
  545. {
  546. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  547. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
  548. var exports = container.GetExports(definition);
  549. ExportsAssert.AreEqual(exports, "Value");
  550. }
  551. [TestMethod]
  552. public void GetExports1_AskingForZeroOrMoreContractWithOneExport_ShouldReturnExport()
  553. {
  554. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  555. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
  556. var exports = container.GetExports(definition);
  557. ExportsAssert.AreEqual(exports, "Value");
  558. }
  559. [TestMethod]
  560. public void GetExports2_AskingForContractWithOneExport_ShouldReturnOneExport()
  561. {
  562. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  563. var exports = container.GetExports(typeof(string), (Type)null, "Contract");
  564. ExportsAssert.AreEqual(exports, "Value");
  565. }
  566. [TestMethod]
  567. public void GetExportsOfT1_AskingForContractWithOneExport_ShouldReturnOneExport()
  568. {
  569. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
  570. var exports = container.GetExports<string>();
  571. ExportsAssert.AreEqual(exports, "Value");
  572. }
  573. [TestMethod]
  574. public void GetExportsOfT2_AskingForContractWithOneExport_ShouldReturnOneExport()
  575. {
  576. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  577. var exports = container.GetExports<string>("Contract");
  578. ExportsAssert.AreEqual(exports, "Value");
  579. }
  580. [TestMethod]
  581. public void GetExportsOfTTMetadataView1_AskingForContractWithOneExport_ShouldReturnOneExport()
  582. {
  583. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
  584. var exports = container.GetExports<string, object>();
  585. ExportsAssert.AreEqual(exports, "Value");
  586. }
  587. [TestMethod]
  588. public void GetExportsOfTTMetadataView2_AskingForContractWithOneExport_ShouldReturnOneExport()
  589. {
  590. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  591. var exports = container.GetExports<string, object>("Contract");
  592. ExportsAssert.AreEqual(exports, "Value");
  593. }
  594. [TestMethod]
  595. public void GetExportedValueOfT1_AskingForContractWithOneExport_ShouldReturnExport()
  596. {
  597. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
  598. var exportedValue = container.GetExportedValue<string>();
  599. Assert.AreEqual("Value", exportedValue);
  600. }
  601. [TestMethod]
  602. public void GetExportedValueOfT2_AskingForContractWithOneExport_ShouldReturnExport()
  603. {
  604. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  605. var exportedValue = container.GetExportedValue<string>("Contract");
  606. Assert.AreEqual("Value", exportedValue);
  607. }
  608. [TestMethod]
  609. public void GetExportedValueOrDefaultOfT1_AskingForContractWithOneExport_ShouldReturnExport()
  610. {
  611. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
  612. var exportedValue = container.GetExportedValueOrDefault<string>();
  613. Assert.AreEqual("Value", exportedValue);
  614. }
  615. [TestMethod]
  616. public void GetExportedValueOrDefaultOfT2_AskingForContractWithOneExport_ShouldReturnExport()
  617. {
  618. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  619. var exportedValue = container.GetExportedValueOrDefault<string>("Contract");
  620. Assert.AreEqual("Value", exportedValue);
  621. }
  622. [TestMethod]
  623. public void GetExportedValuesOfT1_AskingForContractWithOneExport_ShouldReturnOneExport()
  624. {
  625. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value"));
  626. var exportedValues = container.GetExportedValues<string>();
  627. EnumerableAssert.AreEqual(exportedValues, "Value");
  628. }
  629. [TestMethod]
  630. public void GetExportedValuesOfT2_AskingForContractWithOneExport_ShouldReturnOneExport()
  631. {
  632. var container = ContainerFactory.Create(new MicroExport("Contract", "Value"));
  633. var exportedValues = container.GetExportedValues<string>("Contract");
  634. EnumerableAssert.AreEqual(exportedValues, "Value");
  635. }
  636. [TestMethod]
  637. public void GetExportOfT1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  638. {
  639. var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value1", "Value2"));
  640. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  641. {
  642. container.GetExport<string>();
  643. });
  644. }
  645. [TestMethod]
  646. public void GetExportOfT2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  647. {
  648. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  649. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  650. {
  651. container.GetExport<string>("Contract");
  652. });
  653. }
  654. [TestMethod]
  655. public void GetExportOfTTMetadataView1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  656. {
  657. var container = ContainerFactory.Create(new MicroExport(ContractFromType(typeof(String)), "Value1", "Value2"));
  658. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  659. {
  660. container.GetExport<string, object>();
  661. });
  662. }
  663. [TestMethod]
  664. public void GetExportOfTTMetadataView2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  665. {
  666. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  667. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  668. {
  669. container.GetExport<string, object>("Contract");
  670. });
  671. }
  672. [TestMethod]
  673. public void GetExports1_AskingForExactlyOneContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  674. {
  675. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  676. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
  677. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  678. {
  679. container.GetExports(definition);
  680. });
  681. }
  682. [TestMethod]
  683. public void GetExports1_AskingForZeroOrOneContractWithMultipleExports_ShouldReturnZero()
  684. {
  685. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  686. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
  687. Assert.AreEqual(0, container.GetExports(definition).Count());
  688. }
  689. [TestMethod]
  690. public void GetExports1_AskingForZeroOrMoreContractWithMultipleExports_ShouldReturnMultipleExports()
  691. {
  692. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  693. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
  694. var exports = container.GetExports(definition);
  695. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  696. }
  697. [TestMethod]
  698. public void GetExports2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  699. {
  700. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  701. var exports = container.GetExports(typeof(string), (Type)null, "Contract");
  702. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  703. }
  704. [TestMethod]
  705. public void GetExportsOfT1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  706. {
  707. var container = ContainerFactory.Create(new MicroExport(typeof(String), "Value1", "Value2"));
  708. var exports = container.GetExports<string>();
  709. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  710. }
  711. [TestMethod]
  712. public void GetExportsOfT2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  713. {
  714. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  715. var exports = container.GetExports<string>("Contract");
  716. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  717. }
  718. [TestMethod]
  719. public void GetExportsOfTTMetadataView1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  720. {
  721. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
  722. var exports = container.GetExports<string, object>();
  723. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  724. }
  725. [TestMethod]
  726. public void GetExportsOfTTMetadataView2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  727. {
  728. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  729. var exports = container.GetExports<string, object>("Contract");
  730. ExportsAssert.AreEqual(exports, "Value1", "Value2");
  731. }
  732. [TestMethod]
  733. public void GetExportedValueOfT1_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  734. {
  735. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
  736. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  737. {
  738. container.GetExportedValue<string>();
  739. });
  740. }
  741. [TestMethod]
  742. public void GetExportedValueOfT2_AskingForContractWithMultipleExports_ShouldThrowCardinalityMismatch()
  743. {
  744. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  745. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  746. {
  747. container.GetExportedValue<string>("Contract");
  748. });
  749. }
  750. [TestMethod]
  751. public void GetExportedValueOrDefaultOfT1_AskingForContractWithMultipleExports_ShouldReturnZero()
  752. {
  753. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
  754. Assert.IsNull(container.GetExportedValueOrDefault<string>());
  755. }
  756. [TestMethod]
  757. public void GetExportedValueOrDefaultOfT2_AskingForContractWithMultipleExports_ShouldReturnZero()
  758. {
  759. var container = ContainerFactory.Create(new MicroExport("Contract", "Value1", "Value2"));
  760. Assert.IsNull(container.GetExportedValueOrDefault<string>("Contract"));
  761. }
  762. [TestMethod]
  763. public void GetExportedValuesOfT1_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  764. {
  765. var container = ContainerFactory.Create(new MicroExport(typeof(string), "Value1", "Value2"));
  766. var exportedValues = container.GetExportedValues<string>();
  767. EnumerableAssert.AreEqual(exportedValues, "Value1", "Value2");
  768. }
  769. [TestMethod]
  770. public void GetExportedValuesOfT2_AskingForContractWithMultipleExports_ShouldReturnMultipleExports()
  771. {
  772. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), "Value1", "Value2"));
  773. var exportedValues = container.GetExportedValues<string>("Contract");
  774. EnumerableAssert.AreEqual(exportedValues, "Value1", "Value2");
  775. }
  776. [TestMethod]
  777. public void GetExports1_AskingForExactlyOneAndAll_ShouldThrowCardinalityMismatch()
  778. {
  779. var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
  780. new MicroExport("Contract2", "Value4", "Value5", "Value6"));
  781. var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ExactlyOne);
  782. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  783. {
  784. container.GetExports(definition);
  785. });
  786. }
  787. [TestMethod]
  788. public void GetExports1_AskingForZeroOrOneAndAll_ShouldReturnZero()
  789. {
  790. var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
  791. new MicroExport("Contract2", "Value4", "Value5", "Value6"));
  792. var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ZeroOrOne);
  793. Assert.AreEqual(0, container.GetExports(definition).Count());
  794. }
  795. [TestMethod]
  796. public void GetExports1_AskingForZeroOrMoreAndAll_ShouldReturnAll()
  797. {
  798. var container = ContainerFactory.Create(new MicroExport("Contract1", "Value1", "Value2", "Value3"),
  799. new MicroExport("Contract2", "Value4", "Value5", "Value6"));
  800. var definition = ImportDefinitionFactory.Create(import => true, ImportCardinality.ZeroOrMore);
  801. var exports = container.GetExports(definition);
  802. ExportsAssert.AreEqual(exports, "Value1", "Value2", "Value3",
  803. "Value4", "Value5", "Value6");
  804. }
  805. [TestMethod]
  806. public void GetExportOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  807. {
  808. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  809. var export = container.GetExport<string>();
  810. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  811. {
  812. var value = export.Value;
  813. });
  814. }
  815. [TestMethod]
  816. public void GetExportOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  817. {
  818. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  819. var export = container.GetExport<string>("Contract");
  820. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  821. {
  822. var value = export.Value;
  823. });
  824. }
  825. [TestMethod]
  826. public void GetExportOfTTMetadataView1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  827. {
  828. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  829. var export = container.GetExport<string, object>();
  830. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  831. {
  832. var value = export.Value;
  833. });
  834. }
  835. [TestMethod]
  836. public void GetExportOfTTMetadataView2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  837. {
  838. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  839. var export = container.GetExport<string, object>("Contract");
  840. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  841. {
  842. var value = export.Value;
  843. });
  844. }
  845. [TestMethod]
  846. public void GetExports2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  847. {
  848. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  849. var exports = container.GetExports(typeof(string), (Type)null, "Contract");
  850. Assert.AreEqual(1, exports.Count());
  851. var export = exports.ElementAt(0);
  852. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  853. {
  854. var value = export.Value;
  855. });
  856. }
  857. [TestMethod]
  858. public void GetExportsOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  859. {
  860. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  861. var exports = container.GetExports<string>();
  862. Assert.AreEqual(1, exports.Count());
  863. var export = exports.ElementAt(0);
  864. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  865. {
  866. var value = export.Value;
  867. });
  868. }
  869. [TestMethod]
  870. public void GetExportsOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  871. {
  872. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  873. var exports = container.GetExports<string>("Contract");
  874. Assert.AreEqual(1, exports.Count());
  875. var export = exports.ElementAt(0);
  876. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  877. {
  878. var value = export.Value;
  879. });
  880. }
  881. [TestMethod]
  882. public void GetExportsOfTTMetadataView1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  883. {
  884. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  885. var exports = container.GetExports<string, object>();
  886. Assert.AreEqual(1, exports.Count());
  887. var export = exports.ElementAt(0);
  888. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  889. {
  890. var value = export.Value;
  891. });
  892. }
  893. [TestMethod]
  894. public void GetExportsOfTTMetadataView2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  895. {
  896. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  897. var exports = container.GetExports<string, object>("Contract");
  898. Assert.AreEqual(1, exports.Count());
  899. var export = exports.ElementAt(0);
  900. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  901. {
  902. var value = export.Value;
  903. });
  904. }
  905. [TestMethod]
  906. public void GetExportedValueOfT1_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
  907. {
  908. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  909. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  910. {
  911. container.GetExportedValue<string>();
  912. });
  913. }
  914. [TestMethod]
  915. public void GetExportedValueOfT2_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
  916. {
  917. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  918. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  919. {
  920. container.GetExportedValue<string>("Contract");
  921. });
  922. }
  923. [TestMethod]
  924. public void GetExportedValueOrDefaultOfT1_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
  925. {
  926. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  927. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  928. {
  929. container.GetExportedValueOrDefault<string>();
  930. });
  931. }
  932. [TestMethod]
  933. public void GetExportedValueOrDefaultOfT2_StringAsTTypeArgumentAskingForContractWithObjectExport_ShouldThrowContractMismatch()
  934. {
  935. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  936. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  937. {
  938. container.GetExportedValueOrDefault<string>("Contract");
  939. });
  940. }
  941. [TestMethod]
  942. public void GetExportedValuesOfT1_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  943. {
  944. var container = ContainerFactory.Create(new MicroExport(typeof(string), new object()));
  945. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  946. {
  947. container.GetExportedValues<string>();
  948. });
  949. }
  950. [TestMethod]
  951. public void GetExportedValuesOfT2_StringAsTTypeArgumentAskingForContractWithOneObjectExport_ShouldThrowContractMismatch()
  952. {
  953. var container = ContainerFactory.Create(new MicroExport("Contract", typeof(string), new object()));
  954. ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
  955. {
  956. container.GetExportedValues<string>("Contract");
  957. });
  958. }
  959. [TestMethod]
  960. public void GetExportOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  961. {
  962. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  963. var child = ContainerFactory.Create(parent);
  964. var export = child.GetExport<string>();
  965. Assert.AreEqual("Parent", export.Value);
  966. }
  967. [TestMethod]
  968. public void GetExportOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  969. {
  970. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  971. var child = ContainerFactory.Create(parent);
  972. var export = child.GetExport<string>("Contract");
  973. Assert.AreEqual("Parent", export.Value);
  974. }
  975. [TestMethod]
  976. public void GetExportOfTTMetadataView1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  977. {
  978. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  979. var child = ContainerFactory.Create(parent);
  980. var export = child.GetExport<string, object>();
  981. Assert.AreEqual("Parent", export.Value);
  982. }
  983. [TestMethod]
  984. public void GetExportOfTTMetadataView2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  985. {
  986. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  987. var child = ContainerFactory.Create(parent);
  988. var export = child.GetExport<string, object>("Contract");
  989. Assert.AreEqual("Parent", export.Value);
  990. }
  991. [TestMethod]
  992. public void GetExports1_AskingForExactlyOneContractFromChildWithExportInParentContainer_ShouldReturnExport()
  993. {
  994. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  995. var child = ContainerFactory.Create(parent);
  996. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
  997. var exports = child.GetExports(definition);
  998. ExportsAssert.AreEqual(exports, "Parent");
  999. }
  1000. [TestMethod]
  1001. public void GetExports1_AskingForZeroOrOneContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1002. {
  1003. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1004. var child = ContainerFactory.Create(parent);
  1005. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
  1006. var exports = child.GetExports(definition);
  1007. ExportsAssert.AreEqual(exports, "Parent");
  1008. }
  1009. [TestMethod]
  1010. public void GetExports1_AskingForZeroOrMoreContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1011. {
  1012. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1013. var child = ContainerFactory.Create(parent);
  1014. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
  1015. var exports = child.GetExports(definition);
  1016. ExportsAssert.AreEqual(exports, "Parent");
  1017. }
  1018. [TestMethod]
  1019. public void GetExports2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1020. {
  1021. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1022. var child = ContainerFactory.Create(parent);
  1023. var exports = child.GetExports(typeof(string), (Type)null, "Contract");
  1024. ExportsAssert.AreEqual(exports, "Parent");
  1025. }
  1026. [TestMethod]
  1027. public void GetExportsOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1028. {
  1029. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1030. var child = ContainerFactory.Create(parent);
  1031. var exports = child.GetExports<string>();
  1032. ExportsAssert.AreEqual(exports, "Parent");
  1033. }
  1034. [TestMethod]
  1035. public void GetExportsOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1036. {
  1037. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1038. var child = ContainerFactory.Create(parent);
  1039. var exports = child.GetExports<string>("Contract");
  1040. ExportsAssert.AreEqual(exports, "Parent");
  1041. }
  1042. [TestMethod]
  1043. public void GetExportsOfTTMetadataView1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1044. {
  1045. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1046. var child = ContainerFactory.Create(parent);
  1047. var exports = child.GetExports<string, object>();
  1048. ExportsAssert.AreEqual(exports, "Parent");
  1049. }
  1050. [TestMethod]
  1051. public void GetExportsOfTTMetadataView2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1052. {
  1053. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1054. var child = ContainerFactory.Create(parent);
  1055. var exports = child.GetExports<string, object>("Contract");
  1056. ExportsAssert.AreEqual(exports, "Parent");
  1057. }
  1058. [TestMethod]
  1059. public void GetExportedValueOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1060. {
  1061. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1062. var child = ContainerFactory.Create(parent);
  1063. var exportedValue = child.GetExportedValue<string>();
  1064. Assert.AreEqual("Parent", exportedValue);
  1065. }
  1066. [TestMethod]
  1067. public void GetExportedValueOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1068. {
  1069. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1070. var child = ContainerFactory.Create(parent);
  1071. var exportedValue = child.GetExportedValue<string>("Contract");
  1072. Assert.AreEqual("Parent", exportedValue);
  1073. }
  1074. [TestMethod]
  1075. public void GetExportedValueOrDefaultOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1076. {
  1077. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1078. var child = ContainerFactory.Create(parent);
  1079. var exportedValue = child.GetExportedValueOrDefault<string>();
  1080. Assert.AreEqual("Parent", exportedValue);
  1081. }
  1082. [TestMethod]
  1083. public void GetExportedValueOrDefaultOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1084. {
  1085. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1086. var child = ContainerFactory.Create(parent);
  1087. var exportedValue = child.GetExportedValueOrDefault<string>("Contract");
  1088. Assert.AreEqual("Parent", exportedValue);
  1089. }
  1090. [TestMethod]
  1091. public void GetExportedValuesOfT1_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1092. {
  1093. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1094. var child = ContainerFactory.Create(parent);
  1095. var exportedValues = child.GetExportedValues<string>();
  1096. EnumerableAssert.AreEqual(exportedValues, "Parent");
  1097. }
  1098. [TestMethod]
  1099. public void GetExportedValuesOfT2_AskingForContractFromChildWithExportInParentContainer_ShouldReturnExport()
  1100. {
  1101. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1102. var child = ContainerFactory.Create(parent);
  1103. var exportedValues = child.GetExportedValues<string>("Contract");
  1104. EnumerableAssert.AreEqual(exportedValues, "Parent");
  1105. }
  1106. [TestMethod]
  1107. public void GetExportOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1108. {
  1109. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1110. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1111. var export = child.GetExport<string>();
  1112. Assert.AreEqual("Child", export.Value);
  1113. }
  1114. [TestMethod]
  1115. public void GetExportOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1116. {
  1117. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1118. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1119. var export = child.GetExport<string>("Contract");
  1120. Assert.AreEqual("Child", export.Value);
  1121. }
  1122. [TestMethod]
  1123. public void GetExportOfTTMetadataView1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1124. {
  1125. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1126. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1127. var export = child.GetExport<string, object>();
  1128. Assert.AreEqual("Child", export.Value);
  1129. }
  1130. [TestMethod]
  1131. public void GetExportOfTTMetadataView2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1132. {
  1133. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1134. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1135. var export = child.GetExport<string, object>("Contract");
  1136. Assert.AreEqual("Child", export.Value);
  1137. }
  1138. [TestMethod]
  1139. public void GetExports1_AskingForExactlyOneContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1140. {
  1141. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1142. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1143. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ExactlyOne);
  1144. var exports = child.GetExports(definition);
  1145. ExportsAssert.AreEqual(exports, "Child");
  1146. }
  1147. [TestMethod]
  1148. public void GetExports1_AskingForZeroOrOneContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1149. {
  1150. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1151. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1152. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrOne);
  1153. var exports = child.GetExports(definition);
  1154. ExportsAssert.AreEqual(exports, "Child");
  1155. }
  1156. [TestMethod]
  1157. public void GetExports1_AskingForZeroOrMoreContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1158. {
  1159. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1160. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1161. var definition = ImportDefinitionFactory.Create("Contract", ImportCardinality.ZeroOrMore);
  1162. var exports = child.GetExports(definition);
  1163. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1164. }
  1165. [TestMethod]
  1166. public void GetExports2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1167. {
  1168. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1169. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1170. var exports = child.GetExports(typeof(string), (Type)null, "Contract");
  1171. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1172. }
  1173. [TestMethod]
  1174. public void GetExportsOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1175. {
  1176. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1177. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1178. var exports = child.GetExports<string>();
  1179. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1180. }
  1181. [TestMethod]
  1182. public void GetExportsOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1183. {
  1184. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1185. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1186. var exports = child.GetExports<string>("Contract");
  1187. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1188. }
  1189. [TestMethod]
  1190. public void GetExportsOfTTMetadataView1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1191. {
  1192. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1193. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1194. var exports = child.GetExports<string, object>();
  1195. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1196. }
  1197. [TestMethod]
  1198. public void GetExportsOfTTMetadataView2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1199. {
  1200. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1201. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1202. var exports = child.GetExports<string, object>("Contract");
  1203. ExportsAssert.AreEqual(exports, "Child", "Parent");
  1204. }
  1205. [TestMethod]
  1206. public void GetExportedValueOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1207. {
  1208. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1209. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1210. var exportedValue = child.GetExportedValue<string>();
  1211. Assert.AreEqual("Child", exportedValue);
  1212. }
  1213. [TestMethod]
  1214. public void GetExportedValueOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1215. {
  1216. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1217. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1218. var exportedValue = child.GetExportedValue<string>("Contract");
  1219. Assert.AreEqual("Child", exportedValue);
  1220. }
  1221. [TestMethod]
  1222. public void GetExportedValueOrDefaultOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1223. {
  1224. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1225. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1226. var exportedValue = child.GetExportedValueOrDefault<string>();
  1227. Assert.AreEqual("Child", exportedValue);
  1228. }
  1229. [TestMethod]
  1230. public void GetExportedValueOrDefaultOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnChildExport()
  1231. {
  1232. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1233. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1234. var exportedValue = child.GetExportedValueOrDefault<string>("Contract");
  1235. Assert.AreEqual("Child", exportedValue);
  1236. }
  1237. [TestMethod]
  1238. public void GetExportedValuesOfT1_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1239. {
  1240. var parent = ContainerFactory.Create(new MicroExport(typeof(string), "Parent"));
  1241. var child = ContainerFactory.Create(parent, new MicroExport(typeof(string), "Child"));
  1242. var exportedValues = child.GetExportedValues<string>();
  1243. EnumerableAssert.AreEqual(exportedValues, "Child", "Parent");
  1244. }
  1245. [TestMethod]
  1246. public void GetExportedValuesOfT2_AskingForContractWithExportInBothParentAndChildContainers_ShouldReturnBothExports()
  1247. {
  1248. var parent = ContainerFactory.Create(new MicroExport("Contract", "Parent"));
  1249. var child = ContainerFactory.Create(parent, new MicroExport("Contract", "Child"));
  1250. var exportedValues = child.GetExportedValues<string>("Contract");
  1251. EnumerableAssert.AreEqual(exportedValues, "Child", "Parent");
  1252. }
  1253. [TestMethod]
  1254. public void GetExportOfTTMetadataView1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1255. {
  1256. var metadata = new Dictionary<string, object>();
  1257. metadata.Add("Metadata1", "MetadataValue1");
  1258. metadata.Add("Metadata2", "MetadataValue2");
  1259. metadata.Add("Metadata3", "MetadataValue3");
  1260. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1261. new MicroExport(typeof(string), metadata, "Value1"),
  1262. new MicroExport(typeof(string), "Value2"));
  1263. var export = container.GetExport<string, IMetadataView>();
  1264. var metadataExport = (Lazy<string, IMetadataView>)export;
  1265. Assert.AreEqual("Value1", metadataExport.Value);
  1266. Assert.AreEqual("MetadataValue1", metadataExport.Metadata.Metadata1);
  1267. Assert.AreEqual("MetadataValue2", metadataExport.Metadata.Metadata2);
  1268. Assert.AreEqual("MetadataValue3", metadataExport.Metadata.Metadata3);
  1269. }
  1270. [TestMethod]
  1271. public void GetExportOfTTMetadataView2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1272. {
  1273. var metadata = new Dictionary<string, object>();
  1274. metadata.Add("Metadata1", "MetadataValue1");
  1275. metadata.Add("Metadata2", "MetadataValue2");
  1276. metadata.Add("Metadata3", "MetadataValue3");
  1277. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1278. new MicroExport("Contract", metadata, "Value1"),
  1279. new MicroExport("Contract", "Value2"));
  1280. var export = container.GetExport<string, IMetadataView>("Contract");
  1281. var metadataExport = (Lazy<string, IMetadataView>)export;
  1282. Assert.AreEqual("Value1", metadataExport.Value);
  1283. Assert.AreEqual("MetadataValue1", metadataExport.Metadata.Metadata1);
  1284. Assert.AreEqual("MetadataValue2", metadataExport.Metadata.Metadata2);
  1285. Assert.AreEqual("MetadataValue3", metadataExport.Metadata.Metadata3);
  1286. }
  1287. [TestMethod]
  1288. public void GetExports1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1289. {
  1290. var metadata = new Dictionary<string, object>();
  1291. metadata.Add("Metadata1", "MetadataValue1");
  1292. metadata.Add("Metadata2", "MetadataValue2");
  1293. metadata.Add("Metadata3", "MetadataValue3");
  1294. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1295. new MicroExport("Contract", metadata, "Value1"),
  1296. new MicroExport("Contract", "Value2"));
  1297. var definition = ImportDefinitionFactory.Create(
  1298. "Contract",
  1299. new Dictionary<string, Type> { { "Metadata1", typeof(object) }, { "Metadata2", typeof(object) }, { "Metadata3", typeof(object) } }
  1300. );
  1301. var exports = container.GetExports(definition);
  1302. Assert.AreEqual(1, exports.Count());
  1303. var export = exports.First();
  1304. Assert.AreEqual("Value1", export.Value);
  1305. EnumerableAssert.AreEqual(metadata, export.Metadata);
  1306. }
  1307. [TestMethod]
  1308. public void GetExports2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1309. {
  1310. var metadata = new Dictionary<string, object>();
  1311. metadata.Add("Metadata1", "MetadataValue1");
  1312. metadata.Add("Metadata2", "MetadataValue2");
  1313. metadata.Add("Metadata3", "MetadataValue3");
  1314. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1315. new MicroExport("Contract", metadata, "Value1"),
  1316. new MicroExport("Contract", "Value2"));
  1317. var exports = container.GetExports(typeof(string), typeof(IMetadataView), "Contract");
  1318. Assert.AreEqual(1, exports.Count());
  1319. var export = exports.First();
  1320. IMetadataView exportMetadata = export.Metadata as IMetadataView;
  1321. Assert.AreEqual("Value1", export.Value);
  1322. Assert.IsNotNull(exportMetadata);
  1323. Assert.AreEqual("MetadataValue1", exportMetadata.Metadata1);
  1324. Assert.AreEqual("MetadataValue2", exportMetadata.Metadata2);
  1325. Assert.AreEqual("MetadataValue3", exportMetadata.Metadata3);
  1326. }
  1327. [TestMethod]
  1328. public void GetExportsOfTTMetadataView1_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1329. {
  1330. var metadata = new Dictionary<string, object>();
  1331. metadata.Add("Metadata1", "MetadataValue1");
  1332. metadata.Add("Metadata2", "MetadataValue2");
  1333. metadata.Add("Metadata3", "MetadataValue3");
  1334. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1335. new MicroExport(typeof(string), metadata, "Value1"),
  1336. new MicroExport(typeof(string), "Value2"));
  1337. var exports = container.GetExports<string, IMetadataView>();
  1338. Assert.AreEqual(1, exports.Count());
  1339. var export = (Lazy<string, IMetadataView>)exports.First();
  1340. Assert.AreEqual("Value1", export.Value);
  1341. Assert.AreEqual("MetadataValue1", export.Metadata.Metadata1);
  1342. Assert.AreEqual("MetadataValue2", export.Metadata.Metadata2);
  1343. Assert.AreEqual("MetadataValue3", export.Metadata.Metadata3);
  1344. }
  1345. [TestMethod]
  1346. public void GetExportsOfTTMetadataView2_TypeAsMetadataViewTypeArgument_IsUsedAsMetadataConstraint()
  1347. {
  1348. var metadata = new Dictionary<string, object>();
  1349. metadata.Add("Metadata1", "MetadataValue1");
  1350. metadata.Add("Metadata2", "MetadataValue2");
  1351. metadata.Add("Metadata3", "MetadataValue3");
  1352. var container = ContainerFactory.Create(new MicroExport("Another", metadata, "Value1"),
  1353. new MicroExport("Contract", metadata, "Value1"),
  1354. new MicroExport("Contract", "Value2"));
  1355. var exports = container.GetExports<string, IMetadataView>("Contract");
  1356. Assert.AreEqual(1, exports.Count());
  1357. var export = (Lazy<string, IMetadataView>)exports.First();
  1358. Assert.AreEqual("Value1", export.Value);
  1359. Assert.AreEqual("MetadataValue1", export.Metadata.Metadata1);
  1360. Assert.AreEqual("MetadataValue2", export.Metadata.Metadata2);
  1361. Assert.AreEqual("MetadataValue3", export.Metadata.Metadata3);
  1362. }
  1363. [TestMethod]
  1364. public void GetExports1_AskingForExactlyOneAndAllWhenContainerEmpty_ShouldThrowCardinalityMismatch()
  1365. {
  1366. var container = CreateCompositionContainer();
  1367. var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ExactlyOne);
  1368. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  1369. {
  1370. container.GetExports(definition);
  1371. });
  1372. }
  1373. [TestMethod]
  1374. public void GetExports1_AskingForZeroOrOneAndAllWhenContainerEmpty_ShouldReturnEmpty()
  1375. {
  1376. var container = CreateCompositionContainer();
  1377. var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ZeroOrOne);
  1378. var exports = container.GetExports(definition);
  1379. EnumerableAssert.IsEmpty(exports);
  1380. }
  1381. [TestMethod]
  1382. public void GetExports1_AskingForExactlyOneAndAllWhenContainerEmpty_ShouldReturnEmpty()
  1383. {
  1384. var container = CreateCompositionContainer();
  1385. var definition = ImportDefinitionFactory.Create(export => true, ImportCardinality.ZeroOrMore);
  1386. var exports = container.GetExports(definition);
  1387. EnumerableAssert.IsEmpty(exports);
  1388. }
  1389. [TestMethod]
  1390. [Ignore]
  1391. [WorkItem(465976)]
  1392. public void RemovePart_PartNotInContainerAsPartArgument_ShouldNotCauseImportsToBeRebound()
  1393. {
  1394. const string contractName = "Contract";
  1395. var exporter = PartFactory.CreateExporter(new MicroExport(contractName, 1));
  1396. var importer = PartFactory.CreateImporter(contractName);
  1397. var container = ContainerFactory.Create(exporter, importer);
  1398. Assert.AreEqual(1, importer.Value);
  1399. Assert.AreEqual(1, importer.ImportSatisfiedCount);
  1400. var doesNotExistInContainer = PartFactory.CreateExporter(new MicroExport(contractName, 2));
  1401. CompositionBatch batch = new CompositionBatch();
  1402. batch.RemovePart(doesNotExistInContainer);
  1403. container.Compose(batch);
  1404. Assert.AreEqual(1, importer.ImportSatisfiedCount);
  1405. }
  1406. [TestMethod]
  1407. [Ignore]
  1408. [WorkItem(436847)]
  1409. public void RemovePart_PartInContainerQueueAsPartArgument_ShouldNotLeavePartInContainer()
  1410. {
  1411. const string contractName = "Contract";
  1412. var exporter = PartFactory.CreateExporter(new MicroExport(contractName, 1));
  1413. var importer = PartFactory.CreateImporter(contractName);
  1414. var container = ContainerFactory.Create(exporter, importer);
  1415. CompositionBatch batch = new CompositionBatch();
  1416. batch.RemovePart(exporter);
  1417. container.Compose(batch);
  1418. Assert.IsNull(importer.Value);
  1419. Assert.AreEqual(2, importer.ImportSatisfiedCount);
  1420. }
  1421. [TestMethod]
  1422. public void RemovePart_PartAlreadyRemovedAsPartArgument_ShouldNotThrow()
  1423. {
  1424. var exporter = PartFactory.CreateExporter(new MicroExport("Contract", 1));
  1425. var container = ContainerFactory.Create(exporter);
  1426. Assert.AreEqual(1, container.GetExportedValue<int>("Contract"));
  1427. CompositionBatch batch = new CompositionBatch();
  1428. batch.RemovePart(exporter);
  1429. container.Compose(batch);
  1430. Assert.IsFalse(container.IsPresent("Contract"));
  1431. batch = new CompositionBatch();
  1432. batch.RemovePart(exporter);
  1433. container.Compose(batch);
  1434. Assert.IsFalse(container.IsPresent("Contract"));
  1435. }
  1436. [TestMethod]
  1437. public void TryComposeSimple()
  1438. {
  1439. var container = CreateCompositionContainer();
  1440. Int32Importer importer = new Int32Importer();
  1441. CompositionBatch batch = new CompositionBatch();
  1442. batch.AddParts(importer, new Int32Exporter(42));
  1443. container.Compose(batch);
  1444. Assert.AreEqual(42, importer.Value, "Expected value imported from export");
  1445. }
  1446. [TestMethod]
  1447. public void TryComposeSimpleFail()
  1448. {
  1449. var container = CreateCompositionContainer();
  1450. Int32Importer importer = new Int32Importer();
  1451. CompositionBatch batch = new CompositionBatch();
  1452. batch.AddParts(importer);
  1453. CompositionAssert.ThrowsChangeRejectedError(ErrorId.ImportEngine_PartCannotSetImport, ErrorId.ImportEngine_ImportCardinalityMismatch, RetryMode.DoNotRetry, () =>
  1454. {
  1455. container.Compose(batch);
  1456. });
  1457. Assert.AreEqual(0, importer.Value, "Expected default value to remain");
  1458. }
  1459. [TestMethod]
  1460. public void ComposeDisposableChildContainer()
  1461. {
  1462. var outerContainer = CreateCompositionContainer();
  1463. Int32Importer outerImporter = new Int32Importer();
  1464. CompositionBatch outerBatch = new CompositionBatch();
  1465. var key = outerBatch.AddExportedValue("Value", 42);
  1466. outerBatch.AddPart(outerImporter);
  1467. outerContainer.Compose(outerBatch);
  1468. Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
  1469. Int32Importer innerImporter = new Int32Importer();
  1470. var innerContainer = new CompositionContainer(outerContainer);
  1471. CompositionBatch innerBatch = new CompositionBatch();
  1472. innerBatch.AddPart(innerImporter);
  1473. innerContainer.Compose(innerBatch);
  1474. Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
  1475. Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
  1476. outerBatch = new CompositionBatch();
  1477. outerBatch.RemovePart(key);
  1478. key = outerBatch.AddExportedValue("Value", -5);
  1479. outerContainer.Compose(outerBatch);
  1480. Assert.AreEqual(-5, innerImporter.Value, "Expected update value imported from export");
  1481. Assert.AreEqual(-5, outerImporter.Value, "Expected updated value imported from export");
  1482. innerContainer.Dispose();
  1483. outerBatch = new CompositionBatch();
  1484. outerBatch.RemovePart(key);
  1485. key = outerBatch.AddExportedValue("Value", 500);
  1486. outerContainer.Compose(outerBatch);
  1487. Assert.AreEqual(500, outerImporter.Value, "Expected updated value imported from export");
  1488. Assert.AreEqual(-5, innerImporter.Value, "Expected value not updated");
  1489. }
  1490. [TestMethod]
  1491. public void RemoveValueTest()
  1492. {
  1493. var container = CreateCompositionContainer();
  1494. CompositionBatch batch = new CompositionBatch();
  1495. var key = batch.AddExportedValue("foo", "hello");
  1496. container.Compose(batch);
  1497. var result = container.GetExportedValue<string>("foo");
  1498. Assert.AreEqual("hello", result, "Should get the correct value");
  1499. batch = new CompositionBatch();
  1500. batch.RemovePart(key);
  1501. container.Compose(batch);
  1502. Assert.IsFalse(container.IsPresent("foo"));
  1503. batch = new CompositionBatch();
  1504. batch.RemovePart(key); // Remove should be idempotent
  1505. container.Compose(batch);
  1506. }
  1507. [TestMethod]
  1508. [TestProperty("Type", "Integration")]
  1509. public void OptionalImportsOfValueTypeBoundToDefaultValueShouldNotAffectAvailableValues()
  1510. {
  1511. var container = CreateCompositionContainer();
  1512. var importer = new OptionalImporter();
  1513. CompositionBatch batch = new CompositionBatch();
  1514. batch.AddPart(importer);
  1515. container.Compose(batch);
  1516. Assert.AreEqual(0, importer.ValueType);
  1517. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  1518. {
  1519. container.GetExportedValue<int>("ValueType");
  1520. });
  1521. }
  1522. [TestMethod]
  1523. [TestProperty("Type", "Integration")]
  1524. public void OptionalImportsOfNullableValueTypeBoundToDefaultValueShouldNotAffectAvailableValues()
  1525. {
  1526. var container = CreateCompositionContainer();
  1527. var importer = new OptionalImporter();
  1528. CompositionBatch batch = new CompositionBatch();
  1529. batch.AddPart(importer);
  1530. container.Compose(batch);
  1531. Assert.IsNull(importer.NullableValueType);
  1532. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  1533. {
  1534. container.GetExportedValue<int>("NullableValueType");
  1535. });
  1536. }
  1537. [TestMethod]
  1538. [TestProperty("Type", "Integration")]
  1539. public void OptionalImportsOfReferenceTypeBoundToDefaultValueShouldNotAffectAvailableValues()
  1540. {
  1541. var container = CreateCompositionContainer();
  1542. var importer = new OptionalImporter();
  1543. CompositionBatch batch = new CompositionBatch();
  1544. batch.AddPart(importer);
  1545. container.Compose(batch);
  1546. Assert.IsNull(importer.ReferenceType);
  1547. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  1548. {
  1549. container.GetExportedValue<int>("ReferenceType");
  1550. });
  1551. }
  1552. [TestMethod]
  1553. public void ExportsChanged_ExportNothing_ShouldNotFireExportsChanged()
  1554. {
  1555. var container = CreateCompositionContainer();
  1556. container.ExportsChanged += (sender, args) =>
  1557. {
  1558. Assert.Fail("Event should not be fired!");
  1559. };
  1560. CompositionBatch batch = new CompositionBatch();
  1561. container.Compose(batch);
  1562. }
  1563. [TestMethod]
  1564. public void ExportsChanged_ExportAdded_ShouldFireExportsChanged()
  1565. {
  1566. var container = CreateCompositionContainer();
  1567. IEnumerable<string> changedNames = null;
  1568. container.ExportsChanged += (sender, args) =>
  1569. {
  1570. Assert.AreSame(container, sender);
  1571. Assert.IsNull(changedNames, "Ensure this event only fires once!");
  1572. Assert.IsNotNull(args.AddedExports);
  1573. Assert.IsNotNull(args.RemovedExports);
  1574. Assert.IsNotNull(args.ChangedContractNames);
  1575. changedNames = args.ChangedContractNames;
  1576. };
  1577. CompositionBatch batch = new CompositionBatch();
  1578. batch.AddExportedValue("MyExport", new object());
  1579. container.Compose(batch);
  1580. EnumerableAssert.AreEqual(changedNames, "MyExport");
  1581. }
  1582. [TestMethod]
  1583. public void ExportsChanged_ExportRemoved_ShouldFireExportsChanged()
  1584. {
  1585. var container = CreateCompositionContainer();
  1586. IEnumerable<string> changedNames = null;
  1587. CompositionBatch batch = new CompositionBatch();
  1588. var part = batch.AddExportedValue("MyExport", new object());
  1589. container.Compose(batch);
  1590. container.ExportsChanged += (sender, args) =>
  1591. {
  1592. Assert.AreSame(container, sender);
  1593. Assert.IsNull(changedNames, "Ensure this event only fires once!");
  1594. Assert.IsNotNull(args.AddedExports);
  1595. Assert.IsNotNull(args.RemovedExports);
  1596. Assert.IsNotNull(args.ChangedContractNames);
  1597. changedNames = args.ChangedContractNames;
  1598. };
  1599. batch = new CompositionBatch();
  1600. batch.RemovePart(part);
  1601. container.Compose(batch);
  1602. EnumerableAssert.AreEqual(changedNames, "MyExport");
  1603. }
  1604. [TestMethod]
  1605. public void ExportsChanged_ExportAddAnother_ShouldFireExportsChanged()
  1606. {
  1607. var container = CreateCompositionContainer();
  1608. IEnumerable<string> changedNames = null;
  1609. CompositionBatch batch = new CompositionBatch();
  1610. batch.AddExportedValue("MyExport", new object());
  1611. container.Compose(batch);
  1612. container.ExportsChanged += (sender, args) =>
  1613. {
  1614. Assert.AreSame(container, sender);
  1615. Assert.IsNull(changedNames, "Ensure this event only fires once!");
  1616. Assert.IsNotNull(args.AddedExports);
  1617. Assert.IsNotNull(args.RemovedExports);
  1618. Assert.IsNotNull(args.ChangedContractNames);
  1619. changedNames = args.ChangedContractNames;
  1620. };
  1621. batch = new CompositionBatch();
  1622. // Adding another should cause an update.
  1623. batch.AddExportedValue("MyExport", new object());
  1624. container.Compose(batch);
  1625. EnumerableAssert.AreEqual(changedNames, "MyExport");
  1626. }
  1627. [TestMethod]
  1628. public void ExportsChanged_AddExportOnParent_ShouldFireExportsChangedOnBoth()
  1629. {
  1630. var parent = CreateCompositionContainer();
  1631. var child = new CompositionContainer(parent);
  1632. IEnumerable<string> parentNames = null;
  1633. parent.ExportsChanged += (sender, args) =>
  1634. {
  1635. Assert.AreSame(parent, sender);
  1636. parentNames = args.ChangedContractNames;
  1637. };
  1638. IEnumerable<string> childNames = null;
  1639. child.ExportsChanged += (sender, args) =>
  1640. {
  1641. Assert.AreSame(child, sender);
  1642. childNames = args.ChangedContractNames;
  1643. };
  1644. CompositionBatch batch = new CompositionBatch();
  1645. batch.AddExportedValue("MyExport", new object());
  1646. parent.Compose(batch);
  1647. EnumerableAssert.AreEqual(parentNames, "MyExport");
  1648. EnumerableAssert.AreEqual(childNames, "MyExport");
  1649. }
  1650. [TestMethod]
  1651. public void ExportsChanged_AddExportOnChild_ShouldFireExportsChangedOnChildOnly()
  1652. {
  1653. var parent = CreateCompositionContainer();
  1654. var child = new CompositionContainer(parent);
  1655. parent.ExportsChanged += (sender, args) =>
  1656. {
  1657. Assert.Fail("Should not fire on parent container!!");
  1658. };
  1659. IEnumerable<string> childNames = null;
  1660. child.ExportsChanged += (sender, args) =>
  1661. {
  1662. Assert.AreSame(child, sender);
  1663. childNames = args.ChangedContractNames;
  1664. };
  1665. CompositionBatch batch = new CompositionBatch();
  1666. batch.AddExportedValue("MyExport2", new object());
  1667. child.Compose(batch);
  1668. EnumerableAssert.AreEqual(childNames, "MyExport2");
  1669. }
  1670. [TestMethod]
  1671. public void Dispose_BeforeCompose_CanBeCallMultipleTimes()
  1672. {
  1673. var container = ContainerFactory.Create(PartFactory.Create(), PartFactory.Create());
  1674. container.Dispose();
  1675. container.Dispose();
  1676. container.Dispose();
  1677. }
  1678. [TestMethod]
  1679. public void Dispose_AfterCompose_CanBeCallMultipleTimes()
  1680. {
  1681. var container = ContainerFactory.Create(PartFactory.Create(), PartFactory.Create());
  1682. container.Dispose();
  1683. container.Dispose();
  1684. container.Dispose();
  1685. }
  1686. [TestMethod]
  1687. public void Dispose_CallsGCSuppressFinalize()
  1688. {
  1689. bool finalizerCalled = false;
  1690. var container = ContainerFactory.CreateDisposable(disposing =>
  1691. {
  1692. if (!disposing)
  1693. {
  1694. finalizerCalled = true;
  1695. }
  1696. });
  1697. container.Dispose();
  1698. GC.Collect();
  1699. GC.WaitForPendingFinalizers();
  1700. GC.Collect();
  1701. Assert.IsFalse(finalizerCalled);
  1702. }
  1703. [TestMethod]
  1704. public void Dispose_CallsDisposeBoolWithTrue()
  1705. {
  1706. var container = ContainerFactory.CreateDisposable(disposing =>
  1707. {
  1708. Assert.IsTrue(disposing);
  1709. });
  1710. container.Dispose();
  1711. }
  1712. [TestMethod]
  1713. public void Dispose_CallsDisposeBoolOnce()
  1714. {
  1715. int disposeCount = 0;
  1716. var container = ContainerFactory.CreateDisposable(disposing =>
  1717. {
  1718. disposeCount++;
  1719. });
  1720. container.Dispose();
  1721. Assert.AreEqual(1, disposeCount);
  1722. }
  1723. [TestMethod]
  1724. public void Dispose_ContainerAsExportedValue_CanBeDisposed()
  1725. {
  1726. using (var container = CreateCompositionContainer())
  1727. {
  1728. CompositionBatch batch = new CompositionBatch();
  1729. batch.AddExportedValue<ICompositionService>(container);
  1730. container.Compose(batch);
  1731. }
  1732. }
  1733. [TestMethod]
  1734. public void Dispose_ContainerAsPart_CanBeDisposed()
  1735. { // Tests that when we re-enter CompositionContainer.Dispose, that we don't
  1736. // stack overflow.
  1737. using (var container = CreateCompositionContainer())
  1738. {
  1739. var part = PartFactory.CreateExporter(new MicroExport(typeof(ICompositionService), container));
  1740. CompositionBatch batch = new CompositionBatch();
  1741. batch.AddPart(part);
  1742. container.Compose(batch);
  1743. Assert.AreSame(container, container.GetExportedValue<ICompositionService>());
  1744. }
  1745. }
  1746. [TestMethod]
  1747. public void ICompositionService_ShouldNotBeImplicitlyExported()
  1748. {
  1749. var container = CreateCompositionContainer();
  1750. Assert.IsFalse(container.IsPresent<ICompositionService>());
  1751. }
  1752. [TestMethod]
  1753. public void CompositionContainer_ShouldNotBeImplicitlyExported()
  1754. {
  1755. var container = CreateCompositionContainer();
  1756. Assert.IsFalse(container.IsPresent<CompositionContainer>());
  1757. }
  1758. [TestMethod]
  1759. public void ICompositionService_ShouldNotBeImplicitlyImported()
  1760. {
  1761. var importer = PartFactory.CreateImporter<ICompositionService>();
  1762. var container = ContainerFactory.Create(importer);
  1763. Assert.IsNull(importer.Value);
  1764. }
  1765. [TestMethod]
  1766. public void CompositionContainer_ShouldNotBeImplicitlyImported()
  1767. {
  1768. var importer = PartFactory.CreateImporter<CompositionContainer>();
  1769. var container = ContainerFactory.Create(importer);
  1770. Assert.IsNull(importer.Value);
  1771. }
  1772. [TestMethod]
  1773. public void ICompositionService_CanBeExported()
  1774. {
  1775. var container = CreateCompositionContainer();
  1776. CompositionBatch batch = new CompositionBatch();
  1777. batch.AddExportedValue<ICompositionService>(container);
  1778. container.Compose(batch);
  1779. Assert.AreSame(container, container.GetExportedValue<ICompositionService>());
  1780. }
  1781. [TestMethod]
  1782. public void CompositionContainer_CanBeExported()
  1783. {
  1784. var container = CreateCompositionContainer();
  1785. CompositionBatch batch = new CompositionBatch();
  1786. batch.AddExportedValue<CompositionContainer>(container);
  1787. container.Compose(batch);
  1788. Assert.AreSame(container, container.GetExportedValue<CompositionContainer>());
  1789. }
  1790. [TestMethod]
  1791. public void ReleaseExport_Null_ShouldThrowArugmentNull()
  1792. {
  1793. var container = CreateCompositionContainer();
  1794. ExceptionAssert.ThrowsArgument<ArgumentNullException>("export",
  1795. () => container.ReleaseExport(null));
  1796. }
  1797. [TestMethod]
  1798. public void ReleaseExports_Null_ShouldThrowArgumentNull()
  1799. {
  1800. var container = CreateCompositionContainer();
  1801. ExceptionAssert.ThrowsArgument<ArgumentNullException>("exports",
  1802. () => container.ReleaseExports(null));
  1803. }
  1804. [TestMethod]
  1805. public void ReleaseExports_ElementNull_ShouldThrowArgument()
  1806. {
  1807. var container = CreateCompositionContainer();
  1808. ExceptionAssert.ThrowsArgument<ArgumentException>("exports",
  1809. () => container.ReleaseExports(new Export[] { null }));
  1810. }
  1811. public class OptionalImporter
  1812. {
  1813. [Import("ValueType", AllowDefault = true)]
  1814. public int ValueType
  1815. {
  1816. get;
  1817. set;
  1818. }
  1819. [Import("NullableValueType", AllowDefault = true)]
  1820. public int? NullableValueType
  1821. {
  1822. get;
  1823. set;
  1824. }
  1825. [Import("ReferenceType", AllowDefault = true)]
  1826. public string ReferenceType
  1827. {
  1828. get;
  1829. set;
  1830. }
  1831. }
  1832. public class ExportSimpleIntWithException
  1833. {
  1834. [Export("SimpleInt")]
  1835. public int SimpleInt { get { throw new NotImplementedException(); } }
  1836. }
  1837. [TestMethod]
  1838. public void TryGetValueWithCatalogVerifyExecptionDuringGet()
  1839. {
  1840. var cat = CatalogFactory.CreateDefaultAttributed();
  1841. var container = new CompositionContainer(cat);
  1842. CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotGetExportedValue, ErrorId.ReflectionModel_ExportThrewException, () =>
  1843. {
  1844. container.GetExportedValue<int>("SimpleInt");
  1845. });
  1846. }
  1847. [TestMethod]
  1848. public void TryGetExportedValueWhileLockedForNotify()
  1849. {
  1850. var container = CreateCompositionContainer();
  1851. CompositionBatch batch = new CompositionBatch();
  1852. batch.AddParts(new CallbackImportNotify(delegate
  1853. {
  1854. container.GetExportedValueOrDefault<int>();
  1855. }));
  1856. container.Compose(batch);
  1857. }
  1858. [TestMethod]
  1859. public void RawExportTests()
  1860. {
  1861. var container = CreateCompositionContainer();
  1862. CompositionBatch batch = new CompositionBatch();
  1863. batch.AddExportedValue("foo", 1);
  1864. container.Compose(batch);
  1865. Lazy<int> export = container.GetExport<int>("foo");
  1866. Assert.AreEqual(1, export.Value, "Should be the value I put in...");
  1867. }
  1868. [TestMethod]
  1869. [Ignore]
  1870. [WorkItem(468388)]
  1871. public void ContainerXGetXTest()
  1872. {
  1873. CompositionContainer container = CreateCompositionContainer();
  1874. CompositionBatch batch = new CompositionBatch();
  1875. batch.AddPart(new MyExporterWithNoFoo());
  1876. container.Compose(batch);
  1877. ContainerXGetExportBoundValue(container);
  1878. }
  1879. [TestMethod]
  1880. [Ignore]
  1881. [WorkItem(468388)]
  1882. public void ContainerXGetXByComponentCatalogTest()
  1883. {
  1884. CompositionContainer container = ContainerFactory.CreateWithDefaultAttributedCatalog();
  1885. ContainerXGetExportBoundValue(container);
  1886. }
  1887. private void ContainerXGetExportBoundValue(CompositionContainer container)
  1888. {
  1889. Assert.Fail("This scenario (required metadata warnings) no longer works, see 468388");
  1890. //string[] required = new string[] { "Foo" };
  1891. //string[] RequiredMetadataNotFound = new string[] { CompositionIssueId.RequiredMetadataNotFound, CompositionIssueId.CardinalityMismatch };
  1892. //container.TryGetExport<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1893. //container.TryGetExport<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1894. //container.TryGetExport<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
  1895. //container.TryGetExport<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
  1896. //container.TryGetExports<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1897. //container.TryGetExports<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1898. //container.TryGetExports<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
  1899. //container.TryGetExports<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
  1900. //container.TryGetExportedValue<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1901. //container.TryGetExportedValue<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1902. //container.TryGetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
  1903. //container.TryGetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
  1904. //container.TryGetExportedValues<MyExporterWithNoFoo>().VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1905. //container.TryGetExportedValues<MyExporterWithNoFoo>(required).VerifyFailure(CompositionIssueId.CardinalityMismatch);
  1906. //container.TryGetExportedValues<MyExporterWithNoFoo>("MyExporterWithNoFoo").VerifySuccess();
  1907. //container.TryGetExportedValues<MyExporterWithNoFoo>("MyExporterWithNoFoo", required).VerifyFailure(RequiredMetadataNotFound);
  1908. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() => container.GetExportedValue<MyExporterWithNoFoo>());
  1909. Assert.IsNotNull(container.GetExportedValue<MyExporterWithNoFoo>("MyExporterWithNoFoo"));
  1910. }
  1911. [Export("MyExporterWithNoFoo")]
  1912. public class MyExporterWithNoFoo
  1913. {
  1914. }
  1915. [Export("MyExporterWithFoo")]
  1916. [ExportMetadata("Foo", "Foo value")]
  1917. public class MyExporterWithFoo
  1918. {
  1919. }
  1920. [Export("MyExporterWithFooBar")]
  1921. [ExportMetadata("Foo", "Foo value")]
  1922. [ExportMetadata("Bar", "Bar value")]
  1923. public class MyExporterWithFooBar
  1924. {
  1925. }
  1926. #if !SILVERLIGHT
  1927. // Silverlight doesn't support strongly typed metadata
  1928. [TestMethod]
  1929. public void ConverterExportTests()
  1930. {
  1931. var container = CreateCompositionContainer();
  1932. CompositionBatch batch = new CompositionBatch();
  1933. batch.AddExportedValue("foo", 1);
  1934. container.Compose(batch);
  1935. var export = container.GetExport<int, IDictionary<string, object>>("foo");
  1936. Assert.AreEqual(1, export.Value, "Should be the value I put in...");
  1937. Assert.IsNotNull(export.Metadata, "Should have metadata (as an object)");
  1938. }
  1939. #endif //!SILVERLIGHT
  1940. [TestMethod]
  1941. public void RemoveFromWrongContainerTest()
  1942. {
  1943. CompositionContainer d1 = CreateCompositionContainer();
  1944. CompositionContainer d2 = CreateCompositionContainer();
  1945. CompositionBatch batch1 = new CompositionBatch();
  1946. var valueKey = batch1.AddExportedValue("a", 1);
  1947. d1.Compose(batch1);
  1948. CompositionBatch batch2 = new CompositionBatch();
  1949. batch2.RemovePart(valueKey);
  1950. // removing entry from wrong container, shoudl be a no-op
  1951. d2.Compose(batch2);
  1952. }
  1953. [TestMethod]
  1954. [TestProperty("Type", "Integration")]
  1955. public void AddPartSimple()
  1956. {
  1957. var container = CreateCompositionContainer();
  1958. var importer = new Int32Importer();
  1959. CompositionBatch batch = new CompositionBatch();
  1960. batch.AddPart(importer);
  1961. batch.AddPart(new Int32Exporter(42));
  1962. container.Compose(batch);
  1963. Assert.AreEqual(42, importer.Value, "Expected value imported from export");
  1964. }
  1965. [TestMethod]
  1966. [TestProperty("Type", "Integration")]
  1967. public void AddPart()
  1968. {
  1969. var container = CreateCompositionContainer();
  1970. Int32Importer importer = new Int32Importer();
  1971. CompositionBatch batch = new CompositionBatch();
  1972. batch.AddPart(AttributedModelServices.CreatePart(importer));
  1973. batch.AddPart(new Int32Exporter(42));
  1974. container.Compose(batch);
  1975. Assert.AreEqual(42, importer.Value, "Expected value imported from export");
  1976. }
  1977. [TestMethod]
  1978. public void ComposeReentrantChildContainerDisposed()
  1979. {
  1980. var container = CreateCompositionContainer();
  1981. Int32Importer outerImporter = new Int32Importer();
  1982. Int32Importer innerImporter = new Int32Importer();
  1983. Int32Exporter exporter = new Int32Exporter(42);
  1984. CompositionBatch batch = new CompositionBatch();
  1985. batch.AddPart(exporter);
  1986. container.Compose(batch);
  1987. CallbackExecuteCodeDuringCompose callback = new CallbackExecuteCodeDuringCompose(() =>
  1988. {
  1989. using (CompositionContainer innerContainer = new CompositionContainer(container))
  1990. {
  1991. CompositionBatch nestedBatch = new CompositionBatch();
  1992. nestedBatch.AddPart(innerImporter);
  1993. innerContainer.Compose(nestedBatch);
  1994. }
  1995. Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
  1996. });
  1997. batch = new CompositionBatch();
  1998. batch.AddParts(outerImporter, callback);
  1999. container.Compose(batch);
  2000. Assert.AreEqual(42, outerImporter.Value, "Expected value imported from export");
  2001. Assert.AreEqual(42, innerImporter.Value, "Expected value imported from export");
  2002. }
  2003. [TestMethod]
  2004. public void ComposeSimple()
  2005. {
  2006. var container = CreateCompositionContainer();
  2007. Int32Importer importer = new Int32Importer();
  2008. CompositionBatch batch = new CompositionBatch();
  2009. batch.AddParts(importer, new Int32Exporter(42));
  2010. container.Compose(batch);
  2011. Assert.AreEqual(42, importer.Value, "Expected value imported from export");
  2012. }
  2013. [TestMethod]
  2014. public void ComposeSimpleFail()
  2015. {
  2016. var container = CreateCompositionContainer();
  2017. Int32Importer importer = new Int32Importer();
  2018. CompositionBatch batch = new CompositionBatch();
  2019. batch.AddPart(importer);
  2020. CompositionAssert.ThrowsChangeRejectedError(ErrorId.ImportEngine_PartCannotSetImport, // Cannot set Int32Importer.Value because
  2021. ErrorId.ImportEngine_ImportCardinalityMismatch, // No exports are present that match contract
  2022. RetryMode.DoNotRetry, () =>
  2023. {
  2024. container.Compose(batch);
  2025. });
  2026. }
  2027. [TestMethod]
  2028. public void ExceptionDuringNotify()
  2029. {
  2030. var container = CreateCompositionContainer();
  2031. CompositionBatch batch = new CompositionBatch();
  2032. batch.AddParts(new CallbackImportNotify(delegate
  2033. {
  2034. throw new InvalidOperationException();
  2035. }));
  2036. CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotActivate, // Cannot activate CallbackImportNotify because
  2037. ErrorId.ReflectionModel_PartOnImportsSatisfiedThrewException, // OnImportsSatisfied threw an exception
  2038. RetryMode.DoNotRetry, () =>
  2039. {
  2040. container.Compose(batch);
  2041. });
  2042. }
  2043. [TestMethod]
  2044. public void NeutralComposeWhileNotified()
  2045. {
  2046. var container = CreateCompositionContainer();
  2047. CompositionBatch batch = new CompositionBatch();
  2048. batch.AddParts(new CallbackImportNotify(delegate
  2049. {
  2050. // Is this really a supported scenario?
  2051. container.Compose(batch);
  2052. }));
  2053. container.Compose(batch);
  2054. }
  2055. public class PartWithReentrantCompose : ComposablePart
  2056. {
  2057. private CompositionContainer _container;
  2058. public PartWithReentrantCompose(CompositionContainer container)
  2059. {
  2060. this._container = container;
  2061. }
  2062. public override IEnumerable<ExportDefinition> ExportDefinitions
  2063. {
  2064. get
  2065. {
  2066. this._container.ComposeExportedValue<string>("ExportedString");
  2067. return Enumerable.Empty<ExportDefinition>();
  2068. }
  2069. }
  2070. public override IEnumerable<ImportDefinition> ImportDefinitions
  2071. {
  2072. get
  2073. {
  2074. return Enumerable.Empty<ImportDefinition>();
  2075. }
  2076. }
  2077. public override object GetExportedValue(ExportDefinition definition)
  2078. {
  2079. throw new NotImplementedException();
  2080. }
  2081. public override void SetImport(ImportDefinition definition, IEnumerable<Export> exports)
  2082. {
  2083. throw new NotImplementedException();
  2084. }
  2085. }
  2086. [Export]
  2087. public class SimpleExporter
  2088. {
  2089. }
  2090. [TestMethod]
  2091. public void ThreadSafeCompositionContainer()
  2092. {
  2093. TypeCatalog catalog = new TypeCatalog(typeof(SimpleExporter));
  2094. CompositionContainer container = new CompositionContainer(catalog, true);
  2095. Int32Importer importer = new Int32Importer();
  2096. CompositionBatch batch = new CompositionBatch();
  2097. batch.AddParts(importer, new Int32Exporter(42));
  2098. container.Compose(batch);
  2099. Assert.IsNotNull(container.GetExportedValue<SimpleExporter>());
  2100. Assert.AreEqual(42, importer.Value, "Expected value imported from export");
  2101. container.Dispose();
  2102. }
  2103. [TestMethod]
  2104. public void ReentrantencyDisabledWhileComposing()
  2105. {
  2106. var container = CreateCompositionContainer();
  2107. CompositionBatch batch = new CompositionBatch();
  2108. batch.AddPart(new PartWithReentrantCompose(container));
  2109. ExceptionAssert.Throws<InvalidOperationException>(() =>
  2110. container.Compose(batch));
  2111. }
  2112. private static Expression<Func<ExportDefinition, bool>> ConstraintFromContract(string contractName)
  2113. {
  2114. return ConstraintFactory.Create(contractName);
  2115. }
  2116. private static string ContractFromType(Type type)
  2117. {
  2118. return AttributedModelServices.GetContractName(type);
  2119. }
  2120. private static CompositionContainer CreateCompositionContainer()
  2121. {
  2122. return new CompositionContainer();
  2123. }
  2124. public interface IMetadataView
  2125. {
  2126. string Metadata1
  2127. {
  2128. get;
  2129. }
  2130. string Metadata2
  2131. {
  2132. get;
  2133. }
  2134. string Metadata3
  2135. {
  2136. get;
  2137. }
  2138. }
  2139. [TestMethod]
  2140. public void ComposeExportedValueOfT_NullStringAsExportedValueArgument_VerifyCanPullOnValue()
  2141. {
  2142. var container = CreateCompositionContainer();
  2143. var expectation = (string)null;
  2144. container.ComposeExportedValue<string>(expectation);
  2145. var actualValue = container.GetExportedValue<string>();
  2146. Assert.AreEqual(expectation, actualValue);
  2147. }
  2148. [TestMethod]
  2149. public void ComposeExportedValueOfT_StringAsExportedValueArgument_VerifyCanPullOnValue()
  2150. {
  2151. var expectations = new List<string>();
  2152. expectations.Add((string)null);
  2153. expectations.Add(String.Empty);
  2154. expectations.Add("Value");
  2155. foreach (var expectation in expectations)
  2156. {
  2157. var container = CreateCompositionContainer();
  2158. container.ComposeExportedValue<string>(expectation);
  2159. var actualValue = container.GetExportedValue<string>();
  2160. Assert.AreEqual(expectation, actualValue);
  2161. }
  2162. }
  2163. [TestMethod]
  2164. public void ComposeExportedValueOfT_StringAsIEnumerableOfCharAsExportedValueArgument_VerifyCanPullOnValue()
  2165. {
  2166. var expectations = new List<string>();
  2167. expectations.Add((string)null);
  2168. expectations.Add(String.Empty);
  2169. expectations.Add("Value");
  2170. foreach (var expectation in expectations)
  2171. {
  2172. var container = CreateCompositionContainer();
  2173. container.ComposeExportedValue<IEnumerable<char>>(expectation);
  2174. var actualValue = container.GetExportedValue<IEnumerable<char>>();
  2175. Assert.AreEqual(expectation, actualValue);
  2176. }
  2177. }
  2178. [TestMethod]
  2179. public void ComposeExportedValueOfT_ObjectAsExportedValueArgument_VerifyCanPullOnValue()
  2180. {
  2181. var expectations = new List<object>();
  2182. expectations.Add((string)null);
  2183. expectations.Add(String.Empty);
  2184. expectations.Add("Value");
  2185. expectations.Add(42);
  2186. expectations.Add(new object());
  2187. foreach (var expectation in expectations)
  2188. {
  2189. var container = CreateCompositionContainer();
  2190. container.ComposeExportedValue<object>(expectation);
  2191. var actualValue = container.GetExportedValue<object>();
  2192. Assert.AreEqual(expectation, actualValue);
  2193. }
  2194. }
  2195. [TestMethod]
  2196. public void ComposeExportedValueOfT_ExportedValue_ExportedUnderDefaultContractName()
  2197. {
  2198. string expectedContractName = AttributedModelServices.GetContractName(typeof(string));
  2199. var container = CreateCompositionContainer();
  2200. container.ComposeExportedValue<string>("Value");
  2201. var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
  2202. var exports = container.GetExports(importDefinition);
  2203. Assert.AreEqual(1, exports.Count());
  2204. Assert.AreEqual(expectedContractName, exports.Single().Definition.ContractName);
  2205. }
  2206. [TestMethod]
  2207. public void ComposeExportedValueOfT_ExportedValue_ExportContainsEmptyMetadata()
  2208. {
  2209. var container = CreateCompositionContainer();
  2210. container.ComposeExportedValue<string>("Value");
  2211. var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
  2212. var exports = container.GetExports(importDefinition);
  2213. Assert.AreEqual(1, exports.Count());
  2214. Assert.AreEqual(1, exports.Single().Metadata.Count); // contains type identity
  2215. }
  2216. [TestMethod]
  2217. public void ComposeExportedValueOfT_ExportedValue_LazyContainsEmptyMetadata()
  2218. {
  2219. var container = CreateCompositionContainer();
  2220. container.ComposeExportedValue<string>("Value");
  2221. var lazy = container.GetExport<string, IDictionary<string, object>>();
  2222. Assert.AreEqual(1, lazy.Metadata.Count); // contains type identity
  2223. }
  2224. [TestMethod]
  2225. public void ComposeExportedValueOfT_ExportedValue_ImportsAreNotDiscovered()
  2226. {
  2227. var container = CreateCompositionContainer();
  2228. var importer = new PartWithRequiredImport();
  2229. container.ComposeExportedValue<object>(importer);
  2230. var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
  2231. var exports = container.GetExports(importDefinition);
  2232. Assert.AreEqual(1, exports.Count()); // we only get one if the import was not discovered since the import is not satisfied
  2233. }
  2234. [TestMethod]
  2235. public void ComposeExportedValueOfT_NullAsContractName_ThrowsArgumentNullException()
  2236. {
  2237. var container = CreateCompositionContainer();
  2238. ExceptionAssert.ThrowsArgument<ArgumentNullException>("contractName", () =>
  2239. container.ComposeExportedValue<string>((string)null, "Value"));
  2240. }
  2241. [TestMethod]
  2242. public void ComposeExportedValueOfT_EmptyStringAsContractName_ThrowsArgumentException()
  2243. {
  2244. var container = CreateCompositionContainer();
  2245. ExceptionAssert.ThrowsArgument<ArgumentException>("contractName", () =>
  2246. container.ComposeExportedValue<string>(String.Empty, "Value"));
  2247. }
  2248. [TestMethod]
  2249. public void ComposeExportedValueOfT_ValidContractName_ValidExportedValue_VerifyCanPullOnValue()
  2250. {
  2251. var expectations = new List<Tuple<string, string>>();
  2252. expectations.Add(new Tuple<string, string>(" ", (string)null));
  2253. expectations.Add(new Tuple<string, string>(" ", String.Empty));
  2254. expectations.Add(new Tuple<string, string>(" ", "Value"));
  2255. expectations.Add(new Tuple<string, string>("ContractName", (string)null));
  2256. expectations.Add(new Tuple<string, string>("ContractName", String.Empty));
  2257. expectations.Add(new Tuple<string, string>("ContractName", "Value"));
  2258. foreach (var expectation in expectations)
  2259. {
  2260. var container = CreateCompositionContainer();
  2261. container.ComposeExportedValue<string>(expectation.Item1, expectation.Item2);
  2262. var actualValue = container.GetExportedValue<string>(expectation.Item1);
  2263. Assert.AreEqual(expectation.Item2, actualValue);
  2264. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  2265. container.GetExportedValue<string>());
  2266. }
  2267. }
  2268. [TestMethod]
  2269. public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ExportedUnderSpecifiedContractName()
  2270. {
  2271. string expectedContractName = "ContractName";
  2272. var container = CreateCompositionContainer();
  2273. container.ComposeExportedValue<string>(expectedContractName, "Value");
  2274. var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
  2275. var exports = container.GetExports(importDefinition);
  2276. Assert.AreEqual(1, exports.Count());
  2277. Assert.AreEqual(expectedContractName, exports.Single().Definition.ContractName);
  2278. }
  2279. [TestMethod]
  2280. [Ignore]
  2281. [WorkItem(812029)]
  2282. public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ExportContainsEmptyMetadata()
  2283. {
  2284. string expectedContractName = "ContractName";
  2285. var container = CreateCompositionContainer();
  2286. container.ComposeExportedValue<string>(expectedContractName, "Value");
  2287. var importDefinition = new ImportDefinition(ed => ed.ContractName == expectedContractName, null, ImportCardinality.ZeroOrMore, false, false);
  2288. var exports = container.GetExports(importDefinition);
  2289. Assert.AreEqual(1, exports.Count());
  2290. Assert.AreEqual(1, exports.Single().Metadata.Count); // contains type identity
  2291. }
  2292. [TestMethod]
  2293. public void ComposeExportedValueOfT_ValidContractName_ExportedValue_ImportsAreNotDiscovered()
  2294. {
  2295. var container = CreateCompositionContainer();
  2296. var importer = new PartWithRequiredImport();
  2297. container.ComposeExportedValue<object>("ContractName", importer);
  2298. var importDefinition = new ImportDefinition(ed => true, null, ImportCardinality.ZeroOrMore, false, false);
  2299. var exports = container.GetExports(importDefinition);
  2300. Assert.AreEqual(1, exports.Count()); // we only get one if the import was not discovered since the import is not satisfied
  2301. }
  2302. [TestMethod]
  2303. public void TestExportedValueCachesNullValue()
  2304. {
  2305. var container = ContainerFactory.Create();
  2306. var exporter = new ExportsMutableProperty();
  2307. exporter.Property = null;
  2308. container.ComposeParts(exporter);
  2309. Assert.IsNull(container.GetExportedValue<string>("Property"));
  2310. exporter.Property = "Value1";
  2311. // Exported value should have been cached and so it shouldn't change
  2312. Assert.IsNull(container.GetExportedValue<string>("Property"));
  2313. }
  2314. public class ExportsMutableProperty
  2315. {
  2316. [Export("Property")]
  2317. public string Property { get; set; }
  2318. }
  2319. public class PartWithRequiredImport
  2320. {
  2321. [Import]
  2322. public object Import { get; set; }
  2323. }
  2324. }
  2325. }