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 );
 
  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_AUTO_TEST_CASE(HorizontalAlignment)
 
BOOST_AUTO_TEST_SUITE_END()
 
wxString result
Test unit parsing edge cases and error handling.
 
BOOST_CHECK_EQUAL(result, "25.4")