@Test public void canGetShortValueOfShort() { short value = 5; initial.setRegisters(0, value, "S"); expected.setRegisters(0, value, CommonTypes.SHORT_OBJ); VMTester.test(CLASS_NAME, "shortValueOfShort()V", initial, expected); }
@Test public void canPutByte() { Byte value = 0xf; initial.setRegisters(0, new byte[1], "[B", 1, 0, "I", 2, value, "B"); expected.setRegisters(0, new byte[]{value}, "[B"); VMTester.test(CLASS_NAME, "putByte()V", initial, expected); }
@Test public void canPutChar() { initial.setRegisters(0, new char[1], "[C", 1, 0, "I", 2, '$', "C"); expected.setRegisters(0, new char[]{'$'}, "[C"); VMTester.test(CLASS_NAME, "putChar()V", initial, expected); }
@Test public void canPutCharFromInt() { initial.setRegisters(0, new char[1], "[C", 1, 0, "I", 2, (int) '$', "I"); expected.setRegisters(0, new char[]{'$'}, "[C"); VMTester.test(CLASS_NAME, "putChar()V", initial, expected); }
@Test public void canGetLengthForLongArray() { initial.setRegisters(0, new long[] { 1, 2, 3, 4 }, "[J"); expected.setRegisters(0, 4, "I"); VMTester.test(CLASS_NAME, "getLength()V", initial, expected); }
@Test public void canGetLengthForShortArray() { initial.setRegisters(0, new short[] { 1, 2 }, "[S"); expected.setRegisters(0, 2, "I"); VMTester.test(CLASS_NAME, "getLength()V", initial, expected); }
@Test public void canRemDouble2Addr() { initial.setRegisters(0, 22.9D, "D", 2, 0.5D, "D"); expected.setRegisters(0, 22.9D % 0.5D, "D"); VMTester.test(CLASS_NAME, "remDouble2Addr()V", initial, expected); }
@Test public void canSubFloat2Addr() { initial.setRegisters(0, 0.5F, "F", 1, 20.5F, "F"); expected.setRegisters(0, 0.5F - 20.5F, "F"); VMTester.test(CLASS_NAME, "subFloat2Addr()V", initial, expected); }
@Test public void canAddIntAndChar() { // Compiler will actually produce something like this. initial.setRegisters(0, "$".charAt(0), "C", 1, 11, "I"); expected.setRegisters(0, "$".charAt(0) + 11, "I"); VMTester.test(CLASS_NAME, "addInt()V", initial, expected); }
@Test public void canAndInt2Addr() { initial.setRegisters(0, 2, "I", 1, 7, "I"); expected.setRegisters(0, 2 & 7, "I"); VMTester.test(CLASS_NAME, "andInt2Addr()V", initial, expected); }
@Test public void canMulInt() { initial.setRegisters(0, -3, "I", 1, 7, "I"); expected.setRegisters(0, -3 * 7, "I"); VMTester.test(CLASS_NAME, "mulInt()V", initial, expected); }
@Test public void canRemIntLit8() { initial.setRegisters(0, 0x10, "I"); expected.setRegisters(0, 0x10 % 0xf, "I"); VMTester.test(CLASS_NAME, "remIntLit8()V", initial, expected); }
@Test public void canSubInt() { initial.setRegisters(0, -3, "I", 1, 7, "I"); expected.setRegisters(0, -3 - 7, "I"); VMTester.test(CLASS_NAME, "subInt()V", initial, expected); }
@Test public void canDivLong2Addr() { initial.setRegisters(0, 0x300000000L, "J", 2, 3L, "J"); expected.setRegisters(0, 0x300000000L / 3L, "J"); VMTester.test(CLASS_NAME, "divLong2Addr()V", initial, expected); }
@Test public void canSubLong2Addr() { initial.setRegisters(0, 0x100000000L, "J", 2, 0x200000000L, "J"); expected.setRegisters(0, 0x100000000L - 0x200000000L, "J"); VMTester.test(CLASS_NAME, "subLong2Addr()V", initial, expected); }
@Test public void outOfBoundsIndexThrowsArrayIndexOutOfBoundsExceptionHasNoChildrenAndAssignsNoRegisters() { initial.setRegisters(0, new int[5], "[I", 1, 10, "I", 2, 0, "I"); testException("putWithCatch()V", ArrayIndexOutOfBoundsException.class, initial); }
@Test public void incompatibleValueTypeThrowsArrayStoreExceptionHasNoChildrenAndAssignsNoRegisters() { initial.setRegisters(0, new int[5], "[I", 1, 0, "I", 2, "wrong type", "Ljava/lang/String;"); testException("putWithCatch()V", ArrayStoreException.class, initial); }
public static ExecutionGraphManipulator getGraphManipulator(String className, String methodSignature, Object... args) { VMState initial = new VMState(); if (args.length > 0) { initial.setRegisters(args); } return getGraphManipulator(className, methodSignature, initial); }
@Test public void unknownArrayWithIncompatibleTypeThrowsArrayStoreExceptionHasNoChildrenAndAssignsNoRegisters() { initial.setRegisters(0, new UnknownValue(), "[I", 1, 0, "I", 2, "wrong type", "Ljava/lang/String;"); testException("putWithCatch()V", ArrayStoreException.class, initial); }
private static ExecutionGraphManipulator getOptimizedGraph(String methodName, Object... args) { VMState initial = new VMState(); if (args.length > 0) { initial.setRegisters(args); } ExecutionGraphManipulator manipulator = OptimizerTester.getGraphManipulator(CLASS_NAME, methodName, initial); UnreflectionStrategy strategy = new UnreflectionStrategy(manipulator); strategy.perform(); return manipulator; }