28#include <wx/filename.h>
30#include <boost/test/unit_test.hpp>
46#define CHECK_ENUM_CLASS_EQUAL( L, R ) \
47 BOOST_CHECK_EQUAL( static_cast<int>( L ), static_cast<int>( R ) )
64 auto path = std::filesystem::temp_directory_path() / aName;
73 std::unique_ptr<BOARD>& aBoard )
77 aBoard->SetProject(
nullptr );
82 wxFileName projectFile( absPath +
".kicad_pro" );
83 wxFileName legacyProject( absPath +
".pro" );
84 std::string boardPath = absPath +
".kicad_pcb";
85 wxFileName rulesFile( absPath +
".kicad_dru" );
87 if( projectFile.Exists() )
88 aSettingsManager.
LoadProject( projectFile.GetFullPath() );
89 else if( legacyProject.Exists() )
90 aSettingsManager.
LoadProject( legacyProject.GetFullPath() );
99 BOOST_TEST_ERROR( ioe.
What() );
104 if( projectFile.Exists() || legacyProject.Exists() )
105 aBoard->SetProject( &aSettingsManager.
Prj() );
107 auto m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard.get(), &aBoard->GetDesignSettings() );
109 if( rulesFile.Exists() )
110 m_DRCEngine->InitEngine( rulesFile );
112 m_DRCEngine->InitEngine( wxFileName() );
114 aBoard->GetDesignSettings().m_DRCEngine = m_DRCEngine;
115 aBoard->BuildListOfNets();
116 aBoard->BuildConnectivity();
118 if( aBoard->GetProject() )
120 std::unordered_set<wxString>
dummy;
121 aBoard->SynchronizeComponentClasses(
dummy );
125 cacheGenerator.
Run();
135 BOOST_REQUIRE_EQUAL( item->
Type(), aItemType );
158 m_path = std::filesystem::temp_directory_path()
159 / ( aNamePrefix + std::to_string( i ) + aSuffix );
161 if( !std::filesystem::exists(
m_path ) )
167 wxASSERT( !std::filesystem::exists(
m_path ) );
168 std::filesystem::create_directories(
m_path );
181 std::function<
void(
BOARD& )> aBoardTestFunction,
182 std::optional<int> aExpectedBoardVersion )
184 const std::string absBoardPath =
194 aBoardTestFunction( *board1 );
198 if( aExpectedBoardVersion )
200 BOOST_CHECK_EQUAL( board1->GetFileFormatVersionAtLoad(), *aExpectedBoardVersion );
207 const auto savePath = tempLib.
GetPath() / ( aRelativePath.ToStdString() +
".kicad_pcb" );
216 aBoardTestFunction( *board2 );
223 std::function<
void(
FOOTPRINT& )> aFootprintTestFunction,
224 std::optional<int> aExpectedFootprintVersion )
227 + aLibRelativePath.ToStdString() +
"/"
228 + aFpName.ToStdString() +
".kicad_mod";
237 aFootprintTestFunction( *fp1 );
241 if( aExpectedFootprintVersion )
243 BOOST_CHECK_EQUAL( fp1->GetFileFormatVersionAtLoad(), *aExpectedFootprintVersion );
254 const wxString fpFilename = fp1->GetFPID().GetLibItemName() + wxString(
".kicad_mod" );
260 const auto fp2Path = tempLib.
GetPath() / fpFilename.ToStdString();
270 aFootprintTestFunction( *fp2 );
278 toolMgr.
SetEnvironment( m_board,
nullptr,
nullptr,
nullptr,
nullptr );
285 std::vector<ZONE*> toFill;
288 toFill.push_back( zone );
290 if( filler.
Fill( toFill,
false,
nullptr ) )
297#define TEST( a, b ) \
302#define TEST_PT( a, b ) \
331 return fp_comp( itemA, itemB );
361 std::set<PAD*, FOOTPRINT::cmp_pads> expectedPads(
expected->Pads().begin(),
363 std::set<PAD*, FOOTPRINT::cmp_pads> fpPads( fp->
Pads().begin(), fp->
Pads().end() );
365 for(
auto itExpected = expectedPads.begin(), itFp = fpPads.begin();
366 itExpected != expectedPads.end() && itFp != fpPads.end(); itExpected++, itFp++ )
371 std::set<BOARD_ITEM*, kitest_cmp_drawings> expectedGraphicalItems(
expected->GraphicalItems().begin(),
373 std::set<BOARD_ITEM*, kitest_cmp_drawings> fpGraphicalItems( fp->
GraphicalItems().begin(),
376 for(
auto itExpected = expectedGraphicalItems.begin(), itFp = fpGraphicalItems.begin();
377 itExpected != expectedGraphicalItems.end() && itFp != fpGraphicalItems.end();
378 itExpected++, itFp++ )
382 switch( ( *itExpected )->Type() )
411 BOOST_ERROR(
"KICAD_T not known" );
416 std::set<ZONE*, FOOTPRINT::cmp_zones> expectedZones(
expected->Zones().begin(),
418 std::set<ZONE*, FOOTPRINT::cmp_zones> fpZones( fp->
Zones().begin(), fp->
Zones().end() );
420 for(
auto itExpected = expectedZones.begin(), itFp = fpZones.begin();
421 itExpected != expectedZones.end() && itFp != fpZones.end(); itExpected++, itFp++ )
467 pad->GetLocalSolderMaskMargin().value_or( 0 ) );
469 pad->GetLocalSolderPasteMargin().value_or( 0 ) );
471 pad->GetLocalSolderPasteMarginRatio().value_or( 0 ) );
473 pad->GetLocalClearance().value_or( 0 ) );
476 pad->GetLocalThermalSpokeWidthOverride().value_or( 0 ) );
492 pad->GetCustomShapeInZoneOpt() );
536 text->GetFontName() );
556 if(
expected->GetShape() == SHAPE_T::ARC )
647 for(
int i = 0; i <
expected->OutlineCount(); ++i )
660 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...
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual bool IsLocked() const
Information pertinent to a Pcbnew printed circuit board.
BOARD_ITEM * GetItem(const KIID &aID) const
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...
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
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.
bool GetDoNotAllowCopperPour() const
TEARDROP_TYPE GetTeardropAreaType() const
double GetHatchSmoothingValue() 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_CHECK_EQUAL(ret, c.m_exp_result)
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")
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_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