78std::unique_ptr<BOARD>
createBoard(
const std::vector<std::vector<ItemType>>& spec,
bool aAllowInvalidGroups =
false )
80 std::unique_ptr<BOARD> board = std::make_unique<BOARD>();
81 std::vector<BOARD_ITEM*> items;
87 textItem->
SetText( wxString::Format(
_(
"some text-%d" ), idx ) );
91 board->Add( textItem );
93 items.push_back( textItem );
103 wxString
name = wxString::Format(
_(
"group-%d" ),
109 items.push_back( gr );
112 std::bitset<NUM_ITEMS> used;
117 int groupIdx =
GROUP0 + offset;
121 if( offset < spec.size() )
123 const std::vector<ItemType>& groupSpec = spec[offset];
127 used.set(
static_cast<size_t>( item ) );
129 if( aAllowInvalidGroups )
133 group->GetItems().insert( items[item] );
134 items[item]->SetParentGroup(
group );
138 group->AddItem( items[item] );
145 else if( groupIdx !=
REMOVED_GROUP && used.test( groupIdx ) )
169 BOOST_TEST_CHECKPOINT(
"Returning fresh board" );
180 const std::unordered_set<EDA_ITEM*>& items1 = group1.
GetItems();
181 const std::unordered_set<EDA_ITEM*>& items2 = group2.
GetItems();
190 return elem->m_Uuid.AsString() == item1->m_Uuid.AsString();
193 auto item2 = std::find_if( items2.begin(), items2.end(), cmp );
195 BOOST_CHECK( item2 != items2.end() );
209 return elem->m_Uuid.AsString() == group1->m_Uuid.AsString();
212 auto group2 = std::find_if( groups2.begin(), groups2.end(), cmp );
214 BOOST_CHECK( group2 != groups2.end() );
227 std::unique_ptr<BOARD> board1 =
createBoard( spec );
228 auto path = std::filesystem::temp_directory_path() /
"group_saveload_tst.kicad_pcb";
261 auto path = std::filesystem::temp_directory_path() /
"group_saveload_tst.kicad_pcb";
275 BOOST_CHECK_EQUAL( board1->GroupsSanityCheck(),
"Cycle detected in group membership" );
280 BOOST_CHECK_EQUAL( board1->GroupsSanityCheck(),
"Cycle detected in group membership" );
283 board1.reset(
nullptr );
288 board1.reset(
nullptr );
301 std::unique_ptr<BOARD> board = std::make_unique<BOARD>();
304 text0->
SetText( wxT(
"child-0" ) );
308 text1->
SetText( wxT(
"child-1" ) );
312 group->SetName( wxT(
"TestGroup" ) );
313 group->AddItem( text0 );
314 group->AddItem( text1 );
329 BOOST_CHECK( clonedChild != text0 );
330 BOOST_CHECK( clonedChild != text1 );
336 bool foundInOriginal =
group->GetItems().count( clonedChild ) > 0;
338 "DeepClone child should not be in original group's m_items" );
342 std::unique_ptr<BOARD> tempBoard = std::make_unique<BOARD>();
343 tempBoard->Add( deepCopy );
352 auto path = std::filesystem::temp_directory_path() /
"group_deepclone_tst.kicad_pcb";
359 if( !reloaded->Groups().empty() )
375 std::unique_ptr<BOARD> board = std::make_unique<BOARD>();
378 text->SetText( wxT(
"generated-child" ) );
383 board->Add( nested );
394 BOOST_CHECK( clonedNestedRaw != nested );
402 BOOST_CHECK( member !=
text );
420 aBoard->
Add( track );
433 auto board = std::make_unique<BOARD>();
437 board->Add( generator );
448 group->AddItem( generator );
453 BOOST_REQUIRE_EQUAL( dupGroup->
GetItems().size(), 1u );
466 BOOST_CHECK_NE( dupGenerator,
static_cast<PCB_GENERATOR*
>( generator ) );
467 BOOST_CHECK( dupGenerator->
m_Uuid != generator->
m_Uuid );
469 BOOST_REQUIRE_EQUAL( dupGenerator->
GetItems().size(), generator->
GetItems().size() );
471 std::set<EDA_ITEM*> originalMembers( generator->
GetItems().begin(), generator->
GetItems().end() );
490 std::vector<EDA_ITEM*> dupMembers( dupGenerator->
GetItems().begin(), dupGenerator->
GetItems().end() );
492 for(
EDA_ITEM* member : dupMembers )
constexpr EDA_IU_SCALE pcbIUScale
Construction utilities for PCB tests.
General utilities for PCB file IO for QA programs.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
A set of EDA_ITEMs (i.e., without duplicates).
std::unordered_set< EDA_ITEM * > & GetItems()
void AddItem(EDA_ITEM *aItem)
Add item to group.
void SetName(const wxString &aName)
A base class for most all the KiCad significant classes used in schematics and boards.
virtual EDA_GROUP * GetParentGroup() const
KICAD_T Type() const
Returns the type of object.
virtual void SetText(const wxString &aText)
wxString AsString() const
static const LSET & AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
PCB_GENERATOR * DeepClone() const
A set of BOARD_ITEMs (i.e., without duplicates).
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const override
Invoke a function on all children.
void SetEnd(const VECTOR2I &aEnd)
void SetStart(const VECTOR2I &aStart)
virtual void SetWidth(int aWidth)
#define IGNORE_PARENT_GROUP
BOOST_AUTO_TEST_CASE(HealthyGroups)
void testGroupEqual(const PCB_GROUP &group1, const PCB_GROUP &group2)
static PCB_TRACK * makeSegment(BOARD *aBoard, const VECTOR2I &aStart, const VECTOR2I &aEnd)
void testGroupsEqual(const GROUPS &groups1, const GROUPS &groups2)
static PCB_GROUP * s_removedGroup
void testSaveLoad(const std::vector< std::vector< ItemType > > &spec)
static PCB_TEXT * s_removedText
std::unique_ptr< BOARD > createBoard(const std::vector< std::vector< ItemType > > &spec, bool aAllowInvalidGroups=false)
std::unique_ptr< BOARD > ReadBoardFromFileOrStream(const std::string &aFilename, std::istream &aFallback)
Read a board from a file, or another stream, as appropriate.
void DumpBoardToFile(BOARD &board, const std::string &aFilename)
Utility function to simply write a Board out to a file.
Class to handle a set of BOARD_ITEMs.
std::deque< PCB_GROUP * > GROUPS
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_CHECK_MESSAGE(totalMismatches==0, std::to_string(totalMismatches)+" board(s) with strategy disagreements")
BOOST_CHECK_EQUAL(result, "25.4")
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
VECTOR2< int32_t > VECTOR2I