/// <summary>
        /// Perform top-level analysis and produce standard reports
        /// </summary>
        public void DoReport()
        {
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }

            string title = string.Format("{0} Test Results", Path.GetFileNameWithoutExtension(testResultPath));

            indexPage = new HtmlPage(Path.Combine(outputDirectory, "index.html"));
            indexPage.Begin(title);

            try
            {
                resultLoader.Load(testResultPath);
            }
            catch (ApplicationException ex)
            {
                indexPage.WriteLine(ex.Message);
                throw;
            }
            catch (Exception ex)
            {
                indexPage.WriteLine(ex.ToString());
                throw;
            }

            InitializeProjectIndex();

            testCount    = 0;
            notRunCount  = 0;
            failureCount = 0;


            foreach (TestResult suiteResult in resultLoader.ProjectResults)
            {
                string projectName = Path.GetFileNameWithoutExtension(suiteResult.Name);
                Console.WriteLine("Analyzing {0}", projectName);

                TestResultAnalyzer analyzer = new TestResultAnalyzer(projectName);
                analyzer.FindFixtures(suiteResult);
                analyzer.Analyze();

                testCount    += analyzer.TestCount;
                notRunCount  += analyzer.NotRunCount;
                failureCount += analyzer.FailureCount;

                WriteIndexEntry(analyzer);
                WriteDetailPage(analyzer);
            }

            TerminateProjectIndex();

            indexPage.End();

            Console.WriteLine("Analysis Complete");
            Console.WriteLine("Report created in directory {0}", Path.GetFullPath(outputDirectory));
        }
        /// <summary>
        /// Perform top-level analysis and produce standard reports
        /// </summary>
        public void DoReport()
        {
            if( !Directory.Exists( outputDirectory ) )
                Directory.CreateDirectory( outputDirectory );

            string title = string.Format( "{0} Test Results", Path.GetFileNameWithoutExtension( testResultPath ) );
            indexPage = new HtmlPage( Path.Combine( outputDirectory, "index.html" ) );
            indexPage.Begin( title );

            try
            {
                resultLoader.Load( testResultPath );
            }
            catch ( ApplicationException ex )
            {
                indexPage.WriteLine( ex.Message );
                throw;
            }
            catch ( Exception ex )
            {
                indexPage.WriteLine( ex.ToString() );
                throw;
            }

            InitializeProjectIndex();

            testCount = 0;
            notRunCount = 0;
            failureCount = 0;

            foreach( TestResult suiteResult in resultLoader.ProjectResults )
            {
                string projectName = Path.GetFileNameWithoutExtension( suiteResult.Name );
                Console.WriteLine( "Analyzing {0}", projectName );

                TestResultAnalyzer analyzer = new TestResultAnalyzer( projectName );
                analyzer.FindFixtures( suiteResult );
                analyzer.Analyze();

                testCount += analyzer.TestCount;
                notRunCount += analyzer.NotRunCount;
                failureCount += analyzer.FailureCount;

                WriteIndexEntry( analyzer );
                WriteDetailPage( analyzer );
            }

            TerminateProjectIndex();

            indexPage.End();

            Console.WriteLine( "Analysis Complete" );
            Console.WriteLine( "Report created in directory {0}", Path.GetFullPath( outputDirectory ) );
        }
        private void WriteDetailTable(HtmlPage page, TestResultAnalyzer analyzer)
        {
            StringBuilder sbFailures = new StringBuilder();
            StringBuilder sbNotRun   = new StringBuilder();

            page.Begin(analyzer.Name);
            page.BeginTable("class=center");

            page.BeginRow("hdr-row");
            page.WriteHeaderCell("Class", "name");
            page.WriteHeaderCell("Tests");
            page.WriteHeaderCell("Not&nbsp;Run");
            page.WriteHeaderCell("Failures");
            page.EndRow();

            foreach (TestResultAnalyzer classAnalyzer in analyzer.Children)
            {
                if (classAnalyzer.FailureCount > 0)
                {
                    page.BeginRow("failure-row");
                }
                else
                if (classAnalyzer.NotRunCount > 0)
                {
                    page.BeginRow("notrun-row");
                }
                else
                {
                    page.BeginRow();
                }

                page.WriteCell(classAnalyzer.Name, "name");
                page.WriteCell(classAnalyzer.TestCount);
                page.WriteCell(classAnalyzer.NotRunCount);
                page.WriteCell(classAnalyzer.FailureCount);
                page.EndRow();
            }

            page.BeginRow("total-row");
            page.WriteCell("Total", "name");
            page.WriteCell(analyzer.TestCount);
            page.WriteCell(analyzer.NotRunCount);
            page.WriteCell(analyzer.FailureCount);
            page.EndRow();
            page.EndTable();
        }
        private void WriteDetailTable( HtmlPage page, TestResultAnalyzer analyzer )
        {
            StringBuilder sbFailures = new StringBuilder();
            StringBuilder sbNotRun = new StringBuilder();

            page.Begin( analyzer.Name );
            page.BeginTable( "class=center" );

            page.BeginRow( "hdr-row" );
            page.WriteHeaderCell( "Class", "name" );
            page.WriteHeaderCell( "Tests" );
            page.WriteHeaderCell( "Not&nbsp;Run" );
            page.WriteHeaderCell( "Failures" );
            page.EndRow();

            foreach( TestResultAnalyzer classAnalyzer in analyzer.Children )
            {
                if ( classAnalyzer.FailureCount > 0 )
                    page.BeginRow( "failure-row" );
                else
                if ( classAnalyzer.NotRunCount > 0 )
                    page.BeginRow( "notrun-row" );
                else
                    page.BeginRow();

                page.WriteCell( classAnalyzer.Name, "name" );
                page.WriteCell( classAnalyzer.TestCount );
                page.WriteCell( classAnalyzer.NotRunCount );
                page.WriteCell( classAnalyzer.FailureCount );
                page.EndRow();
            }

            page.BeginRow( "total-row" );
            page.WriteCell( "Total", "name" );
            page.WriteCell( analyzer.TestCount );
            page.WriteCell( analyzer.NotRunCount );
            page.WriteCell( analyzer.FailureCount );
            page.EndRow();
            page.EndTable();
        }