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 }