public void SetDataFrom(BinaryReader reader)
 {
     CorrelationId = new Guid(reader.ReadString());
     Item = reader.ReadString();
     Test = new Chain();
     Test.ReadDataFrom(reader);
 }
 public void ReadDataFrom(BinaryReader reader)
 {
     Name = reader.ReadString();
     DisplayName = reader.ReadString();
     IsSetup = reader.ReadBoolean();
     IsTest = reader.ReadBoolean();
     IsTeardown = reader.ReadBoolean();
     TimeStart = reader.ReadDouble();
     TimeEnd = reader.ReadDouble();
     var childrenCount = reader.ReadInt32();
     for(int i=0;i<childrenCount;i++)
     {
         var child = new Chain();
         child.ReadDataFrom(reader);
         Children.Add(child);
     }
 }
        private Lifeline RecurseElements(Chain item, Lifeline parent, bool inSetup, bool inTest, bool inTeardown)
        {

            var time = (item.TimeEnd - item.TimeStart);
            var intime = time - GetChildrenTimes(item);
            var current = GetLifeLine(item.DisplayName);
                  
            if (item.IsTest) inTest = true;
            if (item.IsSetup) inSetup = true;
            if (item.IsTeardown) inTeardown = true;
            if (!(item.DisplayName.Contains("::get_") || item.DisplayName.Contains("::set_")))
            {

                if (parent != null)
                {
                    var message = new Message(seq, parent, current, GetName(item.DisplayName) + " " + TimeFormatter.FormatTime(intime), 2, _dte, GetColor(time), GetOppositeColor(intime));
                    message.Pen = GetPenColor(inSetup, inTest, inTeardown, time);
                    message.Clicked += message_Clicked;
                    message.GoToSpot = item.Name;
                    _doc.Add(message);
                    seq++;
                }
            }
            foreach(var child in item.Children)
            {
                var childline = RecurseElements(child, current, inSetup, inTest, inTeardown);
                if (current != null && childline != current)
                {
                    if (!(item.DisplayName.Contains("::get_") || item.DisplayName.Contains("::set_")))
                    {

                        var childtime = child.TimeEnd - child.TimeStart;
                        var message = new Message(seq, childline, current, "", 1, _dte, GetColor(time), GetOppositeColor(time))
                                          {
                                              Pen = GetPenColor(inSetup, inTest, inTeardown, childtime),
                                              GoToSpot = item.Name
                                          };
                        _doc.Add(message);
                        seq++;
                    }
                }
            }
            return current;
        }
 private double GetChildrenTimes(Chain item)
 {
     double ret = 0;
     if (item.Children == null || item.Children.Count == 0) return 0;
     foreach (var child in item.Children)
     {
         ret += child.TimeEnd - child.TimeStart;
     }
     return ret;
 }
 private static string RecurseElements(int depth, Chain test)
 {
     var children = test.Children.Aggregate("", (current, child) => current + RecurseElements(depth + 1, child));
     return new string(' ',depth + 1) + test.DisplayName + (depth != 0 ? (test.TimeEnd - test.TimeStart).ToString("#.000") + " ms here " : "") + "\r\n" + children;
 }
        private Lifeline RecurseElements(Chain item, Lifeline parent, bool inSetup, bool inTest, bool inTeardown)
        {
            var current = GetLifeLine(item.DisplayName);
            if (item.IsTest) inTest = true;
            if (item.IsSetup) inSetup = true;
            if (item.IsTeardown) inTeardown = true;
            if (parent != null)
            {
                var message = new Message(seq, parent, current, GetName(item.DisplayName), 1, _dte);
                message.Pen = GetPenColor(inSetup, inTest, inTeardown);
                message.Clicked += message_Clicked;
                message.GoToSpot = item.Name;
                doc.Add(message);
                seq++;
            }

            foreach(var child in item.Children)
            {
                var childline = RecurseElements(child, current, inSetup, inTest, inTeardown);
                if(current != null && childline != current)
                {
                    var message = new Message(seq, childline, current, "", 1, _dte);
                    message.Pen = GetPenColor(inSetup, inTest, inTeardown);
                    message.GoToSpot = item.Name;
                    doc.Add(message);
                    seq++;
                }
            }
            return current;
        }
 private static int CountChildren(Chain test)
 {
     int count = 1;
     if (test.Children == null) return 1;
     foreach(var t in test.Children)
     {
         count += CountChildren(t);
     }
     return count;
 }
 private static Chain BuildChain(CallChain callChain, bool isSetup, bool isTest, bool isTeardown )
 {
     var chain = new Chain(callChain.Runtime, callChain.Name);
     chain.IsSetup = isSetup;
     chain.IsTest = isTest;
     chain.IsTeardown = isTeardown;
     chain.TimeStart = callChain.StartTime;
     chain.TimeEnd = callChain.EndTime;
     foreach(var child in callChain.Children)
     {
         chain.Children.Add(BuildChain(child, false, false, false));
     }
     return chain;
 }