54 BOOST_CHECK( m_plugin.CanReadBoard(
path ) );
61 BOOST_CHECK( !m_plugin.CanReadBoard( kicadPath ) );
67 BOOST_CHECK( !m_plugin.CanReadBoard( wxT(
"/nonexistent/path/file.lay6" ) ) );
79 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
82 BOOST_CHECK( board->Footprints().size() > 0 );
89 +
"/plugins/sprint_layout/cacazi-a8-zigbee_cr2032_1.2mm.lay6";
91 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
94 BOOST_CHECK( board->Footprints().size() > 0 );
101 +
"/plugins/sprint_layout/mdb-rs232.lay6";
103 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
106 BOOST_CHECK( board->Footprints().size() > 0 );
115 std::unique_ptr<BOARD> baseBoard = m_plugin.LoadBoard( dataPath );
119 size_t originalFootprints = baseBoard->Footprints().size();
120 size_t originalDrawings = baseBoard->Drawings().size();
128 BOOST_CHECK( baseBoard->Footprints().size() >= originalFootprints * 2 );
129 BOOST_CHECK( baseBoard->Drawings().size() >= originalDrawings * 2 );
141 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
145 int edgeCutsCount = 0;
155 BOOST_CHECK_MESSAGE( edgeCutsCount > 0,
"Board should have Edge.Cuts outline shapes" );
167 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
191 boardBox.
Merge( shapeBox );
204 int outsideCount = 0;
206 for(
FOOTPRINT* fp : board->Footprints() )
208 for(
PAD*
pad : fp->Pads() )
215 BOOST_CHECK_MESSAGE( outsideCount == 0,
216 wxString::Format(
"%d pads found outside board outline", outsideCount ) );
228 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
231 BOOST_CHECK( board->GetCopperLayerCount() >= 2 );
239 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
243 std::vector<FOOTPRINT*> cached = m_plugin.GetImportedCachedLibraryFootprints();
246 BOOST_CHECK( cached.size() > 0 );
257 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
264 for(
FOOTPRINT* fp : board->Footprints() )
266 for(
PAD*
pad : fp->Pads() )
276 BOOST_CHECK_MESSAGE( thtCount > 0 || smdCount > 0,
277 "Board should have at least some pads" );
289 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
294 int negativeCount = 0;
296 for(
FOOTPRINT* fp : board->Footprints() )
298 for(
PAD*
pad : fp->Pads() )
300 if(
pad->GetPosition().y < 0 )
305 BOOST_CHECK_MESSAGE( negativeCount == 0,
306 wxString::Format(
"%d pads have negative Y (Y-flip error)", negativeCount ) );
314 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
318 int copperDrawings = 0;
319 int silkDrawings = 0;
331 BOOST_CHECK_MESSAGE( copperDrawings > 0 || silkDrawings > 0,
332 "Board should have drawings on copper or silkscreen layers" );
342 std::vector<std::string> files = {
343 "/plugins/sprint_layout/gpio2nesc.lay6",
344 "/plugins/sprint_layout/cacazi-a8-zigbee_cr2032_1.2mm.lay6",
345 "/plugins/sprint_layout/mdb-rs232.lay6",
346 "/plugins/sprint_layout/mdb-master-rev2a.lay6",
347 "/plugins/sprint_layout/smalldualrgb-withmask.lay6",
348 "/plugins/sprint_layout/amiga2000-remake.lay6",
349 "/plugins/sprint_layout/karpaty-rx-pcb1-bpf-orig.lay6",
350 "/plugins/sprint_layout/karpaty-rx-pcb2-rfamp-1st-mixer-orig.lay6",
351 "/plugins/sprint_layout/karpaty-rx-pcb3-vfo-orig.lay6",
352 "/plugins/sprint_layout/karpaty-rx-pcb5-buffer-freq-doubler-orig.lay6",
353 "/plugins/sprint_layout/karpaty-rx-pcb6-mainboard-orig.lay6",
354 "/plugins/sprint_layout/karpaty-rx-pcb7-power-supply-orig.lay6",
355 "/plugins/sprint_layout/ku14194revb.lay6",
356 "/plugins/sprint_layout/pcb100x40_v5.lay6",
357 "/plugins/sprint_layout/tfcc.lay6",
358 "/plugins/sprint_layout/12F629_SM.lay6",
361 for(
const auto& file : files )
367 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
368 BOOST_CHECK( board !=
nullptr );
381 +
"/plugins/sprint_layout/mmjoy2-74hc165.lay6";
383 std::map<std::string, UTF8> props;
384 props[
"pcb_id"] =
"0";
386 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath, &props );
389 BOOST_CHECK( board->Footprints().size() > 0 );
393 for(
FOOTPRINT* fp : board->Footprints() )
394 padCount +=
static_cast<int>( fp->Pads().size() );
396 BOOST_CHECK_MESSAGE( padCount > 0,
"MMJoy2 board should have pads" );
403 +
"/plugins/sprint_layout/smalldualrgb-withmask.lay6";
405 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
408 BOOST_CHECK( board->Footprints().size() > 0 );
415 +
"/plugins/sprint_layout/mdb-master-rev2a.lay6";
417 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
420 BOOST_CHECK( board->Footprints().size() > 0 );
421 BOOST_CHECK( board->GetCopperLayerCount() >= 2 );
432 +
"/plugins/sprint_layout/karpaty-rx-pcb1-bpf-orig.lay6";
434 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
437 BOOST_CHECK( board->Footprints().size() > 0 );
444 +
"/plugins/sprint_layout/karpaty-rx-pcb2-rfamp-1st-mixer-orig.lay6";
446 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
449 BOOST_CHECK( board->Footprints().size() > 0 );
456 +
"/plugins/sprint_layout/karpaty-rx-pcb3-vfo-orig.lay6";
458 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
461 BOOST_CHECK( board->Footprints().size() > 0 );
468 +
"/plugins/sprint_layout/karpaty-rx-pcb5-buffer-freq-doubler-orig.lay6";
470 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
473 BOOST_CHECK( board->Footprints().size() > 0 );
480 +
"/plugins/sprint_layout/karpaty-rx-pcb6-mainboard-orig.lay6";
482 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
485 BOOST_CHECK( board->Footprints().size() > 0 );
492 +
"/plugins/sprint_layout/karpaty-rx-pcb7-power-supply-orig.lay6";
494 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
497 BOOST_CHECK( board->Footprints().size() > 0 );
508 +
"/plugins/sprint_layout/ku14194revb.lay6";
510 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
513 BOOST_CHECK( board->Footprints().size() > 0 );
520 +
"/plugins/sprint_layout/pcb100x40_v5.lay6";
522 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
525 BOOST_CHECK( board->Footprints().size() > 0 );
532 +
"/plugins/sprint_layout/tfcc.lay6";
534 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
537 BOOST_CHECK( board->Footprints().size() > 0 );
548 +
"/plugins/sprint_layout/amiga2000-remake.lay6";
550 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
554 BOOST_CHECK_MESSAGE( board->Footprints().size() > 50,
555 wxString::Format(
"Amiga 2000 should have many footprints, got %zu",
556 board->Footprints().size() ) );
558 BOOST_CHECK( board->GetCopperLayerCount() >= 2 );
568 std::vector<std::string> files = {
569 "/plugins/sprint_layout/gpio2nesc.lay6",
570 "/plugins/sprint_layout/mdb-rs232.lay6",
571 "/plugins/sprint_layout/mdb-master-rev2a.lay6",
572 "/plugins/sprint_layout/smalldualrgb-withmask.lay6",
573 "/plugins/sprint_layout/amiga2000-remake.lay6",
574 "/plugins/sprint_layout/karpaty-rx-pcb1-bpf-orig.lay6",
575 "/plugins/sprint_layout/karpaty-rx-pcb2-rfamp-1st-mixer-orig.lay6",
576 "/plugins/sprint_layout/karpaty-rx-pcb3-vfo-orig.lay6",
577 "/plugins/sprint_layout/karpaty-rx-pcb5-buffer-freq-doubler-orig.lay6",
578 "/plugins/sprint_layout/karpaty-rx-pcb6-mainboard-orig.lay6",
579 "/plugins/sprint_layout/karpaty-rx-pcb7-power-supply-orig.lay6",
580 "/plugins/sprint_layout/ku14194revb.lay6",
581 "/plugins/sprint_layout/pcb100x40_v5.lay6",
582 "/plugins/sprint_layout/tfcc.lay6",
583 "/plugins/sprint_layout/12F629_SM.lay6",
586 for(
const auto& file : files )
592 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
598 const int MAX_COORD =
pcbIUScale.mmToIU( 1000.0 );
601 for(
FOOTPRINT* fp : board->Footprints() )
603 for(
PAD*
pad : fp->Pads() )
612 BOOST_CHECK_MESSAGE( badCount == 0,
613 wxString::Format(
"%d pads have coordinates outside +-10m in %s",
614 badCount, wxString::FromUTF8( file ) ) );
627 +
"/plugins/sprint_layout/mmjoy2-74hc165.lay6";
640 +
"/plugins/sprint_layout/mmjoy2-74hc165.lay6";
648 for(
size_t i = 0; i < fileData.boards.size(); i++ )
652 std::map<std::string, UTF8> props;
653 props[
"pcb_id"] = std::to_string( i );
656 std::unique_ptr<BOARD> board = plugin.
LoadBoard( dataPath, &props );
667 +
"/plugins/sprint_layout/mmjoy2-74hc165.lay6";
670 bool callbackInvoked =
false;
671 size_t optionCount = 0;
674 [&](
const std::vector<IMPORT_PROJECT_DESC>& aOptions )
676 callbackInvoked =
true;
677 optionCount = aOptions.size();
680 std::vector<IMPORT_PROJECT_DESC> chosen;
681 chosen.push_back( aOptions[1] );
685 std::unique_ptr<BOARD> board = plugin.
LoadBoard( dataPath );
687 BOOST_CHECK( callbackInvoked );
696 +
"/plugins/sprint_layout/mmjoy2-74hc165.lay6";
701 [&](
const std::vector<IMPORT_PROJECT_DESC>& aOptions )
703 return std::vector<IMPORT_PROJECT_DESC>();
713 +
"/plugins/sprint_layout/gpio2nesc.lay6";
716 bool callbackInvoked =
false;
719 [&](
const std::vector<IMPORT_PROJECT_DESC>& aOptions )
721 callbackInvoked =
true;
725 std::unique_ptr<BOARD> board = plugin.
LoadBoard( dataPath );
727 BOOST_CHECK( !callbackInvoked );
742 +
"/plugins/sprint_layout/12F629_SM.lay6";
744 std::unique_ptr<BOARD> board = m_plugin.LoadBoard( dataPath );
775 int outsideCount = 0;
778 for(
FOOTPRINT* fp : board->Footprints() )
780 for(
PAD*
pad : fp->Pads() )
792 BOOST_CHECK_MESSAGE( smdCount > 0,
793 "PIC12F629 board should have SMD pads" );
795 BOOST_CHECK_MESSAGE( outsideCount == 0,
796 wxString::Format(
"%d of %d SMD pads outside board outline",
797 outsideCount, smdCount ) );
constexpr EDA_IU_SCALE pcbIUScale
General utilities for PCB file IO for QA programs.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr bool Contains(const Vec &aPoint) const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
void LoadAndAppendBoard(const wxString &aFileName, BOARD &aAppendToMe, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr)
Same as LoadBoard(), but appends the loaded board to an existing board, which must already exist.
std::unique_ptr< BOARD > LoadBoard(const wxString &aFileName, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr)
Load information from some input file format that this PCB_IO implementation knows about into new BOA...
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
virtual void RegisterCallback(CHOOSE_PROJECT_HANDLER aChooseProjectHandler)
Register a different handler to be called when a non-KiCad project contains multiple PCB+Schematic co...
const SPRINT_LAYOUT::FILE_DATA & GetFileData() const
bool ParseBoard(const wxString &aFileName)
PCB_LAYER_ID
A quick note on layer IDs:
std::string GetPcbnewTestDataDir()
Utility which returns a path to the data directory where the test board files are stored.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
PCB_IO_SPRINT_LAYOUT m_plugin
SPRINT_LAYOUT_IMPORT_FIXTURE()
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_TEST_CONTEXT("Test Clearance")
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
BOOST_AUTO_TEST_CASE(CanReadLay6File)
BOOST_CHECK_EQUAL(result, "25.4")
VECTOR2< int32_t > VECTOR2I