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>
47const wxString F_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d704" );
48const wxString B_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d701" );
49const wxString IN1_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d707" );
50const wxString IN2_CU_ZONE = wxS(
"00000000-0000-0000-0000-00005c07d70a" );
53struct API_HANDLER_PCB_FIXTURE
55 SETTINGS_MANAGER m_settingsManager;
56 std::unique_ptr<BOARD> m_board;
57 std::shared_ptr<HEADLESS_PCB_CONTEXT> m_context;
61 BOARD* loadBoard(
const wxString& aRelPath )
65 BOARD* board = m_board.get();
66 m_context = std::make_shared<HEADLESS_PCB_CONTEXT>( std::move( m_board ),
67 &m_settingsManager.Prj(),
nullptr );
71 kiapi::common::ApiRequest makeRefillRequest(
BOARD* aBoard,
const std::vector<wxString>& aZoneIds )
const
73 kiapi::board::commands::RefillZones command;
74 command.mutable_board()->set_type( kiapi::common::types::DocumentType::DOCTYPE_PCB );
75 command.mutable_board()->set_board_filename(
76 wxFileName( aBoard->
GetFileName() ).GetFullName().ToStdString() );
78 for(
const wxString&
id : aZoneIds )
81 kiapi::common::ApiRequest request;
82 request.mutable_header()->set_client_name(
"kicad.qa" );
83 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
88 ZONE* zoneByUuid(
BOARD* aBoard,
const wxString& aUuid )
const
90 for( ZONE* zone : aBoard->
Zones() )
92 if( zone->m_Uuid.AsString() == aUuid )
99 void unfillAll(
BOARD* aBoard )
const
102 for( ZONE* zone : aBoard->
Zones() )
111kiapi::common::ApiRequest makeBeginCommitRequest()
114 kiapi::common::commands::BeginCommit command;
116 kiapi::common::ApiRequest request;
117 request.mutable_header()->set_client_name(
"kicad.qa" );
118 request.mutable_message()->PackFrom( command );
124kiapi::common::ApiRequest makeRevertRequest(
BOARD* aBoard )
126 kiapi::common::commands::RevertDocument command;
127 command.mutable_document()->set_type( kiapi::common::types::DocumentType::DOCTYPE_PCB );
128 command.mutable_document()->set_board_filename( wxFileName( aBoard->
GetFileName() ).GetFullName().ToStdString() );
130 kiapi::common::ApiRequest request;
131 request.mutable_header()->set_client_name(
"kicad.qa" );
132 request.mutable_message()->PackFrom( command );
140BOOST_FIXTURE_TEST_SUITE( ApiHandlerPcb, API_HANDLER_PCB_FIXTURE )
145 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
150 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
155 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
156 <<
result.error().error_message() );
161 ZONE* fCu = zoneByUuid(
board, F_CU_ZONE );
162 ZONE* bCu = zoneByUuid(
board, B_CU_ZONE );
163 ZONE* in1Cu = zoneByUuid(
board, IN1_CU_ZONE );
164 ZONE* in2Cu = zoneByUuid(
board, IN2_CU_ZONE );
178 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
184 board->BuildConnectivity();
185 const unsigned baseline =
board->GetConnectivity()->GetUnconnectedCount(
false );
186 BOOST_REQUIRE_MESSAGE( baseline > 0,
"expected an unconnected baseline with zones empty" );
189 kiapi::common::ApiRequest request = makeRefillRequest(
board, { F_CU_ZONE, IN1_CU_ZONE } );
194 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
195 <<
result.error().error_message() );
198 const unsigned afterFill =
board->GetConnectivity()->GetUnconnectedCount(
false );
203 BOOST_CHECK_MESSAGE( afterFill > 0,
"connectivity was cleared, not rebuilt, after the fill" );
204 BOOST_CHECK_MESSAGE( afterFill < baseline,
205 "filling the GND planes should reduce the unconnected count ("
206 << afterFill <<
" vs baseline " << baseline <<
")" );
212 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
217 kiapi::common::ApiRequest request = makeRefillRequest(
board, {} );
222 BOOST_FAIL(
"RefillZones returned status " <<
result.error().status() <<
": "
223 <<
result.error().error_message() );
230 BOOST_CHECK_MESSAGE( zone->IsFilled(),
"zone " << zone->m_Uuid.AsStdString() <<
" not filled" );
236 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
239 kiapi::common::ApiRequest request =
240 makeRefillRequest(
board, { wxS(
"deadbeef-0000-0000-0000-000000000000" ) } );
253 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
258 kiapi::common::ApiRequest beginRequest = makeBeginCommitRequest();
261 kiapi::common::ApiRequest request = makeRevertRequest(
board );
266 BOOST_CHECK(
result.error().error_message().find(
"commit" ) != std::string::npos );
274 BOARD*
board = loadBoard( wxS(
"issue5830" ) );
277 kiapi::common::ApiRequest request = makeRevertRequest(
board );
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.
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(RefillZonesSubset)
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")