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.io.MockClassLoader;
12  import org.codehaus.metaclass.model.ClassDescriptor;
13  
14  /***
15   * @author Peter Donald
16   * @version $Revision: 1.5 $ $Date: 2003/11/28 11:14:54 $
17   */
18  public class DefaultMetaClassAccessorTestCase
19      extends TestCase
20  {
21      public void testLoadBinaryAttributesForClass()
22          throws Exception
23      {
24          final String name = "com.biz.MyClass";
25          final String location = "com/biz/MyClass-meta.binary";
26          final byte[] data = new byte[]
27          {
28              0, 0, 0, 2, //version
29              0, 15, //length of classname
30              'c', 'o', 'm', '.', 'b', 'i', 'z', '.', 'M', 'y', 'C', 'l', 'a', 's', 's',
31              0, 0, 0, 0, //attribute count
32              0, 0, 0, 0, //field count
33              0, 0, 0, 0 //method count
34          };
35          final MockClassLoader classLoader = new MockClassLoader();
36          classLoader.bindResource( location, data );
37          final DefaultMetaClassAccessor accessor = new DefaultMetaClassAccessor();
38          final ClassDescriptor clazz = accessor.getClassDescriptor( name,
39                                                                     classLoader,
40                                                                     null );
41          assertEquals( "class.name", name, clazz.getName() );
42          assertEquals( "class.attributes.length",
43                        0, clazz.getAttributes().length );
44          assertEquals( "class.methods.length",
45                        0, clazz.getMethods().length );
46          assertEquals( "class.fields.length",
47                        0, clazz.getFields().length );
48      }
49  
50      public void testLoadXMLAttributesForAsClass()
51          throws Exception
52      {
53          final String name = "com.biz.MyClass";
54          final String location = "com/biz/MyClass-meta.xml";
55          final String xml =
56              "<class type=\"com.biz.MyClass\" version=\"1.0\"/>";
57          final byte[] data = xml.getBytes();
58          final MockClassLoader classLoader = new MockClassLoader();
59          classLoader.bindResource( location, data );
60          final DefaultMetaClassAccessor accessor = new DefaultMetaClassAccessor();
61          final ClassDescriptor clazz = accessor.getClassDescriptor( name,
62                                                                     classLoader,
63                                                                     null );
64          assertEquals( "class.name", name, clazz.getName() );
65          assertEquals( "class.attributes.length",
66                        0, clazz.getAttributes().length );
67          assertEquals( "class.methods.length",
68                        0, clazz.getMethods().length );
69          assertEquals( "class.fields.length",
70                        0, clazz.getFields().length );
71      }
72  
73      public void testMissingAttributesForClass()
74          throws Exception
75      {
76          final String name = "missing";
77          final MockClassLoader classLoader = new MockClassLoader();
78          final DefaultMetaClassAccessor accessor = new DefaultMetaClassAccessor();
79          try
80          {
81              accessor.getClassDescriptor( name, classLoader, null );
82          }
83          catch( MetaClassException e )
84          {
85              return;
86          }
87          fail(
88              "Expected to be unable to find attributes for non existent class" );
89      }
90  
91      public void testBadAttributesForClass()
92          throws Exception
93      {
94          final String name = "com.biz.MyClass";
95          final String location = "com/biz/MyClass-meta.binary";
96          final byte[] data = new byte[]
97          {
98              1, 2, 3, 4 //Bad version number
99          };
100         final MockClassLoader classLoader = new MockClassLoader();
101         classLoader.bindResource( location, data );
102         final DefaultMetaClassAccessor accessor = new DefaultMetaClassAccessor();
103         try
104         {
105             accessor.getClassDescriptor( name, classLoader, null );
106         }
107         catch( MetaClassException e )
108         {
109             return;
110         }
111         fail( "Expected to be unable to parse bad meta data" );
112     }
113 }