public void testMakeSureThatJsrWhichCallsItselfDoesNotRecurseForever() throws Exception {
   Block main = new Block("main");
   Block sub = new Block("sub");
   main.addOp(new JSR(0, sub));
   main.addOp(new JSR(0, sub));
   sub.addOp(new RetSub(1));
   sub.addNextBlock(main);
   Stack2Turing converter = new Stack2Turing(main);
   converter.translate(); // Assert no exceptions and that we don't get into infinite recursion
 }
  public void testJSRMultiBlock() throws Exception {
    Block main = new Block("main");
    Block sub = new Block("sub");
    Block sub1 = new Block("sub1");
    Block sub2 = new Block("sub2");
    sub.addNextBlock(sub1);
    sub1.addNextBlock(sub2);

    main.addOp(new JSR(0, sub));

    Stack2Turing converter = new Stack2Turing(main);
    converter.translate(); // Assert no exceptions
  }
  public void testJSRSingleBlock() throws Exception {
    Block main = new Block("main");
    Block sub = new Block("sub");

    main.addOp(new Load(0, new Variable("this", JavaType.OBJECT, false, false)));
    main.addOp(new JSR(0, sub));
    main.addOp(new PutField(0, new FieldInfo(null, "a", JavaType.INT, false, false, false)));

    sub.addOp(new Load(0, new Constant(1, JavaType.INT)));
    sub.addOp(new Return(0, JavaType.VOID));

    Stack2Turing converter = new Stack2Turing(main);
    List<Operation> operations = converter.translate();
    assertEquals(1, operations.size());
    assertEquals("null.a{int} <- 1{int}", operations.get(0).toString());
  }