[Test]public void testMakeSureThatJsrWhichCallsItselfDoesNotRecurseForever()
 {
     Block main = new Block("main");
     Block sub = new Block("sub");
     main.addOp(new JMP(0, sub));
     main.addOp(new JMP(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
 }
        [Test]public void testJSRMultiBlock()
        {
            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 JMP(0, sub));

            Stack2Turing converter = new Stack2Turing(main);
            converter.translate(); // Assert no exceptions
        }
        public void testDiamondBlockArrangment()
        {
            Block root = new Block("root");
            Block branchA = new Block("branchA");
            Block branchB = new Block("branchB");
            Block joined = new Block("joined");
            root.addNextBlock(branchA);
            root.addNextBlock(branchB);
            branchA.addNextBlock(joined);
            branchB.addNextBlock(joined);

            root.addOp(new Load(-1, var("this")));
            root.addOp(new Load(-1, var("root")));
            branchA.addOp(new Load(-1, var("A")));
            branchB.addOp(new Load(-1, var("B")));
            joined.addOp(new Load(-1, var("joined")));
            joined.addOp(new Invoke(-1, null, "m", "(System.Int32, System.Int32, System.Int32)System.Void", 
                new ArrayList<Type>(){ClrType.Int32, ClrType.Int32, ClrType.Int32}, 
                false, ClrType.Void));

            IList<Operation> operations = new Stack2Turing(root).translate();
            Assert.AreEqual(2, operations.Count);
            MethodInvokation mB = (MethodInvokation)operations[0];
            MethodInvokation mA = (MethodInvokation)operations[1];
            // since we use hash order is non-deterministic
            if (mB.getParameters()[1].ToString().StartsWith("A"))
            {
                MethodInvokation temp = mB;
                mB = mA;
                mA = temp;
            }

            Assert.AreEqual("[ 0:root{System.Object}, 1:A{System.Object}, 2:joined{System.Object} ]",
                mA.getParameters().ToString());
            Assert.AreEqual("this{System.Object}", mA.getMethodThis().ToString());

            Assert.AreEqual("[ 0:root{System.Object}, 1:B{System.Object}, 2:joined{System.Object} ]",
                mB.getParameters().ToString());
            Assert.AreEqual("this{System.Object}", mB.getMethodThis().ToString());
        }