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.UnitTesting;
\r
14 using System.Threading;
\r
16 namespace System.ComponentModel.Composition.ReflectionModel
\r
19 public class LazyMemberInfoTests
\r
22 public void Constructor_PassMember()
\r
24 foreach (var memberAndAccessorsInfo in GetMembersAndAccessors(typeof(LazyMemberTestClass)))
\r
26 MemberInfo member = memberAndAccessorsInfo.Item1;
\r
27 MemberTypes memberType = memberAndAccessorsInfo.Item2.Item1;
\r
28 MemberInfo[] accessors = memberAndAccessorsInfo.Item2.Item2;
\r
30 LazyMemberInfo lazy = new LazyMemberInfo(member);
\r
31 Assert.AreEqual(memberType, lazy.MemberType);
\r
32 Assert.AreEqual(accessors.Length, lazy.GetAccessors().Length);
\r
33 Assert.IsTrue(accessors.SequenceEqual(lazy.GetAccessors()));
\r
38 public void Constructor_PassNullMember()
\r
40 ExceptionAssert.ThrowsArgument<ArgumentNullException>("member", () =>
\r
42 LazyMemberInfo lazy = new LazyMemberInfo((MemberInfo)null);
\r
47 public void Constructor_PassAccessors()
\r
49 foreach (var memberAndAccessorsInfo in GetMembersAndAccessors(typeof(LazyMemberTestClass)))
\r
51 MemberInfo member = memberAndAccessorsInfo.Item1;
\r
52 MemberTypes memberType = memberAndAccessorsInfo.Item2.Item1;
\r
53 MemberInfo[] accessors = memberAndAccessorsInfo.Item2.Item2;
\r
55 LazyMemberInfo lazy = new LazyMemberInfo(memberType, accessors);
\r
56 Assert.AreEqual(memberType, lazy.MemberType);
\r
57 Assert.AreEqual(accessors.Length, lazy.GetAccessors().Length);
\r
58 Assert.IsTrue(accessors.SequenceEqual(lazy.GetAccessors()));
\r
63 public void Constructor_PassInvalidAccessors()
\r
65 foreach (var memberAndAccessorsInfo in GetMembersAndAccessors(typeof(LazyMemberTestClass)))
\r
67 MemberInfo member = memberAndAccessorsInfo.Item1;
\r
68 MemberTypes memberType = memberAndAccessorsInfo.Item2.Item1;
\r
69 MemberInfo[] accessors = memberAndAccessorsInfo.Item2.Item2;
\r
71 foreach (MemberTypes wrongMemberType in GetValidMemberTypes())
\r
73 if (wrongMemberType == memberType)
\r
77 ExceptionAssert.ThrowsArgument<ArgumentException>("accessors", () =>
\r
79 LazyMemberInfo lazy = new LazyMemberInfo(wrongMemberType, accessors);
\r
86 public void Constructor_PassAccessorsInvalidMemberType()
\r
88 MemberTypes[] validMemberTypes = GetValidMemberTypes().ToArray();
\r
89 foreach (MemberTypes memberType in GetMemberTypeValues())
\r
91 if (!validMemberTypes.Contains(memberType))
\r
93 ExceptionAssert.ThrowsArgument<ArgumentException>("memberType", () =>
\r
95 LazyMemberInfo lazy = new LazyMemberInfo(memberType, typeof(LazyMemberTestClass));
\r
102 public void Constructor_PassNullAccessors()
\r
104 ExceptionAssert.ThrowsArgument<ArgumentNullException>("accessors", () =>
\r
106 LazyMemberInfo lazy = new LazyMemberInfo(MemberTypes.Field, (MemberInfo[])null);
\r
111 public void Constructor_PassAccessorsWithNulls()
\r
113 ExceptionAssert.ThrowsArgument<ArgumentException>("accessors", () =>
\r
115 LazyMemberInfo lazy = new LazyMemberInfo(MemberTypes.Field, new MemberInfo[] { null, null });
\r
120 public void Constructor_PassAccessorCreators()
\r
122 foreach (var memberAndAccessorsInfo in GetMembersAndAccessors(typeof(LazyMemberTestClass)))
\r
124 MemberInfo member = memberAndAccessorsInfo.Item1;
\r
125 MemberTypes memberType = memberAndAccessorsInfo.Item2.Item1;
\r
126 MemberInfo[] accessors = memberAndAccessorsInfo.Item2.Item2;
\r
128 LazyMemberInfo lazy = new LazyMemberInfo(memberType, () => accessors);
\r
129 Assert.AreEqual(memberType, lazy.MemberType);
\r
130 Assert.AreEqual(accessors.Length, lazy.GetAccessors().Length);
\r
131 Assert.IsTrue(accessors.SequenceEqual(lazy.GetAccessors()));
\r
136 public void Constructor_PassInvalidAccessorCreators()
\r
138 foreach (var memberAndAccessorsInfo in GetMembersAndAccessors(typeof(LazyMemberTestClass)))
\r
140 MemberInfo member = memberAndAccessorsInfo.Item1;
\r
141 MemberTypes memberType = memberAndAccessorsInfo.Item2.Item1;
\r
142 MemberInfo[] accessors = memberAndAccessorsInfo.Item2.Item2;
\r
144 foreach (MemberTypes wrongMemberType in GetValidMemberTypes())
\r
146 if (wrongMemberType == memberType)
\r
150 LazyMemberInfo lazy = new LazyMemberInfo(wrongMemberType, () => accessors);
\r
151 ExceptionAssert.Throws<InvalidOperationException>(() =>
\r
153 lazy.GetAccessors();
\r
160 public void Constructor_PassAccessorCreatorsWithInvalidMemberType()
\r
162 MemberTypes[] validMemberTypes = GetValidMemberTypes().ToArray();
\r
163 foreach (MemberTypes memberType in GetMemberTypeValues())
\r
165 if (!validMemberTypes.Contains(memberType))
\r
167 ExceptionAssert.ThrowsArgument<ArgumentException>("memberType", () =>
\r
169 LazyMemberInfo lazy = new LazyMemberInfo(memberType, () => new MemberInfo[] { typeof(LazyMemberTestClass) });
\r
176 public void Constructor_PassNullAccessorCreators()
\r
178 ExceptionAssert.ThrowsArgument<ArgumentNullException>("accessorsCreator", () =>
\r
180 LazyMemberInfo lazy = new LazyMemberInfo(MemberTypes.Field, (Func<MemberInfo[]>)null);
\r
185 private static IEnumerable<Tuple<MemberInfo, Tuple<MemberTypes, MemberInfo[]>>> GetMembersAndAccessors(Type type)
\r
187 yield return new Tuple<MemberInfo, Tuple<MemberTypes, MemberInfo[]>>(
\r
188 type, new Tuple<MemberTypes, MemberInfo[]>(type.MemberType, new MemberInfo[] { type }));
\r
190 foreach (MemberInfo member in type.GetMembers())
\r
192 MemberInfo[] accessors = null;
\r
193 if (member.MemberType == MemberTypes.Property)
\r
195 PropertyInfo property = (PropertyInfo)member;
\r
196 accessors = new MemberInfo[] { property.GetGetMethod(true), property.GetSetMethod(true) };
\r
198 else if (member.MemberType == MemberTypes.Event)
\r
200 EventInfo event_ = (EventInfo)member;
\r
201 accessors = new MemberInfo[] { event_.GetRaiseMethod(true), event_.GetAddMethod(true), event_.GetRemoveMethod(true) };
\r
205 accessors = new MemberInfo[] { member };
\r
208 yield return new Tuple<MemberInfo, Tuple<MemberTypes, MemberInfo[]>>(
\r
209 member, new Tuple<MemberTypes, MemberInfo[]>(member.MemberType, accessors));
\r
213 private static IEnumerable<MemberTypes> GetMemberTypeValues()
\r
215 yield return MemberTypes.All;
\r
216 yield return MemberTypes.Constructor;
\r
217 yield return MemberTypes.Custom;
\r
218 yield return MemberTypes.Event;
\r
219 yield return MemberTypes.Field;
\r
220 yield return MemberTypes.Method;
\r
221 yield return MemberTypes.NestedType;
\r
222 yield return MemberTypes.Property;
\r
223 yield return MemberTypes.TypeInfo;
\r
226 private static IEnumerable<MemberTypes> GetValidMemberTypes()
\r
228 yield return MemberTypes.TypeInfo;
\r
229 yield return MemberTypes.NestedType;
\r
230 yield return MemberTypes.Constructor;
\r
231 yield return MemberTypes.Field;
\r
232 yield return MemberTypes.Method;
\r
233 yield return MemberTypes.Property;
\r
234 yield return MemberTypes.Event;
\r
237 public class LazyMemberTestClass
\r
239 public LazyMemberTestClass() { }
\r
240 public string Property { get; set; }
\r
241 public string SetProperty { set { } }
\r
242 public string GetProperty { get { return null; } }
\r
243 public string Field;
\r
244 public void Method() { this.Event(this, new EventArgs()); }
\r
245 public event EventHandler Event;
\r