public void RunsMachine()
        {
            var fun = ProgramBuilder.Create(p => p
                                            .Write(new byte[] {
                1, 2,
                1, 5,
                1, Op.Add, 0,
                1, Op.Print, 0
            }));

            var col = new Collector();

            Run(CreateContext(col, fun));

            Assert.AreEqual(7, col.Collected.Dequeue());
        }
        public void LimitsDataStack()
        {
            var fun = ProgramBuilder.Create(p =>
            {
                for (var i = 0; i < Constants.MAX_STACK_DEPTH + 1; i++)
                {
                    p.Push(5);
                }
            });

            var col = new Collector();
            var ctx = CreateContext(col, fun);

            Assert.ThrowsException <BoundaryException>(() =>
            {
                Run(ctx);
            });

            Assert.AreEqual(Constants.MAX_STACK_DEPTH, ctx.Stack.Count);
        }
        public void LimitsTicks()
        {
            var fun = ProgramBuilder.Create(p =>
            {
                for (var i = 0; i < Constants.MAX_TICKS + 1; i++)
                {
                    p.Execute(Op.NoOp);
                }
            });

            var col = new Collector();
            var ctx = CreateContext(col, fun);

            Assert.ThrowsException <BoundaryException>(() =>
            {
                Run(ctx);
            });

            Assert.AreEqual(Constants.MAX_TICKS, ctx.Ticks);
        }
        public void RunsFunction()
        {
            var fun = ProgramBuilder.Create(p => p
                                            .Push(d => d.Push(1000).Execute(Op.Add))
                                            .Push(Op.x)
                                            .Execute(Op.Define)

                                            .Push(long.MaxValue)
                                            .Execute(Op.Print)
                                            .Push(99)
                                            .Execute(Op.Print)
                                            .Push(7)
                                            .Execute(Op.x)
                                            .Execute(Op.Print)
                                            );

            var col = new Collector();

            Run(CreateContext(col, fun));

            Assert.AreEqual(long.MaxValue, col.Collected.Dequeue());
            Assert.AreEqual(99, col.Collected.Dequeue());
            Assert.AreEqual(1007, col.Collected.Dequeue());
        }
        public void LimitsExeStack()
        {
            var fun = ProgramBuilder.Create(p => p
                                            .Push(d => d.Execute(Op.y).Push(10))
                                            .Push(Op.x)
                                            .Execute(Op.Define)

                                            .Push(d => d.Execute(Op.x).Push(10))
                                            .Push(Op.y)
                                            .Execute(Op.Define)

                                            .Execute(Op.x)
                                            );

            var col = new Collector();
            var ctx = CreateContext(col, fun);

            Assert.ThrowsException <BoundaryException>(() =>
            {
                Run(ctx);
            });

            Assert.AreEqual(Constants.MAX_EXE_DEPTH, ctx.Executions.Count);
        }