@@ -26,9 +26,9 @@ public class Item : IEquatable<Item>
26
26
27
27
public bool Equals ( Item obj )
28
28
{
29
- if ( obj == null )
29
+ if ( obj == null )
30
30
return false ;
31
- return obj . Value == Value ;
31
+ return obj . Value == Value ;
32
32
}
33
33
34
34
public override bool Equals ( object obj )
@@ -38,7 +38,7 @@ public override bool Equals(object obj)
38
38
39
39
public override int GetHashCode ( )
40
40
{
41
- return ( Value != null ? Value . GetHashCode ( ) : 0 ) ;
41
+ return ( Value != null ? Value . GetHashCode ( ) : 0 ) ;
42
42
}
43
43
44
44
public override string ToString ( )
@@ -54,14 +54,44 @@ public Item(string value)
54
54
55
55
#endregion
56
56
57
- private volatile Item item1 ;
57
+ private volatile Item fieldItem1 ;
58
+ private volatile Item fieldItem2 ;
58
59
59
60
[ Test ]
60
- public void CombinedTest ( )
61
+ public void ClassFieldInTestScopeTest ( )
61
62
{
62
63
var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
63
64
64
- item1 = new Item ( "1" ) ;
65
+ fieldItem1 = new Item ( "1" ) ;
66
+
67
+ cache . Add ( fieldItem1 ) ;
68
+
69
+ Assert . AreSame ( fieldItem1 , cache . First ( ) ) ;
70
+ Assert . AreSame ( fieldItem1 , cache [ new Item ( "1" ) , true ] ) ;
71
+
72
+ cache . Remove ( fieldItem1 ) ;
73
+ Assert . AreEqual ( 0 , cache . Count ) ;
74
+
75
+ cache . Add ( fieldItem1 ) ;
76
+ TestHelper . CollectGarbage ( true ) ;
77
+ cache . CollectGarbage ( ) ;
78
+ Assert . AreEqual ( 1 , cache . Count ) ;
79
+
80
+ fieldItem1 = null ;
81
+ TestHelper . CollectGarbage ( true ) ;
82
+ cache . CollectGarbage ( ) ;
83
+ Assert . AreEqual ( 1 , cache . Count ) ;
84
+
85
+ Assert . IsNotNull ( cache [ new Item ( "1" ) , true ] ) ;
86
+ }
87
+
88
+ [ Test ]
89
+ public void LocalVarInTestScopeTest ( )
90
+ {
91
+ var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
92
+
93
+ var item1 = new Item ( "1" ) ;
94
+
65
95
cache . Add ( item1 ) ;
66
96
67
97
Assert . AreSame ( item1 , cache . First ( ) ) ;
@@ -76,19 +106,87 @@ public void CombinedTest()
76
106
Assert . AreEqual ( 1 , cache . Count ) ;
77
107
78
108
item1 = null ;
109
+ TestHelper . CollectGarbage ( true ) ;
110
+ cache . CollectGarbage ( ) ;
111
+ Assert . AreEqual ( 1 , cache . Count ) ;
112
+
113
+ Assert . IsNotNull ( cache [ new Item ( "1" ) , true ] ) ;
114
+ }
115
+
116
+ [ Test ]
117
+ public void LocalVarInCalledMethodScopeTest ( )
118
+ {
119
+ var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
120
+
121
+ InnerLocalVariableCacheTest ( cache ) ;
122
+
79
123
TestHelper . CollectGarbage ( true ) ;
80
124
cache . CollectGarbage ( ) ;
81
125
Assert . AreEqual ( 0 , cache . Count ) ;
82
126
83
127
Assert . IsNull ( cache [ new Item ( "1" ) , true ] ) ;
84
128
}
85
129
130
+ [ Test ]
131
+ public void ClassFieldInCalledMethodScopeTest ( )
132
+ {
133
+ var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
134
+
135
+ InnerClassFieldCacheTest ( cache ) ;
136
+
137
+ TestHelper . CollectGarbage ( true ) ;
138
+ cache . CollectGarbage ( ) ;
139
+ Assert . AreEqual ( 0 , cache . Count ) ;
140
+
141
+ Assert . IsNull ( cache [ new Item ( "1" ) , true ] ) ;
142
+ }
143
+
144
+ private void InnerLocalVariableCacheTest ( WeakestCache < Item , Item > cache )
145
+ {
146
+ var item = new Item ( "1" ) ;
147
+
148
+ cache . Add ( item ) ;
149
+
150
+ Assert . AreSame ( item , cache . First ( ) ) ;
151
+ Assert . AreSame ( item , cache [ new Item ( "1" ) , true ] ) ;
152
+
153
+ cache . Remove ( item ) ;
154
+ Assert . AreEqual ( 0 , cache . Count ) ;
155
+
156
+ cache . Add ( item ) ;
157
+ TestHelper . CollectGarbage ( true ) ;
158
+ cache . CollectGarbage ( ) ;
159
+ Assert . AreEqual ( 1 , cache . Count ) ;
160
+
161
+ item = null ;
162
+ }
163
+
164
+ private void InnerClassFieldCacheTest ( WeakestCache < Item , Item > cache )
165
+ {
166
+ fieldItem2 = new Item ( "1" ) ;
167
+
168
+ cache . Add ( fieldItem2 ) ;
169
+
170
+ Assert . AreSame ( fieldItem2 , cache . First ( ) ) ;
171
+ Assert . AreSame ( fieldItem2 , cache [ new Item ( "1" ) , true ] ) ;
172
+
173
+ cache . Remove ( fieldItem2 ) ;
174
+ Assert . AreEqual ( 0 , cache . Count ) ;
175
+
176
+ cache . Add ( fieldItem2 ) ;
177
+ TestHelper . CollectGarbage ( true ) ;
178
+ cache . CollectGarbage ( ) ;
179
+ Assert . AreEqual ( 1 , cache . Count ) ;
180
+
181
+ fieldItem2 = null ;
182
+ }
183
+
86
184
[ Test ]
87
185
public void ProfileTest ( )
88
186
{
89
187
var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
90
188
var measurement = new Measurement ( ) ;
91
- for ( int i = 0 , j = 0 ; i < 1000000 ; i ++ , j ++ ) {
189
+ for ( int i = 0 , j = 0 ; i < 1000000 ; i ++ , j ++ ) {
92
190
var item = new Item ( i . ToString ( ) ) ;
93
191
cache . Add ( item ) ;
94
192
if ( j == 100000 ) {
0 commit comments