23#include <boost/test/unit_test.hpp>
25#include <wx/filename.h>
32#include <api/board/board_commands.pb.h>
33#include <api/common/commands/editor_commands.pb.h>
34#include <api/common/envelope.pb.h>
35#include <api/common/types/base_types.pb.h>
48const wxString F_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d704" );
49const wxString B_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d701" );
50const wxString IN1_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d707" );
51const wxString IN2_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d70a" );
54struct API_HANDLER_PCB_FIXTURE
56 SETTINGS_MANAGER m_settingsManager;
57 std::unique_ptr<BOARD> m_board;
58 std::shared_ptr<HEADLESS_PCB_CONTEXT> m_context;
62 BOARD* loadBoard(
const wxString& aRelPath )
66 BOARD* board = m_board.get();
67 m_context = std::make_shared<HEADLESS_PCB_CONTEXT>( std::move( m_board ),
68 &m_settingsManager.Prj(),
nullptr );
72 kiapi::common::ApiRequest makeRefillRequest(
BOARD* aBoard,
const std::vector<wxString>& aZoneIds )
const
74 kiapi::board::commands::RefillZones command;
75 command.mutable_board()->set_type( kiapi::common::types::DocumentType::DOCTYPE_PCB );
76 command.mutable_board()->set_board_filename(
77 wxFileName( aBoard->
GetFileName() ).GetFullName().ToStdString() );
79 for(
const wxString&
id : aZoneIds )
82 kiapi::common::ApiRequest request;
83 request.mutable_header()->set_client_name(
"kicad.qa" );
84 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
89 ZONE* zoneByUuid(
BOARD* aBoard,
const wxString& aUuid )
const
91 for( ZONE* zone : aBoard->
Zones() )
93 if( zone->m_Uuid.AsString() == aUuid )
100 void unfillAll(
BOARD* aBoard )
const
103 for( ZONE* zone : aBoard->
Zones() )
112kiapi::common::ApiRequest makeBeginCommitRequest()
115 kiapi::common::commands::BeginCommit command;
117 kiapi::common::ApiRequest request;
118 request.mutable_header()->set_client_name(
"kicad.qa" );
119 request.mutable_message()->PackFrom( command );
125kiapi::common::ApiRequest makeRevertRequest(
BOARD* aBoard )
127 kiapi::common::commands::RevertDocument command;
128 command.mutable_document()->set_type( kiapi::common::types::DocumentType::DOCTYPE_PCB );
129 command.mutable_document()->set_board_filename( wxFileName( aBoard->
GetFileName() ).GetFullName().ToStdString() );
131 kiapi::common::ApiRequest request;
132 request.mutable_header()->set_client_name(
"kicad.qa" );
133 request.mutable_message()->PackFrom( command );
141BOOST_FIXTURE_TEST_SUITE( ApiHandlerPcb, API_HANDLER_PCB_FIXTURE )
147 kiapi::board::jobs::RunBoardJobExportODB request;
148 request.add_variant_names(
"var1" );
149 request.add_variant_names(
"var2" );
150 request.set_variant(
"legacy" );
151 request.set_variant_packaging( kiapi::board::jobs::ODBVP_COMBINED );
152 request.set_manufacturer_part_number_column(
"MPN" );
161 kiapi::board::jobs::RunBoardJobExportODB legacyRequest;
162 legacyRequest.set_variant(
"legacy" );
173 kiapi::board::jobs::RunBoardJobExportODB request;
174 request.set_origin( kiapi::board::jobs::ODBO_GRID );
175 request.set_product_name(
"board product" );
176 request.mutable_content()->set_data_set( kiapi::board::jobs::FDS_ASSEMBLY );
177 request.mutable_content()->set_sections(
"KP" );
178 request.mutable_content()->set_net_names( kiapi::board::jobs::FNNP_ANONYMIZE );
189 kiapi::board::jobs::RunBoardJobExportODB legacy;
200 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
205 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
210 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
211 <<
result.error().error_message() );
216 ZONE* fCu = zoneByUuid(
board, F_CU_ZONE );
217 ZONE* bCu = zoneByUuid(
board, B_CU_ZONE );
218 ZONE* in1Cu = zoneByUuid(
board, IN1_CU_ZONE );
219 ZONE* in2Cu = zoneByUuid(
board, IN2_CU_ZONE );
233 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
239 board->BuildConnectivity();
240 const unsigned baseline =
board->GetConnectivity()->GetUnconnectedCount(
false );
241 BOOST_REQUIRE_MESSAGE( baseline > 0,
"expected an unconnected baseline with zones empty" );
244 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
249 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
250 <<
result.error().error_message() );
253 const unsigned afterFill =
board->GetConnectivity()->GetUnconnectedCount(
false );
258 BOOST_CHECK_MESSAGE( afterFill > 0,
"connectivity was cleared, not rebuilt, after the fill" );
259 BOOST_CHECK_MESSAGE( afterFill < baseline,
260 "filling the GND planes should reduce the unconnected count ("
261 << afterFill <<
" vs baseline " << baseline <<
")" );
267 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
272 kiapi::common::ApiRequest request = makeRefillRequest(
board, {} );
277 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
278 <<
result.error().error_message() );
285 BOOST_CHECK_MESSAGE( zone->IsFilled(),
"zone " << zone->m_Uuid.AsStdString() <<
" not filled" );
291 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
294 kiapi::common::ApiRequest request =
295 makeRefillRequest(
board, { wxS(
"deadbeef-0000-0000-0000-000000000000" ) } );
308 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
313 kiapi::common::ApiRequest beginRequest = makeBeginCommitRequest();
316 kiapi::common::ApiRequest request = makeRevertRequest(
board );
321 BOOST_CHECK(
result.error().error_message().find(
"commit" ) != std::string::npos );
329 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
332 kiapi::common::ApiRequest request = makeRevertRequest(
board );
tl::expected< ApiResponse, ApiResponseStatus > API_RESULT
void ApplyOdbJobRequest(const RunBoardJobExportODB &aRequest, JOB_EXPORT_PCB_ODB &aJob)
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
std::optional< wxString > m_sections
Section key that replaces the optional sections of the data set Unset lets the data set select them a...
std::vector< wxString > m_variantNames
VARIANT_PACKAGING m_variantPackaging
Handle a list of polygons defining a copper zone.
static std::string ToStdString(const wxString &aStr)
void LoadBoard(SETTINGS_MANAGER &aSettingsManager, const wxString &aRelPath, std::unique_ptr< BOARD > &aBoard)
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_CASE(OdbJobRequestMapsVariants)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")