89 t = m_symbol.GetTransform();
92 t = m_symbol.GetTransform();
95 t = m_symbol.GetTransform();
106 fn.AppendDir( wxS(
"variant_test" ) );
107 fn.SetName( wxS(
"variant_test" ) );
113 BOOST_CHECK( symbol );
116 wxString variantName = wxS(
"Variant1" );
117 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
118 BOOST_CHECK( !variant );
121 BOOST_CHECK( !symbol->
GetDNP() );
122 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
123 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
128 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
133 BOOST_CHECK( symbol->
GetExcludedFromSim( &m_schematic->Hierarchy()[0], variantName ) );
147 false, 0 ) == wxS(
"1K" ) );
150 false, 0, variantName ) == wxS(
"10K" ) );
164 fn.AppendDir( wxS(
"variant_test" ) );
165 fn.SetName( wxS(
"variant_test" ) );
173 wxString newFieldName = wxS(
"Sim.Library" );
177 BOOST_CHECK( existing ==
nullptr );
181 newField.
SetText( wxS(
"test_model.lib" ) );
189 BOOST_CHECK( addedField->
GetParent() == symbol );
194 BOOST_CHECK( found->
GetText() == wxS(
"test_model.lib" ) );
205 fn.AppendDir( wxS(
"variant_test" ) );
206 fn.SetName( wxS(
"variant_test" ) );
212 wxString variantName = wxS(
"TestVariant" );
213 wxString description = wxS(
"This is a test variant description" );
216 m_schematic->AddVariant( variantName );
217 BOOST_CHECK( m_schematic->GetVariantNames().contains( variantName ) );
220 m_schematic->SetVariantDescription( variantName, description );
221 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), description );
224 BOOST_CHECK( m_schematic->GetVariantDescription( wxS(
"NonExistent" ) ).IsEmpty() );
227 m_schematic->SetVariantDescription( variantName, wxEmptyString );
228 BOOST_CHECK( m_schematic->GetVariantDescription( variantName ).IsEmpty() );
239 fn.AppendDir( wxS(
"variant_test" ) );
240 fn.SetName( wxS(
"variant_test" ) );
246 wxString variantName = wxS(
"MilitaryGrade" );
249 m_schematic->AddVariant( variantName );
250 m_schematic->SetCurrentVariant( variantName );
253 wxString token = wxS(
"VARIANT" );
254 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
255 BOOST_CHECK( resolved );
259 token = wxS(
"VARIANTNAME" );
260 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
261 BOOST_CHECK( resolved );
265 m_schematic->SetCurrentVariant( wxEmptyString );
266 token = wxS(
"VARIANT" );
267 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
268 BOOST_CHECK( resolved );
269 BOOST_CHECK( token.IsEmpty() );
280 fn.AppendDir( wxS(
"variant_test" ) );
281 fn.SetName( wxS(
"variant_test" ) );
287 wxString variantName = wxS(
"IndustrialVariant" );
288 wxString description = wxS(
"Industrial temperature range components" );
291 m_schematic->AddVariant( variantName );
292 m_schematic->SetVariantDescription( variantName, description );
293 m_schematic->SetCurrentVariant( variantName );
296 wxString token = wxS(
"VARIANT_DESC" );
297 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
298 BOOST_CHECK( resolved );
302 m_schematic->SetVariantDescription( variantName, wxEmptyString );
303 token = wxS(
"VARIANT_DESC" );
304 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
305 BOOST_CHECK( resolved );
306 BOOST_CHECK( token.IsEmpty() );
317 fn.AppendDir( wxS(
"variant_test" ) );
318 fn.SetName( wxS(
"variant_test" ) );
327 wxString oldName = wxS(
"OriginalVariant" );
328 wxString newName = wxS(
"RenamedVariant" );
329 wxString description = wxS(
"Original description" );
332 m_schematic->AddVariant( oldName );
333 m_schematic->SetVariantDescription( oldName, description );
334 m_schematic->SetCurrentVariant( oldName );
337 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], oldName );
341 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], oldName ) );
343 false, 0, oldName ), wxS(
"100K" ) );
346 m_schematic->RenameVariant( oldName, newName );
349 BOOST_CHECK( !m_schematic->GetVariantNames().contains( oldName ) );
352 BOOST_CHECK( m_schematic->GetVariantNames().contains( newName ) );
361 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], newName ) );
363 false, 0, newName ), wxS(
"100K" ) );
374 fn.AppendDir( wxS(
"variant_test" ) );
375 fn.SetName( wxS(
"variant_test" ) );
384 wxString sourceVariant = wxS(
"SourceVariant" );
385 wxString copyVariant = wxS(
"CopiedVariant" );
386 wxString description = wxS(
"Source description" );
389 m_schematic->AddVariant( sourceVariant );
390 m_schematic->SetVariantDescription( sourceVariant, description );
393 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], sourceVariant );
400 m_schematic->CopyVariant( sourceVariant, copyVariant );
403 BOOST_CHECK( m_schematic->GetVariantNames().contains( sourceVariant ) );
404 BOOST_CHECK( m_schematic->GetVariantNames().contains( copyVariant ) );
407 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( copyVariant ), description );
410 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
411 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], copyVariant ) );
415 false, 0, copyVariant ), wxS(
"47K" ) );
418 symbol->
SetDNP(
false, &m_schematic->Hierarchy()[0], copyVariant );
422 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], sourceVariant ) );
424 false, 0, sourceVariant ), wxS(
"47K" ) );
427 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
429 false, 0, copyVariant ), wxS(
"100K" ) );
440 fn.AppendDir( wxS(
"variant_test" ) );
441 fn.SetName( wxS(
"variant_test" ) );
450 wxString variantName1 = wxS(
"DiffTestVariant1" );
451 wxString variantName2 = wxS(
"DiffTestVariant2" );
459 m_schematic->AddVariant( variantName1 );
464 false, 0, variantName1 );
468 BOOST_CHECK( defaultValue != variantValue );
471 m_schematic->AddVariant( variantName2 );
474 false, 0, variantName2 );
488 fn.AppendDir( wxS(
"variant_test" ) );
489 fn.SetName( wxS(
"variant_test" ) );
498 wxString variantName = wxS(
"DNPVariant" );
501 BOOST_CHECK( !symbol->
GetDNP() );
502 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
505 m_schematic->AddVariant( variantName );
506 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
509 BOOST_CHECK( !symbol->
GetDNP() );
510 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
513 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
518 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
519 BOOST_CHECK( !symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], wxEmptyString ) );
542 fn.AppendDir( wxS(
"variant_test" ) );
543 fn.SetName( wxS(
"variant_test" ) );
550 m_schematic->AddVariant( wxS(
"Zebra" ) );
551 m_schematic->AddVariant( wxS(
"Alpha" ) );
552 m_schematic->AddVariant( wxS(
"Beta" ) );
554 wxArrayString variantNames = m_schematic->GetVariantNamesForUI();
557 BOOST_CHECK( variantNames.GetCount() >= 4 );
561 BOOST_CHECK( !variantNames[0].IsEmpty() );
565 bool foundAlpha =
false;
566 bool foundBeta =
false;
567 bool foundZebra =
false;
569 for(
size_t i = 1; i < variantNames.GetCount(); i++ )
571 if( variantNames[i] == wxS(
"Alpha" ) )
573 else if( variantNames[i] == wxS(
"Beta" ) )
575 else if( variantNames[i] == wxS(
"Zebra" ) )
579 BOOST_CHECK( foundAlpha );
580 BOOST_CHECK( foundBeta );
581 BOOST_CHECK( foundZebra );
594 fn.AppendDir( wxS(
"variant_test" ) );
595 fn.SetName( wxS(
"variant_test" ) );
604 wxString variantName = wxS(
"PersistenceTest" );
605 wxString newValue = wxS(
"4.7K" );
609 m_schematic->AddVariant( variantName );
612 symbol->
SetValueFieldText( newValue, &m_schematic->Hierarchy()[0], variantName );
615 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
619 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
623 wxString retrievedValue = symbol->
GetValue(
false, &m_schematic->Hierarchy()[0],
false, variantName );
627 wxString retrievedDefault = symbol->
GetValue(
false, &m_schematic->Hierarchy()[0],
false, wxEmptyString );
639 fn.AppendDir( wxS(
"variant_test" ) );
640 fn.SetName( wxS(
"variant_test" ) );
649 wxString variantName1 = wxS(
"MethodTest1" );
650 wxString variantName2 = wxS(
"MethodTest2" );
651 wxString value1 = wxS(
"10K" );
652 wxString value2 = wxS(
"22K" );
655 m_schematic->AddVariant( variantName1 );
656 m_schematic->AddVariant( variantName2 );
662 symbol->
SetFieldText( fieldName, value2, &m_schematic->Hierarchy()[0], variantName2 );
665 std::optional<SCH_SYMBOL_VARIANT> variant1 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName1 );
666 std::optional<SCH_SYMBOL_VARIANT> variant2 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName2 );
671 BOOST_CHECK( variant1->m_Fields.contains( fieldName ) );
672 BOOST_CHECK( variant2->m_Fields.contains( fieldName ) );
695 fn.AppendDir( wxS(
"variant_test" ) );
696 fn.SetName( wxS(
"variant_test" ) );
705 wxString variantName = wxS(
"ProductionVariant" );
708 m_schematic->AddVariant( variantName );
711 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
714 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"ProductionVariant" ) ) );
717 BOOST_CHECK( m_schematic->GetVariantNames().contains( wxS(
"ProductionVariant" ) ) );
720 m_schematic->SetCurrentVariant( variantName );
724 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"NonExistentVariant" ) ) );
735 fn.AppendDir( wxS(
"variant_test" ) );
736 fn.SetName( wxS(
"variant_test" ) );
745 wxString variantName = wxS(
"DeleteMe" );
748 m_schematic->AddVariant( variantName );
749 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
753 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
754 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
755 BOOST_CHECK( variant.has_value() );
758 m_schematic->DeleteVariant( variantName );
761 BOOST_CHECK( !m_schematic->GetVariantNames().contains( variantName ) );
764 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
775 fn.AppendDir( wxS(
"variant_test" ) );
776 fn.SetName( wxS(
"variant_test" ) );
785 wxString variantName = wxS(
"UnicodeTest" );
786 m_schematic->AddVariant( variantName );
789 wxString unicodeValue = wxS(
"1kΩ ±5% 日本語" );
793 false, 0, variantName );
797 wxString specialChars = wxS(
"R<1K>\"test\"'value'" );
801 false, 0, variantName );
807 false, 0, variantName );
808 BOOST_CHECK( retrieved.IsEmpty() );
811 wxString unicodeDesc = wxS(
"Variante für Produktion — 测试" );
812 m_schematic->SetVariantDescription( variantName, unicodeDesc );
813 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), unicodeDesc );
824 fn.AppendDir( wxS(
"variant_test" ) );
825 fn.SetName( wxS(
"variant_test" ) );
834 wxString variantName = wxS(
"MilitaryGrade" );
835 wxString variantValue = wxS(
"1K-MIL" );
836 wxString defaultValue = wxS(
"1K" );
839 m_schematic->AddVariant( variantName );
847 wxString symbolRef = symbol->
GetRef( &m_schematic->Hierarchy()[0],
false );
850 wxString token = symbolRef + wxS(
":VALUE:" ) + variantName;
851 bool resolved = m_schematic->ResolveCrossReference( &token, 0 );
852 BOOST_CHECK( resolved );
856 token = symbolRef + wxS(
":VALUE" );
857 resolved = m_schematic->ResolveCrossReference( &token, 0 );
858 BOOST_CHECK( resolved );
862 token = symbolRef + wxS(
":VALUE:NonExistentVariant" );
863 resolved = m_schematic->ResolveCrossReference( &token, 0 );
864 BOOST_CHECK( resolved );
868 token = wxS(
"VALUE" );
869 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, variantName, 0 );
870 BOOST_CHECK( resolved );
874 token = wxS(
"VALUE" );
875 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, wxEmptyString, 0 );
876 BOOST_CHECK( resolved );
890 fn.AppendDir( wxS(
"variant_test" ) );
891 fn.SetName( wxS(
"variant_test" ) );
900 wxString variantName = wxS(
"FootprintVariant" );
901 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
902 wxString variantFootprint = wxS(
"Resistor_SMD:R_0402_1005Metric" );
910 m_schematic->AddVariant( variantName );
913 symbol->
SetFieldText( fieldName, variantFootprint, &m_schematic->Hierarchy()[0], variantName );
920 wxString retrievedDefault = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], wxEmptyString );
924 wxString retrievedVariant = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], variantName );
928 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
930 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
943 fn.AppendDir( wxS(
"variant_test" ) );
944 fn.SetName( wxS(
"variant_test" ) );
953 wxString variantName = wxS(
"NoOpTest" );
954 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
961 m_schematic->AddVariant( variantName );
964 symbol->
SetFieldText( fieldName, baseFootprint, &m_schematic->Hierarchy()[0], variantName );
967 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
970 if( variant.has_value() )
972 BOOST_CHECK( !variant->m_Fields.contains( fieldName ) );
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
EE_TYPE OfType(KICAD_T aType) const
A generic fixture for loading schematics and associated settings for qa tests.
std::unique_ptr< SCHEMATIC > m_schematic
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) const
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
EE_RTREE & Items()
Get the full RTree, usually for iterating.
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
void SetExcludedFromSim(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from simulation flag.
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) const override
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
void SetFootprintFieldText(const wxString &aFootprint)
void SetExcludedFromPosFiles(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
bool GetExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
void SetExcludedFromBOM(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
void SetExcludedFromBoard(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
SCH_SYMBOL * GetFirstSymbol()
SCH_SYMBOL object with no extra data set.
static const std::string KiCadSchematicFileExtension
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
static void LoadSchematic(SCHEMATIC *aSchematic, SCH_SHEET *aRootSheet, const wxString &aFileName)
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ VALUE
Field Value of part, i.e. "3.3K".
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(DefaultProperties)
Declare the test suite.
BOOST_CHECK_EQUAL(result, "25.4")
Definition of file extensions used in Kicad.