@@ -34,26 +34,6 @@ public class TestClassFacadeError : Facade<FacaedTestClass>
3434
3535 }
3636
37- [ TestMethod ]
38- public void FacadeErrorTest ( )
39- {
40- var app = new Application ( ) ;
41- app . Bootstrap ( ) ;
42- app . Singleton < FacaedTestClass > ( ) ;
43-
44- var isError = false ;
45- try
46- {
47- var data = TestClassFacadeError . Instance ;
48- }
49- catch ( TypeInitializationException )
50- {
51- isError = true ;
52- }
53-
54- Assert . AreEqual ( true , isError ) ;
55- }
56-
5737 [ TestMethod ]
5838 public void FacadeWatchTest ( )
5939 {
@@ -205,5 +185,167 @@ public void TestNotBind()
205185 }
206186 Assert . AreEqual ( true , isError ) ;
207187 }
188+
189+ [ TestMethod ]
190+ public void TestStructBindAndRebound ( )
191+ {
192+ var app = new Application ( ) ;
193+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ;
194+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ; // double check
195+ var makeCount = 0 ;
196+ var binder = app . Bind < int > ( ( ) =>
197+ {
198+ makeCount ++ ;
199+ return 100 ;
200+ } ) ;
201+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
202+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ; // double check
203+ Assert . AreEqual ( 3 , makeCount ) ; // 这里为3是因为最开始的facade触发已经引发了解决事件
204+ binder . Unbind ( ) ;
205+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ;
206+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ; // double check
207+ app . Bind < int > ( ( ) =>
208+ {
209+ makeCount ++ ;
210+ return 200 ;
211+ } ) ;
212+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
213+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ; // double check
214+ Assert . AreEqual ( 6 , makeCount ) ;
215+ }
216+
217+ [ TestMethod ]
218+ public void TestStructSingleAndRebound ( )
219+ {
220+ var app = new Application ( ) ;
221+ var makeCount = 0 ;
222+ var binder = app . Singleton < int > ( ( ) =>
223+ {
224+ makeCount ++ ;
225+ return 100 ;
226+ } ) ;
227+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
228+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ; // double check
229+ Assert . AreEqual ( 1 , makeCount ) ;
230+ app . Instance < int > ( 200 ) ;
231+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
232+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ; // double check
233+ Assert . AreEqual ( 1 , makeCount ) ;
234+ binder . Unbind ( ) ;
235+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ;
236+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ; // double check
237+ Assert . AreEqual ( 1 , makeCount ) ;
238+ binder = app . Singleton < int > ( ( ) =>
239+ {
240+ makeCount ++ ;
241+ return 200 ;
242+ } ) ;
243+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
244+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ; // double check
245+ Assert . AreEqual ( 2 , makeCount ) ;
246+
247+ binder . Unbind ( ) ; // 三次连续测试来测试一个特殊情况
248+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ;
249+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ; // double check
250+ Assert . AreEqual ( 2 , makeCount ) ;
251+ binder = app . Singleton < int > ( ( ) =>
252+ {
253+ makeCount ++ ;
254+ return 300 ;
255+ } ) ;
256+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ;
257+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ; // double check
258+ Assert . AreEqual ( 3 , makeCount ) ;
259+ app . Release < int > ( ) ;
260+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ;
261+ Assert . AreEqual ( 4 , makeCount ) ;
262+ }
263+
264+ [ TestMethod ]
265+ public void TestStructSingleToBindAndRebound ( )
266+ {
267+ var app = new Application ( ) ;
268+ var makeCount = 0 ;
269+ var binder = app . Bind < int > ( ( ) =>
270+ {
271+ makeCount ++ ;
272+ return 100 ;
273+ } ) ;
274+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
275+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ; // double check
276+ Assert . AreEqual ( 2 , makeCount ) ;
277+
278+ binder . Unbind ( ) ;
279+ Assert . AreEqual ( 0 , Facade < int > . Instance ) ;
280+
281+ binder = app . Singleton < int > ( ( ) =>
282+ {
283+ makeCount ++ ;
284+ return 200 ;
285+ } ) ;
286+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
287+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ; // double check
288+ Assert . AreEqual ( 3 , makeCount ) ;
289+ }
290+
291+ [ TestMethod ]
292+ public void TestStructSingleRelease ( )
293+ {
294+ var app = new Application ( ) ;
295+ var makeCount = 0 ;
296+ var binder = app . Singleton < int > ( ( ) =>
297+ {
298+ makeCount ++ ;
299+ return 100 ;
300+ } ) ;
301+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
302+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ; // double check
303+ Assert . AreEqual ( 1 , makeCount ) ;
304+ app . Release < int > ( ) ;
305+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
306+ app . Instance < int > ( 200 ) ;
307+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
308+ app . Release < int > ( ) ;
309+ app . Instance < int > ( 300 ) ;
310+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ;
311+ }
312+
313+ [ TestMethod ]
314+ public void TestStructBindToSingleRebound ( )
315+ {
316+ var app = new Application ( ) ;
317+ var makeCount = 0 ;
318+ var binder = app . Bind < int > ( ( ) =>
319+ {
320+ makeCount ++ ;
321+ return 100 ;
322+ } ) ;
323+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ;
324+ Assert . AreEqual ( 100 , Facade < int > . Instance ) ; // double check
325+ Assert . AreEqual ( 2 , makeCount ) ;
326+
327+ Assert . AreEqual ( false , app . Release < int > ( ) ) ;
328+ binder . Unbind ( ) ;
329+ binder = app . Singleton < int > ( ( ) =>
330+ {
331+ makeCount ++ ;
332+ return 200 ;
333+ } ) ;
334+ Assert . AreEqual ( 3 , makeCount ) ;
335+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
336+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
337+ Assert . AreEqual ( 3 , makeCount ) ;
338+
339+ Assert . AreEqual ( true , app . Release < int > ( ) ) ;
340+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
341+ Assert . AreEqual ( 200 , Facade < int > . Instance ) ;
342+ Assert . AreEqual ( 4 , makeCount ) ;
343+
344+ Assert . AreEqual ( true , app . Release < int > ( ) ) ;
345+ app . Instance < int > ( 300 ) ;
346+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ;
347+ Assert . AreEqual ( 300 , Facade < int > . Instance ) ;
348+ Assert . AreEqual ( 4 , makeCount ) ;
349+ }
208350 }
209351}
0 commit comments