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_AUTO_TEST_SUITE_END()
 
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
 
BOOST_CHECK_EQUAL(result, "25.4")