0
|
1 using System;
|
|
2 using System.Reflection;
|
|
3
|
|
4 using NUnit.Framework;
|
|
5
|
|
6 using BLToolkit.Aspects;
|
|
7 using BLToolkit.Reflection;
|
|
8
|
|
9 namespace HowTo.Aspects
|
|
10 {
|
|
11 public /*[a]*/abstract/*[/a]*/ class TestClass
|
|
12 {
|
|
13 public static int Value;
|
|
14
|
|
15 // This is a method we will cache. Cached return value depends on input parameters.
|
|
16 // We will change the 'Value' field outside of the class and see how it affects the result.
|
|
17 //
|
|
18 [/*[a]*/Cache/*[/a]*/(MaxCacheTime=500, IsWeak=false)]
|
|
19 public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2)
|
|
20 {
|
|
21 return Value;
|
|
22 }
|
|
23
|
|
24 public static TestClass CreateInstance()
|
|
25 {
|
|
26 // Use TypeAccessor to create an instance of an abstract class.
|
|
27 //
|
|
28 return /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
|
|
29 }
|
|
30 }
|
|
31
|
|
32 [TestFixture]
|
|
33 public class CacheAspectTest
|
|
34 {
|
|
35 [Test]
|
|
36 public void Test1()
|
|
37 {
|
|
38 TestClass tc = TestClass.CreateInstance();
|
|
39
|
|
40 DateTime begin = DateTime.Now;
|
|
41
|
|
42 // Initial setup for the test static variable.
|
|
43 //
|
|
44 TestClass.Value = 777;
|
|
45
|
|
46 while (tc.CachedMethod(2, 2) == 777)
|
|
47 {
|
|
48 // This change will not affect the Test method return value for 500 ms.
|
|
49 //
|
|
50 TestClass.Value++;
|
|
51 }
|
|
52
|
|
53 double totalMilliseconds = (DateTime.Now - begin).TotalMilliseconds;
|
|
54
|
|
55 Assert.GreaterOrEqual(totalMilliseconds, 500);
|
|
56 }
|
|
57
|
|
58 [Test]
|
|
59 public void Test2()
|
|
60 {
|
|
61 TestClass tc = TestClass.CreateInstance();
|
|
62
|
|
63 // Return value depends on parameter values.
|
|
64 //
|
|
65 TestClass.Value = /*[a]*/1/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1));
|
|
66 TestClass.Value = /*[a]*/2/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1)); // no change
|
|
67 TestClass.Value = /*[a]*/3/*[/a]*/; Assert.AreEqual(/*[a]*/3/*[/a]*/, tc.CachedMethod(2, 1));
|
|
68
|
|
69 // However we can clear cache manually.
|
|
70 // For particular method:
|
|
71 //
|
|
72 CacheAspect.ClearCache(typeof(TestClass), "CachedMethod", typeof(int), typeof(int));
|
|
73 TestClass.Value = /*[a]*/4/*[/a]*/; Assert.AreEqual(/*[a]*/4/*[/a]*/, tc.CachedMethod(2, 1));
|
|
74
|
|
75 // By MethodInfo:
|
|
76 //
|
|
77 MethodInfo methodInfo = tc.GetType().GetMethod("CachedMethod", new Type[] { typeof(int), typeof(int) });
|
|
78 CacheAspect.ClearCache(methodInfo);
|
|
79 TestClass.Value = /*[a]*/5/*[/a]*/; Assert.AreEqual(/*[a]*/5/*[/a]*/, tc.CachedMethod(2, 1));
|
|
80
|
|
81 // For the all cached methods.
|
|
82 //
|
|
83 CacheAspect.ClearCache();
|
|
84 TestClass.Value = /*[a]*/6/*[/a]*/; Assert.AreEqual(/*[a]*/6/*[/a]*/, tc.CachedMethod(2, 1));
|
|
85 }
|
|
86 }
|
|
87 }
|