@@ -26,9 +26,9 @@ public class Item : IEquatable<Item>
2626
2727 public bool Equals ( Item obj )
2828 {
29- if ( obj == null )
29+ if ( obj == null )
3030 return false ;
31- return obj . Value == Value ;
31+ return obj . Value == Value ;
3232 }
3333
3434 public override bool Equals ( object obj )
@@ -38,7 +38,7 @@ public override bool Equals(object obj)
3838
3939 public override int GetHashCode ( )
4040 {
41- return ( Value != null ? Value . GetHashCode ( ) : 0 ) ;
41+ return ( Value != null ? Value . GetHashCode ( ) : 0 ) ;
4242 }
4343
4444 public override string ToString ( )
@@ -54,14 +54,44 @@ public Item(string value)
5454
5555 #endregion
5656
57- private volatile Item item1 ;
57+ private volatile Item fieldItem1 ;
58+ private volatile Item fieldItem2 ;
5859
5960 [ Test ]
60- public void CombinedTest ( )
61+ public void ClassFieldInTestScopeTest ( )
6162 {
6263 var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
6364
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+
6595 cache . Add ( item1 ) ;
6696
6797 Assert . AreSame ( item1 , cache . First ( ) ) ;
@@ -76,19 +106,87 @@ public void CombinedTest()
76106 Assert . AreEqual ( 1 , cache . Count ) ;
77107
78108 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+
79123 TestHelper . CollectGarbage ( true ) ;
80124 cache . CollectGarbage ( ) ;
81125 Assert . AreEqual ( 0 , cache . Count ) ;
82126
83127 Assert . IsNull ( cache [ new Item ( "1" ) , true ] ) ;
84128 }
85129
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+
86184 [ Test ]
87185 public void ProfileTest ( )
88186 {
89187 var cache = new WeakestCache < Item , Item > ( false , false , i => i ) ;
90188 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 ++ ) {
92190 var item = new Item ( i . ToString ( ) ) ;
93191 cache . Add ( item ) ;
94192 if ( j == 100000 ) {
0 commit comments