private static void CreateTestReport(string testPlanFile, TestPlanInfo testPlan)
        {
            var path = "TestsData\\Results\\{0}-Result-{1}.xls";

            var fi = new FileInfo(testPlanFile);
            var reportName = fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length);
            TestingLogUtility.GenerateLogFile(String.Format(path, reportName, DateTime.Now.ToString("yyyyMMdd-hhmmss")), testPlan);
        }
        public static void GenerateLogFile(string logFile, TestPlanInfo planInfo)
        {
            HSSFWorkbook wb = new HSSFWorkbook();

            ISheet sheet = wb.CreateSheet("TestResults");
            sheet.SetColumnWidth(0, 15 * 256);
            sheet.SetColumnWidth(1, 40 * 256);
            sheet.SetColumnWidth(2, 30 * 256);
            sheet.SetColumnWidth(3, 15 * 256);
            sheet.SetColumnWidth(4, 50 * 256);

            //set common cell styles
            ICellStyle styleHeader = wb.CreateCellStyle();
            IFont fontBold = wb.CreateFont();
            fontBold.Boldweight = (short)FontBoldWeight.Bold;
            fontBold.Color = NPOI.HSSF.Util.HSSFColor.White.Index;
            styleHeader.SetFont(fontBold);
            styleHeader.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.SeaGreen.Index;
            styleHeader.FillPattern = FillPattern.SolidForeground;

            //pass
            ICellStyle stylePass = wb.CreateCellStyle();
            stylePass.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;
            stylePass.FillPattern = FillPattern.SolidForeground;

            //fail
            ICellStyle styleFail = wb.CreateCellStyle();
            styleFail.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
            styleFail.FillPattern = FillPattern.SolidForeground;

            //not executed
            ICellStyle styleNotExecuted = wb.CreateCellStyle();
            styleNotExecuted.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
            styleNotExecuted.FillPattern = FillPattern.SolidForeground;

            //title font
            IFont fontTitle = wb.CreateFont();
            fontTitle.Boldweight = (short)FontBoldWeight.Bold;
            fontTitle.FontHeightInPoints = 20;
            ICellStyle styleTitle = wb.CreateCellStyle();
            styleTitle.SetFont(fontTitle);

            //sub-title font
            IFont fontSubTitle = wb.CreateFont();
            fontSubTitle.Boldweight = (short)FontBoldWeight.Bold;
            fontSubTitle.FontHeightInPoints = 15;
            ICellStyle styleSubTitle = wb.CreateCellStyle();
            styleSubTitle.SetFont(fontSubTitle);

            int rowNumber = 0;

            //Add info regarding the Test Plan
            ICell cell;
            IRow row = sheet.CreateRow(rowNumber);
            cell = row.CreateCell(0);
            cell.SetCellValue(String.Format("Test Plan '{0}' - {1}", planInfo.Name, planInfo.Result? "Pass": "******"));
            cell.CellStyle = styleTitle;
            sheet.AddMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 4));

            foreach (var testCase in planInfo.TestCases)
            {
                rowNumber += 3;

                //Add info regarding the Test Case
                row = sheet.CreateRow(rowNumber);
                cell = row.CreateCell(0);
                cell.SetCellValue(String.Format("Test Case '{0}' - {1}", testCase.Name, testCase.Result? "Pass": "******"));
                cell.CellStyle = styleSubTitle;
                sheet.AddMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 4));

                //Add Header for Test Case Steps
                rowNumber++;
                row = sheet.CreateRow(rowNumber);

                cell = row.CreateCell(0);
                cell.SetCellValue("Step Number");
                cell.CellStyle = styleHeader;

                cell = row.CreateCell(1);
                cell.SetCellValue("Description");
                cell.CellStyle = styleHeader;

                cell = row.CreateCell(2);
                cell.SetCellValue("Keyword");
                cell.CellStyle = styleHeader;

                cell = row.CreateCell(3);
                cell.SetCellValue("Result");
                cell.CellStyle = styleHeader;

                cell = row.CreateCell(4);
                cell.SetCellValue("Error");
                cell.CellStyle = styleHeader;

                int stepNumber = 1;
                foreach (var step in testCase.Steps)
                {
                    //Add info regarding Test Case Step
                    rowNumber++;
                    row = sheet.CreateRow(rowNumber);
                    cell = row.CreateCell(0);
                    cell.SetCellValue(stepNumber.ToString());
                    //cell.CellStyle = step.Result >= 0 ? (step.Result > 0 ? stylePass : styleNotExecuted) : styleFail;

                    cell = row.CreateCell(1);
                    cell.SetCellValue(step.StepDescription);
                    //cell.CellStyle = step.Result >= 0 ? (step.Result > 0 ? stylePass : styleNotExecuted) : styleFail;

                    cell=row.CreateCell(2);
                    cell.SetCellValue(step.KeywordName);
                    //cell.CellStyle = step.Result >= 0 ? (step.Result > 0 ? stylePass : styleNotExecuted) : styleFail;

                    cell = row.CreateCell(3);
                    cell.SetCellValue(step.Result >= 0 ? (step.Result > 0 ? "Pass" : "Not Executed") : "Failed");
                    cell.CellStyle = step.Result >= 0 ? (step.Result > 0 ? stylePass : styleNotExecuted) : styleFail;

                    cell= row.CreateCell(4);
                    cell.SetCellValue(step.ErrorMessage);
                    //cell.CellStyle = step.Result >= 0 ? (step.Result > 0 ? stylePass : styleNotExecuted) : styleFail;

                    stepNumber++;
                }
            }

            using (var fileData = new FileStream(logFile, FileMode.Create, FileAccess.Write))
            {
                wb.Write(fileData);
            }
        }
        public static TestPlanInfo ReadTestPlan(string testPlanFile)
        {
            XSSFWorkbook xssfwb;
            using (FileStream file = new FileStream(testPlanFile, FileMode.Open, FileAccess.Read))
            {
                xssfwb = new XSSFWorkbook(file);
            }

            ISheet sheet = xssfwb.GetSheetAt(0); //get the first sheet

            var testPlan = new TestPlanInfo();
            var testCases = new List<TestCaseInfo>();

            //read the plan name
            var planName = sheet.GetRow(0).GetCell(1).ToString();
            testPlan.Name = planName;

            int row = 1;
            while (row <= sheet.LastRowNum)
            {
                if (sheet.GetRow(row) != null) //null is when the row only contains empty cells
                {
                    var firstCellValue = sheet.GetRow(row).GetCell(0) != null ? sheet.GetRow(row).GetCell(0).ToString() : "";

                    //test if it's a new test case
                    if (firstCellValue == "Test Case Name")
                    {
                        row++;
                        string testCaseName = sheet.GetRow(row).GetCell(0).StringCellValue;
                        string testCaseType = sheet.GetRow(row).GetCell(1) != null ? sheet.GetRow(row).GetCell(1).ToString() : "";
                        row++;
                        //get max cell number (based on the second row and the number of defined parameters
                        var maxCell = sheet.GetRow(row).LastCellNum;
                        row++; //skip the test case header row and the "Test Case Name" row

                        var steps = new List<TestCaseStepInfo>();
                        while (sheet.GetRow(row) != null)
                        {
                            if (sheet.GetRow(row).GetCell(1) != null && sheet.GetRow(row).GetCell(1).ToString() != String.Empty)
                            {
                                var descr = sheet.GetRow(row).GetCell(0) != null? sheet.GetRow(row).GetCell(0).ToString(): "";
                                var keywordName = sheet.GetRow(row).GetCell(1).ToString();
                                var keywordType = sheet.GetRow(row).GetCell(2) != null? sheet.GetRow(row).GetCell(2).ToString(): "";
                                var passCondition = sheet.GetRow(row).GetCell(3).ToString();
                                var failCondition = sheet.GetRow(row).GetCell(4).ToString();

                                var parameters = new List<string>();
                                for (int index = 5; index < maxCell; index++)
                                {
                                    var value = sheet.GetRow(row).GetCell(index) != null? sheet.GetRow(row).GetCell(index).ToString(): "";
                                    parameters.Add(value);
                                }

                                var step = new TestCaseStepInfo()
                                {
                                    StepDescription = descr,
                                    KeywordName = keywordName,
                                    KeywordType = keywordType,
                                    PassCondition = passCondition,
                                    FailCondition = failCondition,
                                    Parameters = parameters
                                };

                                steps.Add(step);
                            }

                            row++;
                        }

                        var testCase = new TestCaseInfo() { Name = testCaseName, Type = testCaseType, Steps = steps };
                        testCases.Add(testCase);
                    }
                }

                row++;
            }

            testPlan.TestCases = testCases;

            return testPlan;
        }