View Javadoc

1   package serp.bytecode.lowlevel;
2   
3   import junit.framework.*;
4   import junit.textui.*;
5   
6   /**
7    * Tests the {@link ConstantPool} type.
8    *
9    * @author Abe White
10   */
11  public class TestConstantPool extends TestCase {
12      private ConstantPool _pool = new ConstantPool();
13      private IntEntry _intEntry = new IntEntry(1);
14      private LongEntry _longEntry = new LongEntry(2L);
15      private UTF8Entry _utf8Entry = new UTF8Entry("4");
16  
17      public TestConstantPool(String test) {
18          super(test);
19      }
20  
21      /**
22       * Tests adding entries.
23       */
24      public void testAdd() {
25          assertEquals(0, _pool.size());
26          assertEquals(1, _pool.addEntry(_intEntry));
27          assertEquals(1, _pool.size());
28          assertEquals(2, _pool.addEntry(_longEntry));
29          assertEquals(3, _pool.size());
30          assertEquals(4, _pool.addEntry(_utf8Entry));
31          assertEquals(4, _pool.size());
32  
33          assertEquals(_intEntry, _pool.getEntry(1));
34          assertEquals(_longEntry, _pool.getEntry(2));
35          assertEquals(_utf8Entry, _pool.getEntry(4));
36          assertEquals(1, _pool.findIntEntry(1, false));
37          assertEquals(2, _pool.findLongEntry(2L, false));
38          assertEquals(4, _pool.findUTF8Entry("4", false));
39  
40          // add an entry multiple times
41          assertEquals(4, _pool.addEntry(_utf8Entry));
42          assertEquals(5, _pool.addEntry(new UTF8Entry("4")));
43  
44          // cannot add to another pool
45          ConstantPool pool = new ConstantPool();
46          try {
47              pool.addEntry(_intEntry);
48              fail("Entry already in another pool");
49          } catch (IllegalStateException ise) {
50          }
51  
52          assertEquals(0, pool.size());
53          _pool.removeEntry(_intEntry);
54          assertEquals(0, _pool.indexOf(_intEntry));
55  
56          pool.addEntry(_intEntry);
57          assertEquals(1, pool.size());
58          assertEquals(_intEntry, pool.getEntry(1));
59      }
60  
61      /**
62       * Tests removing entries.
63       */
64      public void testRemove() {
65          _pool.addEntry(_intEntry);
66          _pool.addEntry(_longEntry);
67          _pool.addEntry(_utf8Entry);
68  
69          assertEquals(4, _pool.size());
70          assertTrue(_pool.removeEntry(_longEntry));
71          assertEquals(2, _pool.size());
72          assertEquals(_intEntry, _pool.getEntry(1));
73          assertEquals(_utf8Entry, _pool.getEntry(2));
74          assertEquals(1, _pool.findIntEntry(1, false));
75          assertEquals(2, _pool.findUTF8Entry("4", false));
76          assertEquals(0, _pool.findLongEntry(2L, false));
77          assertTrue(!_pool.removeEntry(_longEntry));
78  
79          assertTrue(_pool.removeEntry(_intEntry));
80          assertEquals(1, _pool.size());
81          assertEquals(_utf8Entry, _pool.getEntry(1));
82          assertEquals(0, _pool.findIntEntry(1, false));
83          assertEquals(1, _pool.findUTF8Entry("4", false));
84          assertTrue(_pool.removeEntry(_utf8Entry));
85          assertEquals(0, _pool.size());
86          try {
87              _pool.getEntry(1);
88              fail("Invalid index");
89          } catch (IndexOutOfBoundsException ioobe) {
90          }
91          assertEquals(0, _pool.findUTF8Entry("4", false));
92      }
93  
94      /**
95       * Tests mutating entries.
96       */
97      public void testMutate() {
98          _intEntry.setValue(2);
99          _pool.addEntry(_intEntry);
100         _pool.addEntry(_longEntry);
101         _pool.addEntry(_utf8Entry);
102 
103         assertEquals(1, _pool.findIntEntry(2, false));
104         assertEquals(2, _pool.findLongEntry(2L, false));
105         assertEquals(4, _pool.findUTF8Entry("4", false));
106 
107         _intEntry.setValue(1);
108         _longEntry.setValue(3L);
109         _utf8Entry.setValue("foo");
110 
111         assertEquals(1, _pool.findIntEntry(1, false));
112         assertEquals(2, _pool.findLongEntry(3L, false));
113         assertEquals(4, _pool.findUTF8Entry("foo", false));
114     }
115 
116     /**
117      * Tests finding the index of entries.
118      */
119     public void testIndexOf() {
120         _pool.addEntry(_intEntry);
121         _pool.addEntry(_longEntry);
122         _pool.addEntry(_utf8Entry);
123 
124         assertEquals(1, _pool.indexOf(_intEntry));
125         assertEquals(2, _pool.indexOf(_longEntry));
126         assertEquals(4, _pool.indexOf(_utf8Entry));
127 
128         _pool.removeEntry(_longEntry);
129         assertEquals(1, _pool.indexOf(_intEntry));
130         assertEquals(0, _pool.indexOf(_longEntry));
131         assertEquals(2, _pool.indexOf(_utf8Entry));
132     }
133 
134     /**
135      * Tests getting all entries.
136      */
137     public void testGetEntries() {
138         _pool.addEntry(_intEntry);
139         _pool.addEntry(_longEntry);
140         _pool.addEntry(_utf8Entry);
141 
142         Entry[] entries = _pool.getEntries();
143         assertEquals(3, entries.length);
144         assertEquals(_intEntry, entries[0]);
145         assertEquals(_longEntry, entries[1]);
146         assertEquals(_utf8Entry, entries[2]);
147 
148         _pool.clear();
149         assertEquals(0, _pool.getEntries().length);
150     }
151 
152     /**
153      * Tests getting entries by index.
154      */
155     public void testGetEntry() {
156         _pool.addEntry(_intEntry);
157         _pool.addEntry(_longEntry);
158         _pool.addEntry(_utf8Entry);
159 
160         assertEquals(_intEntry, _pool.getEntry(1));
161         assertEquals(_longEntry, _pool.getEntry(2));
162         assertEquals(_utf8Entry, _pool.getEntry(4));
163 
164         try {
165             _pool.getEntry(0);
166             fail("0 index");
167         } catch (IndexOutOfBoundsException ioobe) {
168         }
169 
170         try {
171             _pool.getEntry(_pool.size() + 1);
172             fail("size() + 1 index");
173         } catch (IndexOutOfBoundsException ioobe) {
174         }
175 
176         try {
177             _pool.getEntry(3);
178             fail("Wide index");
179         } catch (IndexOutOfBoundsException ioobe) {
180         }
181     }
182 
183     /**
184      * Test clearing the pool.
185      */
186     public void testClear() {
187         // make sure clearing empty pool OK
188         _pool.clear();
189         assertEquals(0, _pool.size());
190 
191         _pool.addEntry(_intEntry);
192         _pool.addEntry(_longEntry);
193         _pool.addEntry(_utf8Entry);
194 
195         _pool.clear();
196         assertEquals(0, _pool.size());
197         assertEquals(0, _pool.findIntEntry(1, false));
198         assertEquals(0, _pool.findUTF8Entry("4", false));
199     }
200 
201     /**
202      * Test finding entry indexes.
203      */
204     public void testFind() {
205         int double1 = _pool.addEntry(new DoubleEntry(1D));
206         int double2 = _pool.addEntry(new DoubleEntry(2D));
207         int float1 = _pool.addEntry(new FloatEntry(1F));
208         int float2 = _pool.addEntry(new FloatEntry(2F));
209         int int1 = _pool.addEntry(new IntEntry(1));
210         int int2 = _pool.addEntry(new IntEntry(2));
211         int long1 = _pool.addEntry(new LongEntry(1L));
212         int long2 = _pool.addEntry(new LongEntry(2L));
213         int utf1 = _pool.addEntry(new UTF8Entry("1"));
214         int utf2 = _pool.addEntry(new UTF8Entry("2"));
215         int string1 = _pool.addEntry(new StringEntry(utf1));
216         int string2 = _pool.addEntry(new StringEntry(utf2));
217         int class1 = _pool.addEntry(new ClassEntry(utf1));
218         int class2 = _pool.addEntry(new ClassEntry(utf2));
219         int name1 = _pool.addEntry(new NameAndTypeEntry(utf1, utf2));
220         int name2 = _pool.addEntry(new NameAndTypeEntry(utf2, utf1));
221         int field1 = _pool.addEntry(new FieldEntry(class1, name1));
222         int field2 = _pool.addEntry(new FieldEntry(class2, name2));
223         int method1 = _pool.addEntry(new MethodEntry(class1, name1));
224         int method2 = _pool.addEntry(new MethodEntry(class2, name2));
225         int imethod1 = _pool.addEntry(new InterfaceMethodEntry(class1, name1));
226         int imethod2 = _pool.addEntry(new InterfaceMethodEntry(class2, name2));
227 
228         assertEquals(0, _pool.findDoubleEntry(0D, false));
229         assertEquals(double1, _pool.findDoubleEntry(1D, false));
230         assertEquals(double2, _pool.findDoubleEntry(2D, false));
231         assertEquals(double1, _pool.findDoubleEntry(1D, true));
232         assertEquals(double2, _pool.findDoubleEntry(2D, true));
233         assertEquals(_pool.size() + 1, _pool.findDoubleEntry(0D, true));
234 
235         assertEquals(0, _pool.findFloatEntry(0F, false));
236         assertEquals(float1, _pool.findFloatEntry(1F, false));
237         assertEquals(float2, _pool.findFloatEntry(2F, false));
238         assertEquals(float1, _pool.findFloatEntry(1F, true));
239         assertEquals(float2, _pool.findFloatEntry(2F, true));
240         assertEquals(_pool.size() + 1, _pool.findFloatEntry(0F, true));
241 
242         assertEquals(0, _pool.findIntEntry(0, false));
243         assertEquals(int1, _pool.findIntEntry(1, false));
244         assertEquals(int2, _pool.findIntEntry(2, false));
245         assertEquals(int1, _pool.findIntEntry(1, true));
246         assertEquals(int2, _pool.findIntEntry(2, true));
247         assertEquals(_pool.size() + 1, _pool.findIntEntry(0, true));
248 
249         assertEquals(0, _pool.findLongEntry(0L, false));
250         assertEquals(long1, _pool.findLongEntry(1L, false));
251         assertEquals(long2, _pool.findLongEntry(2L, false));
252         assertEquals(long1, _pool.findLongEntry(1L, true));
253         assertEquals(long2, _pool.findLongEntry(2L, true));
254         assertEquals(_pool.size() + 1, _pool.findLongEntry(0L, true));
255 
256         assertEquals(0, _pool.findUTF8Entry("0", false));
257         assertEquals(utf1, _pool.findUTF8Entry("1", false));
258         assertEquals(utf2, _pool.findUTF8Entry("2", false));
259         assertEquals(utf1, _pool.findUTF8Entry("1", true));
260         assertEquals(utf2, _pool.findUTF8Entry("2", true));
261         assertEquals(_pool.size() + 1, _pool.findUTF8Entry("0", true));
262 
263         assertEquals(0, _pool.findStringEntry("0", false));
264         assertEquals(string1, _pool.findStringEntry("1", false));
265         assertEquals(string2, _pool.findStringEntry("2", false));
266         assertEquals(string1, _pool.findStringEntry("1", true));
267         assertEquals(string2, _pool.findStringEntry("2", true));
268         assertEquals(_pool.size() + 1, _pool.findStringEntry("0", true));
269         assertEquals(_pool.size() + 2, _pool.findStringEntry("aaa", true));
270 
271         assertEquals(0, _pool.findClassEntry("0", false));
272         assertEquals(class1, _pool.findClassEntry("1", false));
273         assertEquals(class2, _pool.findClassEntry("2", false));
274         assertEquals(class1, _pool.findClassEntry("1", true));
275         assertEquals(class2, _pool.findClassEntry("2", true));
276         assertEquals(_pool.size() + 1, _pool.findClassEntry("0", true));
277         assertEquals(_pool.size() + 2, _pool.findStringEntry("bbb", true));
278 
279         assertEquals(0, _pool.findNameAndTypeEntry("0", "1", false));
280         assertEquals(name1, _pool.findNameAndTypeEntry("1", "2", false));
281         assertEquals(name2, _pool.findNameAndTypeEntry("2", "1", false));
282         assertEquals(name1, _pool.findNameAndTypeEntry("1", "2", true));
283         assertEquals(name2, _pool.findNameAndTypeEntry("2", "1", true));
284         assertEquals(_pool.size() + 1,
285             _pool.findNameAndTypeEntry("0", "1", true));
286         assertEquals(_pool.size() + 2,
287             _pool.findNameAndTypeEntry("2", "3", true));
288         assertEquals(_pool.size() + 3,
289             _pool.findNameAndTypeEntry("ccc", "ddd", true));
290 
291         assertEquals(0, _pool.findFieldEntry("0", "1", "2", false));
292         assertEquals(field1, _pool.findFieldEntry("1", "1", "2", false));
293         assertEquals(field2, _pool.findFieldEntry("2", "2", "1", false));
294         assertEquals(field1, _pool.findFieldEntry("1", "1", "2", true));
295         assertEquals(field2, _pool.findFieldEntry("2", "2", "1", true));
296         assertEquals(_pool.size() + 1, 
297             _pool.findFieldEntry("1", "2", "1", true));
298         assertEquals(_pool.size() + 3, 
299             _pool.findFieldEntry("1", "3", "4", true));
300         assertEquals(_pool.size() + 6,
301             _pool.findFieldEntry("eee", "fff", "ggg", true));
302 
303         assertEquals(0, _pool.findMethodEntry("0", "1", "2", false));
304         assertEquals(method1, _pool.findMethodEntry("1", "1", "2", false));
305         assertEquals(method2, _pool.findMethodEntry("2", "2", "1", false));
306         assertEquals(method1, _pool.findMethodEntry("1", "1", "2", true));
307         assertEquals(method2, _pool.findMethodEntry("2", "2", "1", true));
308         assertEquals(_pool.size() + 1,
309             _pool.findMethodEntry("1", "2", "1", true));
310         assertEquals(_pool.size() + 3,
311             _pool.findMethodEntry("1", "3", "5", true));
312         assertEquals(_pool.size() + 6,
313             _pool.findMethodEntry("hhh", "iii", "jjj", true));
314 
315         assertEquals(0, _pool.findInterfaceMethodEntry("0", "1", "2", false));
316         assertEquals(imethod1,
317             _pool.findInterfaceMethodEntry("1", "1", "2", false));
318         assertEquals(imethod2,
319             _pool.findInterfaceMethodEntry("2", "2", "1", false));
320         assertEquals(imethod1,
321             _pool.findInterfaceMethodEntry("1", "1", "2", true));
322         assertEquals(imethod2,
323             _pool.findInterfaceMethodEntry("2", "2", "1", true));
324         assertEquals(_pool.size() + 1,
325             _pool.findInterfaceMethodEntry("1", "2", "1", true));
326         assertEquals(_pool.size() + 3,
327             _pool.findInterfaceMethodEntry("1", "3", "6", true));
328         assertEquals(_pool.size() + 6,
329             _pool.findInterfaceMethodEntry("kkk", "lll", "mmm", true));
330     }
331 
332     public static Test suite() {
333         return new TestSuite(TestConstantPool.class);
334     }
335 
336     public static void main(String[] args) {
337         TestRunner.run(suite());
338     }
339 }