22#include <boost/test/unit_test.hpp>
26#include <api/common/commands/editor_commands.pb.h>
27#include <api/common/envelope.pb.h>
29#include <api/schematic/schematic_types.pb.h>
47struct API_HANDLER_SCH_FIXTURE
49 SETTINGS_MANAGER m_settingsManager;
50 std::unique_ptr<SCHEMATIC> m_schematic;
52 std::shared_ptr<HEADLESS_SCH_CONTEXT> m_context;
54 SCHEMATIC* loadSchematic(
const wxString& aRelPath )
57 m_schematicSlot = m_schematic.get();
58 m_context = std::make_shared<HEADLESS_SCH_CONTEXT>( &m_schematicSlot,
59 &m_settingsManager.Prj() );
60 return m_schematic.get();
65kiapi::common::types::DocumentSpecifier makeDocument(
const SCHEMATIC& aSchematic )
67 kiapi::common::types::DocumentSpecifier document;
68 document.set_type( kiapi::common::types::DocumentType::DOCTYPE_SCHEMATIC );
75kiapi::common::ApiRequest makeBeginCommitRequest(
const SCHEMATIC& aSchematic )
77 kiapi::common::commands::BeginCommit command;
78 *command.mutable_header()->mutable_document() = makeDocument( aSchematic );
80 kiapi::common::ApiRequest request;
81 request.mutable_header()->set_client_name(
"kicad.qa" );
82 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
88kiapi::common::ApiRequest makeRevertRequest(
const SCHEMATIC& aSchematic )
90 kiapi::common::commands::RevertDocument command;
91 *command.mutable_document() = makeDocument( aSchematic );
93 kiapi::common::ApiRequest request;
94 request.mutable_header()->set_client_name(
"kicad.qa" );
95 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
104BOOST_FIXTURE_TEST_SUITE( ApiHandlerSch, API_HANDLER_SCH_FIXTURE )
113 kiapi::common::ApiRequest beginRequest = makeBeginCommitRequest( *
schematic );
116 kiapi::common::ApiRequest request = makeRevertRequest( *
schematic );
121 BOOST_CHECK(
result.error().error_message().find(
"commit" ) != std::string::npos );
131 ApiRequest beginRequest = makeBeginCommitRequest( *
schematic );
134 commands::CreateItems command;
135 command.mutable_header()->mutable_document()->CopyFrom( makeDocument( *
schematic ) );
137 schematic::types::SchematicLine line;
138 line.mutable_id()->set_value(
"83618809-06d6-4cbe-ba0e-ec60fe58921c" );
139 line.set_type( schematic::types::SchematicLineType::SLT_WIRE );
140 line.add_custom_properties()->set_key(
"linE Width" );
141 line.add_custom_properties()->set_key(
"start X" );
143 command.add_items()->PackFrom( line );
146 request.mutable_header()->set_client_name(
"kicad.qa" );
147 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
152 commands::CreateItemsResponse response;
154 BOOST_REQUIRE_EQUAL( response.created_items_size(), 1 );
156 const commands::ItemStatus& status = response.created_items( 0 ).status();
159 BOOST_CHECK_EQUAL( status.code(), kiapi::common::commands::ItemStatusCode::ISC_INVALID_DATA );
160 BOOST_CHECK_NE( status.error_message().find(
"Invalid custom properties" ), std::string::npos );
169 ApiRequest beginRequest = makeBeginCommitRequest( *
schematic );
172 commands::CreateItems command;
173 command.mutable_header()->mutable_document()->CopyFrom( makeDocument( *
schematic ) );
175 schematic::types::SchematicSymbolInstance symbol;
176 symbol.mutable_id()->set_value(
"f8688bac-2fcb-4184-ab0e-0cf46a139c43" );
177 symbol.mutable_transform()->set_orientation( schematic::types::SchematicSymbolOrientation::SSO_0 );
179 symbol.mutable_definition()->mutable_id()->set_entry_name(
"R" );
181 schematic::types::SchematicField* field = symbol.add_user_fields();
182 field->set_name(
"MPN" );
183 field->mutable_text()->set_text(
"123" );
185 types::CustomProperty* prop = symbol.add_custom_properties();
186 prop->set_key(
"MPN" );
187 prop->set_value(
"456" );
189 command.add_items()->PackFrom( symbol );
192 request.mutable_header()->set_client_name(
"kicad.qa" );
193 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
198 commands::CreateItemsResponse response;
200 BOOST_REQUIRE_EQUAL( response.created_items_size(), 1 );
202 const commands::ItemStatus& status = response.created_items( 0 ).status();
205 BOOST_CHECK_EQUAL( status.code(), kiapi::common::commands::ItemStatusCode::ISC_INVALID_DATA );
206 BOOST_CHECK_NE( status.error_message().find(
"MPN" ), std::string::npos );
213 SCHEMATIC*
model = loadSchematic( wxS(
"net_chains_four_nets_labeled" ) );
214 const auto path =
model->Hierarchy().front();
219 if(
static_cast<SCH_LABEL*
>( item )->GetText() == wxS(
"SIG" ) )
226 for(
bool published : {
false,
true } )
231 const wxString
name = published ? wxS(
"PUBLISHED_API" ) : wxS(
"LEGACY_API" );
236 model->ConnectionGraph()->Reset();
238 model->RebuildConnectivity();
240 for(
bool filtered : {
false,
true } )
242 kiapi::schematic::commands::GetSchematicNetlist command;
243 *command.mutable_document() = makeDocument( *
model );
246 command.add_types( kiapi::common::types::KOT_SCH_LABEL );
249 request.mutable_header()->set_client_name(
"kicad.qa" );
250 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
253 kiapi::schematic::commands::SchematicNetlistResponse response;
255 std::set<std::string> items;
257 for(
const auto& net : response.nets() )
262 for(
const auto& sheet : net.sheets() )
264 for(
const auto& item : sheet.items() )
265 items.insert( item.value() );
274 BOOST_CHECK_GT( items.size(), 1 );
284 SCHEMATIC*
model = loadSchematic( wxS(
"netlists/hierarchy_aliases/hierarchy_aliases" ) );
285 auto* root =
model->Hierarchy().front().LastScreen();
288 auto* unusedBus =
static_cast<SCH_LABEL*
>( ( *labels.begin() )->Clone() );
289 const_cast<KIID&
>( unusedBus->m_Uuid ) =
KIID();
290 unusedBus->SetText( wxS(
"API_UNUSED[0..1]" ) );
291 unusedBus->SetPosition(
VECTOR2I( 0, 0 ) );
292 root->Append( unusedBus );
297 auto* line =
static_cast<SCH_LINE*
>( item );
301 undriven =
static_cast<SCH_LINE*
>( line->Clone() );
309 root->Append( undriven );
311 using CONTENTS = std::map<std::string, std::map<std::vector<std::string>, std::set<std::string>>>;
313 for(
bool filtered : {
false,
true } )
317 for(
bool published : {
false,
true } )
325 model->ConnectionGraph()->Reset();
327 model->RebuildConnectivity();
329 kiapi::schematic::commands::GetSchematicNetlist command;
330 *command.mutable_document() = makeDocument( *
model );
333 command.add_types( kiapi::common::types::KOT_SCH_PIN );
336 request.mutable_header()->set_client_name(
"kicad.qa" );
337 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
340 kiapi::schematic::commands::SchematicNetlistResponse response;
343 size_t nestedItems = 0;
345 for(
const auto& net : response.nets() )
347 BOOST_CHECK_GT( net.sheets_size(), 0 );
348 BOOST_CHECK( net.name().find(
'{' ) == std::string::npos );
349 BOOST_CHECK( net.name().find(
"API_UNUSED" ) == std::string::npos );
351 for(
const auto& sheet : net.sheets() )
353 std::vector<std::string>
path;
355 for(
const auto&
id : sheet.path().path() )
356 path.push_back(
id.value() );
360 for(
const auto& item : sheet.items() )
363 items.insert( item.value() );
366 if(
path.size() > 2 )
367 nestedItems += items.size();
371 BOOST_CHECK(
actual.contains(
"/S0.BOOT.SDA" ) );
372 BOOST_CHECK(
actual.contains(
"/S1.BOOT.SDA" ) );
373 BOOST_CHECK_GT( nestedItems, 0 );
397 throw std::runtime_error(
"Native label extraction failed" );
407 SCHEMATIC*
model = loadSchematic( wxS(
"net_chains_four_nets_labeled" ) );
408 auto* screen =
model->Hierarchy().front().LastScreen();
409 auto labels = screen->Items().OfType(
SCH_LABEL_T );
411 auto* original =
static_cast<SCH_LABEL*
>( *labels.begin() );
412 auto* replacement =
new FAILING_LABEL( *original );
413 screen->Remove( original );
415 screen->Append( replacement );
416 model->ConnectionGraph()->Reset();
417 replacement->fail =
true;
420 kiapi::schematic::commands::GetSchematicNetlist command;
421 *command.mutable_document() = makeDocument( *
model );
423 request.mutable_header()->set_client_name(
"kicad.qa" );
424 BOOST_REQUIRE( request.mutable_message()->PackFrom( command ) );
429 replacement->fail =
false;
432 kiapi::schematic::commands::SchematicNetlistResponse response;
434 BOOST_CHECK_GT( response.nets_size(), 0 );
tl::expected< ApiResponse, ApiResponseStatus > API_RESULT
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
API_RESULT Handle(ApiRequest &aMsg)
Attempt to handle the given API request, if a handler exists in this class for the message.
virtual void SetText(const wxString &aText)
std::string AsStdString() const
Holds all the data relating to one schematic.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
Base class for any item which can be embedded within the SCHEMATIC container class,...
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, int aDepth=0) const override
SCH_LABEL(const VECTOR2I &aPos=VECTOR2I(0, 0), const wxString &aText=wxEmptyString)
Segment description base class to describe items which have 2 end points (track, wire,...
VECTOR2I GetStartPoint() const
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
RAII class that sets an value at construction and resets it to the original value at destruction.
static std::string ToStdString(const wxString &aStr)
void LoadSchematic(SETTINGS_MANAGER &aSettingsManager, const wxString &aRelPath, std::unique_ptr< SCHEMATIC > &aSchematic)
KICOMMON_API void PackProject(types::ProjectSpecifier &aOutput, const PROJECT &aInput)
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
VECTOR3I expected(15, 30, 45)
BOOST_AUTO_TEST_CASE(RevertDocumentRejectedWithOpenCommit)
BOOST_TEST_CONTEXT("Test Clearance")
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")
VECTOR2< int32_t > VECTOR2I