1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.ComponentModel.Composition.Factories;
\r
6 using System.ComponentModel.Composition.Hosting;
\r
7 using System.ComponentModel.Composition.Primitives;
\r
8 using System.Reflection;
\r
9 using Microsoft.Internal;
\r
10 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
11 using System.Collections.Generic;
\r
13 using System.Threading;
\r
15 namespace System.ComponentModel.Composition.ReflectionModel
\r
18 public class ReflectionMemberExportDefinitionTests
\r
20 private static ReflectionMemberExportDefinition CreateReflectionExportDefinition(LazyMemberInfo exportMember, string contractname, IDictionary<string, object> metadata)
\r
22 return CreateReflectionExportDefinition(exportMember, contractname, metadata, null);
\r
25 private static ReflectionMemberExportDefinition CreateReflectionExportDefinition(LazyMemberInfo exportMember, string contractname, IDictionary<string, object> metadata, ICompositionElement origin)
\r
27 return (ReflectionMemberExportDefinition)ReflectionModelServices.CreateExportDefinition(
\r
28 exportMember, contractname, CreateLazyMetadata(metadata), origin);
\r
31 private static Lazy<IDictionary<string, object>> CreateLazyMetadata(IDictionary<string, object> metadata)
\r
33 return new Lazy<IDictionary<string, object>>(() => metadata, false);
\r
37 public void Constructor()
\r
39 MemberInfo expectedMember = this.GetType();
\r
40 LazyMemberInfo expectedExportingMemberInfo = new LazyMemberInfo(expectedMember);
\r
42 string expectedContractName = "Contract";
\r
43 IDictionary<string, object> expectedMetadata = new Dictionary<string, object>();
\r
44 expectedMetadata["Key1"] = 1;
\r
45 expectedMetadata["Key2"] = "Value2";
\r
47 ReflectionMemberExportDefinition definition = CreateReflectionExportDefinition(expectedExportingMemberInfo, expectedContractName, expectedMetadata);
\r
49 Assert.AreEqual(expectedExportingMemberInfo, definition.ExportingLazyMember);
\r
50 Assert.AreSame(expectedMember, definition.ExportingLazyMember.GetAccessors()[0]);
\r
51 Assert.AreEqual(MemberTypes.TypeInfo, definition.ExportingLazyMember.MemberType);
\r
53 Assert.AreSame(expectedContractName, definition.ContractName);
\r
55 Assert.IsNotNull(definition.Metadata);
\r
56 Assert.IsTrue(definition.Metadata.Keys.SequenceEqual(expectedMetadata.Keys));
\r
57 Assert.IsTrue(definition.Metadata.Values.SequenceEqual(expectedMetadata.Values));
\r
59 Assert.IsNull(((ICompositionElement)definition).Origin);
\r
63 public void Constructor_NullMetadata()
\r
65 MemberInfo expectedMember = this.GetType();
\r
66 LazyMemberInfo expectedExportingMemberInfo = new LazyMemberInfo(expectedMember);
\r
68 string expectedContractName = "Contract";
\r
70 ReflectionMemberExportDefinition definition = CreateReflectionExportDefinition(expectedExportingMemberInfo, expectedContractName, null);
\r
72 Assert.AreEqual(expectedExportingMemberInfo, definition.ExportingLazyMember);
\r
73 Assert.AreSame(expectedMember, definition.ExportingLazyMember.GetAccessors()[0]);
\r
74 Assert.AreEqual(MemberTypes.TypeInfo, definition.ExportingLazyMember.MemberType);
\r
76 Assert.AreSame(expectedContractName, definition.ContractName);
\r
78 Assert.IsNotNull(definition.Metadata);
\r
79 Assert.AreEqual(0, definition.Metadata.Count);
\r
81 Assert.IsNull(((ICompositionElement)definition).Origin);
\r
85 public void SetDefinition_OriginIsSet()
\r
87 var expectedPartDefinition = PartDefinitionFactory.CreateAttributed(typeof(object));
\r
88 var exportDefinition = CreateReflectionExportDefinition(new LazyMemberInfo(this.GetType()), "ContractName", null, expectedPartDefinition);
\r
90 Assert.AreSame(expectedPartDefinition, ((ICompositionElement)exportDefinition).Origin);
\r
94 public void SetDefinition_PartDefinitionDoesNotContainCreationPolicy_CreationPolicyShouldNotBeInMetadata()
\r
96 var expectedPartDefinition = PartDefinitionFactory.CreateAttributed(typeof(object));
\r
97 var exportDefinition = CreateReflectionExportDefinition(new LazyMemberInfo(this.GetType()), "ContractName", null);
\r
99 Assert.IsFalse(exportDefinition.Metadata.ContainsKey(CompositionConstants.PartCreationPolicyMetadataName));
\r
103 public void ICompositionElementDisplayName_ValueAsContractName_ShouldIncludeContractName()
\r
105 var contractNames = Expectations.GetContractNamesWithEmpty();
\r
107 foreach (var contractName in contractNames)
\r
109 if (string.IsNullOrEmpty(contractName)) continue;
\r
110 var definition = (ICompositionElement)CreateReflectionExportDefinition(new LazyMemberInfo(typeof(string)), contractName, null);
\r
112 var e = CreateDisplayNameExpectation(contractName);
\r
114 Assert.AreEqual(e, definition.DisplayName);
\r
119 public void ICompositionElementDisplayName_TypeAsMember_ShouldIncludeMemberDisplayName()
\r
121 var types = Expectations.GetTypes();
\r
123 foreach (var type in types)
\r
125 var definition = (ICompositionElement)CreateReflectionExportDefinition(new LazyMemberInfo(type), "Contract", null);
\r
127 var e = CreateDisplayNameExpectation(type);
\r
129 Assert.AreEqual(e, definition.DisplayName);
\r
134 public void ICompositionElementDisplayName_ValueAsMember_ShouldIncludeMemberDisplayName()
\r
136 var members = Expectations.GetMembers();
\r
138 foreach (var member in members)
\r
140 var definition = (ICompositionElement)CreateReflectionExportDefinition(new LazyMemberInfo(member), "Contract", null);
\r
142 var e = CreateDisplayNameExpectation(member);
\r
144 Assert.AreEqual(e, definition.DisplayName);
\r
149 public void ToString_ShouldReturnDisplayName()
\r
151 var members = Expectations.GetMembers();
\r
153 foreach (var member in members)
\r
155 var definition = (ICompositionElement)CreateReflectionExportDefinition(new LazyMemberInfo(member), "Contract", null);
\r
157 Assert.AreEqual(definition.DisplayName, definition.ToString());
\r
161 private static string CreateDisplayNameExpectation(string contractName)
\r
163 return String.Format("System.String (ContractName=\"{0}\")", contractName);
\r
166 private static string CreateDisplayNameExpectation(MemberInfo member)
\r
168 return String.Format("{0} (ContractName=\"Contract\")", member.GetDisplayName());
\r