| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- // -----------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // -----------------------------------------------------------------------
- using System;
- using System.Linq;
- using System.ComponentModel.Composition;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using System.ComponentModel.Composition.UnitTesting;
- using System.ComponentModel.Composition.Factories;
- using System.ComponentModel.Composition.Primitives;
- namespace Tests.Integration
- {
- [TestClass]
- public class CompositionContainerAttributedModelCycleTests
- {
- // There are nine possible scenarios that cause a part to have a dependency on another part, some of which
- // are legal and some not. For example, below, is not legal for a part, A, to have a prerequisite dependency
- // on a part, B, which has also has a prerequisite dependency on A. In contrast, however, it is legal for
- // part A and B to have a non-prerequisite (Post) dependency on each other.
- //
- // ------------------------------
- // | | B |
- // | | Pre | Post | None |
- // |--------|-----|------|------|
- // | Pre | X | X | √ |
- // | A Post | X | √ | √ |
- // | None | √ | √ | √ |
- // ------------------------------
- //
- [TestMethod]
- public void APrerequisiteDependsOnBPrerequisite_ShouldThrowComposition()
- {
- AssertCycle(typeof(APrerequisiteDependsOnBPrerequisite),
- typeof(BPrerequisiteDependsOnAPrerequisite));
- }
- [TestMethod]
- public void APrerequisiteDependsOnBPost_ShouldThrowComposition()
- {
- AssertCycle(typeof(APrerequisiteDependsOnBPost),
- typeof(BPostDependsOnAPrerequisite));
- }
- [TestMethod]
- public void APrerequisiteDependsOnBNone_ShouldNotThrow()
- {
- AssertNotCycle(typeof(APrerequisiteDependsOnBNone),
- typeof(BNone));
- }
- [TestMethod]
- public void APostDependsOnBPrerequisite_ShouldThrowComposition()
- {
- AssertCycle(typeof(APostDependsOnBPrerequisite),
- typeof(BPrerequisiteDependsOnAPost));
- }
- [TestMethod]
- public void APostDependsOnBPost_ShouldNotThrow()
- {
- AssertNotCycle(typeof(APostDependsOnBPost),
- typeof(BPostDependsOnAPost));
- }
- [TestMethod]
- public void APostDependsOnBNone_ShouldNotThrow()
- {
- AssertNotCycle(typeof(APostDependsOnBNone),
- typeof(BNone));
- }
- [TestMethod]
- public void BPrerequisiteDependsOnANone_ShouldNotThrow()
- {
- AssertNotCycle(typeof(ANone),
- typeof(BPrerequisiteDependsOnANone));
- }
- [TestMethod]
- public void BPostDependsOnANone_ShouldNotThrow()
- {
- AssertNotCycle(typeof(ANone),
- typeof(BPostDependsOnANone));
- }
- [TestMethod]
- public void ANoneWithBNone_ShouldNotThrow()
- {
- AssertNotCycle(typeof(ANone),
- typeof(BNone));
- }
- [TestMethod]
- public void PartWithHasPrerequisteImportThatIsInAPostCycle_ShouldNotThrow()
- {
- AssertNotCycle(typeof(PartWithHasPrerequisteImportThatIsInAPostCycle)
- , typeof(APostDependsOnBPost), typeof(BPostDependsOnAPost));
- }
- private static void AssertCycle(params Type[] types)
- {
- foreach (Type type in types)
- {
- var export = GetExport(type, types);
- CompositionAssert.ThrowsError(ErrorId.ImportEngine_PartCannotGetExportedValue, () =>
- {
- var value = export.Value;
- });
- }
- }
- private static void AssertNotCycle(params Type[] types)
- {
- foreach (Type type in types)
- {
- var export = GetExport(type, types);
- Assert.IsInstanceOfType(export.Value, type);
- }
- }
- private static Lazy<object, object> GetExport(Type type, Type[] partTypes)
- {
- var container = ContainerFactory.CreateWithAttributedCatalog(partTypes);
- return container.GetExports(type, null, null).Single();
- }
- [Export]
- public class APrerequisiteDependsOnBPrerequisite
- {
- [ImportingConstructor]
- public APrerequisiteDependsOnBPrerequisite(BPrerequisiteDependsOnAPrerequisite b)
- {
- }
- }
- [Export]
- public class BPrerequisiteDependsOnAPrerequisite
- {
- [ImportingConstructor]
- public BPrerequisiteDependsOnAPrerequisite(APrerequisiteDependsOnBPrerequisite a)
- {
- }
- }
- [Export]
- public class APrerequisiteDependsOnBPost
- {
- [ImportingConstructor]
- public APrerequisiteDependsOnBPost(BPostDependsOnAPrerequisite b)
- {
- }
- }
- [Export]
- public class BPostDependsOnAPrerequisite
- {
- [Import]
- public APrerequisiteDependsOnBPost A
- {
- get;
- set;
- }
- }
- [Export]
- public class APrerequisiteDependsOnBNone
- {
- [ImportingConstructor]
- public APrerequisiteDependsOnBNone(BNone b)
- {
- }
- }
- [Export]
- public class BNone
- {
- }
- [Export]
- public class ANone
- {
- }
- [Export]
- public class APostDependsOnBPrerequisite
- {
- [Import]
- public BPrerequisiteDependsOnAPost B
- {
- get;
- set;
- }
- }
- [Export]
- public class BPrerequisiteDependsOnAPost
- {
- [ImportingConstructor]
- public BPrerequisiteDependsOnAPost(APostDependsOnBPrerequisite a)
- {
- }
- }
- [Export]
- public class APostDependsOnBPost
- {
- [Import]
- public BPostDependsOnAPost B
- {
- get;
- set;
- }
- }
- [Export]
- public class BPostDependsOnAPost
- {
- [Import]
- public APostDependsOnBPost A
- {
- get;
- set;
- }
- }
- [Export]
- public class APostDependsOnBNone
- {
- [Import]
- public BNone B
- {
- get;
- set;
- }
- }
- [Export]
- public class BPrerequisiteDependsOnANone
- {
- [ImportingConstructor]
- public BPrerequisiteDependsOnANone(ANone a)
- {
- }
- }
- [Export]
- public class BPostDependsOnANone
- {
- [Import]
- public ANone A
- {
- get;
- set;
- }
- }
- [Export]
- public class PartWithHasPrerequisteImportThatIsInAPostCycle
- {
- [ImportingConstructor]
- public PartWithHasPrerequisteImportThatIsInAPostCycle(APostDependsOnBPost a)
- {
- }
- }
- }
- }
|