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 }