62 const std::vector<SCH_REFERENCE>& aExistingRefs,
63 const std::vector<int>& aRequiredUnits )
66 for(
int unit : aRequiredUnits )
68 for(
const auto& ref : aExistingRefs )
70 if( ref.GetUnit() == unit
71 || ref.CompareValue( aTestRef ) != 0 )
96 std::map<int, std::vector<SCH_REFERENCE>> refNumberMap;
99 std::vector<SCH_REFERENCE> refs;
100 for(
const auto& [value, unit] : tupleVec )
104 refNumberMap[refNum] = refs;
107 BOOST_TEST_INFO(
"Testing case: " + testCase.
m_caseName );
121 std::string resultRefDes = testCase.
m_testRefPrefix + std::to_string( result );
129 BOOST_CHECK( tracker.
Contains( resultRefDes ) );
135 "Case 1: Completely unused reference - empty units",
144 "Case 2: Completely unused reference - with units",
153 "Case 3: Skip currently in use reference",
156 { 1, { std::make_tuple(
"LM358", 1) } }
164 "Case 4: Units available in currently used reference",
167 { 1, { std::make_tuple(
"LM358", 3),
168 std::make_tuple(
"LM358", 4) } }
176 "Case 5: Different value conflict",
179 { 1, { std::make_tuple(
"LM741", 1) } }
187 "Case 6: Previously used reference in tracker",
196 "Case 7: Min value higher than available",
199 { 5, { std::make_tuple(
"LM358", 1) } }
207 "Case 8: Negative units filtered out",
216 "Case 9: Complex scenario with gaps",
219 { 2, { std::make_tuple(
"74HC00", 1) } },
220 { 4, { std::make_tuple(
"74HC00", 2) } }
235 runTestCase( testCase );
245 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
246 std::vector<int> emptyUnits;
248 setupRefDesTracker( tracker );
251 BOOST_CHECK( tracker.
Contains(
"R1" ) );
259 std::vector<int> mixedUnits = {-1, 1, -5, 2};
260 SCH_REFERENCE testRef2 = createTestReference(
"C",
"100nF", 1 );
270 SCH_REFERENCE testRef = createTestReference(
"U",
"LM358", 1 );
273 std::map<int, std::vector<SCH_REFERENCE>> refNumberMap;
274 refNumberMap[1] = { createTestReference(
"U",
"LM358", 1),
275 createTestReference(
"U",
"LM358", 2) };
276 refNumberMap[3] = { createTestReference(
"U",
"LM358", 1) };
279 std::vector<int> requiredUnits = {1, 2};
281 setupRefDesTracker( tracker );
288 BOOST_CHECK( tracker.
Contains(
"U2" ) );
291 std::vector<int> requiredUnits2 = {3, 4};
292 refNumberMap[3] = { createTestReference(
"U",
"LM358", 1) };
298 SCH_REFERENCE differentValueRef = createTestReference(
"U",
"LM741", 1 );
299 refNumberMap[4] = { createTestReference(
"U",
"LM358", 1) };
310 SCH_REFERENCE testRef = createTestReference(
"U",
"LM358", 1 );
311 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
312 std::vector<int> requiredUnits = {1, 2};
314 setupRefDesTracker( tracker );
317 BOOST_CHECK( tracker.
Contains(
"U1" ) );
322 BOOST_CHECK( tracker.
Contains(
"U2" ) );
325 std::map<int, std::vector<SCH_REFERENCE>> conflictMap;
326 conflictMap[3] = { createTestReference(
"U",
"LM358", 1) };
340 BOOST_CHECK( tracker.
Contains(
"U1" ) );
341 BOOST_CHECK( tracker.
Contains(
"U3" ) );
342 BOOST_CHECK( !tracker.
Contains(
"U2" ) );
345 SCH_REFERENCE testRef = createTestReference(
"U",
"LM358", 1 );
346 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
347 std::vector<int> requiredUnits = {1, 2};
349 setupRefDesTracker( tracker );
354 BOOST_CHECK( tracker.
Contains(
"U2" ) );
359 BOOST_CHECK( tracker.
Contains(
"U5" ) );
362 std::string serialized = tracker.
Serialize();
367 BOOST_CHECK( tracker2.
Contains(
"U1" ) );
368 BOOST_CHECK( tracker2.
Contains(
"U2" ) );
369 BOOST_CHECK( tracker2.
Contains(
"U3" ) );
370 BOOST_CHECK( tracker2.
Contains(
"U5" ) );
372 setupRefDesTracker( tracker2 );
387 setupRefDesTracker( tracker );
391 std::map<int, std::vector<SCH_REFERENCE>> emptyMap;
392 std::vector<int> requiredUnits = {1};
398 SCH_REFERENCE capacitorRef = createTestReference(
"C",
"100nF", 1 );
403 std::string serialized = tracker.
Serialize();
404 BOOST_CHECK( !serialized.empty() );
410 BOOST_CHECK( tracker2.
Contains(
"R1" ) );
411 BOOST_CHECK( tracker2.
Contains(
"R2" ) );
412 BOOST_CHECK( tracker2.
Contains(
"R3" ) );
413 BOOST_CHECK( tracker2.
Contains(
"C5" ) );
415 setupRefDesTracker( tracker2 );
422 std::map<int, std::vector<SCH_REFERENCE>> conflictMap;
423 conflictMap[4] = { createTestReference(
"R",
"2k", 1) };
A generic fixture for loading schematics and associated settings for qa tests.
Class to efficiently track reference designators and provide next available designators.
bool Deserialize(const std::string &aData)
Deserialize tracker data from string representation.
int GetNextRefDesForUnits(const SCH_REFERENCE &aRef, const std::map< int, std::vector< SCH_REFERENCE > > &aRefNumberMap, const std::vector< int > &aRequiredUnits, int aMinValue)
Get the next available reference designator number for multi-unit symbols.
void SetReuseRefDes(bool aReuse)
bool Insert(const std::string &aRefDes)
Insert a reference designator into the tracker.
void SetUnitsChecker(const UNITS_CHECKER_FUNC< SCH_REFERENCE > &aChecker)
Set an external units checker function for SCH_REFERENCE objects.
std::string Serialize() const
Serialize the tracker data to a compact string representation.
bool Contains(const std::string &aRefDes) const
Check if a reference designator exists in the tracker.
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...
void setupRefDesTracker(REFDES_TRACKER &tracker)
void runTestCase(const REFDES_UNITS_TEST_CASE &testCase)
SCH_REFERENCE createTestReference(const std::string &aRefPrefix, const std::string &aValue, int aUnit)
std::map< int, std::vector< std::tuple< std::string, int > > > m_refNumberMap
std::vector< int > m_requiredUnits
std::string m_testRefValue
std::string m_testRefPrefix
std::vector< std::string > m_trackerPreloads
BOOST_AUTO_TEST_CASE(GetNextRefDesForUnits_BasicCases)
static const std::vector< REFDES_UNITS_TEST_CASE > refdesUnitsTestCases
BOOST_CHECK_EQUAL(ret, c.m_exp_result)
BOOST_AUTO_TEST_SUITE_END()