77 m_board->BuildConnectivity();
79 std::shared_ptr<CN_CONNECTIVITY_ALGO> algo =
80 m_board->GetConnectivity()->GetConnectivityAlgo();
87 std::map<CN_ITEM*, size_t> clusterOf;
90 for(
size_t ii = 0; ii < clusters.size(); ++ii )
92 for(
CN_ITEM* item : *clusters[ii] )
94 BOOST_REQUIRE_MESSAGE( clusterOf.emplace( item, ii ).second,
95 "item appears in more than one cluster" );
104 for(
const auto& [item, cluster] : clusterOf )
108 auto it = clusterOf.find( neighbour );
110 if( it == clusterOf.end() )
113 if( neighbour->Net() != item->Net() )
116 BOOST_REQUIRE_MESSAGE( it->second == cluster,
117 "connected items landed in different clusters" );
123 for(
const std::shared_ptr<CN_CLUSTER>& cluster : clusters )
125 std::set<CN_ITEM*> members( cluster->begin(), cluster->end() );
126 std::set<CN_ITEM*> seen;
127 std::deque<CN_ITEM*> queue;
129 queue.push_back( *cluster->begin() );
130 seen.insert( *cluster->begin() );
132 while( !queue.empty() )
134 CN_ITEM* current = queue.front();
139 if( members.count( neighbour ) && !seen.count( neighbour ) )
141 seen.insert( neighbour );
142 queue.push_back( neighbour );
147 BOOST_REQUIRE_EQUAL( seen.size(), members.size() );
159 boost::unit_test::data::make( c_boards ), boardName )
163 m_board->BuildConnectivity();
165 std::shared_ptr<CONNECTIVITY_DATA> conn = m_board->GetConnectivity();
166 std::shared_ptr<CN_CONNECTIVITY_ALGO> algo = conn->GetConnectivityAlgo();
168 std::map<int, std::set<const CN_CLUSTER*>> clustersPerNet;
170 for(
const std::shared_ptr<CN_CLUSTER>& cluster :
174 if( cluster->IsOrphaned() && cluster->Size() == 1
180 if( cluster->OriginNet() > 0 )
181 clustersPerNet[cluster->OriginNet()].insert( cluster.get() );
184 size_t netsChecked = 0;
185 size_t edgesSeen = 0;
187 for(
const auto& [net, netClusters] : clustersPerNet )
189 RN_NET* rn = conn->GetRatsnestForNet( net );
194 const std::vector<CN_EDGE>& edges = rn->
GetEdges();
196 BOOST_REQUIRE_MESSAGE( edges.size() == netClusters.size() - 1,
197 "net " << net <<
" has " << netClusters.size() <<
" clusters but "
198 << edges.size() <<
" ratsnest edges" );
200 for(
const CN_EDGE& edge : edges )
201 BOOST_REQUIRE( edge.GetSourceNode() && edge.GetTargetNode() );
204 edgesSeen += edges.size();
207 BOOST_REQUIRE_MESSAGE( netsChecked > 0,
"no net on this board exercised the ratsnest" );
208 BOOST_TEST_MESSAGE(
"net count " << netsChecked <<
", ratsnest edges " << edgesSeen );
BOOST_DATA_TEST_CASE(ConvertToKicadUnit, boost::unit_test::data::make(altium_to_kicad_unit), input_value, expected_result)
Test conversation from Altium internal units into KiCad internal units.
BOOST_DATA_TEST_CASE(ClustersAreTheConnectedComponents, boost::unit_test::data::make(c_boards), boardName)
Every item must land in exactly one cluster, each cluster must be internally reachable over the adjac...
BOOST_CHECK_EQUAL(result, "25.4")