Fix bugs in sizing TableLayoutPanel (Xamarin bug 18638)
[mono.git] / mcs / class / System.ComponentModel.Composition / Tests / ComponentModelUnitTest / System / ComponentModel / Composition / MetadataViewProviderTests.cs
1 // -----------------------------------------------------------------------\r
2 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
3 // -----------------------------------------------------------------------\r
4 using System;\r
5 using System.Collections.Generic;\r
6 using System.Reflection;\r
7 using System.UnitTesting;\r
8 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
9 \r
10 namespace System.ComponentModel.Composition\r
11 {\r
12     [TestClass]\r
13     public class MetadataViewProviderTests\r
14     {\r
15 \r
16         [TestMethod]\r
17         public void GetMetadataView_InterfaceWithPropertySetter_ShouldThrowNotSupported()\r
18         {\r
19             var metadata = new Dictionary<string, object>();\r
20             metadata["Value"] = "value";\r
21 \r
22             ExceptionAssert.Throws<NotSupportedException>(() =>\r
23             {\r
24                 MetadataViewProvider.GetMetadataView<IMetadataViewWithPropertySetter>(metadata);\r
25             });\r
26         }\r
27 \r
28         [TestMethod]\r
29         public void GetMetadataView_InterfaceWithMethod_ShouldThrowNotSupportedException()\r
30         {\r
31             var metadata = new Dictionary<string, object>();\r
32             metadata["Value"] = "value";\r
33 \r
34             ExceptionAssert.Throws<NotSupportedException>(() =>\r
35             {\r
36                 MetadataViewProvider.GetMetadataView<IMetadataViewWithMethod>(metadata);\r
37             });\r
38         }\r
39 \r
40         [TestMethod]\r
41         public void GetMetadataView_InterfaceWithEvent_ShouldThrowNotSupportedException()\r
42         {\r
43             var metadata = new Dictionary<string, object>();\r
44             metadata["Value"] = "value";\r
45 \r
46             ExceptionAssert.Throws<NotSupportedException>(() =>\r
47             {\r
48                 MetadataViewProvider.GetMetadataView<IMetadataViewWithEvent>(metadata);\r
49             });\r
50         }\r
51 \r
52         [TestMethod]\r
53         public void GetMetadataView_InterfaceWithIndexer_ShouldThrowNotSupportedException()\r
54         {\r
55             var metadata = new Dictionary<string, object>();\r
56             metadata["Value"] = "value";\r
57 \r
58             ExceptionAssert.Throws<NotSupportedException>(() =>\r
59             {\r
60                 MetadataViewProvider.GetMetadataView<IMetadataViewWithIndexer>(metadata);\r
61             });\r
62         }\r
63 \r
64         [TestMethod]\r
65         public void GetMetadataView_AbstractClass_ShouldThrowMissingMethodException()\r
66         {\r
67             var metadata = new Dictionary<string, object>();\r
68             metadata["Value"] = "value";\r
69 \r
70             ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
71             {\r
72                 MetadataViewProvider.GetMetadataView<AbstractClassMetadataView>(metadata);\r
73             });\r
74         }\r
75 \r
76         [TestMethod]\r
77         public void GetMetadataView_AbstractClassWithConstructor_ShouldThrowMemberAccessException()\r
78         {\r
79             var metadata = new Dictionary<string, object>();\r
80             metadata["Value"] = "value";\r
81 \r
82             ExceptionAssert.Throws<MemberAccessException>(() =>\r
83             {\r
84                 MetadataViewProvider.GetMetadataView<AbstractClassWithConstructorMetadataView>(metadata);\r
85             });\r
86         }\r
87 \r
88         [TestMethod]\r
89         public void GetMetadataView_IDictionaryAsTMetadataViewTypeArgument_ShouldReturnMetadata()\r
90         {\r
91             var metadata = new Dictionary<string, object>();\r
92 \r
93             var result = MetadataViewProvider.GetMetadataView<IDictionary<string, object>>(metadata);\r
94 \r
95             Assert.AreSame(metadata, result);\r
96         }\r
97 \r
98         [TestMethod]\r
99         public void GetMetadataView_IEnumerableAsTMetadataViewTypeArgument_ShouldReturnMetadata()\r
100         {\r
101             var metadata = new Dictionary<string, object>();\r
102 \r
103             var result = MetadataViewProvider.GetMetadataView<IEnumerable<KeyValuePair<string, object>>>(metadata);\r
104 \r
105             Assert.AreSame(metadata, result);\r
106         }\r
107 \r
108 \r
109         [TestMethod]\r
110         public void GetMetadataView_DictionaryAsTMetadataViewTypeArgument_ShouldNotThrow()\r
111         {\r
112             var metadata = new Dictionary<string, object>();\r
113             MetadataViewProvider.GetMetadataView<Dictionary<string, object>>(metadata);\r
114         }\r
115 \r
116         [TestMethod]\r
117         public void GetMetadataView_PrivateInterfaceAsTMetadataViewTypeArgument_ShouldhrowNotSupportedException()\r
118         {\r
119             var metadata = new Dictionary<string, object>();\r
120             metadata["CanActivate"] = true;\r
121 \r
122             ExceptionAssert.Throws<NotSupportedException>(() =>\r
123                 {\r
124                     MetadataViewProvider.GetMetadataView<IActivator>(metadata);\r
125                 });\r
126         }\r
127 \r
128         [TestMethod]\r
129         public void GetMetadataView_DictionaryWithUncastableValueAsMetadataArgument_ShouldThrowCompositionContractMismatchException()\r
130         {\r
131             var metadata = new Dictionary<string, object>();\r
132             metadata["Value"] = true;\r
133 \r
134             ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
135             {\r
136                 MetadataViewProvider.GetMetadataView<IMetadataView>(metadata);\r
137             });\r
138         }\r
139 \r
140         [TestMethod]\r
141         public void GetMetadataView_InterfaceWithTwoPropertiesWithSameNameDifferentTypeAsTMetadataViewArgument_ShouldThrowContractMismatch()\r
142         {\r
143             var metadata = new Dictionary<string, object>();\r
144             metadata["Value"] = 10;\r
145 \r
146             ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
147             {\r
148                 MetadataViewProvider.GetMetadataView<IMetadataView2>(metadata);\r
149             });            \r
150         }\r
151 \r
152         [TestMethod]\r
153         public void GetMetadataView_RawMetadata()\r
154         {\r
155             var metadata = new Dictionary<string, object>();\r
156             metadata["Value"] = 10;\r
157 \r
158             var view = MetadataViewProvider.GetMetadataView<RawMetadata>(new Dictionary<string, object>(metadata));\r
159 \r
160             Assert.IsTrue(view.Count == metadata.Count);\r
161             Assert.IsTrue(view["Value"] == metadata["Value"]);\r
162         }\r
163 \r
164         [TestMethod]\r
165         public void GetMetadataView_InterfaceInheritance()\r
166         {\r
167             var metadata = new Dictionary<string, object>();\r
168             metadata["Value"] = "value";\r
169             metadata["Value2"] = "value2";\r
170 \r
171             var view = MetadataViewProvider.GetMetadataView<IMetadataView3>(metadata);\r
172             Assert.AreEqual("value", view.Value);\r
173             Assert.AreEqual("value2", view.Value2);\r
174         }\r
175         \r
176 \r
177         [TestMethod]\r
178         public void GetMetadataView_CachesViewType()\r
179         {\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
184 \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
189 \r
190             Assert.AreEqual(view1.GetType(), view2.GetType());\r
191         }\r
192 \r
193         private interface IActivator\r
194         {\r
195             bool CanActivate\r
196             {\r
197                 get;\r
198             }\r
199         }\r
200         public class RawMetadata : Dictionary<string, object>\r
201         {\r
202             public RawMetadata(IDictionary<string, object> dictionary) : base(dictionary) { }\r
203         }\r
204 \r
205         public interface IMetadataView\r
206         {\r
207             string Value\r
208             {\r
209                 get;\r
210             }\r
211         }\r
212 \r
213         public interface IMetadataView2 : IMetadataView\r
214         {\r
215             new int Value\r
216             {\r
217                 get;\r
218             }\r
219         }\r
220 \r
221         public interface IMetadataView3 : IMetadataView\r
222         {\r
223             string Value2\r
224             {\r
225                 get;\r
226             }\r
227         }\r
228 \r
229         public interface IMetadataViewWithPropertySetter\r
230         {\r
231             string Value\r
232             {\r
233                 get;\r
234                 set;\r
235             }\r
236         }\r
237 \r
238         public interface IMetadataViewWithMethod\r
239         {\r
240             string Value\r
241             {\r
242                 get;\r
243             }\r
244             void Method();\r
245         }\r
246 \r
247         public interface IMetadataViewWithEvent\r
248         {\r
249             string Value\r
250             {\r
251                 get;\r
252             }\r
253             event EventHandler TestEvent;\r
254         }\r
255 \r
256         public interface IMetadataViewWithIndexer\r
257         {\r
258             string Value\r
259             {\r
260                 get;\r
261             }\r
262             string this[object o] { get; }\r
263         }\r
264 \r
265         public abstract class AbstractClassMetadataView\r
266         {\r
267             public abstract object Value { get; }\r
268         }\r
269 \r
270         public abstract class AbstractClassWithConstructorMetadataView\r
271         {\r
272             public AbstractClassWithConstructorMetadataView(IDictionary<string, object> metadata) {}\r
273             public abstract object Value { get; }\r
274         }\r
275 \r
276         public interface IMetadataViewWithDefaultedInt\r
277         {\r
278             [DefaultValue(120)]\r
279             int MyInt { get; }\r
280         }\r
281 \r
282         [TestMethod]\r
283         public void GetMetadataView_IMetadataViewWithDefaultedInt()\r
284         {\r
285             var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt>(new Dictionary<string, object>());\r
286             Assert.AreEqual(120, view.MyInt);\r
287         }\r
288 \r
289 \r
290         [TestMethod]\r
291         public void GetMetadataView_IMetadataViewWithDefaultedIntAndInvalidMetadata()\r
292         {\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
298 \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
303         }\r
304 \r
305 \r
306         public interface IMetadataViewWithDefaultedBool\r
307         {\r
308             [DefaultValue(false)]\r
309             bool MyBool { get; }\r
310         }\r
311 \r
312         [TestMethod]\r
313         public void GetMetadataView_IMetadataViewWithDefaultedBool()\r
314         {\r
315             var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedBool>(new Dictionary<string, object>());\r
316             Assert.AreEqual(false, view.MyBool);\r
317         }\r
318 \r
319         public interface IMetadataViewWithDefaultedInt64\r
320         {\r
321             [DefaultValue(Int64.MaxValue)]\r
322             Int64 MyInt64 { get; }\r
323         }\r
324 \r
325         [TestMethod]\r
326         public void GetMetadataView_IMetadataViewWithDefaultedInt64()\r
327         {\r
328             var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedInt64>(new Dictionary<string, object>());\r
329             Assert.AreEqual(Int64.MaxValue, view.MyInt64);\r
330         }\r
331 \r
332         public interface IMetadataViewWithDefaultedString\r
333         {\r
334             [DefaultValue("MyString")]\r
335             string MyString { get; }\r
336         }\r
337 \r
338         [TestMethod]\r
339         public void GetMetadataView_IMetadataViewWithDefaultedString()\r
340         {\r
341             var view = MetadataViewProvider.GetMetadataView<IMetadataViewWithDefaultedString>(new Dictionary<string, object>());\r
342             Assert.AreEqual("MyString", view.MyString);\r
343         }\r
344 \r
345         public interface IMetadataViewWithTypeMismatchDefaultValue\r
346         {\r
347             [DefaultValue("Strings can't cast to numbers")]\r
348             int MyInt { get; }\r
349         }\r
350 \r
351         [TestMethod]\r
352         public void GetMetadataView_IMetadataViewWithTypeMismatchDefaultValue()\r
353         {\r
354             var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
355             {\r
356                 MetadataViewProvider.GetMetadataView<IMetadataViewWithTypeMismatchDefaultValue>(new Dictionary<string, object>());\r
357             });\r
358 \r
359             Assert.IsInstanceOfType(exception.InnerException, typeof(TargetInvocationException));\r
360         }\r
361 \r
362 \r
363         public interface IMetadataViewUnboxAsInt\r
364         {\r
365             int Value { get; }\r
366         }\r
367 \r
368 \r
369         [TestMethod]\r
370         public void GetMetadataView_IMetadataViewWithTypeMismatchOnUnbox()\r
371         {\r
372             var metadata = new Dictionary<string, object>();\r
373             metadata["Value"] = (short)9999;\r
374 \r
375             var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
376             {\r
377                 MetadataViewProvider.GetMetadataView<IMetadataViewWithTypeMismatchDefaultValue>(new Dictionary<string, object>());\r
378             });\r
379 \r
380             Assert.IsInstanceOfType(exception.InnerException, typeof(TargetInvocationException));\r
381         }\r
382 \r
383         public interface IHasInt32\r
384         {\r
385             Int32 Value { get; }\r
386         }\r
387 \r
388         [TestMethod]\r
389         public void TestMetadataIntConversion()\r
390         {\r
391             var metadata = new Dictionary<string, object>();\r
392             metadata["Value"] = (Int64)45;\r
393 \r
394             var exception = ExceptionAssert.Throws<CompositionContractMismatchException>(() =>\r
395             {\r
396                 MetadataViewProvider.GetMetadataView<IHasInt32>(metadata);\r
397             });\r
398         }\r
399 \r
400     }\r
401 }