1   package serp.bytecode;
2   
3   import junit.framework.*;
4   import junit.textui.*;
5   
6   /**
7    * Tests the {@link NameCache} utility type.
8    *
9    * @author Abe White
10   */
11  public class TestNameCache extends TestCase {
12      private NameCache _cache = null;
13  
14      public TestNameCache(String test) {
15          super(test);
16      }
17  
18      public void setUp() {
19          _cache = new Project().getNameCache();
20      }
21  
22      /**
23       * Tests that class names are correctly converted to internal form.
24       */
25      public void testInternalForm() {
26          assertEquals("I", _cache.getInternalForm("int", true));
27          assertEquals("I", _cache.getInternalForm("int", false));
28          assertEquals("I", _cache.getInternalForm("I", true));
29          assertEquals("I", _cache.getInternalForm("I", false));
30  
31          assertEquals("B", _cache.getInternalForm("byte", true));
32          assertEquals("C", _cache.getInternalForm("char", true));
33          assertEquals("D", _cache.getInternalForm("double", true));
34          assertEquals("F", _cache.getInternalForm("float", true));
35          assertEquals("J", _cache.getInternalForm("long", true));
36          assertEquals("S", _cache.getInternalForm("short", true));
37          assertEquals("Z", _cache.getInternalForm("boolean", true));
38          assertEquals("V", _cache.getInternalForm("void", true));
39  
40          assertEquals("Ljava/lang/Object;",
41              _cache.getInternalForm(Object.class.getName(), true));
42          assertEquals("java/lang/Object",
43              _cache.getInternalForm(Object.class.getName(), false));
44          assertEquals("Ljava/lang/Object;",
45              _cache.getInternalForm("Ljava/lang/Object;", true));
46          assertEquals("java/lang/Object",
47              _cache.getInternalForm("Ljava/lang/Object;", false));
48      }
49  
50      /**
51       * Tests that array class names are correctly converted to internal form.
52       */
53      public void testArrayInternalForm() {
54          assertEquals("[B", _cache.getInternalForm(byte[].class.getName(), 
55              false));
56          assertEquals("[B", _cache.getInternalForm(byte[].class.getName(), 
57              true));
58          assertEquals("[B", _cache.getInternalForm("byte[]", false));
59          assertEquals("[B", _cache.getInternalForm("byte[]", true));
60  
61          assertEquals("[[Ljava/lang/Object;",
62              _cache.getInternalForm(Object[][].class.getName(), false));
63          assertEquals("[[Ljava/lang/Object;",
64              _cache.getInternalForm(Object[][].class.getName(), true));
65          assertEquals("[[Ljava/lang/Object;",
66              _cache.getInternalForm("java.lang.Object[][]", false));
67          assertEquals("[[Ljava/lang/Object;",
68              _cache.getInternalForm("java.lang.Object[][]", true));
69      }
70  
71      /**
72       * Tests that class names are correctly converted to external form.
73       */
74      public void testExternalForm() {
75          assertEquals("byte", _cache.getExternalForm("B", true));
76          assertEquals("byte", _cache.getExternalForm("byte", true));
77          assertEquals("byte", _cache.getExternalForm("B", false));
78          assertEquals("byte", _cache.getExternalForm("byte", false));
79  
80          assertEquals("byte", _cache.getExternalForm("byte", false));
81          assertEquals("byte", _cache.getExternalForm("B", true));
82          assertEquals("char", _cache.getExternalForm("char", false));
83          assertEquals("char", _cache.getExternalForm("C", true));
84          assertEquals("double", _cache.getExternalForm("double", false));
85          assertEquals("double", _cache.getExternalForm("D", true));
86          assertEquals("float", _cache.getExternalForm("float", false));
87          assertEquals("float", _cache.getExternalForm("F", true));
88          assertEquals("int", _cache.getExternalForm("int", false));
89          assertEquals("int", _cache.getExternalForm("I", true));
90          assertEquals("long", _cache.getExternalForm("long", false));
91          assertEquals("long", _cache.getExternalForm("J", true));
92          assertEquals("short", _cache.getExternalForm("short", false));
93          assertEquals("short", _cache.getExternalForm("S", true));
94          assertEquals("boolean", _cache.getExternalForm("boolean", false));
95          assertEquals("boolean", _cache.getExternalForm("Z", true));
96          assertEquals("void", _cache.getExternalForm("void", false));
97          assertEquals("void", _cache.getExternalForm("V", true));
98  
99          assertEquals("[B", _cache.getExternalForm("byte[]", false));
100         assertEquals("[C", _cache.getExternalForm("char[]", false));
101         assertEquals("[D", _cache.getExternalForm("double[]", false));
102         assertEquals("[F", _cache.getExternalForm("float[]", false));
103         assertEquals("[I", _cache.getExternalForm("int[]", false));
104         assertEquals("[J", _cache.getExternalForm("long[]", false));
105         assertEquals("[S", _cache.getExternalForm("short[]", false));
106         assertEquals("[Z", _cache.getExternalForm("boolean[]", false));
107 
108         assertEquals("java.lang.Object",
109             _cache.getExternalForm("java.lang.Object", true));
110         assertEquals("java.lang.Object",
111             _cache.getExternalForm("java/lang/Object", true));
112         assertEquals("java.lang.Object",
113             _cache.getExternalForm("java/lang/Object", false));
114         assertEquals("java.lang.Object",
115             _cache.getExternalForm("Ljava/lang/Object;", false));
116     }
117 
118     /**
119      * Tests that array class names are correctly converted to external form.
120      */
121     public void testArrayExternalForm() {
122         assertEquals("byte[]", _cache.getExternalForm("byte[]", true));
123         assertEquals("byte[]",
124             _cache.getExternalForm(byte[].class.getName(), true));
125         assertEquals("[B", _cache.getExternalForm("byte[]", false));
126         assertEquals("[B", _cache.getExternalForm(byte[].class.getName(), 
127             false));
128 
129         assertEquals("java.lang.Object[][]",
130             _cache.getExternalForm("java.lang.Object[][]", true));
131         assertEquals("java.lang.Object[][]",
132             _cache.getExternalForm(Object[][].class.getName(), true));
133         assertEquals("[[Ljava.lang.Object;",
134             _cache.getExternalForm("java.lang.Object[][]", false));
135         assertEquals("[[Ljava.lang.Object;",
136             _cache.getExternalForm(Object[][].class.getName(), false));
137     }
138 
139     /**
140      * Tests that method descriptors are correctly formed.
141      */
142     public void testDescriptors() {
143         assertEquals("()V", _cache.getDescriptor("V", new String[0]));
144         assertEquals("()V", _cache.getDescriptor("void", null));
145         assertEquals("()Ljava/lang/Object;",
146             _cache.getDescriptor("java.lang.Object", null));
147         assertEquals("(Z)V",
148             _cache.getDescriptor("void", new String[] { "boolean" }));
149         assertEquals("([ZLjava/lang/Object;I)[I",
150             _cache.getDescriptor("int[]",
151                 new String[] { "[Z", "Ljava/lang/Object;", "int" }));
152     }
153 
154     /**
155      * Test that return types are extracted from method descriptors.
156      */
157     public void testDescriptorReturnName() {
158         assertEquals("", _cache.getDescriptorReturnName("foo"));
159         assertEquals("V", _cache.getDescriptorReturnName("()V"));
160         assertEquals("[Ljava/lang/Object;",
161             _cache.getDescriptorReturnName(
162                 "(IZLjava/lang/String;)[Ljava/lang/Object;"));
163     }
164 
165     /**
166      * Test that param types are extracted from method descriptors.
167      */
168     public void testDescriptorParamNames() {
169         assertEquals(0, _cache.getDescriptorParamNames("foo").length);
170 
171         String[] params = _cache.getDescriptorParamNames(
172                 "([ZLjava/lang/Object;I)[I");
173         assertEquals(3, params.length);
174         assertEquals("[Z", params[0]);
175         assertEquals("Ljava/lang/Object;", params[1]);
176         assertEquals("I", params[2]);
177     }
178 
179     /**
180      * Test {@link NameCache#getComponentTypeName}.
181      */
182     public void testComponentTypes() {
183         assertNull(_cache.getComponentName(null));
184         assertNull(_cache.getComponentName(int.class.getName()));
185         assertNull(_cache.getComponentName(String.class.getName()));
186         assertEquals(int.class.getName(),
187             _cache.getComponentName(int[].class.getName()));
188         assertEquals(int[][].class.getName(),
189             _cache.getComponentName(int[][][].class.getName()));
190         assertEquals(String.class.getName(),
191             _cache.getComponentName(String[].class.getName()));
192         assertEquals(String[][].class.getName(),
193             _cache.getComponentName(String[][][].class.getName()));
194     }
195 
196     public static Test suite() {
197         return new TestSuite(TestNameCache.class);
198     }
199 
200     public static void main(String[] args) {
201         TestRunner.run(suite());
202     }
203 }