Fix bugs in sizing TableLayoutPanel (Xamarin bug 18638)
[mono.git] / mcs / class / System.ComponentModel.Composition / Tests / ComponentModelUnitTest / Microsoft / Internal / Collections / ConditionalWeakTableTests.cs
1 // -----------------------------------------------------------------------\r
2 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
3 // -----------------------------------------------------------------------\r
4 using System;\r
5 using System.Collections;\r
6 using System.Collections.Generic;\r
7 using System.Runtime.CompilerServices;\r
8 using System.Text;\r
9 using System.UnitTesting;\r
10 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
11 \r
12 namespace Microsoft.Internal.Collections\r
13 {\r
14     [TestClass]\r
15     public class ConditionalWeakTableTests\r
16     {\r
17         [TestMethod]\r
18         public void Add_KeyShouldBeCollected()\r
19         {\r
20             var obj = new object();\r
21             var cwt = new ConditionalWeakTable<object, object>();\r
22 \r
23             cwt.Add(obj, new object());\r
24 \r
25             var wr = new WeakReference(obj);\r
26 \r
27             obj = null;\r
28 \r
29             GC.Collect();\r
30             GC.WaitForPendingFinalizers();\r
31 \r
32             Assert.IsNull(wr.Target, "Key should be collected now!");\r
33 \r
34             GC.KeepAlive(cwt);\r
35         }\r
36 \r
37         [TestMethod]\r
38         public void Add_KeyHeld_ValueShouldNotBeCollected()\r
39         {\r
40             var obj = new object();\r
41             var str = new StringBuilder();\r
42             var cwt = new ConditionalWeakTable<object, StringBuilder>();\r
43 \r
44             var wrKey = new WeakReference(obj);\r
45             var wrValue = new WeakReference(str);\r
46 \r
47             cwt.Add(obj, str);\r
48 \r
49             str = null;\r
50 \r
51             GC.Collect();\r
52             GC.WaitForPendingFinalizers();\r
53 \r
54             // Should still have both references\r
55             Assert.IsNotNull(wrKey.Target, "Key should NOT be collected yet!");\r
56             Assert.IsNotNull(wrValue.Target, "Value should NOT be collected yet!");\r
57 \r
58             GC.KeepAlive(obj);\r
59             GC.KeepAlive(cwt);\r
60         }\r
61 \r
62 #if CLR40\r
63         [TestMethod]\r
64         public void Add_KeyCollected_ValueShouldBeCollected()\r
65         {\r
66             var obj = new object();\r
67             var str = new StringBuilder();\r
68             var cwt = new ConditionalWeakTable<object, StringBuilder>();\r
69 \r
70             cwt.Add(obj, str);\r
71 \r
72             var wrKey = new WeakReference(obj);\r
73             var wrValue = new WeakReference(str);\r
74             str = null;\r
75             obj = null;\r
76 \r
77             GC.Collect();\r
78             GC.WaitForPendingFinalizers();\r
79 \r
80             Assert.IsNull(wrKey.Target, "Key should be collected now!");\r
81             Assert.IsNull(wrValue.Target, "Value should be collected now!");\r
82 \r
83             GC.KeepAlive(cwt);\r
84         }\r
85 #endif\r
86 \r
87         [TestMethod]\r
88         public void Remove_ValidKey_ShouldReturnTrue()\r
89         {\r
90             var obj = new object();\r
91             var obj2 = new object();\r
92             var cwt = new ConditionalWeakTable<object, object>();\r
93 \r
94             cwt.Add(obj, obj2);\r
95 \r
96             Assert.IsTrue(cwt.Remove(obj));\r
97         }\r
98 \r
99         [TestMethod]\r
100         public void Remove_InvalidKey_ShouldReturnTrue()\r
101         {\r
102             var obj = new object();\r
103             var obj2 = new object();\r
104             var cwt = new ConditionalWeakTable<object, object>();\r
105 \r
106             cwt.Add(obj, obj2);\r
107 \r
108             Assert.IsFalse(cwt.Remove(obj2));\r
109         }\r
110 \r
111         [TestMethod]\r
112         public void TryGetValue_ValidKey_ShouldReturnTrueAndValue()\r
113         {\r
114             var obj = new object();\r
115             var obj2 = new object();\r
116             var cwt = new ConditionalWeakTable<object, object>();\r
117 \r
118             cwt.Add(obj, obj2);\r
119 \r
120             object obj3;\r
121             Assert.IsTrue(cwt.TryGetValue(obj, out obj3), "Should find a value with the key!");\r
122             Assert.AreEqual(obj2, obj3);\r
123         }\r
124 \r
125         [TestMethod]\r
126         public void TryGetValue_InvalidKey_ShouldReturnFalseAndNull()\r
127         {\r
128             var obj = new object();\r
129             var obj2 = new object();\r
130             var cwt = new ConditionalWeakTable<object, object>();\r
131 \r
132             cwt.Add(obj, obj2);\r
133 \r
134             object obj3;\r
135             Assert.IsFalse(cwt.TryGetValue(obj2, out obj3), "Should NOT find a value with the key!");\r
136             Assert.IsNull(obj3); \r
137         }\r
138 \r
139 #if !CLR40\r
140         [TestMethod]\r
141         public void Add_KeyValueSame_KeyShouldNotBeCollected()\r
142         {\r
143             // Dev10:556089 - This test demonstrations a bug in our implementation\r
144             // of ConditionalWeakTable which needs CLR 4 support to fix so once\r
145             // we switch to the CLR 4 version of ConditionalWeakTable this should go away.\r
146 \r
147             var obj = new object();\r
148             var cwt = new ConditionalWeakTable<object, object>();\r
149 \r
150             cwt.Add(obj, obj);\r
151 \r
152             var wrKey = new WeakReference(obj);\r
153             obj = null;\r
154 \r
155             GC.Collect();\r
156             GC.WaitForPendingFinalizers();\r
157 \r
158             Assert.IsNotNull(wrKey.Target, "Key should NOT be collected yet!");\r
159 \r
160             // Apply pressure to ensure they still don't go away.\r
161             ApplyMemoryPressureOnConditionalWeakTable(cwt);\r
162 \r
163             Assert.IsNotNull(wrKey.Target, "Key should NOT be collected yet!");\r
164 \r
165             GC.KeepAlive(cwt);\r
166         }\r
167 \r
168         public class ObjectHolder\r
169         {\r
170             public object Obj { get; set; }\r
171             public ObjectHolder() { }\r
172             public ObjectHolder(object obj)\r
173             {\r
174                 Obj = obj;\r
175             }\r
176         }\r
177 \r
178         [TestMethod]\r
179         public void Add_ValueReferencesKey_KeyAndValueShouldNotBeCollected()\r
180         {\r
181             // Dev10:556089 - This test demonstrations a bug in our implementation\r
182             // of ConditionalWeakTable which needs CLR 4 support to fix so once\r
183             // we switch to the CLR 4 version of ConditionalWeakTable this should go away.\r
184 \r
185             var obj = new object();\r
186             var holder = new ObjectHolder(obj);\r
187             var cwt = new ConditionalWeakTable<object, ObjectHolder>();\r
188 \r
189             cwt.Add(obj, holder);\r
190 \r
191             var wrKey = new WeakReference(obj);\r
192             var wrValue = new WeakReference(holder);\r
193             holder = null;\r
194             obj = null;\r
195 \r
196             GC.Collect();\r
197             GC.WaitForPendingFinalizers();\r
198 \r
199             Assert.IsNotNull(wrKey.Target, "Key should NOT be collected yet!");\r
200             Assert.IsNotNull(wrValue.Target, "Value should NOT be collected now!");\r
201 \r
202             // Apply pressure to ensure they still don't go away.\r
203             ApplyMemoryPressureOnConditionalWeakTable(cwt);\r
204 \r
205             Assert.IsNotNull(wrKey.Target, "Key should NOT be collected yet!");\r
206             Assert.IsNotNull(wrValue.Target, "Value should NOT be collected now!");\r
207 \r
208             GC.KeepAlive(cwt);\r
209         }\r
210 \r
211         private void ApplyMemoryPressureOnConditionalWeakTable<T,V>(ConditionalWeakTable<T,V> table)\r
212             where T : class, new()\r
213             where V : class, new()\r
214         {\r
215             // Adding 100 items should do it.\r
216             for (int i = 0; i < 100; i++)\r
217             {\r
218                 table.Add(new T(), new V());\r
219             }\r
220 \r
221             GC.Collect();\r
222             GC.WaitForPendingFinalizers();\r
223         }\r
224 #endif //!CLR40\r
225     }\r
226 }\r