public void TestSmartVote(byte[] script)
        {
            const string VoteId = "q01";

            // Create arguments

            var args = new ExecutionEngineArgs()
            {
                InteropService  = new DummyInteropService(),
                ScriptTable     = new DummyScriptTable(),
                Trigger         = ETriggerType.Application,
                MessageProvider = new DummyMessageProvider(),
                Logger          = new ExecutionEngineLogger(ELogVerbosity.None)
            };

            args.Logger.OnStepInto += (context) =>
            { Console.WriteLine(context.ToString()); };

            args.InteropService.OnLog += (sender, e) =>
            { Console.WriteLine("Log: " + e.Message); };
            args.InteropService.OnNotify += (sender, e) =>
            { Console.WriteLine("Notification: " + e.State.ToString()); };

            using (var arguments = new ScriptBuilder())
                using (var engine = CreateEngine(args))
                // for (int x = 0; x < 5000; x++) // Benchmark
                {
                    // Register proposal

                    Console.WriteLine("** Register proposal **" + Environment.NewLine);

                    arguments.EmitMainPush("register_proposal", new object[] { VoteId, "My proposal", new byte[20], new byte[20] });

                    engine.Clean(0);
                    int scriptIndex = engine.LoadScript(script);
                    engine.LoadScript(arguments);

                    // Execute

                    Assert.IsTrue(engine.Execute());

                    using (var item = engine.ResultStack.Pop <IntegerStackItem>())
                    {
                        Assert.AreEqual(item.Value, 0x01);
                    }

                    CheckClean(engine);
                    // Vote

                    Console.WriteLine(Environment.NewLine + "** Vote **" + Environment.NewLine);

                    arguments.Clear();
                    arguments.EmitMainPush("vote", new object[] { VoteId, new byte[20], 1 });

                    engine.Clean(1);
                    Assert.IsTrue(engine.LoadScript(scriptIndex));
                    engine.LoadScript(arguments);

                    // Execute

                    Assert.IsTrue(engine.Execute());

                    using (var item = engine.ResultStack.Pop <IntegerStackItem>())
                    {
                        Assert.AreEqual(item.Value, 0x01);
                    }

                    CheckClean(engine);

                    // Count

                    Console.WriteLine(Environment.NewLine + "** Count **" + Environment.NewLine);

                    arguments.Clear();
                    arguments.EmitMainPush("count", new object[] { VoteId });

                    engine.Clean(2);
                    Assert.IsTrue(engine.LoadScript(scriptIndex));
                    engine.LoadScript(arguments);

                    // Execute

                    Assert.IsTrue(engine.Execute());

                    using (var item = engine.ResultStack.Pop <IntegerStackItem>())
                    {
                        Assert.AreEqual(item.Value, 0x01);
                    }

                    CheckClean(engine);
                }
        }