KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_symbol_library_manager.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2023 Wayne Stambaugh <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
25
27
28// Code under test
31#include <sch_field.h>
32
40
41
42BOOST_FIXTURE_TEST_SUITE( SymbolLibraryManager, SYMBOL_LIBRARY_MANAGER_TEST_FIXTURE )
43
44
45
48BOOST_AUTO_TEST_CASE( SymbolBuffer )
49{
50 std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>( wxS( "Symbol" ) );
51 std::unique_ptr<SCH_SCREEN> screen = std::make_unique<SCH_SCREEN>();
52
53 LIB_SYMBOL& symbolRef = *symbol;
54
55 SYMBOL_BUFFER buffer( std::move( symbol ), std::move( screen ) );
56
57 BOOST_CHECK( !buffer.IsModified() );
58 BOOST_CHECK( &buffer.GetSymbol() == &symbolRef );
59 BOOST_CHECK( buffer.GetOriginal() == symbolRef );
60
61 buffer.GetScreen()->SetContentModified();
62 BOOST_CHECK( buffer.IsModified() );
63
64 std::unique_ptr<LIB_SYMBOL> originalSymbol =
65 std::make_unique<LIB_SYMBOL>( wxS( "OriginalSymbol" ) );
66 LIB_SYMBOL& originalSymbolRef = *originalSymbol;
67
68 buffer.SetOriginal( std::move( originalSymbol ) );
69
70 BOOST_CHECK( &buffer.GetOriginal() == &originalSymbolRef );
71 BOOST_CHECK( buffer.GetOriginal() == originalSymbolRef );
72 BOOST_CHECK( &buffer.GetSymbol() != &buffer.GetOriginal() );
73}
74
75
80{
81 wxArrayString symbolNames;
82 LIB_BUFFER libBuffer( wxS( "TestLibrary" ) );
83
84 BOOST_CHECK( !libBuffer.IsModified() );
85 BOOST_CHECK_EQUAL( libBuffer.GetHash(), 1 );
86
87 auto parentSymbol1 = std::make_unique<LIB_SYMBOL>( wxS( "Parent1" ) );
88 // A but clunky, but real code would get symbol from the LIB_BUFFER
89 // via GetSymbol etc, rather than retaining a reference after construction.
90 LIB_SYMBOL& parentSymbol1Ref = *parentSymbol1;
91
92 BOOST_CHECK_EQUAL( libBuffer.GetSymbol( parentSymbol1->GetName() ), nullptr );
93
94 parentSymbol1->GetValueField().SetText( parentSymbol1->GetName() );
95 libBuffer.CreateBuffer( std::move( parentSymbol1 ), std::make_unique<SCH_SCREEN>() );
96 BOOST_CHECK( libBuffer.GetSymbol( parentSymbol1Ref.GetName() ) == &parentSymbol1Ref );
97 BOOST_CHECK( !libBuffer.HasDerivedSymbols( parentSymbol1Ref.GetName() ) );
98 BOOST_CHECK_EQUAL( libBuffer.GetHash(), 2 );
99
100 libBuffer.GetSymbolNames( symbolNames );
101 BOOST_CHECK_EQUAL( symbolNames.GetCount(), 1 );
102 BOOST_CHECK_EQUAL( symbolNames[0], parentSymbol1Ref.GetName() );
103
104 symbolNames.Clear();
105 libBuffer.GetSymbolNames( symbolNames, SYMBOL_NAME_FILTER::ROOT_ONLY );
106 BOOST_CHECK_EQUAL( symbolNames.GetCount(), 1 );
107 BOOST_CHECK_EQUAL( symbolNames[0], parentSymbol1Ref.GetName() );
108
109 symbolNames.Clear();
110 libBuffer.GetSymbolNames( symbolNames, SYMBOL_NAME_FILTER::DERIVED_ONLY );
111 BOOST_CHECK_EQUAL( symbolNames.GetCount(), 0 );
112
113 auto childSymbol1 = std::make_unique<LIB_SYMBOL>( wxS( "Child1" ) );
114 LIB_SYMBOL& childSymbol1Ref = *childSymbol1;
115
116 childSymbol1->SetParent( &parentSymbol1Ref );
117 childSymbol1->GetValueField().SetText( childSymbol1->GetName() );
118 libBuffer.CreateBuffer( std::move( childSymbol1 ), std::make_unique<SCH_SCREEN>() );
119 BOOST_CHECK( libBuffer.GetSymbol( childSymbol1Ref.GetName() ) == &childSymbol1Ref );
120 BOOST_CHECK( libBuffer.HasDerivedSymbols( parentSymbol1Ref.GetName() ) );
121 BOOST_CHECK_EQUAL( libBuffer.GetHash(), 3 );
122
123 symbolNames.Clear();
124 libBuffer.GetSymbolNames( symbolNames );
125 BOOST_CHECK_EQUAL( symbolNames.GetCount(), 2 );
126 BOOST_CHECK_EQUAL( symbolNames[0], parentSymbol1Ref.GetName() );
127 BOOST_CHECK_EQUAL( symbolNames[1], childSymbol1Ref.GetName() );
128
129 symbolNames.Clear();
130 libBuffer.GetSymbolNames( symbolNames, SYMBOL_NAME_FILTER::DERIVED_ONLY );
131 BOOST_CHECK_EQUAL( symbolNames.GetCount(), 1 );
132 BOOST_CHECK_EQUAL( symbolNames[0], childSymbol1Ref.GetName() );
133
134 symbolNames.Clear();
135
136 BOOST_CHECK_EQUAL( libBuffer.GetDerivedSymbolNames( parentSymbol1Ref.GetName(), symbolNames ),
137 1 );
138 BOOST_CHECK_EQUAL( symbolNames[0], childSymbol1Ref.GetName() );
139
140 std::shared_ptr<SYMBOL_BUFFER> buf = libBuffer.GetBuffer( parentSymbol1Ref.GetName() );
141
142 LIB_SYMBOL tmp( parentSymbol1Ref );
143 tmp.GetDescriptionField().SetText( wxS( "Description" ) );
144
145 libBuffer.UpdateBuffer( *buf, tmp );
146 BOOST_CHECK_EQUAL( libBuffer.GetHash(), 4 );
147 BOOST_CHECK( *libBuffer.GetSymbol( parentSymbol1Ref.GetName() ) == tmp );
148
149 const bool deletedOk = libBuffer.DeleteBuffer( *buf );
150 BOOST_CHECK( deletedOk );
151 BOOST_CHECK( libBuffer.GetBuffers().empty() );
152}
153
154
158BOOST_AUTO_TEST_CASE( NewSymbolCreation )
159{
161
162 props.name = wxS( "Standalone" );
163 props.reference = wxS( "U" );
164 props.unitCount = 2;
165 props.pinNameInside = true;
166 props.pinTextPosition = 2;
167 props.powerSymbol = false;
168 props.showPinNumber = true;
169 props.showPinName = true;
170 props.unitsInterchangeable = false;
171 props.includeInBom = true;
172 props.includeOnBoard = true;
173 props.alternateBodyStyle = false;
174
175 std::unique_ptr<LIB_SYMBOL> standalone =
177
178 BOOST_CHECK_EQUAL( standalone->GetReferenceField().GetText(), props.reference );
179 BOOST_CHECK_EQUAL( standalone->GetUnitCount(), props.unitCount );
180 BOOST_CHECK( standalone->GetPinNameOffset() > 0 );
181
182 auto parent = std::make_unique<LIB_SYMBOL>( wxS( "Parent" ) );
183 parent->GetValueField().SetText( parent->GetName() );
184 SCH_FIELD* user = new SCH_FIELD( parent.get(), FIELD_T::USER, wxS( "UF" ) );
185 user->SetText( wxS( "V" ) );
186 parent->AddField( user );
187
188 props.name = wxS( "Child" );
189 props.parentSymbolName = parent->GetName();
190 props.keepFootprint = false;
191 props.keepDatasheet = false;
192 props.transferUserFields = true;
193 props.keepContentUserFields = false;
194
195 std::unique_ptr<LIB_SYMBOL> child =
196 LIB_SYMBOL_LIBRARY_MANAGER::CreateSymbol( props, parent.get() );
197
198 BOOST_CHECK( child->GetParent().lock().get() == parent.get() );
199 BOOST_CHECK( child->GetFootprintField().GetText().IsEmpty() );
200 BOOST_CHECK( child->GetDatasheetField().GetText().IsEmpty() );
201
202 std::vector<SCH_FIELD*> childFields;
203 child->GetFields( childFields );
204
205 bool found = false;
206
207 for( SCH_FIELD* field : childFields )
208 {
209 if( field->GetId() == FIELD_T::USER )
210 {
211 found = true;
212 BOOST_CHECK( field->GetText().IsEmpty() );
213 }
214 }
215
216 BOOST_CHECK( found );
217}
218
219
void SetContentModified(bool aModified=true)
Definition base_screen.h:59
Store a working copy of a library.
size_t GetDerivedSymbolNames(const wxString &aSymbolName, wxArrayString &aList)
Fetch all of the symbols derived from a aSymbolName into aList.
bool CreateBuffer(std::unique_ptr< LIB_SYMBOL > aCopy, std::unique_ptr< SCH_SCREEN > aScreen)
Create a new buffer to store a symbol. LIB_BUFFER takes ownership of aCopy.
bool IsModified() const
bool DeleteBuffer(const SYMBOL_BUFFER &aSymbolBuf)
Delete the given symbol buffer from the library buffer.
void GetSymbolNames(wxArrayString &aSymbolNames, SYMBOL_NAME_FILTER aFilter=SYMBOL_NAME_FILTER::ALL)
Fetch a list of root symbols names from the library buffer.
const std::deque< std::shared_ptr< SYMBOL_BUFFER > > & GetBuffers() const
Return all buffered symbols.
std::shared_ptr< SYMBOL_BUFFER > GetBuffer(const wxString &aAlias) const
Return a symbol buffer with LIB_SYMBOL holding a symbolic alias.
LIB_SYMBOL * GetSymbol(const wxString &aAlias) const
Return the working copy of a LIB_SYMBOL root object with specified alias.
bool HasDerivedSymbols(const wxString &aParentName) const
Check to see any symbols in the buffer are derived from a parent named aParentName.
bool UpdateBuffer(SYMBOL_BUFFER &aSymbolBuf, const LIB_SYMBOL &aCopy)
Update the buffered symbol with the contents of aCopy.
static std::unique_ptr< LIB_SYMBOL > CreateSymbol(const NEW_SYMBOL_PROPERTIES &aProps, LIB_SYMBOL *aParent)
Define a library symbol object.
Definition lib_symbol.h:85
SCH_FIELD & GetDescriptionField()
Return reference to the description field.
Definition lib_symbol.h:352
void SetParent(LIB_SYMBOL *aParent=nullptr)
wxString GetName() const override
Definition lib_symbol.h:148
void SetText(const wxString &aText) override
LIB_SYMBOL & GetSymbol() const
SCH_SCREEN * GetScreen() const
LIB_SYMBOL & GetOriginal() const
void SetOriginal(std::unique_ptr< LIB_SYMBOL > aSymbol)
@ USER
The field ID hasn't been set yet; field is invalid.
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(SymbolBuffer)
Test the SYMBOL_BUFFER object.
BOOST_CHECK_EQUAL(result, "25.4")