31#include <boost/test/unit_test.hpp>
54 BOOST_CHECK( !variant.
GetDNP() );
57 BOOST_CHECK( variant.
GetFields().empty() );
65 BOOST_CHECK( variant.
GetDNP() );
86 BOOST_CHECK( board.
HasVariant(
"Production" ) );
95 BOOST_CHECK( board.
HasVariant(
"production" ) );
96 BOOST_CHECK( board.
HasVariant(
"PRODUCTION" ) );
97 BOOST_CHECK( board.
HasVariant(
"PrOdUcTiOn" ) );
138 prodVariant.
SetDNP(
false );
149 debugVariant.
SetDNP(
true );
228 prodVariant.
SetDNP(
true );
238 BOOST_CHECK( board.
HasVariant(
"production" ) );
239 BOOST_CHECK( board.
HasVariant(
"PRODUCTION" ) );
261 prodVariant.
SetDNP(
false );
284 prodVariant.
SetDNP(
false );
302 prodVariant.
SetDNP(
true );
310 BOOST_CHECK( copyVariant->
GetDNP() );
319 BOOST_CHECK( assignedVariant->
GetDNP() );
354 wxString variantToken = wxT(
"VARIANT" );
358 wxString descToken = wxT(
"VARIANT_DESC" );
363 wxString defaultToken = wxT(
"VARIANT" );
365 BOOST_CHECK( defaultToken.IsEmpty() );
372 "(export (version 1)\n"
376 " (footprint Resistor_SMD:R_0603_1608Metric)\n"
377 " (libsource (lib Device) (part R))\n"
379 " (variant (name Alt)\n"
380 " (property (name dnp) (value 1))\n"
381 " (property (name exclude_from_bom) (value 0))\n"
383 " (field (name Value) \"22K\")\n"
384 " (field (name Footprint) \"Resistor_SMD:R_0805_2012Metric\")\n"
398 BOOST_REQUIRE_EQUAL( parsedNetlist.
GetCount(), 1 );
405 BOOST_CHECK( variant->
m_dnp );
409 auto valueIt = variant->
m_fields.find(
"Value" );
410 BOOST_CHECK( valueIt != variant->
m_fields.end() );
413 auto fpIt = variant->
m_fields.find(
"Footprint" );
414 BOOST_CHECK( fpIt != variant->
m_fields.end() );
480 wxString unicodeValue = wxT(
"1kΩ ±5% 日本語" );
490 wxString specialChars = wxT(
"R<1K>\"test\"'value'" );
499 wxString unicodeDesc = wxT(
"Variante für Produktion — 测试" );
518 BOOST_CHECK( board.
HasVariant(
"Variant1" ) );
525 BOOST_CHECK( !board.
HasVariant(
"Variant1" ) );
526 BOOST_CHECK( board.
HasVariant(
"Variant2" ) );
548 BOOST_CHECK( !board.
HasVariant(
"OldName" ) );
573 BOOST_CHECK( names.GetCount() >= 4 );
576 BOOST_CHECK( !names[0].IsEmpty() );
579 bool foundAlpha =
false;
580 bool foundBeta =
false;
581 bool foundZebra =
false;
583 for(
size_t i = 1; i < names.GetCount(); i++ )
585 if( names[i] == wxT(
"Alpha" ) )
587 else if( names[i] == wxT(
"Beta" ) )
589 else if( names[i] == wxT(
"Zebra" ) )
593 BOOST_CHECK( foundAlpha );
594 BOOST_CHECK( foundBeta );
595 BOOST_CHECK( foundZebra );
672 LIB_ID fpid( wxT(
"Resistor_SMD" ), wxT(
"R_0805_2012Metric" ) );
673 wxString reference = wxT(
"R1" );
674 wxString value = wxT(
"10K" );
676 std::vector<KIID> kiids;
683 variantA.
m_dnp =
true;
689 variantA.
m_fields[wxT(
"Datasheet" )] = wxT(
"https://example.com/datasheet.pdf" );
694 variantB.
m_dnp =
false;
700 variantB.
m_fields[wxT(
"Value" )] = wxT(
"22K" );
704 for(
const auto& [variantName, componentVariant] : component.
GetVariants() )
709 if( componentVariant.m_hasDnp )
710 fpVariant->
SetDNP( componentVariant.m_dnp );
712 if( componentVariant.m_hasExcludedFromBOM )
715 if( componentVariant.m_hasExcludedFromPosFiles )
718 for(
const auto& [fieldName, fieldValue] : componentVariant.m_fields )
725 BOOST_CHECK( fpVariantA->
GetDNP() );
728 BOOST_CHECK( fpVariantA->
HasFieldValue( wxT(
"Datasheet" ) ) );
730 wxT(
"https://example.com/datasheet.pdf" ) );
735 BOOST_CHECK( !fpVariantB->
GetDNP() );
772 initialVariant.
SetDNP(
true );
778 LIB_ID fpid( wxT(
"Resistor_SMD" ), wxT(
"R_0805_2012Metric" ) );
780 std::vector<KIID> kiids;
781 COMPONENT component( fpid, wxT(
"R1" ), wxT(
"10K" ),
path, kiids );
784 partialVariant.
m_dnp =
true;
790 for(
const auto& [variantName, componentVariant] : component.
GetVariants() )
796 bool targetDnp = componentVariant.m_hasDnp ? componentVariant.m_dnp : fp.
IsDNP();
797 fpVariant->
SetDNP( targetDnp );
799 bool targetBOM = componentVariant.m_hasExcludedFromBOM
800 ? componentVariant.m_excludedFromBOM
804 bool targetPos = componentVariant.m_hasExcludedFromPosFiles
805 ? componentVariant.m_excludedFromPosFiles
829 variantWithAll.
m_dnp =
true;
837 BOOST_CHECK( variantWithAll.
m_hasDnp );
838 BOOST_CHECK( variantWithAll.
m_dnp );
846 variantPartial.
m_dnp =
true;
850 BOOST_CHECK( variantPartial.
m_hasDnp );
856 variantAllFalse.
m_dnp =
false;
863 BOOST_CHECK( variantAllFalse.
m_hasDnp );
864 BOOST_CHECK( !variantAllFalse.
m_dnp );
881 fp.
SetFPID(
LIB_ID( wxT(
"Resistor_SMD" ), wxT(
"R_0805" ) ) );
893 fpVariant->
SetDNP(
true );
916 fpVariant->
SetDNP( targetDnp );
922 "DNP should be reset to base value (false) when no explicit override" );
924 "ExcludedFromBOM should be reset to base value (false) when no override" );
926 "ExcludedFromPosFiles should be reset to base (false) when no override" );
946 std::unique_ptr<BOARD> board( pcbIo.
LoadBoard( dataPath,
nullptr ) );
955 for(
FOOTPRINT* fp : board->Footprints() )
957 if( fp->GetReference() == wxT(
"R2" ) )
959 wxString fpName = fp->GetFPID().GetLibItemName();
961 if( fpName.Contains( wxT(
"C_1210" ) ) )
963 else if( fpName.Contains( wxT(
"C_3640" ) ) )
970 BOOST_REQUIRE_MESSAGE( r2_c1210,
"Should find R2 with C_1210 footprint (variant footprint)" );
971 BOOST_REQUIRE_MESSAGE( r2_c3640,
"Should find R2 with C_3640 footprint (base footprint)" );
990 BOOST_CHECK_MESSAGE( !c1210_variantA->
GetDNP(),
991 "C_1210 Variant A DNP should be false (no schematic override)" );
993 "C_1210 Variant A ExcludedFromBOM should be false (no override)" );
995 "C_1210 Variant A ExcludedFromPosFiles should be false (no override)" );
1012 if( c3640_variantA )
1021 BOOST_CHECK_MESSAGE( !c3640_variantA->
GetDNP(),
1022 "C_3640 Variant A DNP should be false (no schematic override)" );
1024 "C_3640 Variant A ExcludedFromBOM should be false (no override)" );
1026 "C_3640 Variant A ExcludedFromPosFiles should be false (no override)" );
1044 std::unique_ptr<BOARD> board( pcbIo.
LoadBoard( dataPath,
nullptr ) );
1049 BOOST_CHECK( board->HasVariant(
"Variant A" ) );
1058 for(
FOOTPRINT* fp : board->Footprints() )
1060 const wxString& ref = fp->GetReference();
1062 if( ref == wxT(
"R1" ) )
1069 BOOST_CHECK( variantA->
HasFieldValue( wxT(
"Datasheet" ) ) );
1073 else if( ref == wxT(
"R2" ) )
1078 wxString fpName = fp->GetFPID().GetLibItemName();
1080 if( fpName.Contains( wxT(
"C_3640" ) ) )
1086 BOOST_CHECK( !variantA->
GetDNP() );
1092 else if( ref == wxT(
"R3" ) )
1099 BOOST_CHECK( variantA->
GetDNP() );
General utilities for PCB file IO for QA programs.
Information pertinent to a Pcbnew printed circuit board.
void SetCurrentVariant(const wxString &aVariant)
const std::vector< wxString > & GetVariantNames() const
wxArrayString GetVariantNamesForUI() const
Return the variant names for UI display.
void DeleteVariant(const wxString &aVariantName)
bool ResolveTextVar(wxString *token, int aDepth) const
bool HasVariant(const wxString &aVariantName) const
void AddVariant(const wxString &aVariantName)
wxString GetVariantDescription(const wxString &aVariantName) const
wxString GetCurrentVariant() const
void RenameVariant(const wxString &aOldName, const wxString &aNewName)
void SetVariantDescription(const wxString &aVariantName, const wxString &aDescription)
Store all of the related component information found in a netlist.
void AddVariant(const COMPONENT_VARIANT &aVariant)
const COMPONENT_VARIANT * GetVariant(const wxString &aVariantName) const
const CASE_INSENSITIVE_MAP< COMPONENT_VARIANT > & GetVariants() const
The parser for reading the KiCad s-expression netlist format.
void Parse()
Function Parse parse the full netlist.
A logical library item identifier and consists of various portions much like a URI.
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
unsigned GetCount() const
COMPONENT * GetComponent(unsigned aIndex)
Return the COMPONENT at aIndex.
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
A #PLUGIN derivation for saving and loading Pcbnew s-expression formatted files.
BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr) override
Load information from some input file format that this PCB_IO implementation knows about into either ...
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
std::string GetPcbnewTestDataDir()
Utility which returns a path to the data directory where the test board files are stored.
bool m_excludedFromPosFiles
bool m_hasExcludedFromBOM
bool m_hasExcludedFromPosFiles
nlohmann::ordered_map< wxString, wxString > m_fields
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
BOOST_CHECK_EQUAL(result, "25.4")
BOOST_AUTO_TEST_CASE(FootprintVariantBasics)
Test FOOTPRINT_VARIANT class basic operations.