test: add explicit assertions to all cpp test cases
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
This commit is contained in:
parent
10104f85ea
commit
a58d7e4cc6
|
|
@ -2478,9 +2478,12 @@ TEST_F(ArcDcalcResultTest, MultipleLoadSetGet) {
|
||||||
|
|
||||||
// NetCaps additional coverage - default constructor doesn't zero-init
|
// NetCaps additional coverage - default constructor doesn't zero-init
|
||||||
TEST_F(StaDcalcTest, NetCapsDefaultConstructorExists) {
|
TEST_F(StaDcalcTest, NetCapsDefaultConstructorExists) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
NetCaps caps;
|
NetCaps caps;
|
||||||
// Default constructor doesn't initialize members, just verify construction
|
// Default constructor doesn't initialize members, just verify construction
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, NetCapsParameterizedConstructor) {
|
TEST_F(StaDcalcTest, NetCapsParameterizedConstructor) {
|
||||||
|
|
@ -2523,33 +2526,48 @@ TEST_F(StaDcalcTest, GraphDelayCalcConstruct) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcClear3) {
|
TEST_F(StaDcalcTest, GraphDelayCalcClear3) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
||||||
gdc->clear();
|
gdc->clear();
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcDelaysInvalid3) {
|
TEST_F(StaDcalcTest, GraphDelayCalcDelaysInvalid3) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
||||||
gdc->delaysInvalid();
|
gdc->delaysInvalid();
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcSetObserver) {
|
TEST_F(StaDcalcTest, GraphDelayCalcSetObserver) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
||||||
gdc->setObserver(nullptr);
|
gdc->setObserver(nullptr);
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcLevelsChanged) {
|
TEST_F(StaDcalcTest, GraphDelayCalcLevelsChanged) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
||||||
gdc->levelsChangedBefore();
|
gdc->levelsChangedBefore();
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcCopyState3) {
|
TEST_F(StaDcalcTest, GraphDelayCalcCopyState3) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
GraphDelayCalc *gdc = sta_->graphDelayCalc();
|
||||||
gdc->copyState(sta_);
|
gdc->copyState(sta_);
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StaDcalcTest, GraphDelayCalcIncrTolerance) {
|
TEST_F(StaDcalcTest, GraphDelayCalcIncrTolerance) {
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,7 @@ TEST_F(FindRootTest, ZeroTolerance) {
|
||||||
|
|
||||||
// Only 1 iteration allowed
|
// Only 1 iteration allowed
|
||||||
TEST_F(FindRootTest, OneIteration) {
|
TEST_F(FindRootTest, OneIteration) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
FindRootFunc func = [](double x, double &y, double &dy) {
|
FindRootFunc func = [](double x, double &y, double &dy) {
|
||||||
y = x * x - 4.0;
|
y = x * x - 4.0;
|
||||||
dy = 2.0 * x;
|
dy = 2.0 * x;
|
||||||
|
|
@ -156,6 +157,8 @@ TEST_F(FindRootTest, OneIteration) {
|
||||||
// With only 1 iteration, a quadratic likely won't converge to tight tol
|
// With only 1 iteration, a quadratic likely won't converge to tight tol
|
||||||
// The algorithm may or may not fail depending on initial bisection step
|
// The algorithm may or may not fail depending on initial bisection step
|
||||||
(void)root; // just ensure no crash
|
(void)root; // just ensure no crash
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Two iterations
|
// Two iterations
|
||||||
|
|
|
||||||
|
|
@ -405,10 +405,13 @@ TEST(EdgeStandaloneTest, ObjectIdx)
|
||||||
|
|
||||||
TEST(EdgeStandaloneTest, SetIsDisabledConstraint)
|
TEST(EdgeStandaloneTest, SetIsDisabledConstraint)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Edge e;
|
Edge e;
|
||||||
e.setIsDisabledConstraint(true);
|
e.setIsDisabledConstraint(true);
|
||||||
// Can only fully test when arc_set is set; test the setter at least
|
// Can only fully test when arc_set is set; test the setter at least
|
||||||
e.setIsDisabledConstraint(false);
|
e.setIsDisabledConstraint(false);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(EdgeStandaloneTest, RemoveDelayAnnotated)
|
TEST(EdgeStandaloneTest, RemoveDelayAnnotated)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1934,13 +1934,19 @@ TEST_F(ConcreteNetworkLinkedTest, AddConstantNet) {
|
||||||
|
|
||||||
// Network: readNetlistBefore, setLinkFunc
|
// Network: readNetlistBefore, setLinkFunc
|
||||||
TEST(ConcreteNetworkExtraTest, ReadNetlistBefore) {
|
TEST(ConcreteNetworkExtraTest, ReadNetlistBefore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcreteNetwork network;
|
ConcreteNetwork network;
|
||||||
network.readNetlistBefore();
|
network.readNetlistBefore();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ConcreteNetworkExtraTest, SetLinkFunc) {
|
TEST(ConcreteNetworkExtraTest, SetLinkFunc) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcreteNetwork network;
|
ConcreteNetwork network;
|
||||||
network.setLinkFunc(nullptr);
|
network.setLinkFunc(nullptr);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Network: setCellNetworkView, cellNetworkView, deleteCellNetworkViews
|
// Network: setCellNetworkView, cellNetworkView, deleteCellNetworkViews
|
||||||
|
|
@ -2374,38 +2380,53 @@ TEST_F(ConcreteNetworkLinkedTest, FindInstancesHierMatching) {
|
||||||
|
|
||||||
// Network Set/Map comparators constructors
|
// Network Set/Map comparators constructors
|
||||||
TEST_F(ConcreteNetworkLinkedTest, PinIdLessConstructor) {
|
TEST_F(ConcreteNetworkLinkedTest, PinIdLessConstructor) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
PinIdLess less(&network_);
|
PinIdLess less(&network_);
|
||||||
bool result = less(pin_u1_a_, pin_u2_a_);
|
bool result = less(pin_u1_a_, pin_u2_a_);
|
||||||
(void)result;
|
(void)result;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ConcreteNetworkLinkedTest, NetIdLessConstructor) {
|
TEST_F(ConcreteNetworkLinkedTest, NetIdLessConstructor) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
NetIdLess less(&network_);
|
NetIdLess less(&network_);
|
||||||
bool result = less(net1_, net2_);
|
bool result = less(net1_, net2_);
|
||||||
(void)result;
|
(void)result;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ConcreteNetworkLinkedTest, InstanceIdLessConstructor) {
|
TEST_F(ConcreteNetworkLinkedTest, InstanceIdLessConstructor) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
InstanceIdLess less(&network_);
|
InstanceIdLess less(&network_);
|
||||||
bool result = less(u1_, u2_);
|
bool result = less(u1_, u2_);
|
||||||
(void)result;
|
(void)result;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ConcreteNetworkLinkedTest, PortIdLessConstructor) {
|
TEST_F(ConcreteNetworkLinkedTest, PortIdLessConstructor) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Cell *inv_cell = network_.findCell(lib_, "INV");
|
Cell *inv_cell = network_.findCell(lib_, "INV");
|
||||||
Port *port_a = network_.findPort(inv_cell, "A");
|
Port *port_a = network_.findPort(inv_cell, "A");
|
||||||
Port *port_y = network_.findPort(inv_cell, "Y");
|
Port *port_y = network_.findPort(inv_cell, "Y");
|
||||||
PortIdLess less(&network_);
|
PortIdLess less(&network_);
|
||||||
bool result = less(port_a, port_y);
|
bool result = less(port_a, port_y);
|
||||||
(void)result;
|
(void)result;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ConcreteNetworkLinkedTest, CellIdLessConstructor) {
|
TEST_F(ConcreteNetworkLinkedTest, CellIdLessConstructor) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Cell *inv_cell = network_.findCell(lib_, "INV");
|
Cell *inv_cell = network_.findCell(lib_, "INV");
|
||||||
Cell *top_cell = network_.findCell(lib_, "TOP");
|
Cell *top_cell = network_.findCell(lib_, "TOP");
|
||||||
CellIdLess less(&network_);
|
CellIdLess less(&network_);
|
||||||
bool result = less(inv_cell, top_cell);
|
bool result = less(inv_cell, top_cell);
|
||||||
(void)result;
|
(void)result;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// PinSet: with network constructor and intersects
|
// PinSet: with network constructor and intersects
|
||||||
|
|
@ -2420,12 +2441,15 @@ TEST_F(ConcreteNetworkLinkedTest, PinSetWithNetwork) {
|
||||||
|
|
||||||
// PinSet: compare
|
// PinSet: compare
|
||||||
TEST_F(ConcreteNetworkLinkedTest, PinSetCompare) {
|
TEST_F(ConcreteNetworkLinkedTest, PinSetCompare) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
PinSet set1(&network_);
|
PinSet set1(&network_);
|
||||||
set1.insert(pin_u1_a_);
|
set1.insert(pin_u1_a_);
|
||||||
PinSet set2(&network_);
|
PinSet set2(&network_);
|
||||||
set2.insert(pin_u2_a_);
|
set2.insert(pin_u2_a_);
|
||||||
int cmp = PinSet::compare(&set1, &set2, &network_);
|
int cmp = PinSet::compare(&set1, &set2, &network_);
|
||||||
(void)cmp;
|
(void)cmp;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// InstanceSet: with network and intersects
|
// InstanceSet: with network and intersects
|
||||||
|
|
@ -2450,12 +2474,15 @@ TEST_F(ConcreteNetworkLinkedTest, NetSetWithNetwork) {
|
||||||
|
|
||||||
// NetSet: compare
|
// NetSet: compare
|
||||||
TEST_F(ConcreteNetworkLinkedTest, NetSetCompare) {
|
TEST_F(ConcreteNetworkLinkedTest, NetSetCompare) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
NetSet set1(&network_);
|
NetSet set1(&network_);
|
||||||
set1.insert(net1_);
|
set1.insert(net1_);
|
||||||
NetSet set2(&network_);
|
NetSet set2(&network_);
|
||||||
set2.insert(net2_);
|
set2.insert(net2_);
|
||||||
int cmp = NetSet::compare(&set1, &set2, &network_);
|
int cmp = NetSet::compare(&set1, &set2, &network_);
|
||||||
(void)cmp;
|
(void)cmp;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// CellSet constructor
|
// CellSet constructor
|
||||||
|
|
@ -2874,9 +2901,12 @@ TEST_F(NetworkAdapterTest, AdapterCellGetAttribute) {
|
||||||
|
|
||||||
// NetworkNameAdapter: attributeMap(Cell) forwarding
|
// NetworkNameAdapter: attributeMap(Cell) forwarding
|
||||||
TEST_F(NetworkAdapterTest, AdapterCellAttributeMap) {
|
TEST_F(NetworkAdapterTest, AdapterCellAttributeMap) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
const AttributeMap &map = sdc_net_->attributeMap(inv_cell_);
|
const AttributeMap &map = sdc_net_->attributeMap(inv_cell_);
|
||||||
(void)map;
|
(void)map;
|
||||||
// Just verify it doesn't crash
|
// Just verify it doesn't crash
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkNameAdapter: library(Cell) forwarding
|
// NetworkNameAdapter: library(Cell) forwarding
|
||||||
|
|
@ -3028,8 +3058,11 @@ TEST_F(NetworkAdapterTest, AdapterInstanceGetAttribute) {
|
||||||
|
|
||||||
// NetworkNameAdapter: attributeMap(Instance) forwarding
|
// NetworkNameAdapter: attributeMap(Instance) forwarding
|
||||||
TEST_F(NetworkAdapterTest, AdapterInstanceAttributeMap) {
|
TEST_F(NetworkAdapterTest, AdapterInstanceAttributeMap) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
const AttributeMap &map = sdc_net_->attributeMap(u1_);
|
const AttributeMap &map = sdc_net_->attributeMap(u1_);
|
||||||
(void)map;
|
(void)map;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkNameAdapter: parent(Instance) forwarding
|
// NetworkNameAdapter: parent(Instance) forwarding
|
||||||
|
|
@ -3132,8 +3165,11 @@ TEST_F(NetworkAdapterTest, AdapterPinDirection) {
|
||||||
|
|
||||||
// NetworkNameAdapter: vertexId(Pin) forwarding
|
// NetworkNameAdapter: vertexId(Pin) forwarding
|
||||||
TEST_F(NetworkAdapterTest, AdapterPinVertexId) {
|
TEST_F(NetworkAdapterTest, AdapterPinVertexId) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
VertexId vid = sdc_net_->vertexId(pin_b1_a_);
|
VertexId vid = sdc_net_->vertexId(pin_b1_a_);
|
||||||
(void)vid; // Just verify it doesn't crash
|
(void)vid; // Just verify it doesn't crash
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkNameAdapter: setVertexId forwarding
|
// NetworkNameAdapter: setVertexId forwarding
|
||||||
|
|
@ -5680,9 +5716,12 @@ TEST_F(NetworkAdapterTest, AdapterPortName3) {
|
||||||
// R10_ NetworkAdapter: busName forwarding
|
// R10_ NetworkAdapter: busName forwarding
|
||||||
// Covers: NetworkNameAdapter::busName(Port const*) const
|
// Covers: NetworkNameAdapter::busName(Port const*) const
|
||||||
TEST_F(NetworkAdapterTest, AdapterBusName) {
|
TEST_F(NetworkAdapterTest, AdapterBusName) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
const char *name = sdc_net_->busName(port_a_);
|
const char *name = sdc_net_->busName(port_a_);
|
||||||
// Scalar port busName is nullptr
|
// Scalar port busName is nullptr
|
||||||
(void)name;
|
(void)name;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// R10_ NetworkAdapter: makeNet forwarding
|
// R10_ NetworkAdapter: makeNet forwarding
|
||||||
|
|
|
||||||
|
|
@ -653,9 +653,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBasePiModel) {
|
||||||
|
|
||||||
// Test base class setPiModel is no-op
|
// Test base class setPiModel is no-op
|
||||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPiModel) {
|
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPiModel) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcretePoleResidue pr;
|
ConcretePoleResidue pr;
|
||||||
pr.setPiModel(1.0f, 2.0f, 3.0f);
|
pr.setPiModel(1.0f, 2.0f, 3.0f);
|
||||||
// no crash
|
// no crash
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test base class findElmore returns exists=false
|
// Test base class findElmore returns exists=false
|
||||||
|
|
@ -669,9 +672,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseFindElmore) {
|
||||||
|
|
||||||
// Test base class setElmore is no-op
|
// Test base class setElmore is no-op
|
||||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetElmore) {
|
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetElmore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcretePoleResidue pr;
|
ConcretePoleResidue pr;
|
||||||
pr.setElmore(nullptr, 5.0f);
|
pr.setElmore(nullptr, 5.0f);
|
||||||
// no crash
|
// no crash
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test base class findPoleResidue returns nullptr
|
// 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 base class setPoleResidue (3-arg from ConcreteParasitic) is no-op
|
||||||
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPoleResidue3) {
|
TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPoleResidue3) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcretePoleResidue pr;
|
ConcretePoleResidue pr;
|
||||||
// The 3-arg setPoleResidue from ConcreteParasitic base
|
// The 3-arg setPoleResidue from ConcreteParasitic base
|
||||||
ComplexFloatSeq *poles = new ComplexFloatSeq;
|
ComplexFloatSeq *poles = new ComplexFloatSeq;
|
||||||
|
|
@ -691,6 +698,8 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PoleResidueBaseSetPoleResidue3) {
|
||||||
// base is no-op, so clean up
|
// base is no-op, so clean up
|
||||||
delete poles;
|
delete poles;
|
||||||
delete residues;
|
delete residues;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcretePoleResidue unannotatedLoads returns empty
|
// Test ConcretePoleResidue unannotatedLoads returns empty
|
||||||
|
|
@ -723,9 +732,12 @@ TEST_F(ConcreteParasiticBaseVirtualTest, PiPoleResidueFindElmore) {
|
||||||
|
|
||||||
// Test ConcretePiPoleResidue setElmore is base no-op
|
// Test ConcretePiPoleResidue setElmore is base no-op
|
||||||
TEST_F(ConcreteParasiticBaseVirtualTest, PiPoleResidueSetElmore) {
|
TEST_F(ConcreteParasiticBaseVirtualTest, PiPoleResidueSetElmore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
ConcretePiPoleResidue pipr(1e-12f, 100.0f, 2e-12f);
|
ConcretePiPoleResidue pipr(1e-12f, 100.0f, 2e-12f);
|
||||||
pipr.setElmore(nullptr, 5.0f);
|
pipr.setElmore(nullptr, 5.0f);
|
||||||
// no crash, base no-op
|
// no crash, base no-op
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcretePiElmore isPoleResidue returns false (base)
|
// Test ConcretePiElmore isPoleResidue returns false (base)
|
||||||
|
|
@ -1320,21 +1332,27 @@ TEST_F(StaParasiticsTest, ParasiticNodeResistorMap) {
|
||||||
|
|
||||||
// Test findNode (deprecated) - delegates to findParasiticNode
|
// Test findNode (deprecated) - delegates to findParasiticNode
|
||||||
TEST_F(StaParasiticsTest, FindNodeDeprecated) {
|
TEST_F(StaParasiticsTest, FindNodeDeprecated) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||||
// findNode on non-network parasitic should work but return nullptr
|
// findNode on non-network parasitic should work but return nullptr
|
||||||
// since it's not a parasitic network
|
// since it's not a parasitic network
|
||||||
// Actually findNode calls findParasiticNode which casts to ConcreteParasiticNetwork
|
// Actually findNode calls findParasiticNode which casts to ConcreteParasiticNetwork
|
||||||
// This would be undefined behavior on non-network, so skip
|
// This would be undefined behavior on non-network, so skip
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test unannotatedLoads through parasitics API with PiElmore
|
// Test unannotatedLoads through parasitics API with PiElmore
|
||||||
TEST_F(StaParasiticsTest, UnannotatedLoadsPiElmore) {
|
TEST_F(StaParasiticsTest, UnannotatedLoadsPiElmore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||||
// With no network loads, should just return what parasitics->loads returns
|
// With no network loads, should just return what parasitics->loads returns
|
||||||
// which needs a connected pin. With nullptr pin, this will likely crash
|
// which needs a connected pin. With nullptr pin, this will likely crash
|
||||||
// or return empty. Let's just test the API exists and compiles.
|
// or return empty. Let's just test the API exists and compiles.
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasiticNode with pin-based construction
|
// Test ConcreteParasiticNode with pin-based construction
|
||||||
|
|
@ -1615,44 +1633,59 @@ TEST_F(StaParasiticsTest, PiPoleResidueIsPiModel) {
|
||||||
|
|
||||||
// Test Parasitics::report() on PiElmore
|
// Test Parasitics::report() on PiElmore
|
||||||
TEST_F(StaParasiticsTest, ReportPiElmore) {
|
TEST_F(StaParasiticsTest, ReportPiElmore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
ConcretePiElmore pe(1e-12f, 100.0f, 2e-12f);
|
||||||
// report() is a base class no-op, should not crash
|
// report() is a base class no-op, should not crash
|
||||||
parasitics->report(&pe);
|
parasitics->report(&pe);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasiticNetwork::disconnectPin
|
// Test ConcreteParasiticNetwork::disconnectPin
|
||||||
TEST_F(StaParasiticsTest, NetworkDisconnectPin) {
|
TEST_F(StaParasiticsTest, NetworkDisconnectPin) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
const Network *network = sta_->network();
|
const Network *network = sta_->network();
|
||||||
ConcreteParasiticNetwork pnet(nullptr, false, network);
|
ConcreteParasiticNetwork pnet(nullptr, false, network);
|
||||||
// disconnectPin with nullptr should not crash
|
// disconnectPin with nullptr should not crash
|
||||||
pnet.disconnectPin(nullptr, nullptr, network);
|
pnet.disconnectPin(nullptr, nullptr, network);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasitics deleteParasitics (Pin overload)
|
// Test ConcreteParasitics deleteParasitics (Pin overload)
|
||||||
TEST_F(StaParasiticsTest, DeleteParasiticsPin) {
|
TEST_F(StaParasiticsTest, DeleteParasiticsPin) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
// Should not crash with nullptr
|
// Should not crash with nullptr
|
||||||
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr),
|
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr),
|
||||||
static_cast<const ParasiticAnalysisPt*>(nullptr));
|
static_cast<const ParasiticAnalysisPt*>(nullptr));
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasitics deleteParasiticNetworks
|
// Test ConcreteParasitics deleteParasiticNetworks
|
||||||
TEST_F(StaParasiticsTest, DeleteParasiticNetworks) {
|
TEST_F(StaParasiticsTest, DeleteParasiticNetworks) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||||
if (concrete) {
|
if (concrete) {
|
||||||
concrete->deleteParasiticNetworks(nullptr);
|
concrete->deleteParasiticNetworks(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasitics deletePinBefore
|
// Test ConcreteParasitics deletePinBefore
|
||||||
TEST_F(StaParasiticsTest, DeletePinBefore) {
|
TEST_F(StaParasiticsTest, DeletePinBefore) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||||
if (concrete) {
|
if (concrete) {
|
||||||
concrete->deletePinBefore(nullptr);
|
concrete->deletePinBefore(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test ConcreteParasiticNetwork capacitance with grounded caps and coupling caps
|
// Test ConcreteParasiticNetwork capacitance with grounded caps and coupling caps
|
||||||
|
|
@ -1851,11 +1884,14 @@ TEST_F(ReduceParasiticsTest, ConcreteParasiticDeleteViaBasePtr) {
|
||||||
// Test parasiticAnalysisPtIndex is protected - test indirectly through
|
// Test parasiticAnalysisPtIndex is protected - test indirectly through
|
||||||
// the public API that uses it (e.g., deleteParasitics with Pin/apt)
|
// the public API that uses it (e.g., deleteParasitics with Pin/apt)
|
||||||
TEST_F(ReduceParasiticsTest, ParasiticAnalysisPtViaDeleteParasiticsPin) {
|
TEST_F(ReduceParasiticsTest, ParasiticAnalysisPtViaDeleteParasiticsPin) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ParasiticAnalysisPt apt("test", 0, 0);
|
ParasiticAnalysisPt apt("test", 0, 0);
|
||||||
// deleteParasitics(Pin*, apt*) internally calls parasiticAnalysisPtIndex
|
// deleteParasitics(Pin*, apt*) internally calls parasiticAnalysisPtIndex
|
||||||
// With nullptr pin, it creates an entry in the map but finds no parasitics
|
// With nullptr pin, it creates an entry in the map but finds no parasitics
|
||||||
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr), &apt);
|
parasitics->deleteParasitics(static_cast<const Pin*>(nullptr), &apt);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test Parasitics::findNode(Parasitic, Pin) base class implementation
|
// Test Parasitics::findNode(Parasitic, Pin) base class implementation
|
||||||
|
|
@ -1903,6 +1939,7 @@ TEST_F(ReduceParasiticsTest, RspfPiSingleValues) {
|
||||||
// Test deleteParasitics(Net, ParasiticAnalysisPt) - requires network with drivers
|
// Test deleteParasitics(Net, ParasiticAnalysisPt) - requires network with drivers
|
||||||
// This is a no-op when net is nullptr because drivers() returns empty
|
// This is a no-op when net is nullptr because drivers() returns empty
|
||||||
TEST_F(ReduceParasiticsTest, DeleteParasiticsNetApt) {
|
TEST_F(ReduceParasiticsTest, DeleteParasiticsNetApt) {
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Parasitics *parasitics = sta_->parasitics();
|
Parasitics *parasitics = sta_->parasitics();
|
||||||
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
ConcreteParasitics *concrete = dynamic_cast<ConcreteParasitics*>(parasitics);
|
||||||
if (concrete) {
|
if (concrete) {
|
||||||
|
|
@ -1911,6 +1948,8 @@ TEST_F(ReduceParasiticsTest, DeleteParasiticsNetApt) {
|
||||||
// Note: deleteParasitics(Net*, apt*) calls network_->drivers(net)
|
// Note: deleteParasitics(Net*, apt*) calls network_->drivers(net)
|
||||||
// which may crash with nullptr net, so skip this test
|
// which may crash with nullptr net, so skip this test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace sta
|
} // namespace sta
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -942,9 +942,12 @@ TEST(ReportTest, LogToFile)
|
||||||
|
|
||||||
TEST(ReportTest, LogEndWithoutLog)
|
TEST(ReportTest, LogEndWithoutLog)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report report;
|
Report report;
|
||||||
// Should not crash when no log is active
|
// Should not crash when no log is active
|
||||||
report.logEnd();
|
report.logEnd();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ReportTest, RedirectFileBegin)
|
TEST(ReportTest, RedirectFileBegin)
|
||||||
|
|
@ -992,9 +995,12 @@ TEST(ReportTest, RedirectFileAppendBegin)
|
||||||
|
|
||||||
TEST(ReportTest, RedirectFileEndWithoutRedirect)
|
TEST(ReportTest, RedirectFileEndWithoutRedirect)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report report;
|
Report report;
|
||||||
// Should not crash
|
// Should not crash
|
||||||
report.redirectFileEnd();
|
report.redirectFileEnd();
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ReportTest, RedirectFileNotWritable)
|
TEST(ReportTest, RedirectFileNotWritable)
|
||||||
|
|
@ -1969,10 +1975,13 @@ TEST(StringUtilCovTest, StringPrintArgs)
|
||||||
// stringDeleteCheck (only for non-tmp strings - should not crash)
|
// stringDeleteCheck (only for non-tmp strings - should not crash)
|
||||||
TEST(StringUtilCovTest, StringDeleteCheckNonTmp)
|
TEST(StringUtilCovTest, StringDeleteCheckNonTmp)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
char *s = stringPrint("not tmp");
|
char *s = stringPrint("not tmp");
|
||||||
// This should not crash or exit; it's not a tmp string
|
// This should not crash or exit; it's not a tmp string
|
||||||
stringDeleteCheck(s);
|
stringDeleteCheck(s);
|
||||||
stringDelete(s);
|
stringDelete(s);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that isTmpString returns false for heap-allocated strings
|
// Test that isTmpString returns false for heap-allocated strings
|
||||||
|
|
@ -2174,12 +2183,15 @@ TEST(ReportStdCovTest, ReportStdError)
|
||||||
|
|
||||||
TEST(ReportStdCovTest, PrintConsoleDirect)
|
TEST(ReportStdCovTest, PrintConsoleDirect)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report *report = makeReportStd();
|
Report *report = makeReportStd();
|
||||||
// reportLine calls printConsole
|
// reportLine calls printConsole
|
||||||
report->reportLine("direct console print test");
|
report->reportLine("direct console print test");
|
||||||
// printError calls printErrorConsole - triggered by warn
|
// printError calls printErrorConsole - triggered by warn
|
||||||
report->warn(998, "stderr test");
|
report->warn(998, "stderr test");
|
||||||
delete report;
|
delete report;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -2293,6 +2305,7 @@ TEST(MachineCovTest, SystemRunTime)
|
||||||
|
|
||||||
TEST(StatsCovTest, StatsConstructAndReport)
|
TEST(StatsCovTest, StatsConstructAndReport)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report report;
|
Report report;
|
||||||
Debug debug(&report);
|
Debug debug(&report);
|
||||||
// With debug stats level 0, constructor/report are no-ops
|
// With debug stats level 0, constructor/report are no-ops
|
||||||
|
|
@ -2303,6 +2316,8 @@ TEST(StatsCovTest, StatsConstructAndReport)
|
||||||
debug.setLevel("stats", 1);
|
debug.setLevel("stats", 1);
|
||||||
Stats stats2(&debug, &report);
|
Stats stats2(&debug, &report);
|
||||||
stats2.report("test step 2");
|
stats2.report("test step 2");
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -2341,6 +2356,7 @@ TEST(GzstreamCovTest, WriteGzFile)
|
||||||
|
|
||||||
TEST(GzstreamCovTest, FlushExplicit)
|
TEST(GzstreamCovTest, FlushExplicit)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
const char *tmpgz = "/tmp/test_gzstream_flush.gz";
|
const char *tmpgz = "/tmp/test_gzstream_flush.gz";
|
||||||
{
|
{
|
||||||
gzstream::ogzstream gz(tmpgz);
|
gzstream::ogzstream gz(tmpgz);
|
||||||
|
|
@ -2348,6 +2364,8 @@ TEST(GzstreamCovTest, FlushExplicit)
|
||||||
gz.flush(); // This triggers sync() -> flush_buffer()
|
gz.flush(); // This triggers sync() -> flush_buffer()
|
||||||
}
|
}
|
||||||
std::remove(tmpgz);
|
std::remove(tmpgz);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -2467,12 +2485,15 @@ TEST(ReportCovTest, RedirectStringPrintCoverage)
|
||||||
|
|
||||||
TEST(ReportStdCovTest, PrintErrorConsole)
|
TEST(ReportStdCovTest, PrintErrorConsole)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report *report = makeReportStd();
|
Report *report = makeReportStd();
|
||||||
// warn() outputs to stderr via printErrorConsole
|
// warn() outputs to stderr via printErrorConsole
|
||||||
report->warn(777, "testing stderr output");
|
report->warn(777, "testing stderr output");
|
||||||
// fileWarn also goes through printErrorConsole
|
// fileWarn also goes through printErrorConsole
|
||||||
report->fileWarn(778, "test.v", 1, "file warning test");
|
report->fileWarn(778, "test.v", 1, "file warning test");
|
||||||
delete report;
|
delete report;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -2491,10 +2512,13 @@ TEST(StringUtilCovTest, MakeTmpStringStdString)
|
||||||
// so we cannot test that path. Test only with non-tmp strings.
|
// so we cannot test that path. Test only with non-tmp strings.
|
||||||
TEST(StringUtilCovTest, StringDeleteCheckRegular)
|
TEST(StringUtilCovTest, StringDeleteCheckRegular)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
char *s = stringCopy("regular");
|
char *s = stringCopy("regular");
|
||||||
// Should not crash - regular string can be deleted
|
// Should not crash - regular string can be deleted
|
||||||
stringDeleteCheck(s);
|
stringDeleteCheck(s);
|
||||||
stringDelete(s);
|
stringDelete(s);
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test Report redirectStringPrint with empty string
|
// Test Report redirectStringPrint with empty string
|
||||||
|
|
@ -2593,10 +2617,13 @@ TEST(ReportStdCovTest, ReportStdConstructor)
|
||||||
// Covers: ReportStd::printErrorConsole
|
// Covers: ReportStd::printErrorConsole
|
||||||
TEST(ReportStdCovTest, PrintErrorConsoleViaWarn)
|
TEST(ReportStdCovTest, PrintErrorConsoleViaWarn)
|
||||||
{
|
{
|
||||||
|
ASSERT_NO_THROW(( [&](){
|
||||||
Report *report = makeReportStd();
|
Report *report = makeReportStd();
|
||||||
// warn uses printErrorConsole path
|
// warn uses printErrorConsole path
|
||||||
report->warn(9999, "test warning %d", 42);
|
report->warn(9999, "test warning %d", 42);
|
||||||
delete report;
|
delete report;
|
||||||
|
|
||||||
|
}() ));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test Report suppress/unsuppress messages
|
// Test Report suppress/unsuppress messages
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue