public async Task Bookmarks()
        {
            var root = new Flowchart()
            {
                Id        = "Ref0",
                Variables = new List <IVariable>
                {
                    new Variable()
                    {
                        Name = "X", Dir = VariableDirection.InOut, Type = VariableType.Number
                    },
                },
                Nodes = new List <FlowNode>()
                {
                    new FlowStart()
                    {
                        Id = "Ref1", Next = "Ref2"
                    },
                    new FlowDecision()
                    {
                        Id = "Ref2", Condition = "X > 0", Then = "Ref3"
                    },
                    new FlowActivity()
                    {
                        Id       = "Ref3", Next = "Ref2",
                        Activity = new Sequence()
                        {
                            Id         = "Ref4",
                            Activities = new List <IActivity>()
                            {
                                new Wait()
                                {
                                    Id = "Ref5", Bookmark = "BM1"
                                },
                                new Code()
                                {
                                    Id = "Ref6", Script = "X -= 1"
                                }
                            }
                        }
                    }
                }
            };

            var wfe  = TestEngine.CreateInMemoryEngine();
            var inst = await wfe.CreateAsync(root, null);

            inst = await wfe.RunAsync(inst.Id, new { X = 5 });

            var result = inst.Result;

            Assert.AreEqual(5, result.Get <Int32>("X"));
            //var id = inst.Id;

            int x = result.Get <Int32>("X");

            while (x > 0)
            {
                var resInst = await wfe.ResumeAsync(inst.Id, "BM1");

                x = resInst.Result.Get <Int32>("X");
            }
            Assert.AreEqual(0, x);
        }
        public async Task ParallelGateway()
        {
            var process = new Process()
            {
                Id           = "process",
                IsExecutable = true,
                Children     = new List <BaseElement>()
                {
                    new StartEvent()
                    {
                        Id       = "start",
                        Children = new List <BaseElement>()
                        {
                            new Outgoing()
                            {
                                Text = "start->gate1"
                            }
                        }
                    },
                    new ParallelGateway()
                    {
                        Id       = "gate1",
                        Children = new List <BaseElement>()
                        {
                            new Incoming()
                            {
                                Text = "start->gate1"
                            },
                            new Outgoing()
                            {
                                Text = "gate1->task1"
                            },
                            new Outgoing()
                            {
                                Text = "gate1->task2"
                            },
                            new Script()
                            {
                                Text = ""
                            }
                        }
                    },
                    new ScriptTask()
                    {
                        Id       = "task1",
                        Children = new List <BaseElement>()
                        {
                            new Incoming()
                            {
                                Text = "gate1->task1"
                            },
                            new Outgoing()
                            {
                                Text = "task1->gate2"
                            }
                        }
                    },
                    new ScriptTask()
                    {
                        Id       = "task2",
                        Children = new List <BaseElement>()
                        {
                            new Incoming()
                            {
                                Text = "gate1->task2"
                            },
                            new Outgoing()
                            {
                                Text = "task2->gate2"
                            }
                        }
                    },
                    new ParallelGateway()
                    {
                        Id       = "gate2",
                        Children = new List <BaseElement>()
                        {
                            new Incoming()
                            {
                                Text = "task1->gate2"
                            },
                            new Incoming()
                            {
                                Text = "task2->gate2"
                            },
                            new Outgoing()
                            {
                                Text = "gate2->end",
                            }
                        },
                    },
                    new EndEvent()
                    {
                        Id       = "end",
                        Children = new List <BaseElement>()
                        {
                            new Incoming()
                            {
                                Text = "script->end"
                            }
                        }
                    },
                    new SequenceFlow()
                    {
                        Id = "start->gate1", SourceRef = "start", TargetRef = "gate1"
                    },
                    new SequenceFlow()
                    {
                        Id = "gate1->task1", SourceRef = "gate1", TargetRef = "task1"
                    },
                    new SequenceFlow()
                    {
                        Id = "gate1->task2", SourceRef = "gate1", TargetRef = "task2"
                    },
                    new SequenceFlow()
                    {
                        Id = "task1->gate2", SourceRef = "task1", TargetRef = "gate2"
                    },
                    new SequenceFlow()
                    {
                        Id = "task2->gate2", SourceRef = "task2", TargetRef = "gate2"
                    },
                    new SequenceFlow()
                    {
                        Id = "gate2->end", SourceRef = "gate2", TargetRef = "end"
                    }
                }
            };

            var wfe  = TestEngine.CreateInMemoryEngine();
            var inst = await wfe.CreateAsync(process, null);

            await wfe.RunAsync(inst.Id);
        }