public void Clear()
 {
     StandardOutputStringBuilder.Clear();
     ErrorOutputStringBuilder.Clear();
     CurrentContextStringBuilder.Clear();
     CurrentTestModule = string.Empty;
     CurrentTestSuite  = string.Empty;
     CurrentTestCase   = string.Empty;
     testSuiteStack.Clear();
     testSuiteStack.Push(string.Empty);
 }
        public void StandardOutputReceiver(object sendingProcess, System.Diagnostics.DataReceivedEventArgs outLine)
        {
            if (!string.IsNullOrEmpty(outLine.Data))
            {
                foreach (var line in outLine.Data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
                {
                    StandardOutputStringBuilder.AppendLine(outLine.Data);
                    CurrentContextStringBuilder.AppendLine(outLine.Data);

                    if (EnableParsing)
                    {
                        var testLineInfo = ParseStandardOutputLine(line);
                        if (testLineInfo != null)
                        {
                            switch (testLineInfo.TestType)
                            {
                            case "module":
                                switch (testLineInfo.TestExecInfoType)
                                {
                                case TestExecInfoType.Entering:
                                    CurrentTestModule     = testLineInfo.TestName;
                                    CurrentTestCaseFailed = false;
                                    CurrentContextStringBuilder.Clear();
                                    OnTestModuleEntered?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Entering, DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    break;

                                case TestExecInfoType.Leaving:
                                    CurrentTestSuite = string.Empty;
                                    CurrentTestCase  = string.Empty;
                                    OnTestModuleLeft?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Leaving, DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    CurrentContextStringBuilder.Clear();
                                    CurrentTestModule = string.Empty;
                                    break;

                                case TestExecInfoType.Skipping:
                                    CurrentTestCaseFailed = false;
                                    OnTestModuleSkipped?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Skipping, TestInfo = "Module disabled", DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    break;
                                }
                                break;

                            case "suite":
                                switch (testLineInfo.TestExecInfoType)
                                {
                                case TestExecInfoType.Entering:
                                    testSuiteStack.Push(testLineInfo.TestName);
                                    CurrentTestSuite = testLineInfo.TestName;
                                    CurrentContextStringBuilder.Clear();
                                    OnTestSuiteEntered?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Entering, DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    break;

                                case TestExecInfoType.Leaving:
                                    OnTestSuiteLeft?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Leaving, DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    if (testSuiteStack.Count > 0)
                                    {
                                        testSuiteStack.Pop();
                                        if (testSuiteStack.Count > 0)
                                        {
                                            CurrentTestSuite = testSuiteStack.Peek();
                                        }
                                        else
                                        {
                                            //uh, can't peek over root
                                            CurrentTestSuite = string.Empty;
                                        }
                                    }
                                    else
                                    {
                                        //uh, can't pop over root
                                        CurrentTestSuite = string.Empty;
                                    }
                                    CurrentTestCase       = string.Empty;
                                    CurrentTestCaseFailed = false;
                                    CurrentContextStringBuilder.Clear();
                                    break;

                                case TestExecInfoType.Skipping:
                                    OnTestSuiteSkipped?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = testLineInfo.TestName, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Skipping, TestInfo = "Suite disabled", DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    break;
                                }
                                break;

                            case "case":
                                switch (testLineInfo.TestExecInfoType)
                                {
                                case TestExecInfoType.Entering:
                                    //Hack TestCase and TestSuite for DataDriven testcases
                                    if (testLineInfo.DataDrivenTestCaseIndex >= 0)
                                    {
                                        CurrentTestCase = testSuiteStack.Peek();
                                        var testSuites = testSuiteStack.ToList();
                                        CurrentTestSuite = testSuites[testSuites.Count - 2];
                                    }
                                    else
                                    {
                                        CurrentContextStringBuilder.Clear();
                                        CurrentTestCaseFailed = false;
                                        CurrentTestCase       = testLineInfo.TestName;
                                    }
                                    OnTestCaseEntered?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = TestExecInfoType.Entering
                                    });
                                    break;

                                case TestExecInfoType.Leaving:
                                    //Hack TestCase and TestSuite for DataDriven testcases
                                    if (testLineInfo.DataDrivenTestCaseIndex >= 0)
                                    {
                                        CurrentTestCase = testSuiteStack.Peek();
                                        var testSuites = testSuiteStack.ToList();
                                        CurrentTestSuite = testSuites[testSuites.Count - 2];
                                    }
                                    else
                                    {
                                        CurrentTestCase = testLineInfo.TestName;
                                    }
                                    OnTestCaseLeft?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = CurrentTestCase, TestExecInfoType = CurrentTestCaseFailed ? TestExecInfoType.Error : TestExecInfoType.Leaving, TestInfo = CurrentContextStringBuilder.ToString(), DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    if (testLineInfo.DataDrivenTestCaseIndex < 0)
                                    {
                                        CurrentTestCase = string.Empty;
                                        CurrentContextStringBuilder.Clear();
                                        CurrentTestCaseFailed = false;
                                    }
                                    break;

                                case TestExecInfoType.Skipping:
                                    OnTestCaseSkipped?.Invoke(this, new TestModuleEventArgs()
                                    {
                                        TestModule = CurrentTestModule, TestSuite = CurrentTestSuite, TestCase = testLineInfo.TestName, TestExecInfoType = TestExecInfoType.Skipping, TestInfo = "Testcase was skipped", DataDrivenTestCaseIndex = testLineInfo.DataDrivenTestCaseIndex
                                    });
                                    break;

                                case TestExecInfoType.Error:
                                    CurrentTestCaseFailed = true;
                                    break;
                                }
                                break;

                            default:
                                //unknown testType
                                break;
                            }
                        }
                    }
                }
            }
        }