1 package serp.bytecode.lowlevel;
2
3 import junit.framework.*;
4 import junit.textui.*;
5
6
7
8
9
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
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
41 assertEquals(4, _pool.addEntry(_utf8Entry));
42 assertEquals(5, _pool.addEntry(new UTF8Entry("4")));
43
44
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
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
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
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
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
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
185
186 public void testClear() {
187
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
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 }