1   /*
2    * Copyright (C) The MetaClass Group. All rights reserved.
3    *
4    * This software is published under the terms of the Spice
5    * Software License version 1.1, a copy of which has been included
6    * with this distribution in the LICENSE.txt file.
7    */
8   package org.codehaus.metaclass.introspector;
9   
10  import junit.framework.TestCase;
11  import org.codehaus.metaclass.MockAccessor;
12  import org.codehaus.metaclass.model.Attribute;
13  import org.codehaus.metaclass.model.ClassDescriptor;
14  import org.codehaus.metaclass.model.FieldDescriptor;
15  import org.codehaus.metaclass.model.MethodDescriptor;
16  
17  /***
18   * @author Peter Donald
19   * @version $Revision: 1.4 $ $Date: 2003/11/28 11:14:54 $
20   */
21  public class MetaClassIntrospectorTestCase
22      extends TestCase
23  {
24      public void testInstantiateMetaClassIntrospectorClass()
25      {
26          assertNotNull( "attributes", new MetaClassIntrospector() );
27      }
28  
29      public void testGetClassDescriptorViaClassObject()
30          throws Exception
31      {
32          final ClassDescriptor original =
33              new ClassDescriptor( MetaClassIntrospectorTestCase.class.getName(),
34                                   Attribute.EMPTY_SET,
35                                   Attribute.EMPTY_SET,
36                                   FieldDescriptor.EMPTY_SET,
37                                   MethodDescriptor.EMPTY_SET );
38          final MockAccessor accessor = new MockAccessor( original );
39          MetaClassIntrospector.setAccessor( accessor );
40          MetaClassIntrospector.clearCompleteCache();
41  
42          final ClassDescriptor retrieved =
43              MetaClassIntrospector.getClassDescriptor(
44                  MetaClassIntrospectorTestCase.class );
45          assertEquals( "original == retrieved", original, retrieved );
46      }
47  
48      public void testGetClassDescriptorViaClassnameAndClassLoader()
49          throws Exception
50      {
51          final ClassDescriptor original =
52              new ClassDescriptor( MetaClassIntrospectorTestCase.class.getName(),
53                                   Attribute.EMPTY_SET,
54                                   Attribute.EMPTY_SET,
55                                   FieldDescriptor.EMPTY_SET,
56                                   MethodDescriptor.EMPTY_SET );
57          final MockAccessor accessor = new MockAccessor( original );
58          MetaClassIntrospector.setAccessor( accessor );
59          MetaClassIntrospector.clearCompleteCache();
60  
61          final ClassDescriptor retrieved = MetaClassIntrospector.
62              getClassDescriptor( MetaClassIntrospectorTestCase.class.getName(),
63                                  MetaClassIntrospectorTestCase.class.getClassLoader() );
64          assertEquals( "original == retrieved", original, retrieved );
65      }
66  
67      public void testGetMissingClassDescriptor()
68          throws Exception
69      {
70          final MockAccessor accessor = new MockAccessor( null );
71          MetaClassIntrospector.setAccessor( accessor );
72          MetaClassIntrospector.clearCompleteCache();
73  
74          try
75          {
76              MetaClassIntrospector.getClassDescriptor(
77                  MetaClassIntrospectorTestCase.class );
78          }
79          catch( MetaClassException e )
80          {
81              return;
82          }
83          fail(
84              "Expected to cause exception due to access of non existent resource" );
85      }
86  
87      public void testSetNullAccessor()
88          throws Exception
89      {
90          try
91          {
92              MetaClassIntrospector.setAccessor( null );
93          }
94          catch( NullPointerException e )
95          {
96              return;
97          }
98          fail( "Expected to cause NPE attempting to set null accessor" );
99      }
100 
101     public void testGetClassDescriptorFromCache()
102         throws Exception
103     {
104         final ClassDescriptor original =
105             new ClassDescriptor( MetaClassIntrospectorTestCase.class.getName(),
106                                  Attribute.EMPTY_SET,
107                                  Attribute.EMPTY_SET,
108                                  FieldDescriptor.EMPTY_SET,
109                                  MethodDescriptor.EMPTY_SET );
110         final MockAccessor accessor = new MockAccessor( original );
111         MetaClassIntrospector.setAccessor( accessor );
112         MetaClassIntrospector.clearCompleteCache();
113 
114         final ClassDescriptor retrieved =
115             MetaClassIntrospector.getClassDescriptor(
116                 MetaClassIntrospectorTestCase.class );
117         assertEquals( "original == retrieved", original, retrieved );
118         assertEquals( "accessor.getAccessCount()",
119                       1,
120                       accessor.getAccessCount() );
121 
122         final ClassDescriptor retrieved2 =
123             MetaClassIntrospector.getClassDescriptor(
124                 MetaClassIntrospectorTestCase.class );
125         assertEquals( "original == retrieved2", original, retrieved2 );
126         assertEquals( "accessor.getAccessCount()",
127                       1,
128                       accessor.getAccessCount() );
129     }
130 
131     public void testSetAccessorUnderSecurityManager()
132         throws Exception
133     {
134         final SecurityManager securityManager = new MockSecurityManager();
135         System.setSecurityManager( securityManager );
136         final MockAccessor accessor = new MockAccessor( null );
137         MetaClassIntrospector.setAccessor( accessor );
138         MetaClassIntrospector.clearCompleteCache();
139     }
140 }