35        m_symbol = std::make_unique<LIB_SYMBOL>( 
"TestSymbol" );
 
 
 
   52    pin->SetNumber( wxT(
"[1,2,3]") );
 
   55    std::vector<wxString> expanded = 
pin->GetStackedPinNumbers( &isValid );
 
   57    BOOST_CHECK( isValid );
 
   58    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
   67    pin->SetNumber( wxT(
"[5-7]") );
 
   69    expanded = 
pin->GetStackedPinNumbers( &isValid );
 
   71    BOOST_CHECK( isValid );
 
   72    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
   81    pin->SetNumber( wxT(
"[1,3,5-7]") );
 
   83    expanded = 
pin->GetStackedPinNumbers( &isValid );
 
   85    BOOST_CHECK( isValid );
 
   86    BOOST_REQUIRE_EQUAL( expanded.size(), 5 );
 
 
  105    pin->SetNumber( wxT(
"1") );
 
  107    std::vector<wxString> expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  108    BOOST_CHECK( isValid );
 
  113    pin->SetNumber( wxT(
"[1,2") );
 
  114    expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  115    BOOST_CHECK( !isValid );
 
  118    pin->SetNumber( wxT(
"[5-3]") );  
 
  119    expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  120    BOOST_CHECK( !isValid );
 
  123    pin->SetNumber( wxT(
"[]") );
 
  124    expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  125    BOOST_CHECK( !isValid );
 
 
  174    pin->SetNumber( wxT(
"[8,9,10]") );
 
  179    std::vector<wxString> expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  181    BOOST_CHECK( isValid );
 
  182    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
 
  223    wxString stackedNotation = wxT(
"[");
 
  225    stackedNotation += wxT(
",");
 
  227    stackedNotation += wxT(
",");
 
  229    stackedNotation += wxT(
"]");
 
  241    BOOST_CHECK( isValid );
 
  242    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
 
  262    std::vector<long> numbers = { 1, 2, 3, 4 };
 
  267    while( i < numbers.size() )
 
  272        long start = numbers[i];
 
  276        while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  283        if( 
end > start + 1 )  
 
  284            result += wxString::Format( wxT(
"%ld-%ld"), start, 
end );
 
  285        else if( 
end == start + 1 )  
 
  286            result += wxString::Format( wxT(
"%ld,%ld"), start, 
end );
 
  288            result += wxString::Format( wxT(
"%ld"), start );
 
  297    numbers = { 1, 2, 3, 4, 7, 8, 9 };
 
  301    while( i < numbers.size() )
 
  306        long start = numbers[i];
 
  310        while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  317        if( 
end > start + 1 )  
 
  318            result += wxString::Format( wxT(
"%ld-%ld"), start, 
end );
 
  319        else if( 
end == start + 1 )  
 
  320            result += wxString::Format( wxT(
"%ld,%ld"), start, 
end );
 
  322            result += wxString::Format( wxT(
"%ld"), start );
 
  331    numbers = { 1, 3, 5 };  
 
  335    while( i < numbers.size() )
 
  340        long start = numbers[i];
 
  344        while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  351        if( 
end > start + 1 )  
 
  352            result += wxString::Format( wxT(
"%ld-%ld"), start, 
end );
 
  353        else if( 
end == start + 1 )  
 
  354            result += wxString::Format( wxT(
"%ld,%ld"), start, 
end );
 
  356            result += wxString::Format( wxT(
"%ld"), start );
 
  369    while( i < numbers.size() )
 
  374        long start = numbers[i];
 
  378        while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  385        if( 
end > start + 1 )  
 
  386            result += wxString::Format( wxT(
"%ld-%ld"), start, 
end );
 
  387        else if( 
end == start + 1 )  
 
  388            result += wxString::Format( wxT(
"%ld,%ld"), start, 
end );
 
  390            result += wxString::Format( wxT(
"%ld"), start );
 
  399    numbers = { 1, 2, 4, 5, 6, 8, 9, 10, 11 };
 
  403    while( i < numbers.size() )
 
  408        long start = numbers[i];
 
  412        while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  419        if( 
end > start + 1 )  
 
  420            result += wxString::Format( wxT(
"%ld-%ld"), start, 
end );
 
  421        else if( 
end == start + 1 )  
 
  422            result += wxString::Format( wxT(
"%ld,%ld"), start, 
end );
 
  424            result += wxString::Format( wxT(
"%ld"), start );
 
  438    BOOST_CHECK( isValid );
 
  439    BOOST_REQUIRE_EQUAL( expanded.size(), 7 );
 
 
  467    pin5->
SetName( wxT(
"TestPin") );
 
  475    pin7->
SetName( wxT(
"TestPin") );
 
  483    pin9->
SetName( wxT(
"TestPin") );
 
  489    wxString originalName = pin5->
GetName();
 
  493    std::vector<SCH_PIN*> pinsToConvert = { pin5, pin7, pin9 };
 
  496    std::sort( pinsToConvert.begin(), pinsToConvert.end(),
 
  500            if( a->GetNumber().ToLong( &numA ) && b->GetNumber().ToLong( &numB ) )
 
  502            return a->GetNumber() < b->GetNumber();
 
  506    wxString stackedNotation = wxT(
"[5,7,9]");
 
  507    pinsToConvert[0]->SetNumber( stackedNotation );
 
  510    SCH_PIN* stackedPin = pinsToConvert[0];
 
  515    BOOST_CHECK( isValid );
 
  516    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
  523    std::sort( expanded.begin(), expanded.end(),
 
  524        []( 
const wxString& a, 
const wxString& b )
 
  527            if( a.ToLong( &numA ) && b.ToLong( &numB ) )
 
  537    std::vector<SCH_PIN*> explodedPins;
 
  538    explodedPins.push_back( stackedPin );
 
  540    for( 
size_t i = 1; i < expanded.size(); ++i )
 
  558        explodedPins.push_back( newPin );
 
  562    BOOST_REQUIRE_EQUAL( explodedPins.size(), 3 );
 
  570    BOOST_CHECK( explodedPins[0]->IsVisible() );
 
  571    BOOST_CHECK( !explodedPins[1]->IsVisible() );
 
  572    BOOST_CHECK( !explodedPins[2]->IsVisible() );
 
  578        BOOST_CHECK( 
pin->GetOrientation() == originalOrientation );
 
  579        BOOST_CHECK( 
pin->GetType() == originalType );
 
  585    for( 
size_t i = 1; i < explodedPins.size(); ++i )
 
  586        delete explodedPins[i];
 
 
  598    pin->SetNumber( wxT(
"[8,10,12]") );
 
  599    pin->SetVisible( 
false );  
 
  603    std::vector<wxString> expanded = 
pin->GetStackedPinNumbers( &isValid );
 
  604    BOOST_CHECK( isValid );
 
  605    BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
 
  608    std::sort( expanded.begin(), expanded.end(),
 
  609        []( 
const wxString& a, 
const wxString& b )
 
  612            if( a.ToLong( &numA ) && b.ToLong( &numB ) )
 
  623    pin->SetNumber( expanded[0] );  
 
  624    pin->SetVisible( 
true );        
 
  628    BOOST_CHECK( 
pin->IsVisible() );
 
 
  643    auto testPrefixParsing = []( 
const wxString& pinNumber ) -> std::pair<wxString, long>
 
  649        size_t numStart = pinNumber.length();
 
  650        for( 
int i = pinNumber.length() - 1; i >= 0; i-- )
 
  652            if( !wxIsdigit( pinNumber[i] ) )
 
  661        if( numStart < pinNumber.length() )  
 
  663            prefix = pinNumber.Left( numStart );
 
  664            wxString numericPart = pinNumber.Mid( numStart );
 
  665            numericPart.ToLong( &numValue );
 
  668        return std::make_pair( prefix, numValue );
 
  672    auto [prefix1, num1] = testPrefixParsing( wxT(
"A1") );
 
  676    auto [prefix2, num2] = testPrefixParsing( wxT(
"AB12") );
 
  680    auto [prefix3, num3] = testPrefixParsing( wxT(
"123") );
 
  684    auto [prefix4, num4] = testPrefixParsing( wxT(
"XYZ") );
 
  689    std::map<wxString, std::vector<long>> prefixGroups;
 
  690    std::vector<wxString> testPins = { wxT(
"AA1"), wxT(
"AA2"), wxT(
"AA3"), wxT(
"AB4"), wxT(
"CD12"), wxT(
"CD13"), wxT(
"CD14") };
 
  692    for( 
const wxString& pinNumber : testPins )
 
  694        auto [prefix, numValue] = testPrefixParsing( pinNumber );
 
  696            prefixGroups[prefix].push_back( numValue );
 
  706    wxString expectedResult;
 
  707    for( 
auto& [prefix, numbers] : prefixGroups )
 
  709        if( !expectedResult.IsEmpty() )
 
  710            expectedResult += wxT(
",");
 
  712        std::sort( numbers.begin(), numbers.end() );
 
  715        while( i < numbers.size() )
 
  718                expectedResult += wxT(
",");
 
  720            long start = numbers[i];
 
  724            while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
 
  731            if( 
end > start + 1 )  
 
  732                expectedResult += wxString::Format( wxT(
"%s%ld-%s%ld"), prefix, start, prefix, 
end );
 
  733            else if( 
end == start + 1 )  
 
  734                expectedResult += wxString::Format( wxT(
"%s%ld,%s%ld"), prefix, start, prefix, 
end );
 
  736                expectedResult += wxString::Format( wxT(
"%s%ld"), prefix, start );
 
 
  754    m_symbol->AddDrawItem( stacked );
 
  759    m_symbol->AddDrawItem( single );
 
  761    std::vector<wxString> messages;
 
  764    BOOST_REQUIRE_EQUAL( messages.size(), 1 );
 
  765    BOOST_CHECK( messages.front().Contains( wxT( 
"Duplicate pin 2" ) ) );
 
  766    BOOST_CHECK( messages.front().Contains( wxT( 
"[1-3]" ) ) );
 
  772    BOOST_CHECK( messages.empty() );
 
 
  790    std::vector<TestCase> testCases = {
 
  791        { wxT( 
"1" ), 1, 
true },                    
 
  792        { wxT( 
"[1,2,3]" ), 3, 
true },              
 
  793        { wxT( 
"[5-7]" ), 3, 
true },                
 
  794        { wxT( 
"[1,3,5-7]" ), 5, 
true },            
 
  795        { wxT( 
"[A1-A5]" ), 5, 
true },              
 
  796        { wxT( 
"[1-10]" ), 10, 
true },              
 
  797        { wxT( 
"[PA1,PA2,PB5-PB8]" ), 6, 
true },    
 
  798        { wxT( 
"[1-3,10,20-22]" ), 7, 
true },       
 
  799        { wxT( 
"[10" ), 1, 
false },                 
 
  800        { wxT( 
"10]" ), 1, 
false },                 
 
  801        { wxT( 
"[5-3]" ), 1, 
false },               
 
  804    for( 
const auto& testCase : testCases )
 
  807        pin->SetNumber( testCase.notation );
 
  809        bool validExpand = 
false;
 
  810        bool validCount = 
false;
 
  812        std::vector<wxString> expanded = 
pin->GetStackedPinNumbers( &validExpand );
 
  813        int count = 
pin->GetStackedPinCount( &validCount );
 
 
constexpr EDA_IU_SCALE schIUScale
 
Define a library symbol object.
 
virtual void SetBodyStyle(int aBodyStyle)
 
virtual void SetUnit(int aUnit)
 
int GetNumberTextSize() const
 
void SetNumber(const wxString &aNumber)
 
void SetVisible(bool aVisible)
 
void SetOrientation(PIN_ORIENTATION aOrientation)
 
void SetName(const wxString &aName)
 
void SetPosition(const VECTOR2I &aPos) override
 
std::vector< wxString > GetStackedPinNumbers(bool *aValid=nullptr) const
 
const wxString & GetName() const
 
void SetLength(int aLength)
 
PIN_ORIENTATION GetOrientation() const
 
void SetNumberTextSize(int aSize)
 
void SetShape(GRAPHIC_PINSHAPE aShape)
 
VECTOR2I GetPosition() const override
 
int GetNameTextSize() const
 
void SetType(ELECTRICAL_PINTYPE aType)
 
bool IsStacked(const SCH_PIN *aPin) const
 
const wxString & GetNumber() const
 
GRAPHIC_PINSHAPE GetShape() const
 
ELECTRICAL_PINTYPE GetType() const
 
void SetNameTextSize(int aSize)
 
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
 
@ PT_INPUT
usual pin input: must be connected
 
PIN_ORIENTATION
The symbol library pin object orientations.
 
@ PIN_RIGHT
The pin extends rightwards from the connection point.
 
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
 
std::unique_ptr< SETTINGS_MANAGER > m_settingsManager
 
STACKED_PIN_CONVERSION_FIXTURE()
 
std::unique_ptr< LIB_SYMBOL > m_symbol
 
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
 
BOOST_AUTO_TEST_SUITE_END()
 
void CheckDuplicatePins(LIB_SYMBOL *aSymbol, std::vector< wxString > &aMessages, UNITS_PROVIDER *aUnitsProvider)
 
BOOST_AUTO_TEST_CASE(TestStackedPinExpansion)
Test basic stacked pin number expansion functionality.
 
wxString result
Test unit parsing edge cases and error handling.
 
BOOST_CHECK_EQUAL(result, "25.4")
 
VECTOR2< int32_t > VECTOR2I