//#region Write to Object

        public override void OnWriteObjectHeader(IndentedTextWriter writer, IALObject Target)
        {
            base.OnWriteObjectHeader(writer, Target);
            TestALCodeunit testALCodeunit = (TestALCodeunit)Target;
            ALMethod       aLMethod       = new ALMethod {
                MethodKind = ALMethodKind.Trigger, Name = "OnRun"
            };

            List <string> contentLines = new List <string>();

            foreach (ITestFeature feature in testALCodeunit.Features)
            {
                contentLines.Add(string.Format("[Feature] {0}", feature.Name));
            }
            aLMethod.Content = String.Join("\r\n        ", contentLines);

            writer.Write(OnWriteObjectMethod(Target, aLMethod));
        }
        public override void OnRead(IEnumerable <string> Lines, IALObject Target, out IALObject NewTarget)
        {
            base.OnRead(Lines, Target, out NewTarget);
            var str = JsonConvert.SerializeObject(Target);

            var TestTarget = new TestALCodeunit
            {
                Id      = Target.Id,
                Name    = Target.Name,
                Methods = Target.Methods.Select(s => new TestALMethod
                {
                    Attributes           = s.Attributes,
                    Comments             = s.Comments,
                    Content              = s.Content,
                    IsLocal              = s.IsLocal,
                    MethodBody           = s.MethodBody,
                    MethodKind           = s.MethodKind,
                    Name                 = s.Name,
                    Parameters           = s.Parameters,
                    ReturnTypeDefinition = s.ReturnTypeDefinition,
                    TestMethod           = s.TestMethod,
                    MethodRange          = s.MethodRange
                }).ToList(),
                GlobalVariables = Target.GlobalVariables,
                Properties      = Target.Properties,
                Type            = Target.Type,
                Comments        = Target.Comments,
                Sections        = Target.Sections
            };

            if (TestTarget.Methods == null)
            {
                return;
            }

            if (TestTarget.Methods.Count == 0)
            {
                return;
            }

            var testMethods     = TestTarget.Methods.Where(w => w.TestMethod == true).ToList();
            var enumNames       = Enum.GetNames(typeof(ScenarioElementType));
            var enumNamesJoined = String.Join('|', enumNames);
            var pattern         = @".*\[(" + enumNamesJoined + @")(.*?)\]\s+(.*)";
            var features        = new List <ITestFeature>();

            foreach (var method in testMethods)
            {
                var matches = Regex.Matches(method.Content, pattern, RegexOptions.IgnoreCase);
                if (matches.Count > 0)
                {
                    var matchList     = matches.ToList();
                    var scenarioElems = matchList
                                        .Select(m => new
                    {
                        Type     = m.Groups[1].Value.ToEnum <ScenarioElementType>(),
                        Id       = m.Groups[2].Value.Trim().Replace("#", ""),
                        Name     = m.Groups[3].Value.Trim(),
                        LineText = m.Groups[0].Value.Trim()
                    });

                    ITestFeature feature  = new TestFeature();
                    var          scenario = new TestScenario();

                    foreach (var elem in scenarioElems)
                    {
                        switch (elem.Type)
                        {
                        case ScenarioElementType.FEATURE:
                            feature = features.FirstOrDefault(a => a.Name == elem.Name);
                            if (feature == null)
                            {
                                feature = new TestFeature
                                {
                                    Name      = elem.Name,
                                    Scenarios = new List <ITestScenario>()
                                };
                                features.Add(feature);
                            }
                            break;

                        case ScenarioElementType.SCENARIO:
                            scenario            = new TestScenario();
                            scenario.ID         = int.Parse(elem.Id);
                            scenario.Name       = elem.Name;
                            scenario.MethodName = method.Name;
                            scenario.Feature    = feature;
                            feature.Scenarios.Add(scenario);
                            break;

                        case ScenarioElementType.GIVEN:
                            var given = new TestScenarioElement();
                            given.Type     = elem.Type;
                            given.Value    = elem.Name;
                            given.LineText = elem.LineText;
                            scenario.Elements.Add(given);
                            break;

                        case ScenarioElementType.WHEN:
                            var when = new TestScenarioElement();
                            when.Type     = elem.Type;
                            when.Value    = elem.Name;
                            when.LineText = elem.LineText;
                            scenario.Elements.Add(when);
                            break;

                        case ScenarioElementType.THEN:
                            var then = new TestScenarioElement();
                            then.Type     = elem.Type;
                            then.Value    = elem.Name;
                            then.LineText = elem.LineText;
                            scenario.Elements.Add(then);
                            break;

                        default:
                            break;
                        }
                    }

                    method.Scenario = scenario;
                }
            }

            TestTarget.Features = features;
            NewTarget           = TestTarget;
        }