47 wxString brd_name( wxT(
"solder_mask_bridge_test" ) );
51 std::vector<DRC_ITEM> violations;
62 [&](
const std::shared_ptr<DRC_ITEM>& aItem,
const VECTOR2I& aPos,
int aLayer,
63 const std::function<
void(
PCB_MARKER* )>& aPathGenerator )
68 violations.push_back( *aItem );
75 const int expected_err_cnt = 4;
77 if( violations.size() == expected_err_cnt )
88 std::map<KIID, EDA_ITEM*> itemMap;
89 m_board->FillItemMap( itemMap );
91 for(
const DRC_ITEM& item : violations )
94 BOOST_ERROR( wxString::Format(
"DRC solder mask bridge test failed board <%s>", brd_name ) );
109 std::vector<wxString> sig;
110 std::vector<std::pair<int, std::array<KIID, 3>>> emissionKeys;
113 [&](
const std::shared_ptr<DRC_ITEM>& aItem,
const VECTOR2I& aPos,
int aLayer,
119 sig.push_back( wxString::Format(
"%d,%d,%d,%s,%s,%s", aLayer, aPos.
x, aPos.
y,
120 aItem->GetMainItemID().AsString(),
121 aItem->GetAuxItemID().AsString(),
122 aItem->GetAuxItem2ID().AsString() ) );
127 std::array<KIID, 3> ids = { aItem->GetMainItemID(), aItem->GetAuxItemID(),
128 aItem->GetAuxItem2ID() };
130 std::sort( ids.begin(), ids.end() - ( ids[2] ==
niluuid ? 1 : 0 ) );
132 emissionKeys.push_back( { aLayer, ids } );
136 [&]() -> std::vector<wxString>
140 emissionKeys.clear();
145 std::vector<wxString> ref = runDrc();
147 BOOST_TEST_MESSAGE( wxString::Format(
"solder_mask_bridge violations: %zu", ref.size() ) );
151 BOOST_REQUIRE_GT( ref.size(), 100u );
156 BOOST_CHECK_MESSAGE( std::is_sorted( emissionKeys.begin(), emissionKeys.end() ),
157 "solder_mask_bridge violations not reported in sorted order" );
159 for(
int run = 0; run < 8; ++run )
161 std::vector<wxString> cur = runDrc();
163 BOOST_CHECK_MESSAGE( cur == ref,
164 wxString::Format(
"solder_mask_bridge report differs on run %d "
165 "(%zu vs %zu violations)",
166 run, cur.size(), ref.size() ) );
BOOST_CHECK_EQUAL(result, "25.4")