001    package serp.bytecode;
002    
003    import junit.framework.*;
004    import junit.textui.*;
005    
006    /**
007     * Tests the {@link NameCache} utility type.
008     *
009     * @author Abe White
010     */
011    public class TestNameCache extends TestCase {
012        private NameCache _cache = null;
013    
014        public TestNameCache(String test) {
015            super(test);
016        }
017    
018        public void setUp() {
019            _cache = new Project().getNameCache();
020        }
021    
022        /**
023         * Tests that class names are correctly converted to internal form.
024         */
025        public void testInternalForm() {
026            assertEquals("I", _cache.getInternalForm("int", true));
027            assertEquals("I", _cache.getInternalForm("int", false));
028            assertEquals("I", _cache.getInternalForm("I", true));
029            assertEquals("I", _cache.getInternalForm("I", false));
030    
031            assertEquals("B", _cache.getInternalForm("byte", true));
032            assertEquals("C", _cache.getInternalForm("char", true));
033            assertEquals("D", _cache.getInternalForm("double", true));
034            assertEquals("F", _cache.getInternalForm("float", true));
035            assertEquals("J", _cache.getInternalForm("long", true));
036            assertEquals("S", _cache.getInternalForm("short", true));
037            assertEquals("Z", _cache.getInternalForm("boolean", true));
038            assertEquals("V", _cache.getInternalForm("void", true));
039    
040            assertEquals("Ljava/lang/Object;",
041                _cache.getInternalForm(Object.class.getName(), true));
042            assertEquals("java/lang/Object",
043                _cache.getInternalForm(Object.class.getName(), false));
044            assertEquals("Ljava/lang/Object;",
045                _cache.getInternalForm("Ljava/lang/Object;", true));
046            assertEquals("java/lang/Object",
047                _cache.getInternalForm("Ljava/lang/Object;", false));
048        }
049    
050        /**
051         * Tests that array class names are correctly converted to internal form.
052         */
053        public void testArrayInternalForm() {
054            assertEquals("[B", _cache.getInternalForm(byte[].class.getName(), 
055                false));
056            assertEquals("[B", _cache.getInternalForm(byte[].class.getName(), 
057                true));
058            assertEquals("[B", _cache.getInternalForm("byte[]", false));
059            assertEquals("[B", _cache.getInternalForm("byte[]", true));
060    
061            assertEquals("[[Ljava/lang/Object;",
062                _cache.getInternalForm(Object[][].class.getName(), false));
063            assertEquals("[[Ljava/lang/Object;",
064                _cache.getInternalForm(Object[][].class.getName(), true));
065            assertEquals("[[Ljava/lang/Object;",
066                _cache.getInternalForm("java.lang.Object[][]", false));
067            assertEquals("[[Ljava/lang/Object;",
068                _cache.getInternalForm("java.lang.Object[][]", true));
069        }
070    
071        /**
072         * Tests that class names are correctly converted to external form.
073         */
074        public void testExternalForm() {
075            assertEquals("byte", _cache.getExternalForm("B", true));
076            assertEquals("byte", _cache.getExternalForm("byte", true));
077            assertEquals("byte", _cache.getExternalForm("B", false));
078            assertEquals("byte", _cache.getExternalForm("byte", false));
079    
080            assertEquals("byte", _cache.getExternalForm("byte", false));
081            assertEquals("byte", _cache.getExternalForm("B", true));
082            assertEquals("char", _cache.getExternalForm("char", false));
083            assertEquals("char", _cache.getExternalForm("C", true));
084            assertEquals("double", _cache.getExternalForm("double", false));
085            assertEquals("double", _cache.getExternalForm("D", true));
086            assertEquals("float", _cache.getExternalForm("float", false));
087            assertEquals("float", _cache.getExternalForm("F", true));
088            assertEquals("int", _cache.getExternalForm("int", false));
089            assertEquals("int", _cache.getExternalForm("I", true));
090            assertEquals("long", _cache.getExternalForm("long", false));
091            assertEquals("long", _cache.getExternalForm("J", true));
092            assertEquals("short", _cache.getExternalForm("short", false));
093            assertEquals("short", _cache.getExternalForm("S", true));
094            assertEquals("boolean", _cache.getExternalForm("boolean", false));
095            assertEquals("boolean", _cache.getExternalForm("Z", true));
096            assertEquals("void", _cache.getExternalForm("void", false));
097            assertEquals("void", _cache.getExternalForm("V", true));
098    
099            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    }