38#include <wx/filename.h>
63 m_dir = wxFileName::CreateTempFileName( wxS(
"kicad_lib_part_" ) );
64 wxRemoveFile(
m_dir );
65 wxFileName::Mkdir(
m_dir );
67 m_path = wxFileName(
m_dir, wxS(
"test_lib.kicad_sym" ) ).GetFullPath();
72 if( wxFileName::DirExists(
m_dir ) )
73 wxFileName::Rmdir(
m_dir, wxPATH_RMDIR_RECURSIVE );
107 libPath.AppendDir(
"libs" );
108 libPath.SetFullName(
"4xxx.kicad_sym" );
113 LIB_SYMBOL* cached = pi->LoadSymbol( libPath.GetFullPath(), wxS(
"4001" ) );
115 return cached ? std::make_unique<LIB_SYMBOL>( *cached ) :
nullptr;
126 pi->CreateLibrary( aLibPath );
127 pi->SaveSymbol( aLibPath, std::make_unique<LIB_SYMBOL>( aSymbol ) );
128 pi->SaveLibrary( aLibPath );
179 std::vector<SCH_FIELD> fields;
180 m_part_no_data.CopyFields( fields );
192 ( m_part_no_data.GetValueField() )(
"Value" )( (
int)
FIELD_T::VALUE ) );
207 std::vector<SCH_FIELD> fields;
208 m_part_no_data.CopyFields( fields );
211 const std::string newFieldName =
"new_field";
212 wxString nonConstNewFieldName = newFieldName;
216 m_part_no_data.SetFields( fields );
222 BOOST_REQUIRE_EQUAL( fields.size(), 6 );
226 SCH_FIELD* gotNewField = m_part_no_data.GetField( newFieldName );
228 BOOST_REQUIRE_NE( gotNewField,
nullptr );
238 const size_t defaultCount = m_part_no_data.GetDrawItems().size();
241 pin->SetNumber(
"1" );
242 m_part_no_data.AddDrawItem(
pin );
245 BOOST_CHECK(
pin->GetParentSymbol() == &m_part_no_data );
248 m_part_no_data.RemoveDrawItem(
pin );
254 m_part_no_data.RemoveDrawItem( &m_part_no_data.GetReferenceField() );
267 pin->SetNumber(
"[A1,A12,B1,B12]" );
268 m_part_no_data.AddDrawItem(
pin );
270 BOOST_CHECK( m_part_no_data.HasPinNumber(
"[A1,A12,B1,B12]" ) );
272 BOOST_CHECK( m_part_no_data.HasPinNumber(
"A1" ) );
273 BOOST_CHECK( m_part_no_data.HasPinNumber(
"A12" ) );
274 BOOST_CHECK( m_part_no_data.HasPinNumber(
"B1" ) );
275 BOOST_CHECK( m_part_no_data.HasPinNumber(
"B12" ) );
277 BOOST_CHECK( !m_part_no_data.HasPinNumber(
"A2" ) );
278 BOOST_CHECK( !m_part_no_data.HasPinNumber(
"[A1" ) );
289 pin->SetNumber(
"[1-4]" );
290 m_part_no_data.AddDrawItem(
pin );
292 BOOST_CHECK( m_part_no_data.HasPinNumber(
"[1-4]" ) );
294 BOOST_CHECK( m_part_no_data.HasPinNumber(
"1" ) );
295 BOOST_CHECK( m_part_no_data.HasPinNumber(
"3" ) );
297 BOOST_CHECK( !m_part_no_data.HasPinNumber(
"5" ) );
314 const std::vector<TEST_LIB_SYMBOL_SUBREF_CASE> cases = {
482 for(
const auto& c : cases )
485 "Subref: " << c.m_index <<
", " << c.m_addSep <<
" -> '" << c.m_expSubRef <<
"'" )
503 shape =
static_cast<SCH_SHAPE*
>( &item );
518 const auto& populated =
static_cast<const EDA_SHAPE&
>( rebuilt );
519 BOOST_REQUIRE_NE(
empty.Compare( &populated ), 0 );
520 BOOST_CHECK_LT(
empty.Compare( &populated ), 0 );
521 BOOST_CHECK_GT( populated.Compare( &
empty ), 0 );
540 testPart.
SetName(
"tart_name" );
541 BOOST_CHECK( m_part_no_data.Compare( testPart ) < 0 );
542 testPart.
SetName(
"cart_name" );
543 BOOST_CHECK( m_part_no_data.Compare( testPart ) > 0 );
544 testPart.
SetName(
"part_name" );
550 BOOST_CHECK( m_part_no_data.Compare( testPart ) < 0 );
551 id.SetLibItemName(
"cart_name" );
553 BOOST_CHECK( m_part_no_data.Compare( testPart ) > 0 );
554 id.SetLibItemName(
"part_name" );
559 BOOST_CHECK( m_part_no_data.Compare( testPart ) < 0 );
561 m_part_no_data.SetUnitCount( 2,
true );
562 BOOST_CHECK( m_part_no_data.Compare( testPart ) > 0 );
563 m_part_no_data.SetUnitCount( 1,
true );
567 BOOST_CHECK( m_part_no_data.Compare( testPart ) < 0 );
569 m_part_no_data.SetGlobalPower();
570 BOOST_CHECK( m_part_no_data.Compare( testPart ) > 0 );
571 m_part_no_data.SetNormal();
577 m_part_no_data.RemoveDrawItem( &m_part_no_data.GetDrawItems()[
SCH_SHAPE_T].front() );
582 m_part_no_data.RemoveDrawItem( &m_part_no_data.GetDrawItems()[
SCH_SHAPE_T].front() );
588 m_part_no_data.RemoveDrawItem( &m_part_no_data.GetDrawItems()[
SCH_SHAPE_T].front() );
590 m_part_no_data.AddDrawItem(
new SCH_PIN( &m_part_no_data ) );
592 m_part_no_data.RemoveDrawItem( &m_part_no_data.GetDrawItems()[
SCH_PIN_T].front() );
595 wxArrayString footPrintFilters;
596 BOOST_CHECK( m_part_no_data.GetFPFilters() == footPrintFilters );
597 footPrintFilters.Add(
"b" );
600 m_part_no_data.SetFPFilters( footPrintFilters );
601 footPrintFilters.Clear();
604 footPrintFilters.Clear();
605 m_part_no_data.SetFPFilters( footPrintFilters );
609 m_part_no_data.SetDescription(
"b" );
612 m_part_no_data.SetDescription(
"a" );
614 m_part_no_data.SetDescription(
"c" );
616 m_part_no_data.SetDescription( wxEmptyString );
620 m_part_no_data.SetKeyWords(
"b" );
623 m_part_no_data.SetKeyWords(
"a" );
625 m_part_no_data.SetKeyWords(
"c" );
627 m_part_no_data.SetKeyWords( wxEmptyString );
641 m_part_no_data.LockUnits(
true );
643 m_part_no_data.LockUnits(
false );
649 m_part_no_data.SetExcludedFromBOM(
true );
651 m_part_no_data.SetExcludedFromBOM(
false );
657 m_part_no_data.SetExcludedFromBoard(
true );
659 m_part_no_data.SetExcludedFromBoard(
false );
665 m_part_no_data.SetExcludedFromPosFiles(
true );
667 m_part_no_data.SetExcludedFromPosFiles(
false );
670 m_part_no_data.SetShowPinNames(
false );
672 m_part_no_data.SetShowPinNames(
true );
678 m_part_no_data.SetShowPinNumbers(
false );
680 m_part_no_data.SetShowPinNumbers(
true );
699 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 1, 1 ).size() == 0 );
703 m_part_no_data.AddDrawItem(
pin1 );
704 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 0, 0 ).size() == 1 );
708 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 1, 0 ).size() == 1 );
711 pin1->SetBodyStyle( 1 );
712 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 1, 1 ).size() == 1 );
717 m_part_no_data.SetUnitCount( 2,
true );
721 m_part_no_data.AddDrawItem( pin2 );
722 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 2, 2 ).size() == 1 );
725 pin1->SetBodyStyle( 0 );
726 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 1, 1 ).size() == 0 );
727 BOOST_CHECK( m_part_no_data.GetUnitDrawItems( 2, 1 ).size() == 1 );
729 m_part_no_data.RemoveDrawItem( pin2 );
730 m_part_no_data.RemoveDrawItem(
pin1 );
731 m_part_no_data.RemoveDrawItem( &*m_part_no_data.GetDrawItems().begin() );
741 std::vector<struct LIB_SYMBOL_UNIT> units = m_part_no_data.GetUnitDrawItems();
743 BOOST_REQUIRE_EQUAL( units.size(), 1u );
746 BOOST_CHECK( units[0].m_items.empty() );
751 pin1->SetNumber(
"1" );
752 m_part_no_data.AddDrawItem(
pin1 );
754 units = m_part_no_data.GetUnitDrawItems();
756 BOOST_REQUIRE_EQUAL( units.size(), 2u );
759 BOOST_REQUIRE_EQUAL( units[0].m_items.size(), 1u );
763 BOOST_CHECK( units[1].m_items.empty() );
766 m_part_no_data.SetUnitCount( 3,
true );
768 units = m_part_no_data.GetUnitDrawItems();
770 BOOST_REQUIRE_EQUAL( units.size(), 4u );
775 BOOST_CHECK( units[1].m_items.empty() );
776 BOOST_CHECK( units[2].m_items.empty() );
777 BOOST_CHECK( units[3].m_items.empty() );
780 m_part_no_data.SetHasDeMorganBodyStyles(
true );
782 units = m_part_no_data.GetUnitDrawItems();
784 BOOST_REQUIRE_EQUAL( units.size(), 7u );
795 std::unique_ptr<LIB_SYMBOL> parent = std::make_unique<LIB_SYMBOL>(
"parent" );
796 BOOST_CHECK( parent->IsRoot() );
799 std::unique_ptr<LIB_SYMBOL> ref = std::make_unique<LIB_SYMBOL>( *parent );
801 std::unique_ptr<LIB_SYMBOL> child = std::make_unique<LIB_SYMBOL>(
"child", parent.get() );
802 BOOST_CHECK( child->IsDerived() );
805 std::unique_ptr<LIB_SYMBOL> grandChild = std::make_unique<LIB_SYMBOL>(
"grandchild", child.get() );
806 BOOST_CHECK( grandChild->IsDerived() );
809 BOOST_CHECK( parent->GetRootSymbol().get() == parent.get() );
810 BOOST_CHECK( child->GetRootSymbol().get() == parent.get() );
811 BOOST_CHECK( grandChild->GetRootSymbol().get() == parent.get() );
813 std::shared_ptr<LIB_SYMBOL> parentRef = child->GetParent().lock();
814 BOOST_CHECK( parentRef );
815 BOOST_CHECK( parentRef == parent->SharedPtr() );
818 std::shared_ptr<LIB_SYMBOL> childRef = grandChild->GetParent().lock();
819 BOOST_CHECK( childRef );
820 BOOST_CHECK( childRef == child->SharedPtr() );
824 parent->SetUnitCount( 4,
true );
826 parent->SetUnitCount( 1,
true );
831 BOOST_CHECK( *parent == *ref );
833 ref->SetName(
"child" );
836 child->AddField( field );
841 ref->AddField( field );
844 BOOST_CHECK( *ref == *child->Flatten() );
846 ref->SetName(
"grandchild" );
849 grandChild->AddField( field );
854 ref->AddField( field );
857 BOOST_CHECK( *ref == *grandChild->Flatten() );
860 "https://kicad/resistors.pdf" );
875 std::shared_ptr<LIB_SYMBOL>
copy = std::make_shared<LIB_SYMBOL>( m_part_no_data );
876 BOOST_CHECK( m_part_no_data == *
copy.get() );
885 std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>(
"power" );
887 pin->SetNumber(
"1" );
889 pin->SetVisible(
false );
890 symbol->AddDrawItem(
pin );
892 BOOST_CHECK( !symbol->IsPower() );
893 BOOST_CHECK( symbol->IsNormal() );
895 symbol->SetGlobalPower();
896 BOOST_CHECK( symbol->IsPower() );
897 BOOST_CHECK( !symbol->IsNormal() );
924 auto checkMandatoryFields = [](
LIB_SYMBOL& aSymbol )
935 BOOST_CHECK_NO_THROW( (
void) aSymbol.GetReferenceField().GetText() );
940 checkMandatoryFields( baseline );
948#if wxDEBUG_LEVEL == 0
951 checkMandatoryFields( zeroCount );
953 LIB_SYMBOL negativeCount( wxS(
"test_part" ) );
955#if wxDEBUG_LEVEL == 0
958 checkMandatoryFields( negativeCount );
973 for(
bool clearFlagFirst : {
false,
true } )
982 symbol->SetHasDeMorganBodyStyles(
false );
983 symbol->SetBodyStyleCount( 1,
false,
false );
987 symbol->SetBodyStyleCount( 1,
false,
false );
988 symbol->SetHasDeMorganBodyStyles(
false );
991 symbol->SetBodyStyleNames( {} );
1009 symbol->SetHasDeMorganBodyStyles(
false );
1036 BOOST_REQUIRE_EQUAL( original->Compare( changed, flags ), 0 );
1037 BOOST_REQUIRE_EQUAL( changed.
Compare( *original, flags ), 0 );
1040 const auto previous =
pin->GetType();
1044 BOOST_CHECK_NE( original->Compare( changed, flags ), 0 );
1045 BOOST_CHECK_NE( changed.
Compare( *original, flags ), 0 );
1057 BOOST_REQUIRE_EQUAL( original->Compare( changed, flags ), 0 );
1058 BOOST_REQUIRE_EQUAL( changed.
Compare( *original, flags ), 0 );
1059 const auto pins = original->GetGraphicalPins( 0, 0 );
1061 auto* extra =
static_cast<SCH_PIN*
>( pins.front()->Clone() );
1064 BOOST_REQUIRE_EQUAL( changed.
GetGraphicalPins( 0, 0 ).size(), pins.size() + 1 );
1065 BOOST_CHECK_NE( original->Compare( changed, flags ), 0 );
1066 BOOST_CHECK_NE( changed.
Compare( *original, flags ), 0 );
1078 BOOST_REQUIRE_EQUAL( original->Compare( changed, flags ), 0 );
1079 BOOST_REQUIRE_EQUAL( changed.
Compare( *original, flags ), 0 );
1080 const wxString
name(
"Native comparison field" );
1086 BOOST_CHECK_NE( original->Compare( changed, flags ), 0 );
1087 BOOST_CHECK_NE( changed.
Compare( *original, flags ), 0 );
1099 BOOST_REQUIRE_EQUAL( original->Compare( changed, flags ), 0 );
1100 BOOST_REQUIRE_EQUAL( changed.
Compare( *original, flags ), 0 );
1104 pin->SetVisible( !
pin->IsVisible() );
1107 BOOST_CHECK_NE( original->Compare( changed, flags ), 0 );
1108 BOOST_CHECK_NE( changed.
Compare( *original, flags ), 0 );
1120 BOOST_REQUIRE_EQUAL( original->Compare( changed, flags ), 0 );
1121 BOOST_REQUIRE_EQUAL( changed.
Compare( *original, flags ), 0 );
1125 const wxString
name(
"Native alternate" );
1131 BOOST_CHECK_NE( original->Compare( changed, flags ), 0 );
1132 BOOST_CHECK_NE( changed.
Compare( *original, flags ), 0 );
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetEnd(const VECTOR2I &aEnd)
virtual void SetBezierC2(const VECTOR2I &aPt)
virtual void SetBezierC1(const VECTOR2I &aPt)
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
virtual void SetShape(SHAPE_T aShape)
const std::vector< VECTOR2I > & GetBezierPoints() const
virtual void SetStart(const VECTOR2I &aStart)
A logical library item identifier and consists of various portions much like a URI.
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Define a library symbol object.
const LIB_ID & GetLibId() const override
std::vector< const SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
std::vector< struct LIB_SYMBOL_UNIT > GetUnitDrawItems()
Return a list of SCH_ITEM objects separated by unit and convert number.
SCH_FIELD * GetField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName; return nullptr if not found.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
void LockUnits(bool aLockUnits)
Set interchangeable the property for symbol units.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
void SetUnitCount(int aCount, bool aDuplicateDrawItems)
Set the units per symbol count.
void SetDescription(const wxString &aDescription)
Gets the Description field text value */.
void SetKeyWords(const wxString &aKeyWords)
void RemoveDrawItem(SCH_ITEM *aItem)
Remove draw aItem from list.
void SetFPFilters(const wxArrayString &aFilters)
int GetBodyStyleCount() const override
The body styles are a property of the drawings, which a derived symbol inherits from its root symbol ...
int GetUnitCount() const override
void SetLibId(const LIB_ID &aLibId)
void AddField(SCH_FIELD *aField)
Add a field.
int Compare(const LIB_SYMBOL &aRhs, int aCompareFlags=~COMPARE_FLAGS::UNIT, REPORTER *aReporter=nullptr) const
Comparison test that can be used for operators.
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
virtual void SetName(const wxString &aName)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetBodyStyle(int aBodyStyle)
virtual void SetUnit(int aUnit)
void SetNumber(const wxString &aNumber)
A temporary symbol library that is removed when it goes out of scope.
const wxString & GetPath() const
void SetExcludedFromBoard(bool aExclude, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear exclude from board netlist flag.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
int GetPinNameOffset() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
void SetPinNameOffset(int aOffset)
Set the offset in mils of the pin name text from the pin symbol.
void SetExcludedFromPosFiles(bool aExclude, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear exclude from position files flag.
virtual void SetExcludedFromBOM(bool aExcludeFromBOM, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
TEST_LIB_SYMBOL_FIXTURE()
Part with no extra data set.
LIB_SYMBOL m_part_no_data
static bool empty(const wxTextEntryBase *aCtrl)
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
bool AreDefaultFieldsCorrect(const std::vector< SCH_FIELD > &aFields)
Predicate to check that the mandatory fields look sensible.
bool FieldNameIdMatches(const SCH_FIELD &aField, const std::string &aExpectedName, int aExpectedId)
Predicate to check a field name is as expected.
@ PT_INPUT
usual pin input: must be connected
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ USER
The field ID hasn't been set yet; field is invalid.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ 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()
static void saveToLib(const wxString &aLibPath, const LIB_SYMBOL &aSymbol)
Write a symbol to its own library file.
static int alternateBodyStyleItemCount(LIB_SYMBOL &aSymbol)
Return the number of draw items belonging to a body style beyond the standard one.
static std::unique_ptr< LIB_SYMBOL > loadDeMorganSymbol()
Load 4001, a four unit NOR gate carrying a De Morgan alternate body style.
BOOST_AUTO_TEST_CASE(DefaultProperties)
Declare the test suite.
BOOST_CHECK_PREDICATE(ArePolylineEndPointsNearCircle,(chain)(c.m_geom.m_center_point)(radius)(accuracy+epsilon))
BOOST_TEST_CONTEXT("Test Clearance")
BOOST_CHECK_EQUAL(result, "25.4")
#define CHECK_WX_ASSERT(STATEMENT)
A test macro to check a wxASSERT is thrown.
VECTOR2< int32_t > VECTOR2I