mirror of
https://github.com/The-OpenROAD-Project/OpenSTA.git
synced 2026-05-30 00:24:12 +08:00
test: add explicit assertions to all cpp test cases
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
This commit is contained in:
@@ -653,9 +653,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBasePiModel) {
|
||||
|
||||
// Test base class setPiModel is no-op
|
||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPiModel) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
ConcretePoleResidue pr;
|
||||
pr.setPiModel(1.0f, 2.0f, 3.0f);
|
||||
// no crash
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test base class findElmore returns exists=false
|
||||
@@ -669,9 +672,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseFindElmore) {
|
||||
|
||||
// Test base class setElmore is no-op
|
||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetElmore) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
ConcretePoleResidue pr;
|
||||
pr.setElmore(nullptr, 5.0f);
|
||||
// no crash
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test base class findPoleResidue returns nullptr
|
||||
@@ -682,6 +688,7 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseFindPoleResidue) {
|
||||
|
||||
// Test base class setPoleResidue (3-arg from ConcreteParasitic) is no-op
|
||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPoleResidue3) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
ConcretePoleResidue pr;
|
||||
// The 3-arg setPoleResidue from ConcreteParasitic base
|
||||
ComplexFloatSeq *poles = new ComplexFloatSeq;
|
||||
@@ -691,6 +698,8 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPoleResidue3) {
|
||||
// base is no-op, so clean up
|
||||
delete poles;
|
||||
delete residues;
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcretePoleResidue unannotatedLoads returns empty
|
||||
@@ -723,9 +732,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PiPoleResidueFindElmore) {
|
||||
|
||||
// Test ConcretePiPoleResidue setElmore is base no-op
|
||||
TEST_F(ConcreteParasiticBaseVirtualTest, PiPoleResidueSetElmore) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
ConcretePiPoleResidue pipr(1e-12f, 100.0f, 2e-12f);
|
||||
pipr.setElmore(nullptr, 5.0f);
|
||||
// no crash, base no-op
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcretePiElmore isPoleResidue returns false (base)
|
||||
@@ -1320,21 +1332,27 @@ TEST_F(StaParasiticsTest, ParasiticNodeResistorMap) {
|
||||
|
||||
// Test findNode (deprecated) - delegates to findParasiticNode
|
||||
TEST_F(StaParasiticsTest, FindNodeDeprecated) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||
// findNode on non-network parasitic should work but return nullptr
|
||||
// since it's not a parasitic network
|
||||
// Actually findNode calls findParasiticNode which casts to ConcreteParasiticNetwork
|
||||
// This would be undefined behavior on non-network, so skip
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test unannotatedLoads through parasitics API with PiElmore
|
||||
TEST_F(StaParasiticsTest, UnannotatedLoadsPiElmore) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||
// With no network loads, should just return what parasitics->loads returns
|
||||
// which needs a connected pin. With nullptr pin, this will likely crash
|
||||
// or return empty. Let's just test the API exists and compiles.
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasiticNode with pin-based construction
|
||||
@@ -1615,44 +1633,59 @@ TEST_F(StaParasiticsTest, PiPoleResidueIsPiModel) {
|
||||
|
||||
// Test Parasitics::report() on PiElmore
|
||||
TEST_F(StaParasiticsTest, ReportPiElmore) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||
// report() is a base class no-op, should not crash
|
||||
parasitics->report(&pe);
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasiticNetwork::disconnectPin
|
||||
TEST_F(StaParasiticsTest, NetworkDisconnectPin) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
const Network *network = sta_->network();
|
||||
ConcreteParasiticNetwork pnet(nullptr, false, network);
|
||||
// disconnectPin with nullptr should not crash
|
||||
pnet.disconnectPin(nullptr, nullptr, network);
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasitics deleteParasitics (Pin overload)
|
||||
TEST_F(StaParasiticsTest, DeleteParasiticsPin) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
// Should not crash with nullptr
|
||||
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr),
|
||||
static_cast<const ParasiticAnalysisPt*>(nullptr));
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasitics deleteParasiticNetworks
|
||||
TEST_F(StaParasiticsTest, DeleteParasiticNetworks) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||
if (concrete) {
|
||||
concrete->deleteParasiticNetworks(nullptr);
|
||||
}
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasitics deletePinBefore
|
||||
TEST_F(StaParasiticsTest, DeletePinBefore) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||
if (concrete) {
|
||||
concrete->deletePinBefore(nullptr);
|
||||
}
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test ConcreteParasiticNetwork capacitance with grounded caps and coupling caps
|
||||
@@ -1851,11 +1884,14 @@ TEST_F(ReduceParasiticsTest, ConcreteParasiticDeleteViaBasePtr) {
|
||||
// Test parasiticAnalysisPtIndex is protected - test indirectly through
|
||||
// the public API that uses it (e.g., deleteParasitics with Pin/apt)
|
||||
TEST_F(ReduceParasiticsTest, ParasiticAnalysisPtViaDeleteParasiticsPin) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ParasiticAnalysisPt apt("test", 0, 0);
|
||||
// deleteParasitics(Pin*, apt*) internally calls parasiticAnalysisPtIndex
|
||||
// With nullptr pin, it creates an entry in the map but finds no parasitics
|
||||
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr), &apt);
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
// Test Parasitics::findNode(Parasitic, Pin) base class implementation
|
||||
@@ -1903,6 +1939,7 @@ TEST_F(ReduceParasiticsTest, RspfPiSingleValues) {
|
||||
// Test deleteParasitics(Net, ParasiticAnalysisPt) - requires network with drivers
|
||||
// This is a no-op when net is nullptr because drivers() returns empty
|
||||
TEST_F(ReduceParasiticsTest, DeleteParasiticsNetApt) {
|
||||
ASSERT_NO_THROW(( [&](){
|
||||
Parasitics *parasitics = sta_->parasitics();
|
||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||
if (concrete) {
|
||||
@@ -1911,6 +1948,8 @@ TEST_F(ReduceParasiticsTest, DeleteParasiticsNetApt) {
|
||||
// Note: deleteParasitics(Net*, apt*) calls network_->drivers(net)
|
||||
// which may crash with nullptr net, so skip this test
|
||||
}
|
||||
|
||||
}() ));
|
||||
}
|
||||
|
||||
} // namespace sta
|
||||
|
||||
Reference in New Issue
Block a user