29#include <wx/filename.h> 
   31#include <boost/test/unit_test.hpp> 
   48#define CHECK_ENUM_CLASS_EQUAL( L, R )                                                      \ 
   49    BOOST_CHECK_EQUAL( static_cast<int>( L ), static_cast<int>( R ) ) 
 
   66    auto path = std::filesystem::temp_directory_path() / aName;
 
 
   75                std::unique_ptr<BOARD>& aBoard )
 
   79        aBoard->SetProject( 
nullptr );
 
   84    wxFileName  projectFile( absPath + 
".kicad_pro" );
 
   85    wxFileName  legacyProject( absPath + 
".pro" );
 
   86    std::string boardPath = absPath + 
".kicad_pcb";
 
   87    wxFileName  rulesFile( absPath + 
".kicad_dru" );
 
   89    if( projectFile.Exists() )
 
   91        aSettingsManager.
LoadProject( projectFile.GetFullPath() );
 
   94    else if( legacyProject.Exists() )
 
   96        aSettingsManager.
LoadProject( legacyProject.GetFullPath() );
 
  109        BOOST_TEST_ERROR( ioe.
What() );
 
  112    BOOST_REQUIRE_MESSAGE( aBoard, 
"aBoard is null or invalid" );
 
  114    if( projectFile.Exists() || legacyProject.Exists() )
 
  115        aBoard->SetProject( &aSettingsManager.
Prj() );
 
  117    auto m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard.get(), &aBoard->GetDesignSettings() );
 
  119    BOOST_TEST_CHECKPOINT( 
"Init drc engine" );
 
  121    if( rulesFile.Exists() )
 
  122        m_DRCEngine->InitEngine( rulesFile );
 
  124        m_DRCEngine->InitEngine( wxFileName() );
 
  126    aBoard->GetDesignSettings().m_DRCEngine = m_DRCEngine;
 
  128    BOOST_TEST_CHECKPOINT( 
"Build list of nets" );
 
  131        aBoard->BuildListOfNets();
 
  133    catch( 
const std::exception& e )
 
  135        BOOST_TEST_ERROR( 
"Exception in BuildListOfNets: " << e.what() );
 
  139    BOOST_TEST_CHECKPOINT( 
"Build connectivity" );
 
  142        aBoard->BuildConnectivity();
 
  144    catch( 
const std::exception& e )
 
  146        BOOST_TEST_ERROR( 
"Exception in BuildConnectivity: " << e.what() );
 
  150    BOOST_TEST_CHECKPOINT( 
"Synchronize Tuning Profile Properties" );
 
  153        aBoard->GetLengthCalculation()->SynchronizeTuningProfileProperties();
 
  155    catch( 
const std::exception& e )
 
  157        BOOST_TEST_ERROR( 
"Exception in SynchronizeTimeDomainProperties: " << e.what() );
 
  161    if( aBoard->GetProject() )
 
  163        std::unordered_set<wxString> 
dummy;
 
  164        BOOST_TEST_CHECKPOINT( 
"Synchronize Component Classes" );
 
  167            aBoard->SynchronizeComponentClasses( 
dummy );
 
  169        catch( 
const std::exception& e )
 
  171            BOOST_TEST_ERROR( 
"Exception in SynchronizeComponentClasses: " << e.what() );
 
  175        BOOST_TEST_CHECKPOINT( 
"Run DRC cache generator" );
 
  180            cacheGenerator.
Run();
 
  182        catch( 
const std::exception& e )
 
  184            BOOST_TEST_ERROR( 
"Exception in DRC cache generator: " << e.what() );
 
 
  196    BOOST_REQUIRE_EQUAL( item->
Type(), aItemType );
 
 
  219            m_path = std::filesystem::temp_directory_path()
 
  220                     / ( aNamePrefix + std::to_string( i ) + aSuffix );
 
  222            if( !std::filesystem::exists( 
m_path ) )
 
  228        wxASSERT( !std::filesystem::exists( 
m_path ) );
 
  229        std::filesystem::create_directories( 
m_path );
 
 
 
  242                           std::function<
void( 
BOARD& )> aBoardTestFunction,
 
  243                           std::optional<int>            aExpectedBoardVersion )
 
  245    const std::string absBoardPath =
 
  255    aBoardTestFunction( *board1 );
 
  259    if( aExpectedBoardVersion )
 
  261        BOOST_CHECK_EQUAL( board1->GetFileFormatVersionAtLoad(), *aExpectedBoardVersion );
 
  268        const auto savePath = tempLib.
GetPath() / ( aRelativePath.ToStdString() + 
".kicad_pcb" );
 
  277        aBoardTestFunction( *board2 );
 
 
  284                               std::function<
void( 
FOOTPRINT& )> aFootprintTestFunction,
 
  285                               std::optional<int>                aExpectedFootprintVersion )
 
  288                                         + aLibRelativePath.ToStdString() + 
"/" 
  289                                         + aFpName.ToStdString() + 
".kicad_mod";
 
  298    aFootprintTestFunction( *fp1 );
 
  302    if( aExpectedFootprintVersion )
 
  304        BOOST_CHECK_EQUAL( fp1->GetFileFormatVersionAtLoad(), *aExpectedFootprintVersion );
 
  315        const wxString      fpFilename = fp1->GetFPID().GetLibItemName() + wxString( 
".kicad_mod" );
 
  321        const auto fp2Path = tempLib.
GetPath() / fpFilename.ToStdString();
 
  331        aFootprintTestFunction( *fp2 );
 
 
  338    BOOST_TEST_CHECKPOINT( 
"Filling zones" );
 
  341    toolMgr.
SetEnvironment( m_board, 
nullptr, 
nullptr, 
nullptr, 
nullptr );
 
  348    std::vector<ZONE*> toFill;
 
  351        toFill.push_back( zone );
 
  353    if( filler.
Fill( toFill, 
false, 
nullptr ) )
 
  356    BOOST_TEST_CHECKPOINT( 
"Building connectivity (after zone fill)" );
 
 
  361#define TEST( a, b )                                                                               \ 
 
  366#define TEST_PT( a, b )                                                                            \ 
 
  395        return fp_comp( itemA, itemB );
 
 
 
  425    std::set<PAD*, FOOTPRINT::cmp_pads> expectedPads( 
expected->Pads().begin(),
 
  427    std::set<PAD*, FOOTPRINT::cmp_pads> fpPads( fp->
Pads().begin(), fp->
Pads().end() );
 
  429    for( 
auto itExpected = expectedPads.begin(), itFp = fpPads.begin();
 
  430         itExpected != expectedPads.end() && itFp != fpPads.end(); itExpected++, itFp++ )
 
  435    std::set<BOARD_ITEM*, kitest_cmp_drawings> expectedGraphicalItems( 
expected->GraphicalItems().begin(),
 
  437    std::set<BOARD_ITEM*, kitest_cmp_drawings> fpGraphicalItems( fp->
GraphicalItems().begin(),
 
  440    for( 
auto itExpected = expectedGraphicalItems.begin(), itFp = fpGraphicalItems.begin();
 
  441         itExpected != expectedGraphicalItems.end() && itFp != fpGraphicalItems.end();
 
  442         itExpected++, itFp++ )
 
  446        switch( ( *itExpected )->Type() )
 
  479            BOOST_ERROR( 
"KICAD_T not known" );
 
  484    std::set<ZONE*, FOOTPRINT::cmp_zones> expectedZones( 
expected->Zones().begin(),
 
  486    std::set<ZONE*, FOOTPRINT::cmp_zones> fpZones( fp->
Zones().begin(), fp->
Zones().end() );
 
  488    for( 
auto itExpected = expectedZones.begin(), itFp = fpZones.begin();
 
  489         itExpected != expectedZones.end() && itFp != fpZones.end(); itExpected++, itFp++ )
 
  501        BOOST_REQUIRE_MESSAGE( 
false,  reporter.
GetMessages() );
 
 
  539                           pad->GetLocalSolderMaskMargin().value_or( 0 ) );
 
  541                           pad->GetLocalSolderPasteMargin().value_or( 0 ) );
 
  543                           pad->GetLocalSolderPasteMarginRatio().value_or( 0 ) );
 
  545                           pad->GetLocalClearance().value_or( 0 ) );
 
  548                           pad->GetLocalThermalSpokeWidthOverride().value_or( 0 ) );
 
  564                                pad->GetCustomShapeInZoneOpt() );
 
 
  717        for( 
int i = 0; i < 
expected->OutlineCount(); ++i )
 
  730                for( 
int j = 0; j < 
expected->Outline( i ).PointCount(); ++j )
 
 
#define SKIP_CONNECTIVITY
 
General utilities for PCB file IO for QA programs.
 
#define CHECK_ENUM_CLASS_EQUAL(L, R)
 
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
bool IsLocked() const override
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
Information pertinent to a Pcbnew printed circuit board.
 
const ZONES & Zones() const
 
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
 
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
 
virtual bool Run() override
Run this provider against the given PCB with configured options (if any).
 
void SetDRCEngine(DRC_ENGINE *engine)
 
KICAD_T Type() const
Returns the type of object.
 
const VECTOR2I & GetBezierC2() const
 
FILL_T GetFillMode() const
 
SHAPE_POLY_SET & GetPolyShape()
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
 
const VECTOR2I & GetBezierC1() const
 
VECTOR2I GetArcMid() const
 
const EDA_ANGLE & GetTextAngle() const
 
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
 
virtual const wxString What() const
A composite of Problem() and Where()
 
void DumpBoardToFile(BOARD &aBoard, const std::string &aName) const
 
A temporary directory that will be deleted when it goes out of scope.
 
const std::filesystem::path & GetPath() const
 
TEMPORARY_DIRECTORY(const std::string &aNamePrefix, const std::string aSuffix)
Create a temporary directory with a given prefix and suffix.
 
std::filesystem::path m_path
 
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
 
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
 
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
STROKE_PARAMS GetStroke() const override
 
VECTOR2I GetPosition() const override
 
virtual VECTOR2I GetPosition() const override
 
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
 
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
 
virtual const VECTOR2I GetPoint(int aIndex) const override
 
int PointCount() const
Return the number of points (vertices) in this line chain.
 
Represent a set of closed polygons.
 
int TotalVertices() const
Return total number of vertices stored in the set.
 
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
 
int OutlineCount() const
Return the number of outlines in the set.
 
LINE_STYLE GetLineStyle() const
 
A wrapper for reporting to a wxString object.
 
const wxString & GetMessages() const
 
bool Fill(const std::vector< ZONE * > &aZones, bool aCheck=false, wxWindow *aParent=nullptr)
Fills the given list of zones.
 
Handle a list of polygons defining a copper zone.
 
int GetHatchBorderAlgorithm() const
 
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
 
std::optional< int > GetLocalClearance() const override
 
bool GetDoNotAllowVias() const
 
bool GetDoNotAllowPads() const
 
bool GetDoNotAllowTracks() const
 
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
 
SHAPE_POLY_SET * Outline()
 
long long int GetMinIslandArea() const
 
const wxString & GetZoneName() const
 
int GetMinThickness() const
 
ZONE_CONNECTION GetPadConnection() const
 
int GetHatchThickness() const
 
double GetHatchHoleMinArea() const
 
int GetThermalReliefSpokeWidth() const
 
EDA_ANGLE GetHatchOrientation() const
 
bool GetDoNotAllowFootprints() const
 
ZONE_FILL_MODE GetFillMode() const
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
TEARDROP_TYPE GetTeardropAreaType() const
 
double GetHatchSmoothingValue() const
 
bool GetDoNotAllowZoneFills() const
 
int GetHatchSmoothingLevel() const
 
unsigned int GetCornerRadius() const
 
int GetCornerSmoothingType() const
 
int GetThermalReliefGap() const
 
unsigned GetAssignedPriority() const
 
std::string GetPcbnewTestDataDir()
Utility which returns a path to the data directory where the test board files are stored.
 
void LoadBoard(SETTINGS_MANAGER &aSettingsManager, const wxString &aRelPath, std::unique_ptr< BOARD > &aBoard)
 
void CheckFootprint(const FOOTPRINT *expected, const FOOTPRINT *fp)
Helper method to check if two footprints are semantically the same.
 
void FillZones(BOARD *m_board)
 
std::unique_ptr< BOARD > ReadBoardFromFileOrStream(const std::string &aFilename, std::istream &aFallback)
Read a board from a file, or another stream, as appropriate.
 
void CheckFpShape(const PCB_SHAPE *expected, const PCB_SHAPE *shape)
 
std::unique_ptr< FOOTPRINT > ReadFootprintFromFileOrStream(const std::string &aFilename, std::istream &aFallback)
 
void LoadAndTestFootprintFile(const wxString &aLibRelativePath, const wxString &aFpName, bool aRoundtrip, std::function< void(FOOTPRINT &)> aFootprintTestFunction, std::optional< int > aExpectedFootprintVersion)
Same as LoadAndTestBoardFile, but for footprints.
 
void DumpBoardToFile(BOARD &board, const std::string &aFilename)
Utility function to simply write a Board out to a file.
 
void CheckFpPad(const PAD *expected, const PAD *pad)
 
void CheckFpZone(const ZONE *expected, const ZONE *zone)
 
void CheckFpText(const PCB_TEXT *expected, const PCB_TEXT *text)
 
void DumpFootprintToFile(const FOOTPRINT &aFootprint, const std::string &aLibraryPath)
Same as DumpBoardToFile, but for footprints.
 
void LoadAndTestBoardFile(const wxString aRelativePath, bool aRoundtrip, std::function< void(BOARD &)> aBoardTestFunction, std::optional< int > aExpectedBoardVersion)
Perform "some test" on a board file loaded from the path, then optionally save and reload and run the...
 
void CheckShapePolySet(const SHAPE_POLY_SET *expected, const SHAPE_POLY_SET *polyset)
 
BOARD_ITEM & RequireBoardItemWithTypeAndId(const BOARD &aBoard, KICAD_T aItemType, const KIID &aID)
Get an item from the given board with a certain type and UUID.
 
std::vector< FAB_LAYER_COLOR > dummy
 
FOOTPRINT::cmp_drawings fp_comp
 
bool operator()(const BOARD_ITEM *itemA, const BOARD_ITEM *itemB) const
 
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
 
VECTOR3I expected(15, 30, 45)
 
BOOST_TEST_CONTEXT("Test Clearance")
 
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
 
BOOST_CHECK_EQUAL(result, "25.4")
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
 
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
 
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
 
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
 
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
 
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
 
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
 
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension