28#include <wx/filename.h>
30#include <boost/test/unit_test.hpp>
45#define CHECK_ENUM_CLASS_EQUAL( L, R ) \
46 BOOST_CHECK_EQUAL( static_cast<int>( L ), static_cast<int>( R ) )
63 auto path = std::filesystem::temp_directory_path() / aName;
72 std::unique_ptr<BOARD>& aBoard )
76 aBoard->SetProject(
nullptr );
81 wxFileName projectFile( absPath +
".kicad_pro" );
82 wxFileName legacyProject( absPath +
".pro" );
83 std::string boardPath = absPath +
".kicad_pcb";
84 wxFileName rulesFile( absPath +
".kicad_dru" );
86 if( projectFile.Exists() )
87 aSettingsManager.
LoadProject( projectFile.GetFullPath() );
88 else if( legacyProject.Exists() )
89 aSettingsManager.
LoadProject( legacyProject.GetFullPath() );
98 BOOST_TEST_ERROR( ioe.
What() );
103 if( projectFile.Exists() || legacyProject.Exists() )
104 aBoard->SetProject( &aSettingsManager.
Prj() );
106 auto m_DRCEngine = std::make_shared<DRC_ENGINE>( aBoard.get(), &aBoard->GetDesignSettings() );
108 if( rulesFile.Exists() )
109 m_DRCEngine->InitEngine( rulesFile );
111 m_DRCEngine->InitEngine( wxFileName() );
113 aBoard->GetDesignSettings().m_DRCEngine = m_DRCEngine;
114 aBoard->BuildListOfNets();
115 aBoard->BuildConnectivity();
124 BOOST_REQUIRE_EQUAL( item->
Type(), aItemType );
147 m_path = std::filesystem::temp_directory_path()
148 / ( aNamePrefix + std::to_string( i ) + aSuffix );
150 if( !std::filesystem::exists(
m_path ) )
156 wxASSERT( !std::filesystem::exists(
m_path ) );
157 std::filesystem::create_directories(
m_path );
170 std::function<
void(
BOARD& )> aBoardTestFunction,
171 std::optional<int> aExpectedBoardVersion )
173 const std::string absBoardPath =
183 aBoardTestFunction( *board1 );
187 if( aExpectedBoardVersion )
189 BOOST_CHECK_EQUAL( board1->GetFileFormatVersionAtLoad(), *aExpectedBoardVersion );
196 const auto savePath = tempLib.
GetPath() / ( aRelativePath.ToStdString() +
".kicad_pcb" );
205 aBoardTestFunction( *board2 );
212 std::function<
void(
FOOTPRINT& )> aFootprintTestFunction,
213 std::optional<int> aExpectedFootprintVersion )
216 + aLibRelativePath.ToStdString() +
"/"
217 + aFpName.ToStdString() +
".kicad_mod";
226 aFootprintTestFunction( *fp1 );
230 if( aExpectedFootprintVersion )
232 BOOST_CHECK_EQUAL( fp1->GetFileFormatVersionAtLoad(), *aExpectedFootprintVersion );
243 const wxString fpFilename = fp1->GetFPID().GetLibItemName() + wxString(
".kicad_mod" );
249 const auto fp2Path = tempLib.
GetPath() / fpFilename.ToStdString();
259 aFootprintTestFunction( *fp2 );
267 toolMgr.
SetEnvironment( m_board,
nullptr,
nullptr,
nullptr,
nullptr );
274 std::vector<ZONE*> toFill;
277 toFill.push_back( zone );
279 if( filler.
Fill( toFill,
false,
nullptr ) )
286#define TEST( a, b ) \
291#define TEST_PT( a, b ) \
320 return fp_comp( itemA, itemB );
350 std::set<PAD*, FOOTPRINT::cmp_pads> expectedPads(
expected->Pads().begin(),
352 std::set<PAD*, FOOTPRINT::cmp_pads> fpPads( fp->
Pads().begin(), fp->
Pads().end() );
354 for(
auto itExpected = expectedPads.begin(), itFp = fpPads.begin();
355 itExpected != expectedPads.end() && itFp != fpPads.end(); itExpected++, itFp++ )
360 std::set<BOARD_ITEM*, kitest_cmp_drawings> expectedGraphicalItems(
expected->GraphicalItems().begin(),
362 std::set<BOARD_ITEM*, kitest_cmp_drawings> fpGraphicalItems( fp->
GraphicalItems().begin(),
365 for(
auto itExpected = expectedGraphicalItems.begin(), itFp = fpGraphicalItems.begin();
366 itExpected != expectedGraphicalItems.end() && itFp != fpGraphicalItems.end();
367 itExpected++, itFp++ )
371 switch( ( *itExpected )->Type() )
400 BOOST_ERROR(
"KICAD_T not known" );
405 std::set<ZONE*, FOOTPRINT::cmp_zones> expectedZones(
expected->Zones().begin(),
407 std::set<ZONE*, FOOTPRINT::cmp_zones> fpZones( fp->
Zones().begin(), fp->
Zones().end() );
409 for(
auto itExpected = expectedZones.begin(), itFp = fpZones.begin();
410 itExpected != expectedZones.end() && itFp != fpZones.end(); itExpected++, itFp++ )
456 pad->GetLocalSolderMaskMargin().value_or( 0 ) );
458 pad->GetLocalSolderPasteMargin().value_or( 0 ) );
460 pad->GetLocalSolderPasteMarginRatio().value_or( 0 ) );
462 pad->GetLocalClearance().value_or( 0 ) );
465 pad->GetLocalThermalSpokeWidthOverride().value_or( 0 ) );
481 pad->GetCustomShapeInZoneOpt() );
525 text->GetFontName() );
545 if(
expected->GetShape() == SHAPE_T::ARC )
636 for(
int i = 0; i <
expected->OutlineCount(); ++i )
649 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...
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.
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