Skip to content

Commit

Permalink
Merge pull request #6085 from NREL/revert-6039-NewErrorWhenHoursShown…
Browse files Browse the repository at this point in the history
…InFirstColumnOfTable

Revert "New error for Output:Table:Monthly and Annual don't have proper order for aggregation types"
  • Loading branch information
Myoldmopar authored Mar 30, 2017
2 parents df3c0af + 475830e commit 78a111d
Show file tree
Hide file tree
Showing 6 changed files with 1 addition and 197 deletions.
53 changes: 1 addition & 52 deletions src/EnergyPlus/OutputReportTabular.cc
Original file line number Diff line number Diff line change
Expand Up @@ -695,16 +695,12 @@ namespace OutputReportTabular {
if ( UpdateTabularReportsGetInput ) {
GetInputTabularMonthly();
OutputReportTabularAnnual::GetInputTabularAnnual();
OutputReportTabularAnnual::checkAggregationOrderForAnnual();
GetInputTabularTimeBins();
GetInputTabularStyle();
GetInputOutputTableSummaryReports();
// noel -- noticed this was called once and very slow -- sped up a little by caching keys
InitializeTabularMonthly();
if ( isInvalidAggregationOrder( ) ) {
ShowFatalError( "OutputReportTabular: Invalid aggregations detected, no simulation performed." );
}
GetInputFuelAndPollutionFactors( );
GetInputFuelAndPollutionFactors();
SetupUnitConversions();
AddTOCZoneLoadComponentTable();
UpdateTabularReportsGetInput = false;
Expand Down Expand Up @@ -1411,53 +1407,6 @@ namespace OutputReportTabular {
//#endif
}

bool
isInvalidAggregationOrder( )
{
bool foundError = false;
if ( !DoWeathSim ) {// if no weather simulation than no reading of MonthlyInput array
return foundError;
}
for ( int iInput = 1; iInput <= MonthlyInputCount; ++iInput ) {
bool foundMinOrMax = false;
bool foundHourAgg = false;
bool missingMaxOrMinError = false;
bool missingHourAggError = false;
for ( int jTable = 1; jTable <= MonthlyInput( iInput ).numTables; ++jTable ) {
int curTable = jTable + MonthlyInput( iInput ).firstTable - 1;
// test if the aggregation types are in the correct order
for ( int kColumn = 1; kColumn <= MonthlyTables( curTable ).numColumns; ++kColumn ) {
int curCol = kColumn + MonthlyTables( curTable ).firstColumn - 1;
int curAggType = MonthlyColumns( curCol ).aggType;
if ( ( curAggType == aggTypeMaximum ) || ( curAggType == aggTypeMinimum ) ) {
foundMinOrMax = true;
} else if ( ( curAggType == aggTypeHoursNonZero ) || ( curAggType == aggTypeHoursZero ) ||
( curAggType == aggTypeHoursPositive ) || ( curAggType == aggTypeHoursNonPositive ) ||
( curAggType == aggTypeHoursNegative ) || ( curAggType == aggTypeHoursNonNegative ) ) {
foundHourAgg = true;
} else if ( curAggType == aggTypeValueWhenMaxMin ) {
if ( !foundMinOrMax ) {
missingMaxOrMinError = true;
}
} else if ( ( curAggType == aggTypeSumOrAverageHoursShown ) || ( curAggType == aggTypeMaximumDuringHoursShown ) || ( curAggType == aggTypeMinimumDuringHoursShown ) ) {
if ( !foundHourAgg ) {
missingHourAggError = true;
}
}
}
}
if ( missingMaxOrMinError ) {
ShowSevereError( "The Output:Table:Monthly report named=\"" + MonthlyInput( iInput ).name + "\" has a valueWhenMaxMin aggregation type for a column without a previous column that uses either the minimum or maximum aggregation types. The report will not be generated." );
foundError = true;
}
if ( missingHourAggError ) {
ShowSevereError( "The Output:Table:Monthly report named=\"" + MonthlyInput( iInput ).name + "\" has a --DuringHoursShown aggregation type for a column without a previous field that uses one of the Hour-- aggregation types. The report will not be generated." );
foundError = true;
}
}
return foundError;
}

void
GetInputTabularTimeBins()
{
Expand Down
3 changes: 0 additions & 3 deletions src/EnergyPlus/OutputReportTabular.hh
Original file line number Diff line number Diff line change
Expand Up @@ -629,9 +629,6 @@ namespace OutputReportTabular {
void
InitializeTabularMonthly();

bool
isInvalidAggregationOrder();

void
GetInputTabularTimeBins();

Expand Down
62 changes: 0 additions & 62 deletions src/EnergyPlus/OutputReportTabularAnnual.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@
#include <General.hh>
#include <SQLiteProcedures.hh>
#include <ScheduleManager.hh>
#include <DisplayRoutines.hh>


namespace EnergyPlus {
Expand Down Expand Up @@ -119,7 +118,6 @@ namespace EnergyPlus {
InputProcessor::GetObjectDefMaxArgs( currentModuleObject, numParams, numAlphas, numNums );
alphArray.allocate( numAlphas );
numArray.dimension( numNums, 0.0 );

for ( int tabNum = 1 ; tabNum <= objCount; ++tabNum ) {
InputProcessor::GetObjectItem( currentModuleObject, tabNum, alphArray, numAlphas, numArray, numNums, IOStat );
if ( numAlphas >= 5 ) {
Expand Down Expand Up @@ -151,7 +149,6 @@ namespace EnergyPlus {
}
}


void
AnnualTable::addFieldSet( std::string varName, AnnualFieldSet::AggregationKind aggKind, int dgts)
// Jason Glazer, August 2015
Expand Down Expand Up @@ -249,65 +246,6 @@ namespace EnergyPlus {
}
}

void
checkAggregationOrderForAnnual( )
{
std::vector<AnnualTable>::iterator annualTableIt;
bool invalidAggregationOrderFound = false;
if ( !DataGlobals::DoWeathSim ) {// if no weather simulation than no reading of MonthlyInput array
return;
}
for ( annualTableIt = annualTables.begin( ); annualTableIt != annualTables.end( ); ++annualTableIt ) {
if ( annualTableIt->invalidAggregationOrder( ) ) {
invalidAggregationOrderFound = true;
}
}
if ( invalidAggregationOrderFound ) {
ShowFatalError( "OutputReportTabularAnnual: Invalid aggregations detected, no simulation performed." );
}
}

// Generate an error message if an advanced aggregation kind columns don't follow the appropriate column - Glazer 2017
bool
AnnualTable::invalidAggregationOrder( )
{
std::vector<AnnualFieldSet>::iterator fldStIt;
bool foundMinOrMax = false;
bool foundHourAgg = false;
bool missingMaxOrMinError = false;
bool missingHourAggError = false;
for ( fldStIt = m_annualFields.begin( ); fldStIt != m_annualFields.end( ); ++fldStIt ) {
if ( ( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::maximum ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::minimum ) ) {
foundMinOrMax = true;
} else if ( ( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursNonZero ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursZero ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursPositive ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursNonPositive ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursNegative ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::hoursNonNegative ) ){
foundHourAgg = true;
} else if ( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::valueWhenMaxMin ){
if ( !foundMinOrMax ) {
missingMaxOrMinError = true;
}
} else if ( ( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::sumOrAverageHoursShown ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::maximumDuringHoursShown ) ||
( fldStIt->m_aggregate == AnnualFieldSet::AggregationKind::minimumDuringHoursShown ) ){
if ( !foundHourAgg ) {
missingHourAggError = true;
}
}
}
if ( missingMaxOrMinError ) {
ShowSevereError( "The Output:Table:Annual report named=\"" + m_name + "\" has a valueWhenMaxMin aggregation type for a column without a previous column that uses either the minimum or maximum aggregation types. The report will not be generated." );
}
if ( missingHourAggError ) {
ShowSevereError( "The Output:Table:Annual report named=\"" + m_name + "\" has a --DuringHoursShown aggregation type for a column without a previous field that uses one of the Hour-- aggregation types. The report will not be generated." );
}
return ( missingHourAggError || missingMaxOrMinError );
}


void
GatherAnnualResultsForTimeStep( int kindOfTimeStep )
Expand Down
6 changes: 0 additions & 6 deletions src/EnergyPlus/OutputReportTabularAnnual.hh
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,6 @@ namespace OutputReportTabularAnnual {
void
GetInputTabularAnnual();

void
checkAggregationOrderForAnnual();

void
GatherAnnualResultsForTimeStep( int kindOfTypeStep );

Expand Down Expand Up @@ -133,9 +130,6 @@ public:
void
setupGathering();

bool
invalidAggregationOrder();

void
gatherForTimestep( int kindOfTypeStep );

Expand Down
37 changes: 0 additions & 37 deletions tst/EnergyPlus/unit/OutputReportTabular.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5973,40 +5973,3 @@ TEST_F( SQLiteFixture, WriteVeriSumTableAreasTest ) {
EXPECT_EQ( " 114.72", tabularData[103][10] ); // window opening area

}


TEST_F( EnergyPlusFixture, OutputReportTabularMonthly_invalidAggregationOrder )
{
std::string const idf_objects = delimited_string( {
"Version,8.3;",
"Output:Table:Monthly,",
"Space Gains Annual Report, !- Name",
"2, !- Digits After Decimal",
"Exterior Lights Electric Energy, !- Variable or Meter 1 Name",
"SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 1",
"Exterior Lights Electric Power, !- Variable or Meter 2 Name",
"Maximum, !- Aggregation Type for Variable or Meter 2",
"Exterior Lights Electric Power, !- Variable or Meter 2 Name",
"Minimum; !- Aggregation Type for Variable or Meter 2",

} );

ASSERT_FALSE( process_idf( idf_objects ) );

Real64 extLitUse;

SetupOutputVariable( "Exterior Lights Electric Energy [J]", extLitUse, "Zone", "Sum", "Lite1", _, "Electricity", "Exterior Lights", "General" );
SetupOutputVariable( "Exterior Lights Electric Energy [J]", extLitUse, "Zone", "Sum", "Lite2", _, "Electricity", "Exterior Lights", "General" );
SetupOutputVariable( "Exterior Lights Electric Energy [J]", extLitUse, "Zone", "Sum", "Lite3", _, "Electricity", "Exterior Lights", "General" );

DataGlobals::DoWeathSim = true;
DataGlobals::TimeStepZone = 0.25;

GetInputTabularMonthly( );
EXPECT_EQ( MonthlyInputCount, 1 );
InitializeTabularMonthly( );

EXPECT_TRUE(isInvalidAggregationOrder());

}

37 changes: 0 additions & 37 deletions tst/EnergyPlus/unit/OutputReportTabularAnnual.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -272,40 +272,3 @@ TEST_F(EnergyPlusFixture, OutputReportTabularAnnual_columnHeadersToTitleCase)

}

TEST_F( EnergyPlusFixture, OutputReportTabularAnnual_invalidAggregationOrder )
{
std::string const idf_objects = delimited_string( {
"Version,8.7;",
"Output:Table:Annual,",
"Test Report, !- Name",
", !- Filter",
", !- Schedule Name",
"Electricity:Facility, !- Variable or Meter 2 Name",
"SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2",
", !- field Digits After Decimal 2",
"Misc Facility Electric Energy, !- Variable or Meter 3 Name",
"SumOrAverage, !- Aggregation Type for Variable or Meter 3",
"0; !- field Digits After Decimal 3",
} );

ASSERT_FALSE( process_idf( idf_objects ) );

Real64 facilUse;
SetupOutputVariable( "Misc Facility Electric Energy [J]", facilUse, "Zone", "Sum", "Lite1", _, "Electricity", "Facility", "General" ); //create an electric meter

OutputProcessor::NumEnergyMeters = 2;
OutputProcessor::EnergyMeters.allocate( OutputProcessor::NumEnergyMeters );
OutputProcessor::EnergyMeters( 1 ).Name = "Electricity:Facility"; //"ELECTRICITY:FACILITY";
OutputProcessor::EnergyMeters( 2 ).Name = "ELECTRICITY:LIGHTING";

DataGlobals::DoWeathSim = true;

OutputReportTabularAnnual::GetInputTabularAnnual( );

EXPECT_EQ( OutputReportTabularAnnual::annualTables.size( ), 1u );

std::vector<AnnualTable>::iterator firstTable = OutputReportTabularAnnual::annualTables.begin( );

EXPECT_TRUE( firstTable->invalidAggregationOrder( ) );

}

32 comments on commit 78a111d

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-MacOS-10.9-clang: OK (1892 of 1892 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8: OK (1912 of 1912 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-cppcheck-1.61: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-UnitTestsCoverage-Debug: OK (1294 of 1294 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-IntegrationCoverage-Debug: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-custom_check: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - i386-Windows-7-VisualStudio-14: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - Win64-Windows-7-VisualStudio-14: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-MacOS-10.9-clang: OK (2488 of 2488 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-MacOS-10.9-clang: OK (2488 of 2488 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8: OK (2528 of 2528 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-cppcheck-1.61: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-UnitTestsCoverage-Debug: OK (1294 of 1294 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-IntegrationCoverage-Debug: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-custom_check: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - i386-Windows-7-VisualStudio-14: OK (2494 of 2494 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AllowMultipleSolversToFindARoot (Myoldmopar) - Win64-Windows-7-VisualStudio-14: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8: OK (1912 of 1912 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-cppcheck-1.61: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-UnitTestsCoverage-Debug: OK (1294 of 1294 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-IntegrationCoverage-Debug: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-custom_check: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - i386-Windows-7-VisualStudio-14: OK (2494 of 2494 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ProportionalDCVEnhancements (Myoldmopar) - Win64-Windows-7-VisualStudio-14: OK (2494 of 2494 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-MacOS-10.9-clang: OK (2488 of 2488 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8: OK (2528 of 2528 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-cppcheck-1.61: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-UnitTestsCoverage-Debug: OK (1294 of 1294 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-IntegrationCoverage-Debug: OK (1895 of 1895 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - x86_64-Linux-Ubuntu-14.04-custom_check: OK (0 of 0 tests passed, 0 test warnings)

Build Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - i386-Windows-7-VisualStudio-14: OK (2494 of 2494 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6105-HW-supplemental-heating-coil-in-AirloopHVAC-UnitarySystem-not-controlling-to-set-point (Myoldmopar) - Win64-Windows-7-VisualStudio-14: OK (2494 of 2494 tests passed, 0 test warnings)

Build Badge Test Badge

Please sign in to comment.