public override TestResult Run(EventListener listener, ITestFilter filter)
        {
            using (new TestContext())
            {
                TestSuiteResult suiteResult = new TestSuiteResult(new TestInfo(this), TestName.Name);

                listener.SuiteStarted(this.TestName);
                long startTime = DateTime.Now.Ticks;

                switch (this.RunState)
                {
                case RunState.Runnable:
                case RunState.Explicit:
                    suiteResult.RunState = RunState.Executed;
                    DoOneTimeSetUp(suiteResult);
                    if (suiteResult.IsFailure)
                    {
                        MarkTestsFailed(Tests, suiteResult, listener, filter);
                    }
                    else
                    {
                        try
                        {
                            RunAllTests(suiteResult, listener, filter);
                        }
                        finally
                        {
                            DoOneTimeTearDown(suiteResult);
                        }
                    }
                    break;

                case RunState.Skipped:
                    suiteResult.Skip(this.IgnoreReason);
                    MarkTestsNotRun(Tests, RunState.Skipped, IgnoreReason, suiteResult, listener, filter);
                    break;

                default:
                case RunState.Ignored:
                case RunState.NotRunnable:
                    suiteResult.Ignore(this.IgnoreReason);
                    MarkTestsNotRun(Tests, RunState.Ignored, IgnoreReason, suiteResult, listener, filter);
                    break;
                }

                long   stopTime = DateTime.Now.Ticks;
                double time     = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
                suiteResult.Time = time;

                listener.SuiteFinished(suiteResult);
                return(suiteResult);
            }
        }