public void StartTest(XmlReader xmldoc, string testToRun, ref gbXMLReport gbr, string username = "******") { log4net.Config.XmlConfigurator.Configure(); TestToRun = testToRun; globalMatchObject = new gbXMLMatches(); globalMatchObject.Init(); //first create a list of lists that is indexed identically to the drop down list the user selects TestDetail = new DOEgbXMLTestDetail(); //then populate the list of lists. All indexing is done "by hand" in InitializeTestResultStrings() TestDetail.InitializeTestResultStrings(); //create report list reportlist will store all the test result ReportList = new List<DOEgbXMLReportingObj>(); //Load an XML File for the test at hand gbXMLTestFile = new XmlDocument(); gbXMLTestFile.Load(xmldoc); gbXMLStandardFile = new XmlDocument(); gbXMLStandardFile.Load(filepaths[TestToRun]); if (!TestFileIsAvailable()) { //TODO: update browser json with something to indicate there is a problem return; } //Define the namespace XmlNamespaceManager gbXMLns1 = new XmlNamespaceManager(gbXMLTestFile.NameTable); gbXMLns1.AddNamespace("gbXMLv5", "http://www.gbxml.org/schema"); XmlNamespaceManager gbXMLns2 = new XmlNamespaceManager(gbXMLStandardFile.NameTable); gbXMLns2.AddNamespace("gbXMLv5", "http://www.gbxml.org/schema"); List<XmlDocument> gbXMLdocs = new List<XmlDocument>(); gbXMLdocs.Add(gbXMLTestFile); gbXMLdocs.Add(gbXMLStandardFile); List<XmlNamespaceManager> gbXMLnsm = new List<XmlNamespaceManager>(); gbXMLnsm.Add(gbXMLns1); gbXMLnsm.Add(gbXMLns2); //standardizing all tests on US-IP Conversions c = new Conversions(); Conversions.volumeUnitEnum testVol = Conversions.volumeUnitEnum.CubicFeet; Conversions.volumeUnitEnum validatorVol = Conversions.volumeUnitEnum.CubicFeet; Conversions.areaUnitEnum testArea = Conversions.areaUnitEnum.SquareFeet; Conversions.areaUnitEnum validatorArea = Conversions.areaUnitEnum.SquareFeet; Conversions.lengthUnitEnum testLength = Conversions.lengthUnitEnum.Feet; Conversions.lengthUnitEnum validatorLength = Conversions.lengthUnitEnum.Feet; Conversions.lengthUnitEnum standardLength = Conversions.lengthUnitEnum.Feet; Conversions.areaUnitEnum standardArea = Conversions.areaUnitEnum.SquareFeet; Conversions.volumeUnitEnum standardVol = Conversions.volumeUnitEnum.CubicFeet; //standardize all units to feet, square feet, and cubic feet double testlengthConversion = 1; double testareaConversion = 1; double testvolumeConversion = 1; double standardlengthConversion = 1; double standardareaConversion = 1; double standardvolConversion = 1; bool mustBePlanar = false; for(int ns=0; ns< gbXMLnsm.Count; ns++) { if (ns == 0) { XmlNodeList nodes = gbXMLdocs[ns].SelectNodes("/gbXMLv5:gbXML", gbXMLnsm[ns]); StandardizeToUSIP(nodes, c, ref testlengthConversion, ref testareaConversion, ref testvolumeConversion, ref testLength, ref testArea, ref testVol); } else { XmlNodeList nodes = gbXMLdocs[ns].SelectNodes("/gbXMLv5:gbXML", gbXMLnsm[ns]); StandardizeToUSIP(nodes, c, ref standardlengthConversion, ref standardareaConversion, ref standardvolConversion, ref standardLength, ref standardArea, ref standardVol); } } //TODO: Add a summary of the Unit of Measures stuff above to the final result //Create a Log file that logs the success or failure of each test. //Eventually maybe I want to create a little HTML factory output = ""; log = ""; table += "<div class='container'>" + "<h3>" + "Test Sections" + "</h3>"; table += "<table class='table table-bordered'>"; table += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Standard Result" + "</td>" + "<td>" + "Test File Result" + "</td>" + "<td>" + "Tolerances" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; string units; DOEgbXMLReportingObj report = new DOEgbXMLReportingObj(); CampusReport camprep = new CampusReport(); //this string I can manipulate to produce the final test output string menujson = JsonConvert.SerializeXmlNode(gbXMLStandardFile); //prepare json for view menujson = MakeViewJson(menujson); gbr.menu = menujson; gbr.CampusReport = camprep; report.standResult = new List<string>(); report.testResult = new List<string>(); report.idList = new List<string>(); report.MessageList = new List<string>(); report.TestPassedDict = new Dictionary<string, bool>(); //Set up the Global Pass/Fail criteria for the test case file TestCriteria = new DOEgbXMLTestCriteriaObject(); TestCriteria.InitializeTestCriteriaWithTestName(testToRun); //needed specially for area and volume tests DOEgbXMLTestDetail afile = TestDetail.TestDetailList.Find(x => x.testName == TestToRun); BuildingSummary bs = new BuildingSummary(); bs.FileType = "Standard"; camprep.BuildingSummary.Add(bs); BuildingSummary bst = new BuildingSummary(); bst.FileType = "Test"; camprep.BuildingSummary.Add(bst); //Test 2 execute //report.tolerance = DOEgbXMLBasics.Tolerances.AreaTolerance; //report.testType = TestType.Building_Area; //units = DOEgbXMLBasics.MeasurementUnits.sqft.ToString(); //report = GetBuildingArea(gbXMLdocs, gbXMLnsm, report, validatorArea, testArea, testareaConversion, standardareaConversion); logger.Info("START: BUILDING AREA TEST"); var baresult = GetBuildingArea(gbXMLdocs, gbXMLnsm, ref camprep, validatorArea, testArea, testareaConversion, standardareaConversion, DOEgbXMLBasics.Tolerances.AreaPercentageTolerance, afile ); if(!baresult) { camprep.BuildingSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; } logger.Info("END: BUILDING AREA TEST"); //GetBuildingArea(gbXMLdocs,gbXMLnsm,) //AddToOutPut("Building Area Test Passed: ", report, true); //Test 3 execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.SpaceCountTolerance; //report.testType = TestType.Space_Count; //units = DOEgbXMLBasics.MeasurementUnits.spaces.ToString(); //report = GetBuildingSpaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: BUILDING SPACE COUNT TEST"); SpacesSummary ssm = new SpacesSummary(); ssm.FileType = "Standard"; camprep.SpacesSummary.Add(ssm); SpacesSummary ssmt = new SpacesSummary(); ssmt.FileType = "Test"; camprep.SpacesSummary.Add(ssmt); var spctResult = GetBuildingSpaceCount(gbXMLdocs, gbXMLnsm, "", DOEgbXMLBasics.Tolerances.SpaceCountTolerance, ref camprep); if(!spctResult) { camprep.BuildingSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; camprep.SpacesSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; } logger.Info("END: BUILDING SPACE COUNT TEST"); //AddToOutPut("Building Space Quantity Count Test Passed: ", report, true); // Building Stories Tests.... ////Test 4 execute //report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.LevelCountTolerance; //report.testType = TestType.Building_Story_Count; //units = DOEgbXMLBasics.MeasurementUnits.levels.ToString(); //report = GetBuildingStoryCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: Building Storey Count Test"); var blstctresult = GetBuildingStoryCount(gbXMLdocs, gbXMLnsm, ref camprep, DOEgbXMLBasics.Tolerances.LevelCountTolerance); if(!blstctresult) { camprep.BuildingSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //TODO: Need a Building Story Summary Field } logger.Info("END: Building Storey Count Test"); //AddToOutPut("Building Story Count Test Passed: ", report, true); //Test 5 execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.LevelHeightTolerance; //report.testType = TestType.Building_Story_Z_Height; //units = DOEgbXMLBasics.MeasurementUnits.ft.ToString(); report = GetStoryHeights(gbXMLdocs, gbXMLnsm, report, validatorLength, testLength, testlengthConversion, standardlengthConversion); logger.Info("START: Building Storey Height Test"); var storyHeightsres = GetStoryHeights(gbXMLdocs, gbXMLnsm, ref camprep, validatorLength, testLength, testlengthConversion, standardlengthConversion, DOEgbXMLBasics.Tolerances.LevelHeightTolerance); if (!storyHeightsres) { camprep.BuildingSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //TODO: Need a Building Story Summary Field } logger.Info("END: Building Storey Height Test"); //AddToOutPut("Building Story Z-Height Test: ", report, true); //Test 6 execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.VectorAngleTolerance; //report.testType = TestType.Building_Story_PolyLoop_RHR; //units = "degrees"; //report = TestBuildingStoryRHR(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: Building Story Right Hand Rule Test."); var blstRHResult = TestBuildingStoryRHR(gbXMLdocs, gbXMLnsm, ref camprep); if(!blstRHResult) { //this method has no bearing on the overall pass or fail tests. //camprep.BuildingSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //TODO: Need a Building Story Summary Field } logger.Info("END: Building Story Right Hand Rule Test."); //AddToOutPut("Building Story PolyLoop Right Hand Rule Test Result:", report, true); //String spShellGeometrySurfaceNum = TestShellGeomSurfaceNum(gbXMLTestFile, gbXMLns); //Space Tests ............................................................. //Test 7 execute //only needs to test the test file //report.Clear(); //report.testType = TestType.SpaceId_Match_Test; logger.Info("START: UNIQUE SPACE ID TEST"); var spaceIDresults = UniqueSpaceIdTest(gbXMLdocs, gbXMLnsm, ref camprep); if(!spaceIDresults) { camprep.SpacesSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; } logger.Info("END: UNIQUE SPACE ID TEST"); //AddToOutPut("SpaceId Match Test: ", report, true); //Test 8 execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.SpaceAreaTolerance; //report.testType = TestType.Space_Area; //units = DOEgbXMLBasics.MeasurementUnits.sqft.ToString(); logger.Info("START: SPACE AREAS TEST"); //report = TestSpaceAreas(gbXMLdocs, gbXMLnsm, report, validatorArea, testArea, testareaConversion,standardareaConversion,afile); var result = TestSpaceAreas(gbXMLdocs, gbXMLnsm, ref camprep, validatorArea, testArea, testareaConversion, standardareaConversion, afile, DOEgbXMLBasics.Tolerances.SpaceAreaTolerance); if(!result) { camprep.SpacesSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //gbxml detailed compliance results? } logger.Info("END: SPACE AREAS TEST"); //AddToOutPut("Space Areas Test: ", report, true); //Test 9 execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.VolumeTolerance; //report.testType = TestType.Space_Volume; //units = DOEgbXMLBasics.MeasurementUnits.cubicft.ToString(); logger.Info("START: SPACE VOLUMES TEST"); //report = TestSpaceVolumes(gbXMLdocs, gbXMLnsm, report, validatorVol, testVol, testvolumeConversion,standardvolConversion,afile); var volresult = TestSpaceVolumes(gbXMLdocs, gbXMLnsm, ref camprep, validatorVol, testVol, testvolumeConversion, standardvolConversion, afile, DOEgbXMLBasics.Tolerances.VolumePercentageTolerance); logger.Info("END: SPACE VOLUMES TEST"); if (!volresult) { camprep.SpacesSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //gbxml detailed compliance results? } //AddToOutPut("Space Volumes Test: ", report, true); //Test 10 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.VectorAngleTolerance; //report.testType = TestType.Shell_Geom_RHR; //units = "degrees"; //report = TestShellGeomPLRHR(gbXMLdocs, gbXMLnsm, report, units); //AddToOutPut("Shell Geometry RHR Test: ",report); //Surface Element tests //deprecating all counts tests as criteria for passing and failing. Use this now only to indicate counts in the surfaces summary ////Test 11 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.SurfaceCountTolerance; //report.testType = TestType.Total_Surface_Count; //units = ""; //report = GetSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); //AddToOutPut("Surface Count Test Result: ", report, true); ////Surface Element tests ////Test 12 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.ExteriorWallCountTolerance; //report.testType = TestType.Exterior_Wall_Surface_Count; //units = ""; SurfaceSummary ss = new SurfaceSummary(); ss.FileType = "Standard"; camprep.SurfacesSummary.Add(ss); SurfaceSummary sst = new SurfaceSummary(); sst.FileType = "Test"; camprep.SurfacesSummary.Add(sst); //initialization of summaries complete logger.Info("START: EXTERIOR WALL COUNT"); //report = GetEWSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); var ewctresult = GetEWSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); logger.Info("END: EXTERIOR WALL COUNT"); if (!ewctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } //AddToOutPut("Exterior Wall Surface Count Test Result: ", report, true); //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.SurfaceCountTolerance; //report.testType = TestType.Underground_Surface_Count; //units = ""; //report = GetUGSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: UNDERGROUND WALL COUNT"); var ugwctresult = GetUGSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!ugwctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: UNDERGROUND WALL COUNT"); //AddToOutPut("Underground Wall Count Test Result: ", report, true); logger.Info("START: SLABONGRADE COUNT"); var sogctresult = GetSOGSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!sogctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: SLABONGRADE WALL COUNT"); ////Surface Element tests ////Test 13 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; //report.testType = TestType.Interior_Wall_Surface_Count; //units = ""; logger.Info("START: INTERIOR WALL COUNT"); //report = GetIWSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); var iwctresult = GetIWSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!iwctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: INTERIOR WALL COUNT"); //AddToOutPut("Interior Wall Surface Count Test Result: ", report, true); ////Surface Element tests ////Test 13 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.InteriorFloorCountTolerance; //report.testType = TestType.Interior_Floor_Surface_Count; //units = ""; //report = GetIFSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: INTERIOR FLOOR/CEILING COUNT"); var ifctresult = GetIFSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!ifctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: INTERIOR FLOOR/CEILING COUNT"); //AddToOutPut("Interior Floor Surface Count Test Result: ", report, true); ////Surface Element tests ////Test 14 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; //report.testType = TestType.Roof_Surface_Count; //units = ""; //report = GetRoofSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: ROOF COUNT"); var irctresult = GetRoofSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!irctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: ROOF COUNT"); //AddToOutPut("Roof Surface Count Test Result: ", report, true); ////Surface Element tests ////Test 15 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; //report.testType = TestType.Shading_Surface_Count; //units = ""; //report = GetShadeSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: SHADING DEVICE COUNT"); var shadectresult = GetShadeSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!shadectresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } //AddToOutPut("Shading Surface Count Test Result: ", report, true); logger.Info("END: SHADING DEVICE COUNT"); ////Test 16 Execute //report.Clear(); //report.tolerance = DOEgbXMLBasics.Tolerances.AirWallCountTolerance; //report.testType = TestType.Air_Surface_Count; //units = ""; //report = GetAirSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); logger.Info("START: AIR SURFACE COUNT"); var asctresult = GetAirSurfaceCount(gbXMLdocs, gbXMLnsm, ref camprep); if (!asctresult) { //do nothing, it has no consequence for now //gbxml detailed compliance results? } logger.Info("END: AIR SURFACE COUNT"); //AddToOutPut("Air Surface Count Test Result: ", report, true); #region surface detailed test //Jan 31-2012: We may not want to perform these if the surface counts fail, but for now, we will include these tests //Detailed Surface Checks //Store Surface Element Information List<SurfaceDefinitions> TestSurfaces = new List<SurfaceDefinitions>(); XmlDocument TestFile = gbXMLdocs[0]; XmlNamespaceManager TestNSM = gbXMLnsm[0]; List<SurfaceDefinitions> StandardSurfaces = new List<SurfaceDefinitions>(); XmlDocument StandardFile = gbXMLdocs[1]; XmlNamespaceManager StandardNSM = gbXMLnsm[1]; TestSurfaces = GetFileSurfaceDefs(TestFile, TestNSM); StandardSurfaces = GetFileSurfaceDefs(StandardFile, StandardNSM); string TestSurfaceTable = " <div class='container'><table class='table table-bordered'>"; TestSurfaceTable += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Stand Surface ID" + "</td>" + "<td>" + "Test Surface ID" + "</td>" + "<td>" + "Stand Surface Tilt" + "</td>" + "<td>" + "Test Surface Tilt" + "</td>" + "<td>" + "Stand Surface Azimuth" + "</td>" + "<td>" + "Test Surface Azimuth" + "</td>" + "<td>" + "Stand Surface Height" + "</td>" + "<td>" + "Test Surface Height" + "</td>" + "<td>" + "Stand Surface Width" + "</td>" + "<td>" + "Test Surface Width" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; //Test Surfaces Planar Test //all polyloops must be such that the surface defined by the coordinates is planar //report.Clear(); //report.testType = TestType.Surface_Planar_Test; logger.Info("START: SURFACE PLANARITY TEST"); //report = TestSurfacePlanarTest(TestSurfaces, report); var planarityResult = TestSurfacePlanarTest(TestSurfaces,ref camprep); if (!planarityResult) { camprep.SurfacesSummary.Find(x => x.FileType == "Standard").PassedAllTests = false; //gbxml detailed compliance results? } logger.Info("END: SURFACE PLANARITY TEST"); //if (!report.passOrFail && mustBePlanar) //{ // AddToOutPut("Test File Planar Surface Check: ", report, true); // report.Clear(); //} //only run detailed surface checks if the surfaces are planar if(planarityResult) { //<For each surface in the Standard File, try to find a match for this surface in the test file> //Written Jan 31, 2013 by Chien Si Harriman, Senior Product Manager, Carmel Software Corporation //Execute Tests // globalMatchObject.MatchedSurfaceIds = new Dictionary<string, List<string>>(); int i = 1; foreach (SurfaceDefinitions surface in StandardSurfaces) { report.Clear(); DetailedSurfaceSummary ssSummary = new DetailedSurfaceSummary(); //multiple tolerances used report.testType = TestType.Detailed_Surface_Checks; report.subTestIndex = i; if (surface.SurfaceId == "su-zone_5_Srf_7" || surface.SurfaceId == "su-zone_0_Srf_0") { var d = 1; } logger.Info("START: DETAILED SURFACE TEST"); GetSurfaceMatches(surface, TestSurfaces, ref ssSummary, validatorLength, testLength, testlengthConversion, standardlengthConversion, validatorArea, testArea, testareaConversion, standardareaConversion); logger.Info("END: DETAILED SURFACE TEST"); camprep.SurfacesReport.Add(ssSummary); } #endregion #region opending detailed test //openings detailed tests List<OpeningDefinitions> TestOpenings = new List<OpeningDefinitions>(); XmlDocument testFile = gbXMLdocs[0]; XmlNamespaceManager testNSM = gbXMLnsm[0]; List<OpeningDefinitions> StandardOpenings = new List<OpeningDefinitions>(); XmlDocument standardFile = gbXMLdocs[1]; XmlNamespaceManager standardNSM = gbXMLnsm[1]; TestOpenings = GetFileOpeningDefs(TestFile, TestNSM); StandardOpenings = GetFileOpeningDefs(StandardFile, StandardNSM); string TestOpeningTable = ""; report.Clear(); report.testType = TestType.Opening_Planar_Test; report = TestOpeningPlanarTest(TestOpenings, report); if (!report.passOrFail) { AddToOutPut("Test File Planar Opening Check: ", report, true); report.Clear(); } //only run detailed opening checks if the opening are planar else { TestOpeningTable = "<div class='container'><table class='table table-bordered'>"; TestOpeningTable += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Standard Opening Id" + "</td>" + "<td>" + "Test Opening Id" + "</td>" + "<td>" + "Standard Parent Surface Id" + "</td>" + "<td>" + "Test Parent Surface Id" + "</td>" + "<td>" + "Standard Parent Azimuth" + "</td>" + "<td>" + "Test Parent Azimuth" + "</td>" + "<td>" + "Standard Parent Tilt" + "</td>" + "<td>" + "Test Parent Tilt" + "</td>" + "<td>" + "Standard Surface Area" + "</td>" + "<td>" + "Test Surface Area" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; globalMatchObject.MatchedOpeningIds = new Dictionary<string, List<string>>(); int j = 1; //if no openings remove the table. if (StandardOpenings.Count < 1) TestOpeningTable = ""; //compare the openings foreach (OpeningDefinitions opening in StandardOpenings) { report.Clear(); report.testType = TestType.Detailed_Opening_Checks; report.subTestIndex = j; report = GetPossibleOpeningMatches(opening, TestOpenings, report); AddToOutPut("Test 17 for Opening number " + j + " Result: ", report, false); foreach (OpeningDefinitions to in TestOpenings) { if (globalMatchObject.MatchedOpeningIds.ContainsKey(opening.OpeningId)) { foreach (string id in globalMatchObject.MatchedOpeningIds[opening.OpeningId]) { if (to.OpeningId == id) { if (report.passOrFail) TestOpeningTable += "<tr class='success'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Opening Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + opening.OpeningId + "</td>" + "<td>" + to.OpeningId + "</td>" + "<td>" + opening.ParentSurfaceId + "</td>" + "<td>" + to.ParentSurfaceId + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentAzimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.ParentAzimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentTilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.ParentTilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.surfaceArea) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.surfaceArea) + "</td>" + "<td>" + "Pass" + "</td>" + "</tr>"; } } } } //if didn't find match means it failed the test if (!report.passOrFail) TestOpeningTable += "<tr class='error'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Opening Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + opening.OpeningId + "</td>" + "<td>" + "---" + "</td>" + "<td>" + opening.ParentSurfaceId + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentAzimuth) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentTilt) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.surfaceArea) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + "Fail" + "</td>" + "</tr>"; j += 1; } } TestOpeningTable += "</table></div><br/>"; #endregion //close table table += "</table></div><br/>"; //add TestSurfaceTable table += TestSurfaceTable + TestOpeningTable; } //CreateSummaryTable(); ((FileAppender)LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0]).Close(); }
public void StartTest(XmlReader xmldoc, string testToRun, string username) { TestToRun = testToRun; globalMatchObject = new gbXMLMatches(); globalMatchObject.Init(); //first create a list of lists that is indexed identically to the drop down list the user selects TestDetail = new DOEgbXMLTestDetail(); //then populate the list of lists. All indexing is done "by hand" in InitializeTestResultStrings() TestDetail.InitializeTestResultStrings(); //create report list reportlist will store all the test result ReportList = new List<DOEgbXMLReportingObj>(); //Load an XML File for the test at hand gbXMLTestFile = new XmlDocument(); gbXMLTestFile.Load(xmldoc); gbXMLStandardFile = new XmlDocument(); // gbXMLStandardFile.Load(filepaths[testToRun]); if (!TestFileIsAvailable()) return; //Define the namespace XmlNamespaceManager gbXMLns1 = new XmlNamespaceManager(gbXMLTestFile.NameTable); gbXMLns1.AddNamespace("gbXMLv5", "http://www.gbxml.org/schema"); XmlNamespaceManager gbXMLns2 = new XmlNamespaceManager(gbXMLStandardFile.NameTable); gbXMLns2.AddNamespace("gbXMLv5", "http://www.gbxml.org/schema"); //is the test file metric or not? bool isMetric = false; XmlNodeList nodes = gbXMLTestFile.SelectNodes("/gbXMLv5:gbXML", gbXMLns1); foreach (XmlNode Node in nodes) { XmlAttributeCollection spaceAtts = Node.Attributes; foreach (XmlAttribute at in spaceAtts) { if (at.Name == "volumeUnit") { string type = at.Value; if (type == "CubicMeters") { isMetric = true; } else { isMetric = false; } } else if (at.Name == "areaUnit") { string type = at.Value; if (type == "CubicMeters") { isMetric = true; } else { isMetric = false; } } else if (at.Name == "lengthUnit") { string type = at.Value; if (type == "Meters") { isMetric = true; } else { isMetric = false; } } } } //if isMetric is true, then we would like to convert the test file's numbers to US-IP units if(isMetric) gbXMLTestFile = ConvertMetricToUS(gbXMLTestFile); List<XmlDocument> gbXMLdocs = new List<XmlDocument>(); gbXMLdocs.Add(gbXMLTestFile); gbXMLdocs.Add(gbXMLStandardFile); List<XmlNamespaceManager> gbXMLnsm = new List<XmlNamespaceManager>(); gbXMLnsm.Add(gbXMLns1); gbXMLnsm.Add(gbXMLns2); //Create a Log file that logs the success or failure of each test. //Eventually maybe I want to create a little HTML factory output = ""; log = ""; table += "<div class='container'>" + "<h3>" + "Test Sections" + "</h3>"; table += "<table class='table table-bordered'>"; table += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Standard Result" + "</td>" + "<td>" + "Test File Result" + "</td>" + "<td>" + "Tolerances" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; string units; DOEgbXMLReportingObj report = new DOEgbXMLReportingObj(); report.standResult = new List<string>(); report.testResult = new List<string>(); report.idList = new List<string>(); report.MessageList = new List<string>(); report.TestPassedDict = new Dictionary<string, bool>(); //Set up the Global Pass/Fail criteria for the test case file TestCriteria = new DOEgbXMLTestCriteriaObject(); TestCriteria.InitializeTestCriteriaWithTestName(testToRun); //Test 2 execute report.tolerance = DOEgbXMLBasics.Tolerances.AreaTolerance; report.testType = TestType.Building_Area; units = DOEgbXMLBasics.MeasurementUnits.sqft.ToString(); report = GetBuildingArea(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Building Area Test Passed: ", report, true); //Test 3 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.SpaceCountTolerance; report.testType = TestType.Space_Count; units = DOEgbXMLBasics.MeasurementUnits.spaces.ToString(); report = GetBuildingSpaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Building Space Quantity Count Test Passed: ", report, true); ////Test 4 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.LevelCountTolerance; report.testType = TestType.Building_Story_Count; units = DOEgbXMLBasics.MeasurementUnits.levels.ToString(); report = GetBuildingStoryCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Building Story Count Test Passed: ", report, true); //Test 5 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.LevelHeightTolerance; report.testType = TestType.Building_Story_Z_Height; units = DOEgbXMLBasics.MeasurementUnits.ft.ToString(); report = GetStoryHeights(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Building Story Z-Height Test: ", report, true); //Test 6 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.VectorAngleTolerance; report.testType = TestType.Building_Story_PolyLoop_RHR; units = "degrees"; report = TestBuildingStoryRHR(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Building Story PolyLoop Right Hand Rule Test Result:", report, true); //String spShellGeometrySurfaceNum = TestShellGeomSurfaceNum(gbXMLTestFile, gbXMLns); //Space Tests ............................................................. //Test 7 execute //only needs to test the test file report.Clear(); report.testType = TestType.SpaceId_Match_Test; report = UniqueSpaceIdTest(gbXMLdocs, gbXMLnsm, report); AddToOutPut("SpaceId Match Test: ", report, true); //Test 8 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.SpaceAreaTolerance; report.testType = TestType.Space_Area; units = DOEgbXMLBasics.MeasurementUnits.sqft.ToString(); report = TestSpaceAreas(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Space Areas Test: ", report, true); //Test 9 execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.VolumeTolerance; report.testType = TestType.Space_Volume; units = DOEgbXMLBasics.MeasurementUnits.cubicft.ToString(); report = TestSpaceVolumes(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Space Volumes Test: ", report, true); //Test 10 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.VectorAngleTolerance; report.testType = TestType.Shell_Geom_RHR; units = "degrees"; report = TestShellGeomPLRHR(gbXMLdocs, gbXMLnsm, report, units); //AddToOutPut("Shell Geometry RHR Test: ",report); //Surface Element tests //Test 11 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.SurfaceCountTolerance; report.testType = TestType.Total_Surface_Count; units = ""; report = GetSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Surface Count Test Result: ", report, true); //Surface Element tests //Test 12 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.ExteriorWallCountTolerance; report.testType = TestType.Exterior_Wall_Surface_Count; units = ""; report = GetEWSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Exterior Wall Surface Count Test Result: ", report, true); report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.SurfaceCountTolerance; report.testType = TestType.Underground_Surface_Count; units = ""; report = GetUGSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Underground Wall Count Test Result: ", report, true); //Surface Element tests //Test 13 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; report.testType = TestType.Interior_Wall_Surface_Count; units = ""; report = GetIWSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Interior Wall Surface Count Test Result: ", report, true); //Surface Element tests //Test 13 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.InteriorFloorCountTolerance; report.testType = TestType.Interior_Floor_Surface_Count; units = ""; report = GetIFSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Interior Floor Surface Count Test Result: ", report, true); //Surface Element tests //Test 14 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; report.testType = TestType.Roof_Surface_Count; units = ""; report = GetRoofSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Roof Surface Count Test Result: ", report, true); //Surface Element tests //Test 15 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.InteriorWallCountTolerance; report.testType = TestType.Shading_Surface_Count; units = ""; report = GetShadeSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Shading Surface Count Test Result: ", report, true); //Test 16 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.AirWallCountTolerance; report.testType = TestType.Air_Surface_Count; units = ""; report = GetAirSurfaceCount(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Air Surface Count Test Result: ", report, true); #region surface detailed test //Jan 31-2012: We may not want to perform these if the surface counts fail, but for now, we will include these tests //Detailed Surface Checks //Store Surface Element Information List<SurfaceDefinitions> TestSurfaces = new List<SurfaceDefinitions>(); XmlDocument TestFile = gbXMLdocs[0]; XmlNamespaceManager TestNSM = gbXMLnsm[0]; List<SurfaceDefinitions> StandardSurfaces = new List<SurfaceDefinitions>(); XmlDocument StandardFile = gbXMLdocs[1]; XmlNamespaceManager StandardNSM = gbXMLnsm[1]; TestSurfaces = GetFileSurfaceDefs(TestFile, TestNSM); StandardSurfaces = GetFileSurfaceDefs(StandardFile, StandardNSM); string TestSurfaceTable = " <div class='container'><table class='table table-bordered'>"; TestSurfaceTable += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Stand Surface ID" + "</td>" + "<td>" + "Test Surface ID" + "</td>" + "<td>" + "Stand Surface Tilt" + "</td>" + "<td>" + "Test Surface Tilt" + "</td>" + "<td>" + "Stand Surface Azimuth" + "</td>" + "<td>" + "Test Surface Azimuth" + "</td>" + "<td>" + "Stand Surface Height" + "</td>" + "<td>" + "Test Surface Height" + "</td>" + "<td>" + "Stand Surface Width" + "</td>" + "<td>" + "Test Surface Width" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; //Test Surfaces Planar Test //all polyloops must be such that the surface defined by the coordinates is planar report.Clear(); report.testType = TestType.Surface_Planar_Test; report = TestSurfacePlanarTest(TestSurfaces, report); if (!report.passOrFail) { AddToOutPut("Test File Planar Surface Check: ", report, true); report.Clear(); } //only run detailed surface checks if the surfaces are planar else { //<For each surface in the Standard File, try to find a match for this surface in the test file> //Written Jan 31, 2013 by Chien Si Harriman, Senior Product Manager, Carmel Software Corporation //Execute Tests // globalMatchObject.MatchedSurfaceIds = new Dictionary<string, List<string>>(); int i = 1; foreach (SurfaceDefinitions surface in StandardSurfaces) { report.Clear(); //multiple tolerances used report.testType = TestType.Detailed_Surface_Checks; report.subTestIndex = i; //multiple units used, so ignore units report = GetPossibleSurfaceMatches(surface, TestSurfaces, report); AddToOutPut("Test 17 for Surface number " + i + " Result: ", report, false); foreach (SurfaceDefinitions ts in TestSurfaces) { if (globalMatchObject.MatchedSurfaceIds.ContainsKey(surface.SurfaceId)) { foreach (string id in globalMatchObject.MatchedSurfaceIds[surface.SurfaceId]) { if (ts.SurfaceId == id) { if (report.passOrFail) TestSurfaceTable += "<tr class='success'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Surface Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + surface.SurfaceId + "</td>" + "<td>" + ts.SurfaceId + "</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Tilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", ts.Tilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Azimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", ts.Azimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Height) + "</td>" + "<td>" + String.Format("{0:#,0.00}", ts.Height) + "</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Width) + "</td>" + "<td>" + String.Format("{0:#,0.00}", ts.Width) + "</td>" + "<td>" + "Pass" + "</td>" + "</tr>"; } } } } //if didn't find match means it failed the test if (!report.passOrFail) TestSurfaceTable += "<tr class='error'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Surface Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + surface.SurfaceId + "</td>" + "<td>" + "---</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Tilt) + "</td>" + "<td>" + "---</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Azimuth) + "</td>" + "<td>" + "---</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Height) + "</td>" + "<td>" + "---</td>" + "<td>" + String.Format("{0:#,0.00}", surface.Width) + "</td>" + "<td>" + "---</td>" + "<td>" + "Fail" + "</td>" + "</tr>"; i += 1; } TestSurfaceTable += "</table></div><br/>"; } #endregion //test 18 CountFixedWindows //Test 18 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.FixedWindowCountTolerance; report.testType = TestType.Fixed_Windows_Count; units = ""; report = CountFixedWindows(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Fixed Windows Count Test Result: ", report, true); //test 19 CountOperableWindows //Test 19 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.OperableWindowCountTolerance; report.testType = TestType.Operable_Windows_Count; units = ""; report = CountOperableWindows(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Operable Windows Count Test Result: ", report, true); //test 20 CountFixedSkylights //Test 20 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.FixedSkylightCountTolerance; report.testType = TestType.Fixed_Skylight_Count; units = ""; report = CountFixedSkylights(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Fixed Skylight Count Test Result: ", report, true); //test 21 CountOperableSkylights //Test 21 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.OperableSkylightCountTolerance; report.testType = TestType.Operable_Skylight_Count; units = ""; report = CountOperableSkylights(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Operable Skylight Count Test Result: ", report, true); //test 22 CountSlidingDoors //Test 22 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.SlidingDoorCountTolerance; report.testType = TestType.Sliding_Doors_Count; units = ""; report = CountSlidingDoors(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Sliding Doors Count Test Result: ", report, true); //test 23 CountNonSlidingDoors //Test 23 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.NonSlidingDoorCountTolerance; report.testType = TestType.Non_Sliding_Doors_Count; units = ""; report = CountNonSlidingDoors(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Non Sliding Doors Count Test Result: ", report, true); //test 24 CountAirOpenings //Test 24 Execute report.Clear(); report.tolerance = DOEgbXMLBasics.Tolerances.AirOpeningCountTolerance; report.testType = TestType.Air_Openings_Count; units = ""; report = CountAirOpenings(gbXMLdocs, gbXMLnsm, report, units); AddToOutPut("Air Openings Count Test Result: ", report, true); #region opending detailed test //openings detailed tests List<OpeningDefinitions> TestOpenings = new List<OpeningDefinitions>(); XmlDocument testFile = gbXMLdocs[0]; XmlNamespaceManager testNSM = gbXMLnsm[0]; List<OpeningDefinitions> StandardOpenings = new List<OpeningDefinitions>(); XmlDocument standardFile = gbXMLdocs[1]; XmlNamespaceManager standardNSM = gbXMLnsm[1]; TestOpenings = GetFileOpeningDefs(TestFile, TestNSM); StandardOpenings = GetFileOpeningDefs(StandardFile, StandardNSM); string TestOpeningTable = ""; report.Clear(); report.testType = TestType.Opening_Planar_Test; report = TestOpeningPlanarTest(TestOpenings, report); if (!report.passOrFail) { AddToOutPut("Test File Planar Opening Check: ", report, true); report.Clear(); } //only run detailed opening checks if the opening are planar else { TestOpeningTable = "<div class='container'><table class='table table-bordered'>"; TestOpeningTable += "<tr class='info'>" + "<td>" + "Test Section Name" + "</td>" + "<td>" + "Standard Opening Id" + "</td>" + "<td>" + "Test Opening Id" + "</td>" + "<td>" + "Standard Parent Surface Id" + "</td>" + "<td>" + "Test Parent Surface Id" + "</td>" + "<td>" + "Standard Parent Azimuth" + "</td>" + "<td>" + "Test Parent Azimuth" + "</td>" + "<td>" + "Standard Parent Tilt" + "</td>" + "<td>" + "Test Parent Tilt" + "</td>" + "<td>" + "Standard Surface Area" + "</td>" + "<td>" + "Test Surface Area" + "</td>" + "<td>" + "Pass/Fail" + "</td>" + "</tr>"; globalMatchObject.MatchedOpeningIds = new Dictionary<string, List<string>>(); int i = 1; //if no openings remove the table. if (StandardOpenings.Count < 1) TestOpeningTable = ""; //compare the openings foreach (OpeningDefinitions opening in StandardOpenings) { report.Clear(); report.testType = TestType.Detailed_Opening_Checks; report.subTestIndex = i; report = GetPossibleOpeningMatches(opening, TestOpenings, report); AddToOutPut("Test 17 for Opening number " + i + " Result: ", report, false); foreach (OpeningDefinitions to in TestOpenings) { if (globalMatchObject.MatchedOpeningIds.ContainsKey(opening.OpeningId)) { foreach (string id in globalMatchObject.MatchedOpeningIds[opening.OpeningId]) { if (to.OpeningId == id) { if (report.passOrFail) TestOpeningTable += "<tr class='success'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Opening Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + opening.OpeningId + "</td>" + "<td>" + to.OpeningId + "</td>" + "<td>" + opening.ParentSurfaceId + "</td>" + "<td>" + to.ParentSurfaceId + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentAzimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.ParentAzimuth) + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentTilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.ParentTilt) + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.surfaceArea) + "</td>" + "<td>" + String.Format("{0:#,0.00}", to.surfaceArea) + "</td>" + "<td>" + "Pass" + "</td>" + "</tr>"; } } } } //if didn't find match means it failed the test if (!report.passOrFail) TestOpeningTable += "<tr class='error'>" + "<td>" + "<a href='TestDetailPage.aspx?type=" + (int)report.testType + "&subtype=" + report.subTestIndex + "' target='_blank'>" + "Detailed Opening Checks " + report.subTestIndex + "</a>" + "</td>" + "<td>" + opening.OpeningId + "</td>" + "<td>" + "---" + "</td>" + "<td>" + opening.ParentSurfaceId + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentAzimuth) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.ParentTilt) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + String.Format("{0:#,0.00}", opening.surfaceArea) + "</td>" + "<td>" + "---" + "</td>" + "<td>" + "Fail" + "</td>" + "</tr>"; i += 1; } } TestOpeningTable += "</table></div><br/>"; #endregion //close table table += "</table></div><br/>"; //add TestSurfaceTable table += TestSurfaceTable + TestOpeningTable; CreateSummaryTable(); }