23#include <boost/test/unit_test.hpp>
25#include <wx/filename.h>
32#include <api/board/board_commands.pb.h>
33#include <api/common/envelope.pb.h>
34#include <api/common/types/base_types.pb.h>
46const wxString F_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d704" );
47const wxString B_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d701" );
48const wxString IN1_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d707" );
49const wxString IN2_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d70a" );
52struct API_HANDLER_PCB_FIXTURE
54 SETTINGS_MANAGER m_settingsManager;
55 std::unique_ptr<BOARD> m_board;
56 std::shared_ptr<HEADLESS_PCB_CONTEXT> m_context;
60 BOARD* loadBoard(
const wxString& aRelPath )
64 BOARD* board = m_board.get();
65 m_context = std::make_shared<HEADLESS_PCB_CONTEXT>( std::move( m_board ),
66 &m_settingsManager.Prj(),
nullptr );
70 kiapi::common::ApiRequest makeRefillRequest(
BOARD* aBoard,
const std::vector<wxString>& aZoneIds )
const
72 kiapi::board::commands::RefillZones command;
73 command.mutable_board()->set_type( kiapi::common::types::DocumentType::DOCTYPE_PCB );
74 command.mutable_board()->set_board_filename(
75 wxFileName( aBoard->
GetFileName() ).GetFullName().ToStdString() );
77 for(
const wxString&
id : aZoneIds )
78 command.add_zones()->set_value(
id.ToStdString() );
80 kiapi::common::ApiRequest request;
81 request.mutable_header()->set_client_name(
"kicad.qa" );
82 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
87 ZONE* zoneByUuid(
BOARD* aBoard,
const wxString& aUuid )
const
89 for( ZONE* zone : aBoard->
Zones() )
91 if( zone->m_Uuid.AsString() == aUuid )
98 void unfillAll(
BOARD* aBoard )
const
101 for( ZONE* zone : aBoard->
Zones() )
112BOOST_FIXTURE_TEST_SUITE( ApiHandlerPcb, API_HANDLER_PCB_FIXTURE )
117 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
122 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
125 BOOST_REQUIRE_MESSAGE(
result.has_value(),
126 "RefillZones returned status " <<
result.error().status() <<
": "
127 <<
result.error().error_message() );
130 ZONE* fCu = zoneByUuid(
board, F_CU_ZONE );
131 ZONE* bCu = zoneByUuid(
board, B_CU_ZONE );
132 ZONE* in1Cu = zoneByUuid(
board, IN1_CU_ZONE );
133 ZONE* in2Cu = zoneByUuid(
board, IN2_CU_ZONE );
147 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
153 board->BuildConnectivity();
154 const unsigned baseline =
board->GetConnectivity()->GetUnconnectedCount(
false );
155 BOOST_REQUIRE_MESSAGE( baseline > 0,
"expected an unconnected baseline with zones empty" );
158 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
161 BOOST_REQUIRE_MESSAGE(
result.has_value(),
162 "RefillZones returned status " <<
result.error().status() <<
": "
163 <<
result.error().error_message() );
165 const unsigned afterFill =
board->GetConnectivity()->GetUnconnectedCount(
false );
170 BOOST_CHECK_MESSAGE( afterFill > 0,
"connectivity was cleared, not rebuilt, after the fill" );
172 "filling the GND planes should reduce the unconnected count ("
173 << afterFill <<
" vs baseline " << baseline <<
")" );
179 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
184 kiapi::common::ApiRequest request = makeRefillRequest(
board, {} );
187 BOOST_REQUIRE_MESSAGE(
result.has_value(),
188 "RefillZones returned status " <<
result.error().status() <<
": "
189 <<
result.error().error_message() );
194 BOOST_CHECK_MESSAGE( zone->IsFilled(),
"zone " << zone->m_Uuid.AsStdString() <<
" not filled" );
200 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
203 kiapi::common::ApiRequest request =
204 makeRefillRequest(
board, { wxS(
"deadbeef-0000-0000-0000-000000000000" ) } );
tl::expected< ApiResponse, ApiResponseStatus > API_RESULT
API_RESULT Handle(ApiRequest &aMsg)
Attempt to handle the given API request, if a handler exists in this class for the message.
Information pertinent to a Pcbnew printed circuit board.
const ZONES & Zones() const
const wxString & GetFileName() const
Handle a list of polygons defining a copper zone.
void LoadBoard(SETTINGS_MANAGER &aSettingsManager, const wxString &aRelPath, std::unique_ptr< BOARD > &aBoard)
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_CASE(RefillZonesSubset)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_CHECK_MESSAGE(totalMismatches==0, std::to_string(totalMismatches)+" board(s) with strategy disagreements")
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")