52 using DIAGNOSTIC = std::tuple<KIID, KIID_PATH, int, int, wxString>;
54 for(
const wxString& fixture : { wxString(
"erc_wire_endpoints" ), wxString(
"unconnected_bus_entry_qa" ) } )
61 for(
auto& [code, severity] : m_schematic->ErcSettings().m_ERCSeverities )
65 m_schematic->ConnectionGraph()->RunERC();
67 const auto diagnostics = [&](
bool aRecordExclusions = false )
70 std::multiset<DIAGNOSTIC>
result;
71 std::vector<std::pair<SCH_SCREEN*, SCH_MARKER*>> markers;
73 for(
int i = 0; i < errors.
GetCount(); ++i )
75 const auto item = std::static_pointer_cast<ERC_ITEM>( errors.
GetItem( i ) );
76 auto* marker =
static_cast<SCH_MARKER*
>( item->GetParent() );
78 if( aRecordExclusions )
81 BOOST_CHECK( marker->IsExcluded() );
84 result.emplace( item->GetMainItemID(), item->GetSpecificSheetPath().PathRef(),
85 marker->GetPosition().x, marker->GetPosition().y, item->GetErrorMessage(
false ) );
86 markers.emplace_back( item->GetSpecificSheetPath().LastScreen(), marker );
89 if( aRecordExclusions )
90 m_schematic->RecordERCExclusions();
92 for(
const auto& [screen, marker] : markers )
93 screen->DeleteItem( marker );
97 const auto expected = diagnostics(
true );
100 m_schematic->RebuildConnectivity();
102 std::set<SCH_SCREEN*> screens;
103 size_t markerCount = 0;
107 if( screens.insert(
path.LastScreen() ).second )
115 m_schematic->ResolveERCExclusionsPostUpdate();
116 BOOST_CHECK( diagnostics() ==
expected );
127 using GROUP = std::pair<KIID_PATH, std::vector<KIID>>;
129 for(
const wxString& fixture : { wxString(
"erc_wire_endpoints" ), wxString(
"unconnected_bus_entry_qa" ) } )
136 for(
auto& [code, severity] : m_schematic->ErcSettings().m_ERCSeverities )
140 std::map<KIID, VECTOR2I> positions;
145 positions.emplace( item->m_Uuid, item->GetPosition() );
149 const auto diagnostics = [&](
bool aCanonical )
152 std::multiset<GROUP>
result;
153 std::vector<std::pair<SCH_SCREEN*, SCH_MARKER*>> markers;
155 for(
int i = 0; i < errors.
GetCount(); ++i )
157 const auto item = std::static_pointer_cast<ERC_ITEM>( errors.
GetItem( i ) );
158 auto* marker =
static_cast<SCH_MARKER*
>( item->GetParent() );
160 auto ids = item->GetIDs();
166 BOOST_CHECK( std::is_sorted( ids.begin(), ids.end() ) );
167 BOOST_CHECK( marker->GetPosition() == positions.at( ids.front() ) );
168 BOOST_CHECK( marker->IsExcluded() );
173 marker->SetExcluded(
true,
"Retained floating wire" );
176 std::sort( ids.begin(), ids.end() );
177 result.emplace( item->GetSpecificSheetPath().PathRef(), std::move( ids ) );
178 markers.emplace_back( item->GetSpecificSheetPath().LastScreen(), marker );
182 m_schematic->RecordERCExclusions();
184 for(
const auto& [screen, marker] : markers )
185 screen->DeleteItem( marker );
189 m_schematic->ConnectionGraph()->RunERC();
190 const auto expected = diagnostics(
false );
193 m_schematic->RebuildConnectivity();
194 m_schematic->ConnectionGraph()->Reset();
196 m_schematic->ResolveERCExclusionsPostUpdate();
197 BOOST_CHECK( diagnostics(
true ) ==
expected );
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")