47 pin->SetNumber( wxT(
"[1,2,3]") );
50 std::vector<wxString> expanded =
pin->GetStackedPinNumbers( &isValid );
52 BOOST_CHECK( isValid );
53 BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
62 pin->SetNumber( wxT(
"[5-7]") );
64 expanded =
pin->GetStackedPinNumbers( &isValid );
66 BOOST_CHECK( isValid );
67 BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
76 pin->SetNumber( wxT(
"[1,3,5-7]") );
78 expanded =
pin->GetStackedPinNumbers( &isValid );
80 BOOST_CHECK( isValid );
81 BOOST_REQUIRE_EQUAL( expanded.size(), 5 );
100 pin->SetNumber( wxT(
"1") );
102 std::vector<wxString> expanded =
pin->GetStackedPinNumbers( &isValid );
103 BOOST_CHECK( isValid );
108 pin->SetNumber( wxT(
"[1,2") );
109 expanded =
pin->GetStackedPinNumbers( &isValid );
110 BOOST_CHECK( !isValid );
113 pin->SetNumber( wxT(
"[5-3]") );
114 expanded =
pin->GetStackedPinNumbers( &isValid );
115 BOOST_CHECK( !isValid );
118 pin->SetNumber( wxT(
"[]") );
119 expanded =
pin->GetStackedPinNumbers( &isValid );
120 BOOST_CHECK( !isValid );
257 std::vector<long> numbers = { 1, 2, 3, 4 };
262 while( i < numbers.size() )
267 long start = numbers[i];
271 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
278 if(
end > start + 1 )
279 result += wxString::Format( wxT(
"%ld-%ld"), start,
end );
280 else if(
end == start + 1 )
281 result += wxString::Format( wxT(
"%ld,%ld"), start,
end );
283 result += wxString::Format( wxT(
"%ld"), start );
292 numbers = { 1, 2, 3, 4, 7, 8, 9 };
296 while( i < numbers.size() )
301 long start = numbers[i];
305 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
312 if(
end > start + 1 )
313 result += wxString::Format( wxT(
"%ld-%ld"), start,
end );
314 else if(
end == start + 1 )
315 result += wxString::Format( wxT(
"%ld,%ld"), start,
end );
317 result += wxString::Format( wxT(
"%ld"), start );
326 numbers = { 1, 3, 5 };
330 while( i < numbers.size() )
335 long start = numbers[i];
339 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
346 if(
end > start + 1 )
347 result += wxString::Format( wxT(
"%ld-%ld"), start,
end );
348 else if(
end == start + 1 )
349 result += wxString::Format( wxT(
"%ld,%ld"), start,
end );
351 result += wxString::Format( wxT(
"%ld"), start );
364 while( i < numbers.size() )
369 long start = numbers[i];
373 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
380 if(
end > start + 1 )
381 result += wxString::Format( wxT(
"%ld-%ld"), start,
end );
382 else if(
end == start + 1 )
383 result += wxString::Format( wxT(
"%ld,%ld"), start,
end );
385 result += wxString::Format( wxT(
"%ld"), start );
394 numbers = { 1, 2, 4, 5, 6, 8, 9, 10, 11 };
398 while( i < numbers.size() )
403 long start = numbers[i];
407 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
414 if(
end > start + 1 )
415 result += wxString::Format( wxT(
"%ld-%ld"), start,
end );
416 else if(
end == start + 1 )
417 result += wxString::Format( wxT(
"%ld,%ld"), start,
end );
419 result += wxString::Format( wxT(
"%ld"), start );
433 BOOST_CHECK( isValid );
434 BOOST_REQUIRE_EQUAL( expanded.size(), 7 );
462 pin5->
SetName( wxT(
"TestPin") );
470 pin7->
SetName( wxT(
"TestPin") );
478 pin9->
SetName( wxT(
"TestPin") );
484 wxString originalName = pin5->
GetName();
488 std::vector<SCH_PIN*> pinsToConvert = { pin5, pin7, pin9 };
491 std::sort( pinsToConvert.begin(), pinsToConvert.end(),
495 if( a->GetNumber().ToLong( &numA ) && b->GetNumber().ToLong( &numB ) )
497 return a->GetNumber() < b->GetNumber();
501 wxString stackedNotation = wxT(
"[5,7,9]");
502 pinsToConvert[0]->SetNumber( stackedNotation );
505 SCH_PIN* stackedPin = pinsToConvert[0];
510 BOOST_CHECK( isValid );
511 BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
518 std::sort( expanded.begin(), expanded.end(),
519 [](
const wxString& a,
const wxString& b )
522 if( a.ToLong( &numA ) && b.ToLong( &numB ) )
532 std::vector<SCH_PIN*> explodedPins;
533 explodedPins.push_back( stackedPin );
535 for(
size_t i = 1; i < expanded.size(); ++i )
553 explodedPins.push_back( newPin );
557 BOOST_REQUIRE_EQUAL( explodedPins.size(), 3 );
565 BOOST_CHECK( explodedPins[0]->IsVisible() );
566 BOOST_CHECK( !explodedPins[1]->IsVisible() );
567 BOOST_CHECK( !explodedPins[2]->IsVisible() );
573 BOOST_CHECK(
pin->GetOrientation() == originalOrientation );
574 BOOST_CHECK(
pin->GetType() == originalType );
580 for(
size_t i = 1; i < explodedPins.size(); ++i )
581 delete explodedPins[i];
593 pin->SetNumber( wxT(
"[8,10,12]") );
594 pin->SetVisible(
false );
598 std::vector<wxString> expanded =
pin->GetStackedPinNumbers( &isValid );
599 BOOST_CHECK( isValid );
600 BOOST_REQUIRE_EQUAL( expanded.size(), 3 );
603 std::sort( expanded.begin(), expanded.end(),
604 [](
const wxString& a,
const wxString& b )
607 if( a.ToLong( &numA ) && b.ToLong( &numB ) )
618 pin->SetNumber( expanded[0] );
619 pin->SetVisible(
true );
623 BOOST_CHECK(
pin->IsVisible() );
638 auto testPrefixParsing = [](
const wxString& pinNumber ) -> std::pair<wxString, long>
644 size_t numStart = pinNumber.length();
645 for(
int i = pinNumber.length() - 1; i >= 0; i-- )
647 if( !wxIsdigit( pinNumber[i] ) )
656 if( numStart < pinNumber.length() )
658 prefix = pinNumber.Left( numStart );
659 wxString numericPart = pinNumber.Mid( numStart );
660 numericPart.ToLong( &numValue );
663 return std::make_pair( prefix, numValue );
667 auto [prefix1, num1] = testPrefixParsing( wxT(
"A1") );
671 auto [prefix2, num2] = testPrefixParsing( wxT(
"AB12") );
675 auto [prefix3, num3] = testPrefixParsing( wxT(
"123") );
679 auto [prefix4, num4] = testPrefixParsing( wxT(
"XYZ") );
684 std::map<wxString, std::vector<long>> prefixGroups;
685 std::vector<wxString> testPins = { wxT(
"AA1"), wxT(
"AA2"), wxT(
"AA3"), wxT(
"AB4"), wxT(
"CD12"), wxT(
"CD13"), wxT(
"CD14") };
687 for(
const wxString& pinNumber : testPins )
689 auto [prefix, numValue] = testPrefixParsing( pinNumber );
691 prefixGroups[prefix].push_back( numValue );
701 wxString expectedResult;
702 for(
auto& [prefix, numbers] : prefixGroups )
704 if( !expectedResult.IsEmpty() )
705 expectedResult += wxT(
",");
707 std::sort( numbers.begin(), numbers.end() );
710 while( i < numbers.size() )
713 expectedResult += wxT(
",");
715 long start = numbers[i];
719 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
726 if(
end > start + 1 )
727 expectedResult += wxString::Format( wxT(
"%s%ld-%s%ld"), prefix, start, prefix,
end );
728 else if(
end == start + 1 )
729 expectedResult += wxString::Format( wxT(
"%s%ld,%s%ld"), prefix, start, prefix,
end );
731 expectedResult += wxString::Format( wxT(
"%s%ld"), prefix, start );
wxString result
Test unit parsing edge cases and error handling.
BOOST_CHECK_EQUAL(result, "25.4")