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