49 const std::vector<SCH_REFERENCE>& aExistingRefs,
50 const std::vector<int>& aRequiredUnits )
53 for(
int unit : aRequiredUnits )
55 for(
const auto& ref : aExistingRefs )
57 if( ref.GetUnit() == unit
58 && ref.CompareValue( aTestRef ) == 0 )
89 const std::vector<SCH_REFERENCE>& aExistingRefs,
90 const std::vector<int>& aRequiredUnits )
93 for(
int unit : aRequiredUnits )
95 for(
const auto& ref : aExistingRefs )
97 if( ref.GetUnit() == unit
98 && ref.CompareValue( aTestRef ) == 0 )
112 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
115 tracker->Insert(
"U1" );
116 tracker->Insert(
"U5" );
117 tracker->Insert(
"IC2" );
118 tracker->Insert(
"IC7" );
136 "Unit Annotation: Skip previously used references",
137 "test_multiunit_reannotate",
140 {
"cf058f25-2bad-4c49-a0c4-f059825c427f",
"U99A",
"U2A",
true },
141 {
"e6c8127f-e282-4128-8744-05f7893bc3ec",
"U99B",
"U2B",
true },
142 {
"db066797-b21c-4c1c-9591-8c7c549f8087",
"U99C",
"U2C",
true },
147 "Unit Annotation: Complex gaps with multi-unit symbols",
148 "test_multiunit_reannotate_complex",
154 {
"U1",
"U3",
"U7",
"IC2",
"IC5" }
157 "Unit Annotation: Min value override with unit conflicts",
158 "test_multiunit_reannotate",
161 {
"cf058f25-2bad-4c49-a0c4-f059825c427f",
"U99A",
"U10A",
true },
162 {
"e6c8127f-e282-4128-8744-05f7893bc3ec",
"U99B",
"U10B",
true },
163 {
"db066797-b21c-4c1c-9591-8c7c549f8087",
"U99C",
"U10C",
true },
173 BOOST_TEST_INFO_SCOPE( c.m_caseName );
176 if( c.m_SchematicRelativePath ==
"test_multiunit_reannotate_complex" )
187 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
188 for(
const std::string& ref : c.m_PreloadedRefs )
190 tracker->Insert( ref );
192 m_schematic->Settings().m_refDesTracker = tracker;
200 if( ref.m_IncludeInReannotationList )
208 catch(
const std::exception& e )
210 BOOST_TEST_MESSAGE(
"Skipping test case due to missing schematic: " + std::string( e.what() ) );
218 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
221 tracker->Insert(
"U1" );
222 tracker->Insert(
"U3" );
223 tracker->Insert(
"R1" );
224 tracker->Insert(
"R2" );
225 tracker->Insert(
"R5" );
229 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
230 std::vector<int> emptyUnits;
232 setupRefDesTracker( *tracker );
234 int nextU = tracker->GetNextRefDesForUnits( uRef, emptyMap, emptyUnits, 1 );
238 int nextR = tracker->GetNextRefDesForUnits( rRef, emptyMap, emptyUnits, 1 );
241 SCH_REFERENCE icRef = createTestReference(
"IC",
"74HC00", 1 );
242 int nextIC = tracker->GetNextRefDesForUnits( icRef, emptyMap, emptyUnits, 1 );
246 int nextU_min5 = tracker->GetNextRefDesForUnits( uRef, emptyMap, emptyUnits, 5 );
250 BOOST_CHECK( tracker->Contains(
"U2" ) );
251 BOOST_CHECK( tracker->Contains(
"R3" ) );
252 BOOST_CHECK( tracker->Contains(
"IC1" ) );
253 BOOST_CHECK( tracker->Contains(
"U5" ) );
260 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
267 tracker->Insert(
"U1" );
272 SCH_REFERENCE testRef = createTestReference(
"U",
"LM358", 1 );
273 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
274 std::vector<int> emptyUnits;
276 setupRefDesTracker( *tracker );
278 int next = tracker->GetNextRefDesForUnits( testRef, emptyMap, emptyUnits, 1 );
281 BOOST_TEST_MESSAGE(
"Testing unit availability concept - integrated with GetNextRefDesForUnits" );
286 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
289 tracker->Insert(
"U1" );
290 tracker->Insert(
"U3" );
294 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
295 std::vector<int> emptyUnits;
297 setupRefDesTracker( *tracker );
299 int next = tracker->GetNextRefDesForUnits( uRef, emptyMap, emptyUnits, 1 );
302 tracker->Insert(
"IC1" );
303 tracker->Insert(
"IC5" );
305 SCH_REFERENCE icRef = createTestReference(
"IC",
"74HC00", 1 );
306 next = tracker->GetNextRefDesForUnits( icRef, emptyMap, emptyUnits, 3 );
310 std::string serialized = tracker->Serialize();
312 auto tracker2 = std::make_shared<REFDES_TRACKER>(
false );
313 BOOST_CHECK( tracker2->Deserialize( serialized ) );
316 BOOST_CHECK( tracker2->Contains(
"U1" ) );
317 BOOST_CHECK( tracker2->Contains(
"U2" ) );
318 BOOST_CHECK( tracker2->Contains(
"U3" ) );
319 BOOST_CHECK( tracker2->Contains(
"IC1" ) );
320 BOOST_CHECK( tracker2->Contains(
"IC3" ) );
321 BOOST_CHECK( tracker2->Contains(
"IC5" ) );
324 setupRefDesTracker( *tracker2 );
325 next = tracker2->GetNextRefDesForUnits( uRef, emptyMap, emptyUnits, 1 );
328 next = tracker2->GetNextRefDesForUnits( icRef, emptyMap, emptyUnits, 1 );
334 auto tracker = std::make_shared<REFDES_TRACKER>(
false );
337 for(
int i = 1; i <= 100; i += 7 )
339 tracker->Insert(
"R" + std::to_string( i ) );
343 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
344 std::vector<int> emptyUnits;
346 setupRefDesTracker( *tracker );
349 auto start = std::chrono::high_resolution_clock::now();
351 for(
int i = 0; i < 100; ++i )
354 int result1 = tracker->GetNextRefDesForUnits( rRef, emptyMap, emptyUnits, 1 );
355 int result50 = tracker->GetNextRefDesForUnits( rRef, emptyMap, emptyUnits, 50 );
358 auto end = std::chrono::high_resolution_clock::now();
359 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
end - start );
361 BOOST_TEST_MESSAGE(
"200 GetNextRefDesForUnits calls took: " + std::to_string( duration.count() ) +
" microseconds" );
364 BOOST_CHECK_LT( duration.count(), 50000 );
A generic fixture for loading schematics and associated settings for qa tests.
std::unique_ptr< SCHEMATIC > m_schematic
Class to efficiently track reference designators and provide next available designators.
void SetReuseRefDes(bool aReuse)
void SetUnitsChecker(const UNITS_CHECKER_FUNC< SCH_REFERENCE > &aChecker)
Set an external units checker function for SCH_REFERENCE objects.
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
void SetRefDesTracker(std::shared_ptr< REFDES_TRACKER > aTracker)
A helper to define a symbol's reference designator in a schematic.
void SetValue(const wxString &aValue)
void SetRef(const wxString &aReference)
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_REFERENCE createTestReference(const wxString &aRef, const wxString &aValue, int aUnit)
void setupRefDesTracker(REFDES_TRACKER &tracker)
void testFindFirstUnusedReferenceWithUnits()
void setupRefDesTracker(REFDES_TRACKER &tracker)
void setupRefDesTracker()
void verifyUnitAvailabilityLogic()
static void LoadSchematic(SCHEMATIC *aSchematic, SCH_SHEET *aRootSheet, const wxString &aFileName)
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
std::map< wxString, SCH_REFERENCE_LIST > SCH_MULTI_UNIT_REFERENCE_MAP
Container to map reference designators for multi-unit parts.
wxString m_KIID
KIID of the symbol to reannotate.
wxString m_ExpectedRef
Expected Reference Designator (after reannotating)
wxString m_OriginalRef
Original Reference Designator (prior to reannotating)
bool m_IncludeInReannotationList
True if reference is "selected" for reannotation.
std::vector< REANNOTATED_REFERENCE > m_ExpectedReannotations
wxString m_SchematicRelativePath
std::vector< std::string > m_PreloadedRefs
BOOST_AUTO_TEST_CASE(UnitAnnotationWithRefDesTracker)
static const std::vector< UNIT_ANNOTATION_CASE > unitAnnotationCases
BOOST_CHECK_EQUAL(ret, c.m_exp_result)
BOOST_AUTO_TEST_SUITE_END()
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")