package com.hellblazer.primeMover.soot;
import static java.util.Arrays.asList;
import junit.framework.Assert;
import junit.framework.TestCase;
import soot.G;
import soot.PhaseOptions;
import soot.Scene;
import soot.SootClass;
import soot.SootMethod;
import soot.options.Options;
import com.hellblazer.primeMover.runtime.EntityReference;
import com.hellblazer.primeMover.runtime.Framework;
public class TestApiTransformer extends TestCase {
static class MyMockController extends MockController {
boolean continuationPosted = false;
@Override
public Object postContinuingEvent(EntityReference entity, int event,
Object... arguments) throws Throwable {
Assert.assertEquals("com.hellblazer.primeMover.runtime.BlockingSleep",
entity.getClass().getCanonicalName());
Assert.assertEquals(0, event);
Assert.assertNotNull(arguments);
Assert.assertEquals(1, arguments.length);
continuationPosted = true;
return null;
}
}
public void testTransform() throws Exception {
G.reset();
SimulationTransform.setStandardClassPath();
Options.v().set_keep_line_number(true);
PhaseOptions.v().setPhaseOption("tag.ln", "on");
SootClass apiUserClass = Scene.v().loadClassAndSupport(ApiUserImpl.class.getCanonicalName());
ApiTransformer transformer = new ApiTransformer();
for (SootMethod method : apiUserClass.getMethods()) {
transformer.transform(method.retrieveActiveBody());
}
Scene.v().loadNecessaryClasses();
LocalLoader loader = new LocalLoader(asList(apiUserClass));
Class<?> clazz = loader.loadClass(ApiUserImpl.class.getCanonicalName());
assertNotSame(ApiUserImpl.class, clazz);
MyMockController controller = new MyMockController();
ApiUser apiUser = (ApiUser) clazz.newInstance();
Framework.setController(controller);
apiUser.blockingSleep();
assertTrue(controller.continuationPosted);
}
}