1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.Reflection;
\r
7 using System.UnitTesting;
\r
8 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
10 namespace System.ComponentModel.Composition
\r
13 public class MetadataViewProviderTests
\r
17 public void GetMetadataView_InterfaceWithPropertySetter_ShouldThrowNotSupported()
\r
19 var metadata = new Dictionary<string, object>();
\r
20 metadata["Value"] = "value";
\r
22 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
24 MetadataViewProvider.GetMetadataView<IMetadataViewWithPropertySetter>(metadata);
\r
29 public void GetMetadataView_InterfaceWithMethod_ShouldThrowNotSupportedException()
\r
31 var metadata = new Dictionary<string, object>();
\r
32 metadata["Value"] = "value";
\r
34 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
36 MetadataViewProvider.GetMetadataView<IMetadataViewWithMethod>(metadata);
\r
41 public void GetMetadataView_InterfaceWithEvent_ShouldThrowNotSupportedException()
\r
43 var metadata = new Dictionary<string, object>();
\r
44 metadata["Value"] = "value";
\r
46 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
48 MetadataViewProvider.GetMetadataView<IMetadataViewWithEvent>(metadata);
\r
53 public void GetMetadataView_InterfaceWithIndexer_ShouldThrowNotSupportedException()
\r
55 var metadata = new Dictionary<string, object>();
\r
56 metadata["Value"] = "value";
\r
58 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
60 MetadataViewProvider.GetMetadataView<IMetadataViewWithIndexer>(metadata);
\r
65 public void GetMetadataView_AbstractClass_ShouldThrowMissingMethodException()
\r
67 var metadata = new Dictionary<string, object>();
\r
68 metadata["Value"] = "value";
\r
70 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
72 MetadataViewProvider.GetMetadataView<AbstractClassMetadataView>(metadata);
\r
77 public void GetMetadataView_AbstractClassWithConstructor_ShouldThrowMemberAccessException()
\r
79 var metadata = new Dictionary<string, object>();
\r
80 metadata["Value"] = "value";
\r
82 ExceptionAssert.Throws<MemberAccessException>(() =>
\r
84 MetadataViewProvider.GetMetadataView<AbstractClassWithConstructorMetadataView>(metadata);
\r
89 public void GetMetadataView_IDictionaryAsTMetadataViewTypeArgument_ShouldReturnMetadata()
\r
91 var metadata = new Dictionary<string, object>();
\r
93 var result = MetadataViewProvider.GetMetadataView<IDictionary<string, object>>(metadata);
\r
95 Assert.AreSame(metadata, result);
\r
99 public void GetMetadataView_IEnumerableAsTMetadataViewTypeArgument_ShouldReturnMetadata()
\r
101 var metadata = new Dictionary<string, object>();
\r
103 var result = MetadataViewProvider.GetMetadataView<IEnumerable<KeyValuePair<string, object>>>(metadata);
\r
105 Assert.AreSame(metadata, result);
\r
110 public void GetMetadataView_DictionaryAsTMetadataViewTypeArgument_ShouldNotThrow()
\r
112 var metadata = new Dictionary<string, object>();
\r
113 MetadataViewProvider.GetMetadataView<Dictionary<string, object>>(metadata);
\r
117 public void GetMetadataView_PrivateInterfaceAsTMetadataViewTypeArgument_ShouldhrowNotSupportedException()
\r
119 var metadata = new Dictionary<string, object>();
\r
120 metadata["CanActivate"] = true;
\r
122 ExceptionAssert.Throws<NotSupportedException>(() =>
\r
124 MetadataViewProvider.GetMetadataView<IActivator>(metadata);
\r
129 public void GetMetadataView_DictionaryWithUncastableValueAsMetadataArgument_ShouldThrowCompositionContractMismatchException()
\r
131 var metadata = new Dictionary<string, object>();
\r
132 metadata["Value"] = true;
\r
134 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
136 MetadataViewProvider.GetMetadataView<IMetadataView>(metadata);
\r
141 public void GetMetadataView_InterfaceWithTwoPropertiesWithSameNameDifferentTypeAsTMetadataViewArgument_ShouldThrowContractMismatch()
\r
143 var metadata = new Dictionary<string, object>();
\r
144 metadata["Value"] = 10;
\r
146 ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
148 MetadataViewProvider.GetMetadataView<IMetadataView2>(metadata);
\r
153 public void GetMetadataView_RawMetadata()
\r
155 var metadata = new Dictionary<string, object>();
\r
156 metadata["Value"] = 10;
\r
158 var view = MetadataViewProvider.GetMetadataView<RawMetadata>(new Dictionary<string, object>(metadata));
\r
160 Assert.IsTrue(view.Count == metadata.Count);
\r
161 Assert.IsTrue(view["Value"] == metadata["Value"]);
\r
165 public void GetMetadataView_InterfaceInheritance()
\r
167 var metadata = new Dictionary<string, object>();
\r
168 metadata["Value"] = "value";
\r
169 metadata["Value2"] = "value2";
\r
171 var view = MetadataViewProvider.GetMetadataView<IMetadataView3>(metadata);
\r
172 Assert.AreEqual("value", view.Value);
\r
173 Assert.AreEqual("value2", view.Value2);
\r
178 public void GetMetadataView_CachesViewType()
\r
180 var metadata1 = new Dictionary<string, object>();
\r
181 metadata1["Value"] = "value1";
\r
182 var view1 = MetadataViewProvider.GetMetadataView<IMetadataView>(metadata1);
\r
183 Assert.AreEqual("value1", view1.Value);
\r
185 var metadata2 = new Dictionary<string, object>();
\r
186 metadata2["Value"] = "value2";
\r
187 var view2 = MetadataViewProvider.GetMetadataView<IMetadataView>(metadata2);
\r
188 Assert.AreEqual("value2", view2.Value);
\r
190 Assert.AreEqual(view1.GetType(), view2.GetType());
\r
193 private interface IActivator
\r
200 public class RawMetadata : Dictionary<string, object>
\r
202 public RawMetadata(IDictionary<string, object> dictionary) : base(dictionary) { }
\r
205 public interface IMetadataView
\r
213 public interface IMetadataView2 : IMetadataView
\r
221 public interface IMetadataView3 : IMetadataView
\r
229 public interface IMetadataViewWithPropertySetter
\r
238 public interface IMetadataViewWithMethod
\r
247 public interface IMetadataViewWithEvent
\r
253 event EventHandler TestEvent;
\r
256 public interface IMetadataViewWithIndexer
\r
262 string this[object o] { get; }
\r
265 public abstract class AbstractClassMetadataView
\r
267 public abstract object Value { get; }
\r
270 public abstract class AbstractClassWithConstructorMetadataView
\r
272 public AbstractClassWithConstructorMetadataView(IDictionary<string, object> metadata) {}
\r
273 public abstract object Value { get; }
\r
276 public interface IMetadataViewWithDefaultedInt
\r
278 [DefaultValue(120)]
\r
283 public void GetMetadataView_IMetadataViewWithDefaultedInt()
\r
285 var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt>(new Dictionary<string, object>());
\r
286 Assert.AreEqual(120, view.MyInt);
\r
291 public void GetMetadataView_IMetadataViewWithDefaultedIntAndInvalidMetadata()
\r
293 Dictionary<string, object> metadata = new Dictionary<string, object>();
\r
294 metadata = new Dictionary<string, object>();
\r
295 metadata.Add("MyInt", 1.2);
\r
296 var view1 = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt>(metadata);
\r
297 Assert.AreEqual(120, view1.MyInt);
\r
299 metadata = new Dictionary<string, object>();
\r
300 metadata.Add("MyInt", "Hello, World");
\r
301 var view2 = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt>(metadata);
\r
302 Assert.AreEqual(120, view2.MyInt);
\r
306 public interface IMetadataViewWithDefaultedBool
\r
308 [DefaultValue(false)]
\r
309 bool MyBool { get; }
\r
313 public void GetMetadataView_IMetadataViewWithDefaultedBool()
\r
315 var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedBool>(new Dictionary<string, object>());
\r
316 Assert.AreEqual(false, view.MyBool);
\r
319 public interface IMetadataViewWithDefaultedInt64
\r
321 [DefaultValue(Int64.MaxValue)]
\r
322 Int64 MyInt64 { get; }
\r
326 public void GetMetadataView_IMetadataViewWithDefaultedInt64()
\r
328 var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt64>(new Dictionary<string, object>());
\r
329 Assert.AreEqual(Int64.MaxValue, view.MyInt64);
\r
332 public interface IMetadataViewWithDefaultedString
\r
334 [DefaultValue("MyString")]
\r
335 string MyString { get; }
\r
339 public void GetMetadataView_IMetadataViewWithDefaultedString()
\r
341 var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedString>(new Dictionary<string, object>());
\r
342 Assert.AreEqual("MyString", view.MyString);
\r
345 public interface IMetadataViewWithTypeMismatchDefaultValue
\r
347 [DefaultValue("Strings can't cast to numbers")]
\r
352 public void GetMetadataView_IMetadataViewWithTypeMismatchDefaultValue()
\r
354 var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
356 MetadataViewProvider.GetMetadataView<IMetadataViewWithTypeMismatchDefaultValue>(new Dictionary<string, object>());
\r
359 Assert.IsInstanceOfType(exception.InnerException, typeof(TargetInvocationException));
\r
363 public interface IMetadataViewUnboxAsInt
\r
370 public void GetMetadataView_IMetadataViewWithTypeMismatchOnUnbox()
\r
372 var metadata = new Dictionary<string, object>();
\r
373 metadata["Value"] = (short)9999;
\r
375 var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
377 MetadataViewProvider.GetMetadataView<IMetadataViewWithTypeMismatchDefaultValue>(new Dictionary<string, object>());
\r
380 Assert.IsInstanceOfType(exception.InnerException, typeof(TargetInvocationException));
\r
383 public interface IHasInt32
\r
385 Int32 Value { get; }
\r
389 public void TestMetadataIntConversion()
\r
391 var metadata = new Dictionary<string, object>();
\r
392 metadata["Value"] = (Int64)45;
\r
394 var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>
\r
396 MetadataViewProvider.GetMetadataView<IHasInt32>(metadata);
\r