1   package serp.bytecode;
2   
3   import junit.framework.*;
4   import junit.textui.*;
5   
6   /**
7    * Tests the {@link MathInstruction} type.
8    *
9    * @author Abe White
10   */
11  public class TestMathInstruction extends TestCase {
12      private Code _code = new Code();
13  
14      public TestMathInstruction(String test) {
15          super(test);
16      }
17  
18      /**
19       * Test that the instruction intitializes correctly when generated.
20       */
21      public void testInitialize() {
22          assertEquals(Constants.NOP, _code.math().getOpcode());
23          assertEquals(Constants.NOP, _code.xadd().getOpcode());
24          assertEquals(Constants.IADD, _code.iadd().getOpcode());
25          assertEquals(Constants.LADD, _code.ladd().getOpcode());
26          assertEquals(Constants.FADD, _code.fadd().getOpcode());
27          assertEquals(Constants.DADD, _code.dadd().getOpcode());
28          assertEquals(Constants.NOP, _code.xsub().getOpcode());
29          assertEquals(Constants.ISUB, _code.isub().getOpcode());
30          assertEquals(Constants.LSUB, _code.lsub().getOpcode());
31          assertEquals(Constants.FSUB, _code.fsub().getOpcode());
32          assertEquals(Constants.DSUB, _code.dsub().getOpcode());
33          assertEquals(Constants.NOP, _code.xmul().getOpcode());
34          assertEquals(Constants.IMUL, _code.imul().getOpcode());
35          assertEquals(Constants.LMUL, _code.lmul().getOpcode());
36          assertEquals(Constants.FMUL, _code.fmul().getOpcode());
37          assertEquals(Constants.DMUL, _code.dmul().getOpcode());
38          assertEquals(Constants.NOP, _code.xdiv().getOpcode());
39          assertEquals(Constants.IDIV, _code.idiv().getOpcode());
40          assertEquals(Constants.LDIV, _code.ldiv().getOpcode());
41          assertEquals(Constants.FDIV, _code.fdiv().getOpcode());
42          assertEquals(Constants.DDIV, _code.ddiv().getOpcode());
43          assertEquals(Constants.NOP, _code.xrem().getOpcode());
44          assertEquals(Constants.IREM, _code.irem().getOpcode());
45          assertEquals(Constants.LREM, _code.lrem().getOpcode());
46          assertEquals(Constants.FREM, _code.frem().getOpcode());
47          assertEquals(Constants.DREM, _code.drem().getOpcode());
48          assertEquals(Constants.NOP, _code.xneg().getOpcode());
49          assertEquals(Constants.INEG, _code.ineg().getOpcode());
50          assertEquals(Constants.LNEG, _code.lneg().getOpcode());
51          assertEquals(Constants.FNEG, _code.fneg().getOpcode());
52          assertEquals(Constants.DNEG, _code.dneg().getOpcode());
53          assertEquals(Constants.NOP, _code.xshl().getOpcode());
54          assertEquals(Constants.ISHL, _code.ishl().getOpcode());
55          assertEquals(Constants.LSHL, _code.lshl().getOpcode());
56          assertEquals(Constants.NOP, _code.xshr().getOpcode());
57          assertEquals(Constants.ISHR, _code.ishr().getOpcode());
58          assertEquals(Constants.LSHR, _code.lshr().getOpcode());
59          assertEquals(Constants.NOP, _code.xushr().getOpcode());
60          assertEquals(Constants.IUSHR, _code.iushr().getOpcode());
61          assertEquals(Constants.LUSHR, _code.lushr().getOpcode());
62          assertEquals(Constants.NOP, _code.xand().getOpcode());
63          assertEquals(Constants.IAND, _code.iand().getOpcode());
64          assertEquals(Constants.LAND, _code.land().getOpcode());
65          assertEquals(Constants.NOP, _code.xor().getOpcode());
66          assertEquals(Constants.IOR, _code.ior().getOpcode());
67          assertEquals(Constants.LOR, _code.lor().getOpcode());
68          assertEquals(Constants.NOP, _code.xxor().getOpcode());
69          assertEquals(Constants.IXOR, _code.ixor().getOpcode());
70          assertEquals(Constants.LXOR, _code.lxor().getOpcode());
71      }
72  
73      /**
74       * Test that the instruction returns its type correctly.
75       */
76      public void testGetType() {
77          MathInstruction ins = _code.math();
78          assertNull(ins.getType());
79          assertEquals(-1, ins.getOperation());
80  
81          ins = _code.xadd();
82          assertNull(ins.getType());
83          assertEquals(Constants.MATH_ADD, ins.getOperation());
84          ins = _code.iadd();
85          assertEquals(int.class, ins.getType());
86          assertEquals(Constants.MATH_ADD, ins.getOperation());
87          ins = _code.ladd();
88          assertEquals(long.class, ins.getType());
89          assertEquals(Constants.MATH_ADD, ins.getOperation());
90          ins = _code.fadd();
91          assertEquals(float.class, ins.getType());
92          assertEquals(Constants.MATH_ADD, ins.getOperation());
93          ins = _code.dadd();
94          assertEquals(double.class, ins.getType());
95          assertEquals(Constants.MATH_ADD, ins.getOperation());
96  
97          ins = _code.xsub();
98          assertNull(ins.getType());
99          assertEquals(Constants.MATH_SUB, ins.getOperation());
100         ins = _code.isub();
101         assertEquals(int.class, ins.getType());
102         assertEquals(Constants.MATH_SUB, ins.getOperation());
103         ins = _code.lsub();
104         assertEquals(long.class, ins.getType());
105         assertEquals(Constants.MATH_SUB, ins.getOperation());
106         ins = _code.fsub();
107         assertEquals(float.class, ins.getType());
108         assertEquals(Constants.MATH_SUB, ins.getOperation());
109         ins = _code.dsub();
110         assertEquals(double.class, ins.getType());
111         assertEquals(Constants.MATH_SUB, ins.getOperation());
112 
113         ins = _code.xmul();
114         assertNull(ins.getType());
115         assertEquals(Constants.MATH_MUL, ins.getOperation());
116         ins = _code.imul();
117         assertEquals(int.class, ins.getType());
118         assertEquals(Constants.MATH_MUL, ins.getOperation());
119         ins = _code.lmul();
120         assertEquals(long.class, ins.getType());
121         assertEquals(Constants.MATH_MUL, ins.getOperation());
122         ins = _code.fmul();
123         assertEquals(float.class, ins.getType());
124         assertEquals(Constants.MATH_MUL, ins.getOperation());
125         ins = _code.dmul();
126         assertEquals(double.class, ins.getType());
127         assertEquals(Constants.MATH_MUL, ins.getOperation());
128 
129         ins = _code.xdiv();
130         assertNull(ins.getType());
131         assertEquals(Constants.MATH_DIV, ins.getOperation());
132         ins = _code.idiv();
133         assertEquals(int.class, ins.getType());
134         assertEquals(Constants.MATH_DIV, ins.getOperation());
135         ins = _code.ldiv();
136         assertEquals(long.class, ins.getType());
137         assertEquals(Constants.MATH_DIV, ins.getOperation());
138         ins = _code.fdiv();
139         assertEquals(float.class, ins.getType());
140         assertEquals(Constants.MATH_DIV, ins.getOperation());
141         ins = _code.ddiv();
142         assertEquals(double.class, ins.getType());
143         assertEquals(Constants.MATH_DIV, ins.getOperation());
144 
145         ins = _code.xrem();
146         assertNull(ins.getType());
147         assertEquals(Constants.MATH_REM, ins.getOperation());
148         ins = _code.irem();
149         assertEquals(int.class, ins.getType());
150         assertEquals(Constants.MATH_REM, ins.getOperation());
151         ins = _code.lrem();
152         assertEquals(long.class, ins.getType());
153         assertEquals(Constants.MATH_REM, ins.getOperation());
154         ins = _code.frem();
155         assertEquals(float.class, ins.getType());
156         assertEquals(Constants.MATH_REM, ins.getOperation());
157         ins = _code.drem();
158         assertEquals(double.class, ins.getType());
159         assertEquals(Constants.MATH_REM, ins.getOperation());
160 
161         ins = _code.xneg();
162         assertNull(ins.getType());
163         assertEquals(Constants.MATH_NEG, ins.getOperation());
164         ins = _code.ineg();
165         assertEquals(int.class, ins.getType());
166         assertEquals(Constants.MATH_NEG, ins.getOperation());
167         ins = _code.lneg();
168         assertEquals(long.class, ins.getType());
169         assertEquals(Constants.MATH_NEG, ins.getOperation());
170         ins = _code.fneg();
171         assertEquals(float.class, ins.getType());
172         assertEquals(Constants.MATH_NEG, ins.getOperation());
173         ins = _code.dneg();
174         assertEquals(double.class, ins.getType());
175         assertEquals(Constants.MATH_NEG, ins.getOperation());
176 
177         ins = _code.xshl();
178         assertNull(ins.getType());
179         assertEquals(Constants.MATH_SHL, ins.getOperation());
180         ins = _code.ishl();
181         assertEquals(int.class, ins.getType());
182         assertEquals(Constants.MATH_SHL, ins.getOperation());
183         ins = _code.lshl();
184         assertEquals(long.class, ins.getType());
185         assertEquals(Constants.MATH_SHL, ins.getOperation());
186 
187         ins = _code.xshr();
188         assertNull(ins.getType());
189         assertEquals(Constants.MATH_SHR, ins.getOperation());
190         ins = _code.ishr();
191         assertEquals(int.class, ins.getType());
192         assertEquals(Constants.MATH_SHR, ins.getOperation());
193         ins = _code.lshr();
194         assertEquals(long.class, ins.getType());
195         assertEquals(Constants.MATH_SHR, ins.getOperation());
196 
197         ins = _code.xushr();
198         assertNull(ins.getType());
199         assertEquals(Constants.MATH_USHR, ins.getOperation());
200         ins = _code.iushr();
201         assertEquals(int.class, ins.getType());
202         assertEquals(Constants.MATH_USHR, ins.getOperation());
203         ins = _code.lushr();
204         assertEquals(long.class, ins.getType());
205         assertEquals(Constants.MATH_USHR, ins.getOperation());
206 
207         ins = _code.xand();
208         assertNull(ins.getType());
209         assertEquals(Constants.MATH_AND, ins.getOperation());
210         ins = _code.iand();
211         assertEquals(int.class, ins.getType());
212         assertEquals(Constants.MATH_AND, ins.getOperation());
213         ins = _code.land();
214         assertEquals(long.class, ins.getType());
215         assertEquals(Constants.MATH_AND, ins.getOperation());
216 
217         ins = _code.xor();
218         assertNull(ins.getType());
219         assertEquals(Constants.MATH_OR, ins.getOperation());
220         ins = _code.ior();
221         assertEquals(int.class, ins.getType());
222         assertEquals(Constants.MATH_OR, ins.getOperation());
223         ins = _code.lor();
224         assertEquals(long.class, ins.getType());
225         assertEquals(Constants.MATH_OR, ins.getOperation());
226 
227         ins = _code.xxor();
228         assertNull(ins.getType());
229         assertEquals(Constants.MATH_XOR, ins.getOperation());
230         ins = _code.ixor();
231         assertEquals(int.class, ins.getType());
232         assertEquals(Constants.MATH_XOR, ins.getOperation());
233         ins = _code.lxor();
234         assertEquals(long.class, ins.getType());
235         assertEquals(Constants.MATH_XOR, ins.getOperation());
236     }
237 
238     /**
239      * Test that the opcode is morphed correctly when the type and operation
240      * of the instruction are changed.
241      */
242     public void testOpcodeMorph() {
243         MathInstruction math = _code.math();
244 
245         math.setOperation(Constants.MATH_ADD);
246         assertEquals(Constants.NOP, math.setType((String) null).getOpcode());
247         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
248         assertEquals(Constants.NOP, math.setType((BCClass) null).getOpcode());
249         assertEquals(Constants.IADD, math.setType(int.class).getOpcode());
250         assertEquals(Constants.LADD, math.setType(long.class).getOpcode());
251         assertEquals(Constants.FADD, math.setType(float.class).getOpcode());
252         assertEquals(Constants.DADD, math.setType(double.class).getOpcode());
253         assertEquals(Constants.IADD, math.setType(boolean.class).getOpcode());
254         assertEquals(Constants.IADD, math.setType(short.class).getOpcode());
255         assertEquals(Constants.IADD, math.setType(char.class).getOpcode());
256 
257         math.setOperation(Constants.MATH_SUB);
258         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
259         assertEquals(Constants.ISUB, math.setType(int.class).getOpcode());
260         assertEquals(Constants.LSUB, math.setType(long.class).getOpcode());
261         assertEquals(Constants.FSUB, math.setType(float.class).getOpcode());
262         assertEquals(Constants.DSUB, math.setType(double.class).getOpcode());
263 
264         math.setOperation(Constants.MATH_MUL);
265         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
266         assertEquals(Constants.IMUL, math.setType(int.class).getOpcode());
267         assertEquals(Constants.LMUL, math.setType(long.class).getOpcode());
268         assertEquals(Constants.FMUL, math.setType(float.class).getOpcode());
269         assertEquals(Constants.DMUL, math.setType(double.class).getOpcode());
270 
271         math.setOperation(Constants.MATH_DIV);
272         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
273         assertEquals(Constants.IDIV, math.setType(int.class).getOpcode());
274         assertEquals(Constants.LDIV, math.setType(long.class).getOpcode());
275         assertEquals(Constants.FDIV, math.setType(float.class).getOpcode());
276         assertEquals(Constants.DDIV, math.setType(double.class).getOpcode());
277 
278         math.setOperation(Constants.MATH_REM);
279         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
280         assertEquals(Constants.IREM, math.setType(int.class).getOpcode());
281         assertEquals(Constants.LREM, math.setType(long.class).getOpcode());
282         assertEquals(Constants.FREM, math.setType(float.class).getOpcode());
283         assertEquals(Constants.DREM, math.setType(double.class).getOpcode());
284 
285         math.setOperation(Constants.MATH_NEG);
286         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
287         assertEquals(Constants.INEG, math.setType(int.class).getOpcode());
288         assertEquals(Constants.LNEG, math.setType(long.class).getOpcode());
289         assertEquals(Constants.FNEG, math.setType(float.class).getOpcode());
290         assertEquals(Constants.DNEG, math.setType(double.class).getOpcode());
291 
292         math.setOperation(Constants.MATH_SHL);
293         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
294         assertEquals(Constants.ISHL, math.setType(int.class).getOpcode());
295         assertEquals(Constants.LSHL, math.setType(long.class).getOpcode());
296 
297         math.setOperation(Constants.MATH_SHR);
298         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
299         assertEquals(Constants.ISHR, math.setType(int.class).getOpcode());
300         assertEquals(Constants.LSHR, math.setType(long.class).getOpcode());
301 
302         math.setOperation(Constants.MATH_USHR);
303         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
304         assertEquals(Constants.IUSHR, math.setType(int.class).getOpcode());
305         assertEquals(Constants.LUSHR, math.setType(long.class).getOpcode());
306 
307         math.setOperation(Constants.MATH_AND);
308         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
309         assertEquals(Constants.IAND, math.setType(int.class).getOpcode());
310         assertEquals(Constants.LAND, math.setType(long.class).getOpcode());
311 
312         math.setOperation(Constants.MATH_OR);
313         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
314         assertEquals(Constants.IOR, math.setType(int.class).getOpcode());
315         assertEquals(Constants.LOR, math.setType(long.class).getOpcode());
316 
317         math.setOperation(Constants.MATH_XOR);
318         assertEquals(Constants.NOP, math.setType((Class) null).getOpcode());
319         assertEquals(Constants.IXOR, math.setType(int.class).getOpcode());
320         assertEquals(Constants.LXOR, math.setType(long.class).getOpcode());
321     }
322 
323     public static Test suite() {
324         return new TestSuite(TestMathInstruction.class);
325     }
326 
327     public static void main(String[] args) {
328         TestRunner.run(suite());
329     }
330 }