001    package serp.bytecode;
002    
003    import junit.framework.*;
004    import junit.textui.*;
005    
006    /**
007     * Tests the {@link MathInstruction} type.
008     *
009     * @author Abe White
010     */
011    public class TestMathInstruction extends TestCase {
012        private Code _code = new Code();
013    
014        public TestMathInstruction(String test) {
015            super(test);
016        }
017    
018        /**
019         * Test that the instruction intitializes correctly when generated.
020         */
021        public void testInitialize() {
022            assertEquals(Constants.NOP, _code.math().getOpcode());
023            assertEquals(Constants.NOP, _code.xadd().getOpcode());
024            assertEquals(Constants.IADD, _code.iadd().getOpcode());
025            assertEquals(Constants.LADD, _code.ladd().getOpcode());
026            assertEquals(Constants.FADD, _code.fadd().getOpcode());
027            assertEquals(Constants.DADD, _code.dadd().getOpcode());
028            assertEquals(Constants.NOP, _code.xsub().getOpcode());
029            assertEquals(Constants.ISUB, _code.isub().getOpcode());
030            assertEquals(Constants.LSUB, _code.lsub().getOpcode());
031            assertEquals(Constants.FSUB, _code.fsub().getOpcode());
032            assertEquals(Constants.DSUB, _code.dsub().getOpcode());
033            assertEquals(Constants.NOP, _code.xmul().getOpcode());
034            assertEquals(Constants.IMUL, _code.imul().getOpcode());
035            assertEquals(Constants.LMUL, _code.lmul().getOpcode());
036            assertEquals(Constants.FMUL, _code.fmul().getOpcode());
037            assertEquals(Constants.DMUL, _code.dmul().getOpcode());
038            assertEquals(Constants.NOP, _code.xdiv().getOpcode());
039            assertEquals(Constants.IDIV, _code.idiv().getOpcode());
040            assertEquals(Constants.LDIV, _code.ldiv().getOpcode());
041            assertEquals(Constants.FDIV, _code.fdiv().getOpcode());
042            assertEquals(Constants.DDIV, _code.ddiv().getOpcode());
043            assertEquals(Constants.NOP, _code.xrem().getOpcode());
044            assertEquals(Constants.IREM, _code.irem().getOpcode());
045            assertEquals(Constants.LREM, _code.lrem().getOpcode());
046            assertEquals(Constants.FREM, _code.frem().getOpcode());
047            assertEquals(Constants.DREM, _code.drem().getOpcode());
048            assertEquals(Constants.NOP, _code.xneg().getOpcode());
049            assertEquals(Constants.INEG, _code.ineg().getOpcode());
050            assertEquals(Constants.LNEG, _code.lneg().getOpcode());
051            assertEquals(Constants.FNEG, _code.fneg().getOpcode());
052            assertEquals(Constants.DNEG, _code.dneg().getOpcode());
053            assertEquals(Constants.NOP, _code.xshl().getOpcode());
054            assertEquals(Constants.ISHL, _code.ishl().getOpcode());
055            assertEquals(Constants.LSHL, _code.lshl().getOpcode());
056            assertEquals(Constants.NOP, _code.xshr().getOpcode());
057            assertEquals(Constants.ISHR, _code.ishr().getOpcode());
058            assertEquals(Constants.LSHR, _code.lshr().getOpcode());
059            assertEquals(Constants.NOP, _code.xushr().getOpcode());
060            assertEquals(Constants.IUSHR, _code.iushr().getOpcode());
061            assertEquals(Constants.LUSHR, _code.lushr().getOpcode());
062            assertEquals(Constants.NOP, _code.xand().getOpcode());
063            assertEquals(Constants.IAND, _code.iand().getOpcode());
064            assertEquals(Constants.LAND, _code.land().getOpcode());
065            assertEquals(Constants.NOP, _code.xor().getOpcode());
066            assertEquals(Constants.IOR, _code.ior().getOpcode());
067            assertEquals(Constants.LOR, _code.lor().getOpcode());
068            assertEquals(Constants.NOP, _code.xxor().getOpcode());
069            assertEquals(Constants.IXOR, _code.ixor().getOpcode());
070            assertEquals(Constants.LXOR, _code.lxor().getOpcode());
071        }
072    
073        /**
074         * Test that the instruction returns its type correctly.
075         */
076        public void testGetType() {
077            MathInstruction ins = _code.math();
078            assertNull(ins.getType());
079            assertEquals(-1, ins.getOperation());
080    
081            ins = _code.xadd();
082            assertNull(ins.getType());
083            assertEquals(Constants.MATH_ADD, ins.getOperation());
084            ins = _code.iadd();
085            assertEquals(int.class, ins.getType());
086            assertEquals(Constants.MATH_ADD, ins.getOperation());
087            ins = _code.ladd();
088            assertEquals(long.class, ins.getType());
089            assertEquals(Constants.MATH_ADD, ins.getOperation());
090            ins = _code.fadd();
091            assertEquals(float.class, ins.getType());
092            assertEquals(Constants.MATH_ADD, ins.getOperation());
093            ins = _code.dadd();
094            assertEquals(double.class, ins.getType());
095            assertEquals(Constants.MATH_ADD, ins.getOperation());
096    
097            ins = _code.xsub();
098            assertNull(ins.getType());
099            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    }