{"action":"created","comment":{"url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/comments/34414540","id":34414540,"diff_hunk":"@@ -4,411 +4,245 @@\n #include <gtest/gtest.h>\n \n // ObjexxFCL Headers\n-#include <ObjexxFCL/Array1D.hh>\n-#include <ObjexxFCL/gio.hh>\n \n // EnergyPlus Headers\n #include <EnergyPlus/Humidifiers.hh>\n-#include <EnergyPlus/DataGlobals.hh>\n-#include <EnergyPlus/DataHVACGlobals.hh>\n-#include <EnergyPlus/DataSizing.hh>\n-#include <EnergyPlus/DataEnvironment.hh>\n-#include <EnergyPlus/Psychrometrics.hh>\n-#include <EnergyPlus/ReportSizingManager.hh>\n-#include <EnergyPlus/ScheduleManager.hh>\n-#include <EnergyPlus/SQLiteProcedures.hh>\n-#include <EnergyPlus/InputProcessor.hh>\n-#include <EnergyPlus/DataGlobals.hh>\n-#include <EnergyPlus/DataStringGlobals.hh>\n-#include <EnergyPlus/CurveManager.hh>\n-#include <EnergyPlus/NodeInputManager.hh>\n-#include <EnergyPlus/DataLoopNode.hh>\n-\n-using namespace ObjexxFCL;\n-using namespace EnergyPlus;\n+\n+#include \"Fixtures/HVACFixture.hh\"\n+\n using namespace EnergyPlus::Humidifiers;\n using namespace EnergyPlus::DataSizing;\n using namespace EnergyPlus::DataGlobals;\n using namespace EnergyPlus::DataEnvironment;\n-using namespace EnergyPlus::ReportSizingManager;\n using namespace EnergyPlus::Psychrometrics;\n-using namespace EnergyPlus::ScheduleManager;\n using namespace EnergyPlus::DataHVACGlobals;\n-using namespace EnergyPlus::InputProcessor;\n-using namespace EnergyPlus::DataGlobals;\n using namespace EnergyPlus::CurveManager;\n-using namespace EnergyPlus::DataLoopNode;\n-using namespace EnergyPlus::NodeInputManager;\n-\n-TEST( GasFiredHumidifierTest, Sizing ) {\n-\tShowMessage( \"Begin Test: GasFiredHumidifierTest, Sizing\" );\n-\n-\tint write_stat;\n-\t// Open the Initialization Output File (lifted from SimulationManager.cc)\n-\tOutputFileInits = GetNewUnitNumber();\n-\t{ IOFlags flags; flags.ACTION( \"write\" ); flags.STATUS( \"UNKNOWN\" ); gio::open( OutputFileInits, \"eplusout.eio\", flags ); write_stat = flags.ios(); }\n-\n-\tSysSizingRunDone = true;\n-\tCurSysNum = 1;\n-\tNumElecSteamHums = 0;\n-\tNumGasSteamHums = 1;\n-\tNumHumidifiers = 1;\n-\n-\tHumidifierData thisHum;\n-\n-\tthisHum.HumType_Code = 2;\n-\tthisHum.NomCapVol = 4.00E-5;\n-\tthisHum.NomPower = AutoSize;\n-\tthisHum.ThermalEffRated = 1.0;\n-\tthisHum.FanPower = 0.0;\n-\tthisHum.StandbyPower = 0.0;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\n-\tFinalSysSizing.allocate( CurSysNum );\n-\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 30.0;\n-\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.090;\n-\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n-\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n-\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n-\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n-\n-\t// autosize nominal gas use rate\n-\tOutBaroPress = 101325.0;\n-\tthisHum.SizeHumidifier();\n-\tEXPECT_DOUBLE_EQ( 4.00E-5, thisHum.NomCapVol );\n-\tEXPECT_DOUBLE_EQ( 0.040000010708118504, thisHum.NomCap );\n-\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.NomPower );\n-\n-\t// clean up\n-\tFinalSysSizing.deallocate();\n-\n \n-}\n-TEST( GasFiredHumidifierTest, AutoSizing ) {\n-\tShowMessage( \"Begin Test: GasFiredHumidifierTest, AutoSizing\" );\n-\n-\tSysSizingRunDone = true;\n-\tCurSysNum = 1;\n-\tNumElecSteamHums = 0;\n-\tNumGasSteamHums = 1;\n-\tNumHumidifiers = 1;\n-\n-\tHumidifierData thisHum;\n-\n-\tthisHum.HumType_Code = 2;\n-\tthisHum.NomCapVol = AutoSize;\n-\tthisHum.NomPower = AutoSize;\n-\tthisHum.ThermalEffRated = 0.80;\n-\tthisHum.FanPower = 0.0;\n-\tthisHum.StandbyPower = 0.0;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\n-\tFinalSysSizing.allocate( CurSysNum );\n-\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 30.0;\n-\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.090;\n-\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n-\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n-\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n-\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n-\n-\tOutBaroPress = 101325.0;\n-\t// volumetric capacity autosize unit test\n-\tthisHum.NomCapVol = AutoSize;\n-\tCurZoneEqNum = 0; // size it based on system\n-\tthisHum.SizeHumidifier();\n-\t// test autosized nominal capacity\n-\tEXPECT_NEAR( 8.185E-05, thisHum.NomCapVol, 1.0E-06 ); // m3/s\n-\t// test autosized nominal capacity\n-\tEXPECT_NEAR( 0.0818, thisHum.NomCap, 1.0E-04 ); // kg/s\n-\t// test autosized nominal gas use rate\n-\tEXPECT_NEAR( 265257.67, thisHum.NomPower, 1.0E-02 ); // Watts\n-\n-\t// clean up\n-\tFinalSysSizing.deallocate();\n-}\n-\n-TEST( GasFiredHumidifierTest, EnergyUse ) {\n-\tShowMessage( \"Begin Test: GasFiredHumidifierTest, EnergyUse\" );\n-\n-\tHumidifierData thisHum;\n-\n-\tTimeStepSys = 0.25;\n-\tSysSizingRunDone = true;\n-\tCurSysNum = 1;\n-\n-\tNumElecSteamHums = 0;\n-\tNumGasSteamHums = 1;\n-\tNumHumidifiers = 1;\n-\tHumidifier.allocate( NumGasSteamHums );\n-\tthisHum.HumType_Code = 2;\n-\tthisHum.NomCapVol = 4.00E-5;\n-\tthisHum.NomPower = 103710.0;\n-\tthisHum.ThermalEffRated = 1.0;\n-\tthisHum.FanPower = 0.0;\n-\tthisHum.StandbyPower = 0.0;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\tthisHum.SchedPtr = ScheduleAlwaysOn;\n-\n-\tFinalSysSizing.allocate( CurSysNum );\n-\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 20.0;\n-\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.00089;\n-\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n-\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n-\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n-\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n-\n-\t// resize the humidifier nominal capacity and gas use rate\n-\tthisHum.NomCapVol = 4.00E-5;\n-\tthisHum.NomPower = 103710;\n-\tOutBaroPress = 101325.0;\n-\tthisHum.SizeHumidifier();\n-\tEXPECT_DOUBLE_EQ( 0.040000010708118504, thisHum.NomCap );\n-\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.NomPower );\n-\n-\t// calculate gas use rate and energy at full load\n-\tthisHum.AirInMassFlowRate = 1.8919;\n-\tthisHum.AirInTemp = 20.0;\n-\tthisHum.AirInEnthalpy = 25000.0;\n-\tthisHum.InletWaterTempOption = 1;\n-\tthisHum.CurMakeupWaterTemp = 20.0;\n-\tOutBaroPress = 101325.0;\n-\n-\tInitializePsychRoutines();\n-\n-\tthisHum.CalcGasSteamHumidifier( 0.040000010708118504 );\n-\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.GasUseRate );\n-\n-\tthisHum.ReportHumidifier();\n-\tEXPECT_DOUBLE_EQ( 93339384.987223208, thisHum.GasUseEnergy );\n-\n-\t// clean up\n-\tFinalSysSizing.deallocate();\n-\tHumidifier.deallocate();\n-\n-\t// Close and delete eio output file\n-\t{ IOFlags flags; flags.DISPOSE( \"DELETE\" ); gio::close( OutputFileInits, flags ); }\n-}\n-TEST( GasFiredHumidifierTest, GetHumidifierInput ) {\n-\tShowMessage( \"Begin Test: GasFiredHumidifierTest, GetHumidifierInput\" );\n-\n-\t// Test get input for gas fired humidifier object\n-\t//Humidifier:Steam:Gas,\n-\t//  Main Gas Humidifier,     !- Name\n-\t//  ALWAYS_ON,               !- Availability Schedule Name\n-\t//  autosize,                !- Rated Capacity {m3/s}\n-\t//  autosize,                !- Rated Gas Use Rate {W}\n-\t//  0.80,                    !- Thermal Efficiency {-} \n-\t//  ThermalEfficiencyFPLR,   !- Thermal Efficiency Modifier Curve Name\n-\t//  0,                       !- Rated Fan Power {W}\n-\t//  0,                       !- Auxiliary Electric Power {W}\n-\t//  Mixed Air Node 1,        !- Air Inlet Node Name\n-\t//  Main Humidifier Outlet Node,  !- Air Outlet Node Name\n-\t//  ;                        !- Water Storage Tank Name\n-\n-\tint NumGasSteamHums( 1 ); // Zone number\n-\tint NumAlphas;\n-\tint NumNumbers;\n-\tint CurveNum;\n-\n-\tNumAlphas = 7;\n-\tNumNumbers = 5;\n-\n-\t// GetNumObjectsFound function requires the IDF object for Construction\n-\tNumObjectDefs = 2;\n-\tListOfObjects.allocate( NumObjectDefs );\n-\tListOfObjects( 1 ) = \"HUMIDIFIER:STEAM:GAS\";\n-\tiListOfObjects.allocate( NumObjectDefs );\n-\tiListOfObjects( 1 ) = 1;\n-\n-\tObjectStartRecord.allocate( NumObjectDefs );\n-\tObjectStartRecord( 1 ) = 1;\n-\tObjectGotCount.allocate( NumObjectDefs );\n-\tIDFRecordsGotten.allocate( NumObjectDefs );\n-\tIDFRecordsGotten( NumObjectDefs ) = false;\n-\tObjectDef.allocate( NumObjectDefs );\n-\tObjectDef( 1 ).NumFound = 1;\n-\tObjectDef( 1 ).NumParams = NumAlphas + NumNumbers;\n-\tObjectDef( 1 ).NumAlpha = NumAlphas;\n-\tObjectDef( 1 ).NumNumeric = NumNumbers;\n-\tObjectDef( 1 ).AlphFieldChks.allocate( NumAlphas );\n-\tObjectDef( 1 ).AlphFieldChks = \" \";\n-\tObjectDef( 1 ).NumRangeChks.allocate( NumNumbers );\n-\n-\tNumIDFRecords = 1;\n-\tIDFRecords.allocate( 1 );\n-\tIDFRecords( 1 ).Name = ListOfObjects( 1 );\n-\tIDFRecords( 1 ).NumNumbers = NumNumbers;\n-\tIDFRecords( 1 ).NumAlphas = NumAlphas;\n-\tIDFRecords( 1 ).ObjectDefPtr = ObjectDef( 1 ).NumFound;\n-\tIDFRecords( 1 ).Alphas.allocate( NumAlphas );\n-\tIDFRecords( 1 ).Alphas( 1 ) = \"Main Gas Humidifier\";\n-\tIDFRecords( 1 ).Alphas( 2 ) = \"\";\n-\tIDFRecords( 1 ).Alphas( 3 ) = \"ThermalEfficiencyFPLR\";\n-\tIDFRecords( 1 ).Alphas( 4 ) = \"Mixed Air Node 1\";\n-\tIDFRecords( 1 ).Alphas( 5 ) = \"Main Humidifier Outlet Node\";\n-\tIDFRecords( 1 ).Alphas( 6 ) = \"\";\n-\tIDFRecords( 1 ).Alphas( 7 ) = \"\";\n-\tIDFRecords( 1 ).AlphBlank.allocate( NumAlphas );\n-\tIDFRecords( 1 ).AlphBlank( 1 ) = false;\n-\tIDFRecords( 1 ).AlphBlank( 2 ) = true;\n-\tIDFRecords( 1 ).AlphBlank( 3 ) = false;\n-\tIDFRecords( 1 ).AlphBlank( 4 ) = false;\n-\tIDFRecords( 1 ).AlphBlank( 5 ) = false;\n-\tIDFRecords( 1 ).AlphBlank( 6 ) = true;\n-\tIDFRecords( 1 ).AlphBlank( 7 ) = true;\n-\tIDFRecords( 1 ).Numbers.allocate( NumNumbers );\n-\tIDFRecords( 1 ).Numbers( 1 ) = 0.00045;\n-\tIDFRecords( 1 ).Numbers( 2 ) = 10000.0;\n-\tIDFRecords( 1 ).Numbers( 3 ) = 0.80;\n-\tIDFRecords( 1 ).Numbers( 4 ) = 0.0;\n-\tIDFRecords( 1 ).Numbers( 5 ) = 0.0;\n-\tIDFRecords( 1 ).NumBlank.allocate( NumNumbers );\n-\tIDFRecords( 1 ).NumBlank = false;\n-\n-\t// the following array size allocation is done only once every simulation in\n-\t// GetObjectItem function in InputProcessor module.\n-\t// AlphaArgs.allocate( MaxAlphaArgsFound );\n-\t// NumberArgs.allocate( MaxNumericArgsFound );\n-\t// thus maximum array size is already fixed by unit tests (HeatBalanceManager.unit.cc)\n-\t// that use these variables and called prior to this unit test. This initialization is \n-\t// used only if want to run this unit test individually, or some changes the calling \n-\t// sequence of the unit test.\n-\tMaxAlphaArgsFound = 100;\n-\tMaxNumericArgsFound = 100;\n-\n-\t// GetOnlySingleNode requires that the IDD object definition\n-\tListOfObjects( 2 ) = \"NodeList\";\n-\tiListOfObjects( 2 ) = 2;\n-\tObjectDef( 2 ).NumParams = 2;\n-\tObjectDef( 2 ).NumAlpha = 2;\n-\tObjectDef( 2 ).NumNumeric = 0;\n-\n-\tCurveNum = 1;\n-\tCurveManager::NumCurves = 1; \n-\tCurveManager::GetCurvesInputFlag = false;\n-\tNodeInputManager::GetNodeInputFlag = false;\n-\tPerfCurve.allocate( CurveNum );\n-\tPerfCurve( CurveNum ).Name = \"ThermalEfficiencyFPLR\";\n-\tPerfCurve( CurveNum ).CurveType = CurveManager::Quadratic;\n-\tPerfCurve( CurveNum ).ObjectType = CurveType_Quadratic;\n-\tPerfCurve( CurveNum ).InterpolationType = EvaluateCurveToLimits;\n-\tPerfCurve( CurveNum ).Coeff1 = 0.9375;\n-\tPerfCurve( CurveNum ).Coeff2 = 0.0625;\n-\tPerfCurve( CurveNum ).Coeff3 = -7.0E-15;\n-\tPerfCurve( CurveNum ).Coeff4 = 0.0;\n-\tPerfCurve( CurveNum ).Coeff5 = 0.0;\n-\tPerfCurve( CurveNum ).Coeff6 = 0.0;\n-\tPerfCurve( CurveNum ).Var1Min = 0.0;\n-\tPerfCurve( CurveNum ).Var1Max = 1.2;\n-\tPerfCurve( CurveNum ).Var2Min = 0.7;\n-\tPerfCurve( CurveNum ).Var2Max = 1.0;\n-\n-\t// call to get valid window material types\n-\tGetHumidifierInput(); // \n-\tEXPECT_EQ( 1, Humidifier( 1 ).EfficiencyCurvePtr );\n-\n-\t// clear varaibles\n-\tNumIDFRecords = 0;\n-\tNumObjectDefs = 0;\n-\tNumGasSteamHums = 0;\n-\tNumCurves = 0;\n-\tMaxAlphaArgsFound = 0;\n-\tMaxNumericArgsFound = 0;\n-\tCurveManager::GetCurvesInputFlag = true;\n-\tNodeInputManager::GetNodeInputFlag = true;\n-\tNodeInputManager::NumOfUniqueNodeNames = 0;\n-\n-\t// deallocate variables\n-\tHumidifier.deallocate();\n-\tListOfObjects.deallocate();\n-\tiListOfObjects.deallocate();\n-\tObjectStartRecord.deallocate();\n-\tObjectGotCount.deallocate();\n-\tIDFRecordsGotten.deallocate();\n-\tObjectDef( 2 ).AlphFieldChks.deallocate();\n-\tObjectDef( 2 ).NumRangeChks.deallocate();\n-\tObjectDef.deallocate();\n-\tIDFRecords( 1 ).Alphas.deallocate();\n-\tIDFRecords( 1 ).AlphBlank.deallocate();\n-\tIDFRecords( 1 ).Numbers.deallocate();\n-\tIDFRecords( 1 ).NumBlank.deallocate();\n-\tIDFRecords.deallocate();\n-\tPerfCurve.deallocate();\n+namespace EnergyPlus {\n+\n+\ttypedef HVACFixture HumidifiersFixture;\n+\ttypedef HVACFixture HumidifiersDeathTestFixture;\n+\n+\tTEST_F( HumidifiersFixture, Sizing ) {\n+\t\tSysSizingRunDone = true;\n+\t\tCurSysNum = 1;\n+\t\tNumElecSteamHums = 0;\n+\t\tNumGasSteamHums = 1;\n+\t\tNumHumidifiers = 1;\n+\n+\t\tHumidifierData thisHum;\n+\n+\t\tthisHum.HumType_Code = 2;\n+\t\tthisHum.NomCapVol = 4.00E-5;\n+\t\tthisHum.NomPower = AutoSize;\n+\t\tthisHum.ThermalEffRated = 1.0;\n+\t\tthisHum.FanPower = 0.0;\n+\t\tthisHum.StandbyPower = 0.0;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\n+\t\tFinalSysSizing.allocate( CurSysNum );\n+\t\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 30.0;\n+\t\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.090;\n+\t\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n+\t\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n+\t\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n+\t\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n+\n+\t\t// autosize nominal gas use rate\n+\t\tOutBaroPress = 101325.0;\n+\t\tthisHum.SizeHumidifier();\n+\t\tEXPECT_DOUBLE_EQ( 4.00E-5, thisHum.NomCapVol );\n+\t\tEXPECT_DOUBLE_EQ( 0.040000010708118504, thisHum.NomCap );\n+\t\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.NomPower );\n+\n+\t}\n+\n+\tTEST_F( HumidifiersFixture, AutoSizing ) {\n+\t\tSysSizingRunDone = true;\n+\t\tCurSysNum = 1;\n+\t\tNumElecSteamHums = 0;\n+\t\tNumGasSteamHums = 1;\n+\t\tNumHumidifiers = 1;\n+\n+\t\tHumidifierData thisHum;\n+\n+\t\tthisHum.HumType_Code = 2;\n+\t\tthisHum.NomCapVol = AutoSize;\n+\t\tthisHum.NomPower = AutoSize;\n+\t\tthisHum.ThermalEffRated = 0.80;\n+\t\tthisHum.FanPower = 0.0;\n+\t\tthisHum.StandbyPower = 0.0;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\n+\t\tFinalSysSizing.allocate( CurSysNum );\n+\t\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 30.0;\n+\t\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.090;\n+\t\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n+\t\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n+\t\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n+\t\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n+\n+\t\tOutBaroPress = 101325.0;\n+\t\t// volumetric capacity autosize unit test\n+\t\tthisHum.NomCapVol = AutoSize;\n+\t\tCurZoneEqNum = 0; // size it based on system\n+\t\tthisHum.SizeHumidifier();\n+\t\t// test autosized nominal capacity\n+\t\tEXPECT_NEAR( 8.185E-05, thisHum.NomCapVol, 1.0E-06 ); // m3/s\n+\t\t// test autosized nominal capacity\n+\t\tEXPECT_NEAR( 0.0818, thisHum.NomCap, 1.0E-04 ); // kg/s\n+\t\t// test autosized nominal gas use rate\n+\t\tEXPECT_NEAR( 265257.67, thisHum.NomPower, 1.0E-02 ); // Watts\n+\t}\n+\n+\tTEST_F( HumidifiersFixture, EnergyUse ) {\n+\t\tHumidifierData thisHum;\n+\n+\t\tTimeStepSys = 0.25;\n+\t\tSysSizingRunDone = true;\n+\t\tCurSysNum = 1;\n+\n+\t\tNumElecSteamHums = 0;\n+\t\tNumGasSteamHums = 1;\n+\t\tNumHumidifiers = 1;\n+\t\tHumidifier.allocate( NumGasSteamHums );\n+\t\tthisHum.HumType_Code = 2;\n+\t\tthisHum.NomCapVol = 4.00E-5;\n+\t\tthisHum.NomPower = 103710.0;\n+\t\tthisHum.ThermalEffRated = 1.0;\n+\t\tthisHum.FanPower = 0.0;\n+\t\tthisHum.StandbyPower = 0.0;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\t\tthisHum.SchedPtr = ScheduleAlwaysOn;\n+\n+\t\tFinalSysSizing.allocate( CurSysNum );\n+\t\tFinalSysSizing( CurSysNum ).MixTempAtCoolPeak = 20.0;\n+\t\tFinalSysSizing( CurSysNum ).MixHumRatAtCoolPeak = 0.00089;\n+\t\tFinalSysSizing( CurSysNum ).DesMainVolFlow = 1.60894;\n+\t\tFinalSysSizing( CurSysNum ).HeatMixHumRat = 0.05;\n+\t\tFinalSysSizing( CurSysNum ).CoolSupHumRat = 0.07;\n+\t\tFinalSysSizing( CurSysNum ).HeatSupHumRat = 0.10;\n+\n+\t\t// resize the humidifier nominal capacity and gas use rate\n+\t\tthisHum.NomCapVol = 4.00E-5;\n+\t\tthisHum.NomPower = 103710;\n+\t\tOutBaroPress = 101325.0;\n+\t\tthisHum.SizeHumidifier();\n+\t\tEXPECT_DOUBLE_EQ( 0.040000010708118504, thisHum.NomCap );\n+\t\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.NomPower );\n+\n+\t\t// calculate gas use rate and energy at full load\n+\t\tthisHum.AirInMassFlowRate = 1.8919;\n+\t\tthisHum.AirInTemp = 20.0;\n+\t\tthisHum.AirInEnthalpy = 25000.0;\n+\t\tthisHum.InletWaterTempOption = 1;\n+\t\tthisHum.CurMakeupWaterTemp = 20.0;\n+\t\tOutBaroPress = 101325.0;\n+\n+\t\tthisHum.CalcGasSteamHumidifier( 0.040000010708118504 );\n+\t\tEXPECT_DOUBLE_EQ( 103710.42776358133, thisHum.GasUseRate );\n+\n+\t\tthisHum.ReportHumidifier();\n+\t\tEXPECT_DOUBLE_EQ( 93339384.987223208, thisHum.GasUseEnergy );\n+\t}\n+\n+\tTEST_F( HumidifiersFixture, GetHumidifierInput ) {\n+\t\tstd::string const idf_objects = delimited_string({\n+\t\t\t\"Version,8.3;\",\n+\t\t\t\"Humidifier:Steam:Gas,\",\n+\t\t\t\"  Main Gas Humidifier,     !- Name\",\n+\t\t\t\"  ,                        !- Availability Schedule Name\",\n+\t\t\t\"  autosize,                !- Rated Capacity {m3/s}\",\n+\t\t\t\"  autosize,                !- Rated Gas Use Rate {W}\",\n+\t\t\t\"  0.80,                    !- Thermal Efficiency {-} \",\n+\t\t\t\"  ThermalEfficiencyFPLR,   !- Thermal Efficiency Modifier Curve Name\",\n+\t\t\t\"  0,                       !- Rated Fan Power {W}\",\n+\t\t\t\"  0,                       !- Auxiliary Electric Power {W}\",\n+\t\t\t\"  Mixed Air Node 1,        !- Air Inlet Node Name\",\n+\t\t\t\"  Main Humidifier Outlet Node,  !- Air Outlet Node Name\",\n+\t\t\t\"  ;                        !- Water Storage Tank Name\",\n+\t\t\t\"  Curve:Cubic,\",\n+\t\t\t\"    ThermalEfficiencyFPLR,   !- Name\",\n+\t\t\t\"    1.0,                     !- Coefficient1 Constant\",\n+\t\t\t\"    0.0,                     !- Coefficient2 x\",\n+\t\t\t\"    0.0,                     !- Coefficient3 x**2\",\n+\t\t\t\"    0.0,                     !- Coefficient4 x**3\",\n+\t\t\t\"    0.0,                     !- Minimum Value of x\",\n+\t\t\t\"    1.5,                     !- Maximum Value of x\",\n+\t\t\t\"    ,                        !- Minimum Curve Output\",\n+\t\t\t\"    ,                        !- Maximum Curve Output\",\n+\t\t\t\"    Dimensionless,           !- Input Unit Type for X\",\n+\t\t\t\"    Dimensionless;           !- Output Unit Type\",\n+\t\t});\n+\n+\t\tASSERT_FALSE( process_idf( idf_objects ) );\n+\n+\t\tGetHumidifierInput();","path":"tst/EnergyPlus/unit/Humidifiers.unit.cc","position":500,"original_position":500,"commit_id":"59e9dd7b7fd49c3a8ca9f507b45eb7c544633854","original_commit_id":"59e9dd7b7fd49c3a8ca9f507b45eb7c544633854","user":{"login":"mbadams5","id":2001544,"avatar_url":"https://avatars.githubusercontent.com/u/2001544?v=3","gravatar_id":"","url":"https://api.github.com/users/mbadams5","html_url":"https://github.com/mbadams5","followers_url":"https://api.github.com/users/mbadams5/followers","following_url":"https://api.github.com/users/mbadams5/following{/other_user}","gists_url":"https://api.github.com/users/mbadams5/gists{/gist_id}","starred_url":"https://api.github.com/users/mbadams5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbadams5/subscriptions","organizations_url":"https://api.github.com/users/mbadams5/orgs","repos_url":"https://api.github.com/users/mbadams5/repos","events_url":"https://api.github.com/users/mbadams5/events{/privacy}","received_events_url":"https://api.github.com/users/mbadams5/received_events","type":"User","site_admin":false},"body":"@Nigusse I changed this test to use the new input processing capabilities. The assertions are the same as you had  and the only thing I changed was remove the IDD and IDF data structures creation. Instead it now uses process_idf() and the IDF snippet. Make sure this test is still what you intended, but I think it is.","created_at":"2015-07-11T17:13:18Z","updated_at":"2015-07-11T17:13:18Z","html_url":"https://github.com/NREL/EnergyPlus/pull/4998#discussion_r34414540","pull_request_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998","_links":{"self":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/comments/34414540"},"html":{"href":"https://github.com/NREL/EnergyPlus/pull/4998#discussion_r34414540"},"pull_request":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998"}}},"pull_request":{"url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998","id":38717140,"html_url":"https://github.com/NREL/EnergyPlus/pull/4998","diff_url":"https://github.com/NREL/EnergyPlus/pull/4998.diff","patch_url":"https://github.com/NREL/EnergyPlus/pull/4998.patch","issue_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/4998","number":4998,"state":"open","locked":false,"title":"Fix bugs in sqlite timeseries","user":{"login":"mbadams5","id":2001544,"avatar_url":"https://avatars.githubusercontent.com/u/2001544?v=3","gravatar_id":"","url":"https://api.github.com/users/mbadams5","html_url":"https://github.com/mbadams5","followers_url":"https://api.github.com/users/mbadams5/followers","following_url":"https://api.github.com/users/mbadams5/following{/other_user}","gists_url":"https://api.github.com/users/mbadams5/gists{/gist_id}","starred_url":"https://api.github.com/users/mbadams5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbadams5/subscriptions","organizations_url":"https://api.github.com/users/mbadams5/orgs","repos_url":"https://api.github.com/users/mbadams5/repos","events_url":"https://api.github.com/users/mbadams5/events{/privacy}","received_events_url":"https://api.github.com/users/mbadams5/received_events","type":"User","site_admin":false},"body":"This fixes two bugs in the SQLite time series data where interval periods are incorrect or meters are missing time indexes. I added a bunch of unit tests to test upstream of the SQLite class. There are now unit tests at each of the points in OutputProcessor where it interacts with the SQLite class. \r\n\r\nThis should fix both bugs from my unit tests and manual testing, although I would like other people to test this branch as well. \r\n\r\nI also found a bug in DetermineIndexGroupKeyFromMeterName from adding unit tests. Also, DateToStringWithMonth didn't have enough validation to pass all my new unit tests so I refactored the code after creating quite a few failing tests. That function probably never got passed invalid data so it was never an issue but now it is more robust.\r\n\r\nI also moved the SQLiteFixture to its own header file in a 'fixtures' folder in the unit test folder. I did this since it is now used by both the SQLite.unit.cc and OutputProcessor.unit.cc\r\n\r\n===================== Update =========================\r\n\r\nWell this one definitely got away from me quickly.... What started out as a fairly simple bug fix turned into massive Input/Output testing and a new unit testing framework to process IDFs. This is the huge new addition. Now you can pass in an IDF snippet and have it run through the normal InputProcessor routines to fill out the global data structures. This paves the way to call GetFooInput() for any object without having to generate that global data yourself. Generating the data is error prone and can easily cause issues between different unit tests as @Nigusse and others have noticed.\r\n\r\nSo now in a unit test you use the EnergyPlusFixture (or any derived fixtures from that fixture) and this allows you to call process_idf(). You need to pass in a valid IDF snippet otherwise process_idf() will return false and may output more specific error messages as well (the same as ProcessInput() in InputProcessor). Another advantage of these fixtures is that they clear the global state of the various namespaces on TearDown() meaning at the end of every individual unit test run. This is done through a new clear_state() function in the namespace (not all namespaces have it yet, I was going through on an as need basis for now). As part of all this, the EnergyPlusFixture reads in the full Energy+.idd (that is output to the Products folder) and after the first call, will cache it. Then all subsequent calls (within that same executable run) should use this cached IDD saving time on unit testing. \r\n\r\nI refactored some of the Humidifiers, MixedAir, and HeatBalanceManager unit tests to take advantage of this new framework and to show how to use it. There are also examples in the many new unit tests for OutputProcessor and InputProcessor as well as unit tests for my new helper classes.\r\n\r\nThe pattern i've started is that all fixtures derive from EnergyPlusFixture and you only create a new fixture if it adds needed functionality not captured in EnergyPlusFixture AND is not appropriate to add to EnergyPlusFixture. I tried to make a hierarchy and start making the fixtures adhere to OOP. Another pattern I started to use is for each namespace or unit test type I use a typedef to make the name specific and useful without adding a new fixture. For example, \r\n```c++\r\ntypedef HVACFixture HumidifiersFixture;\r\ntypedef HVACFixture HumidifiersDeathTestFixture;\r\n```\r\nFor the Humidifiers unit tests, they use HumidifiersFixture as the test case name BUT really they are just using HVACFixture and not a new fixture called HumidifiersFixture. This way it has a descriptive name, but doesn't require extra coding to create a new fixture when it doesn't add any new functionality.\r\n\r\nAlso notice the HumidifiersDeathTestFixture, I think we should separate DeathTests from normal tests. An example of a death test is [here](https://github.com/NREL/EnergyPlus/blob/1ea3d1b1229da3c5307739581cf0fd16b7ce2181/tst/EnergyPlus/unit/OutputProcessor.unit.cc#L2147). These are tests where you expect the program to not exit normally. In this case, ShowFatalError() is called and exits EnergyPlus. This allows us to test code paths that will cause program termination and make sure it happens how we expect.\r\n\r\nYou can now compare an expected string against the ESO, MTR, ECHO, COUT, and CERR streams as well as see if there is or is not any output on those streams.\r\n\r\nThere is a compare_containers function that will compare two different containers (either STL OR ObjexxFCL). It will make sure the two containers are the same size then iterate through each item in the container comparing the items. If they differ it will show the difference and at what index (zero based) they differ. Example usage...\r\n```c++\r\nEXPECT_TRUE( compare_containers< std::vector< bool > >( { true } , ObjectDef( index ).AlphaOrNumeric ) );\r\nEXPECT_TRUE( compare_containers< Array1D_bool >( { true } , ObjectDef( index ).AlphaOrNumeric ) );\r\n```\r\n\r\nOh and just for you @mjwitte, the EnergyPlusFixture will automatically call ShowMessage( \"Begin Test: \" ) on every individual unit test run, putting the test case name and test name into that message. No need to put that message into every unit test anymore.\r\n\r\nThe overall unit test coverage increased from 5.49% to 6.99%. InputProcessor.cc went from 7.0% to 58.9% and OutputProcessor.cc went from 17.3% to 65.6%.\r\n\r\n@kbenne @macumber @asparke2 @Myoldmopar \r\n\r\nFixes #4979 \r\n[Fixes #97920946]\r\n\r\nFixes #4982 \r\n[Fixes #97921020]\r\n\r\n[Delivers #98501064]","created_at":"2015-06-27T23:17:13Z","updated_at":"2015-07-11T17:13:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"322e90b3a0abb2da670573481c64d93309b6eb19","assignee":{"login":"kbenne","id":707488,"avatar_url":"https://avatars.githubusercontent.com/u/707488?v=3","gravatar_id":"","url":"https://api.github.com/users/kbenne","html_url":"https://github.com/kbenne","followers_url":"https://api.github.com/users/kbenne/followers","following_url":"https://api.github.com/users/kbenne/following{/other_user}","gists_url":"https://api.github.com/users/kbenne/gists{/gist_id}","starred_url":"https://api.github.com/users/kbenne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kbenne/subscriptions","organizations_url":"https://api.github.com/users/kbenne/orgs","repos_url":"https://api.github.com/users/kbenne/repos","events_url":"https://api.github.com/users/kbenne/events{/privacy}","received_events_url":"https://api.github.com/users/kbenne/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998/commits","review_comments_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998/comments","review_comment_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/4998/comments","statuses_url":"https://api.github.com/repos/NREL/EnergyPlus/statuses/59e9dd7b7fd49c3a8ca9f507b45eb7c544633854","head":{"label":"NREL:sqlite_timeseries","ref":"sqlite_timeseries","sha":"59e9dd7b7fd49c3a8ca9f507b45eb7c544633854","user":{"login":"NREL","id":1906800,"avatar_url":"https://avatars.githubusercontent.com/u/1906800?v=3","gravatar_id":"","url":"https://api.github.com/users/NREL","html_url":"https://github.com/NREL","followers_url":"https://api.github.com/users/NREL/followers","following_url":"https://api.github.com/users/NREL/following{/other_user}","gists_url":"https://api.github.com/users/NREL/gists{/gist_id}","starred_url":"https://api.github.com/users/NREL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NREL/subscriptions","organizations_url":"https://api.github.com/users/NREL/orgs","repos_url":"https://api.github.com/users/NREL/repos","events_url":"https://api.github.com/users/NREL/events{/privacy}","received_events_url":"https://api.github.com/users/NREL/received_events","type":"Organization","site_admin":false},"repo":{"id":14620185,"name":"EnergyPlus","full_name":"NREL/EnergyPlus","owner":{"login":"NREL","id":1906800,"avatar_url":"https://avatars.githubusercontent.com/u/1906800?v=3","gravatar_id":"","url":"https://api.github.com/users/NREL","html_url":"https://github.com/NREL","followers_url":"https://api.github.com/users/NREL/followers","following_url":"https://api.github.com/users/NREL/following{/other_user}","gists_url":"https://api.github.com/users/NREL/gists{/gist_id}","starred_url":"https://api.github.com/users/NREL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NREL/subscriptions","organizations_url":"https://api.github.com/users/NREL/orgs","repos_url":"https://api.github.com/users/NREL/repos","events_url":"https://api.github.com/users/NREL/events{/privacy}","received_events_url":"https://api.github.com/users/NREL/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NREL/EnergyPlus","description":"","fork":false,"url":"https://api.github.com/repos/NREL/EnergyPlus","forks_url":"https://api.github.com/repos/NREL/EnergyPlus/forks","keys_url":"https://api.github.com/repos/NREL/EnergyPlus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NREL/EnergyPlus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NREL/EnergyPlus/teams","hooks_url":"https://api.github.com/repos/NREL/EnergyPlus/hooks","issue_events_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/events{/number}","events_url":"https://api.github.com/repos/NREL/EnergyPlus/events","assignees_url":"https://api.github.com/repos/NREL/EnergyPlus/assignees{/user}","branches_url":"https://api.github.com/repos/NREL/EnergyPlus/branches{/branch}","tags_url":"https://api.github.com/repos/NREL/EnergyPlus/tags","blobs_url":"https://api.github.com/repos/NREL/EnergyPlus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NREL/EnergyPlus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NREL/EnergyPlus/git/refs{/sha}","trees_url":"https://api.github.com/repos/NREL/EnergyPlus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NREL/EnergyPlus/statuses/{sha}","languages_url":"https://api.github.com/repos/NREL/EnergyPlus/languages","stargazers_url":"https://api.github.com/repos/NREL/EnergyPlus/stargazers","contributors_url":"https://api.github.com/repos/NREL/EnergyPlus/contributors","subscribers_url":"https://api.github.com/repos/NREL/EnergyPlus/subscribers","subscription_url":"https://api.github.com/repos/NREL/EnergyPlus/subscription","commits_url":"https://api.github.com/repos/NREL/EnergyPlus/commits{/sha}","git_commits_url":"https://api.github.com/repos/NREL/EnergyPlus/git/commits{/sha}","comments_url":"https://api.github.com/repos/NREL/EnergyPlus/comments{/number}","issue_comment_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/comments{/number}","contents_url":"https://api.github.com/repos/NREL/EnergyPlus/contents/{+path}","compare_url":"https://api.github.com/repos/NREL/EnergyPlus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NREL/EnergyPlus/merges","archive_url":"https://api.github.com/repos/NREL/EnergyPlus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NREL/EnergyPlus/downloads","issues_url":"https://api.github.com/repos/NREL/EnergyPlus/issues{/number}","pulls_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls{/number}","milestones_url":"https://api.github.com/repos/NREL/EnergyPlus/milestones{/number}","notifications_url":"https://api.github.com/repos/NREL/EnergyPlus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NREL/EnergyPlus/labels{/name}","releases_url":"https://api.github.com/repos/NREL/EnergyPlus/releases{/id}","created_at":"2013-11-22T14:47:34Z","updated_at":"2015-07-07T12:43:44Z","pushed_at":"2015-07-11T17:02:53Z","git_url":"git://github.com/NREL/EnergyPlus.git","ssh_url":"git@github.com:NREL/EnergyPlus.git","clone_url":"https://github.com/NREL/EnergyPlus.git","svn_url":"https://github.com/NREL/EnergyPlus","homepage":null,"size":420723,"stargazers_count":57,"watchers_count":57,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":44,"mirror_url":null,"open_issues_count":445,"forks":44,"open_issues":445,"watchers":57,"default_branch":"develop"}},"base":{"label":"NREL:develop","ref":"develop","sha":"2787adb41a435de814011a1134e7675d4de9450f","user":{"login":"NREL","id":1906800,"avatar_url":"https://avatars.githubusercontent.com/u/1906800?v=3","gravatar_id":"","url":"https://api.github.com/users/NREL","html_url":"https://github.com/NREL","followers_url":"https://api.github.com/users/NREL/followers","following_url":"https://api.github.com/users/NREL/following{/other_user}","gists_url":"https://api.github.com/users/NREL/gists{/gist_id}","starred_url":"https://api.github.com/users/NREL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NREL/subscriptions","organizations_url":"https://api.github.com/users/NREL/orgs","repos_url":"https://api.github.com/users/NREL/repos","events_url":"https://api.github.com/users/NREL/events{/privacy}","received_events_url":"https://api.github.com/users/NREL/received_events","type":"Organization","site_admin":false},"repo":{"id":14620185,"name":"EnergyPlus","full_name":"NREL/EnergyPlus","owner":{"login":"NREL","id":1906800,"avatar_url":"https://avatars.githubusercontent.com/u/1906800?v=3","gravatar_id":"","url":"https://api.github.com/users/NREL","html_url":"https://github.com/NREL","followers_url":"https://api.github.com/users/NREL/followers","following_url":"https://api.github.com/users/NREL/following{/other_user}","gists_url":"https://api.github.com/users/NREL/gists{/gist_id}","starred_url":"https://api.github.com/users/NREL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NREL/subscriptions","organizations_url":"https://api.github.com/users/NREL/orgs","repos_url":"https://api.github.com/users/NREL/repos","events_url":"https://api.github.com/users/NREL/events{/privacy}","received_events_url":"https://api.github.com/users/NREL/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NREL/EnergyPlus","description":"","fork":false,"url":"https://api.github.com/repos/NREL/EnergyPlus","forks_url":"https://api.github.com/repos/NREL/EnergyPlus/forks","keys_url":"https://api.github.com/repos/NREL/EnergyPlus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NREL/EnergyPlus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NREL/EnergyPlus/teams","hooks_url":"https://api.github.com/repos/NREL/EnergyPlus/hooks","issue_events_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/events{/number}","events_url":"https://api.github.com/repos/NREL/EnergyPlus/events","assignees_url":"https://api.github.com/repos/NREL/EnergyPlus/assignees{/user}","branches_url":"https://api.github.com/repos/NREL/EnergyPlus/branches{/branch}","tags_url":"https://api.github.com/repos/NREL/EnergyPlus/tags","blobs_url":"https://api.github.com/repos/NREL/EnergyPlus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NREL/EnergyPlus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NREL/EnergyPlus/git/refs{/sha}","trees_url":"https://api.github.com/repos/NREL/EnergyPlus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NREL/EnergyPlus/statuses/{sha}","languages_url":"https://api.github.com/repos/NREL/EnergyPlus/languages","stargazers_url":"https://api.github.com/repos/NREL/EnergyPlus/stargazers","contributors_url":"https://api.github.com/repos/NREL/EnergyPlus/contributors","subscribers_url":"https://api.github.com/repos/NREL/EnergyPlus/subscribers","subscription_url":"https://api.github.com/repos/NREL/EnergyPlus/subscription","commits_url":"https://api.github.com/repos/NREL/EnergyPlus/commits{/sha}","git_commits_url":"https://api.github.com/repos/NREL/EnergyPlus/git/commits{/sha}","comments_url":"https://api.github.com/repos/NREL/EnergyPlus/comments{/number}","issue_comment_url":"https://api.github.com/repos/NREL/EnergyPlus/issues/comments{/number}","contents_url":"https://api.github.com/repos/NREL/EnergyPlus/contents/{+path}","compare_url":"https://api.github.com/repos/NREL/EnergyPlus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NREL/EnergyPlus/merges","archive_url":"https://api.github.com/repos/NREL/EnergyPlus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NREL/EnergyPlus/downloads","issues_url":"https://api.github.com/repos/NREL/EnergyPlus/issues{/number}","pulls_url":"https://api.github.com/repos/NREL/EnergyPlus/pulls{/number}","milestones_url":"https://api.github.com/repos/NREL/EnergyPlus/milestones{/number}","notifications_url":"https://api.github.com/repos/NREL/EnergyPlus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NREL/EnergyPlus/labels{/name}","releases_url":"https://api.github.com/repos/NREL/EnergyPlus/releases{/id}","created_at":"2013-11-22T14:47:34Z","updated_at":"2015-07-07T12:43:44Z","pushed_at":"2015-07-11T17:02:53Z","git_url":"git://github.com/NREL/EnergyPlus.git","ssh_url":"git@github.com:NREL/EnergyPlus.git","clone_url":"https://github.com/NREL/EnergyPlus.git","svn_url":"https://github.com/NREL/EnergyPlus","homepage":null,"size":420723,"stargazers_count":57,"watchers_count":57,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":44,"mirror_url":null,"open_issues_count":445,"forks":44,"open_issues":445,"watchers":57,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998"},"html":{"href":"https://github.com/NREL/EnergyPlus/pull/4998"},"issue":{"href":"https://api.github.com/repos/NREL/EnergyPlus/issues/4998"},"comments":{"href":"https://api.github.com/repos/NREL/EnergyPlus/issues/4998/comments"},"review_comments":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998/comments"},"review_comment":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NREL/EnergyPlus/pulls/4998/commits"},"statuses":{"href":"https://api.github.com/repos/NREL/EnergyPlus/statuses/59e9dd7b7fd49c3a8ca9f507b45eb7c544633854"}}}}