From 3f36e7d725f5e4e0b2c4b3530079544a4dccf708 Mon Sep 17 00:00:00 2001 From: Thomas Pointhuber Date: Wed, 9 Feb 2022 22:34:04 +0100 Subject: [PATCH] altium: Start with a test-suite to validate that *.PcbLib footprints are correctly imported The test simply loads every footprint of a library, and compares all elements with an equivalent KiCad footprint. This allows us to quickly spot regressions in the altium and kicad footprint importer, and any code in-between. This test is only a demo, as the checks are still incomplete and quite a few tests are missing. It has to be noted that mask expansion is not supported rigt now by the altium importer, thus the reference footprint is adjusted to keep the test happy. --- .../plugins/altium/altium_designer_plugin.cpp | 1 + .../plugins/altium/pcblib/TracksTest.PcbLib | Bin 0 -> 115200 bytes .../TracksTest.pretty/KEEPOUT.kicad_mod | 47 ++++ .../pcblib/TracksTest.pretty/MASKS.kicad_mod | 35 +++ .../MULTILAYER MASK EXPANSION.kicad_mod | 205 +++++++++++++++++ .../TracksTest.pretty/MULTILAYER.kicad_mod | 77 +++++++ .../pcblib/TracksTest.pretty/Tracks.kicad_mod | 29 +++ .../pcblib/TracksTest.pretty/WIDTHS.kicad_mod | 23 ++ qa/pcbnew/CMakeLists.txt | 1 + .../altium/test_altium_pcblib_import.cpp | 208 ++++++++++++++++++ 10 files changed, 626 insertions(+) create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.PcbLib create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/KEEPOUT.kicad_mod create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/MASKS.kicad_mod create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/MULTILAYER MASK EXPANSION.kicad_mod create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/MULTILAYER.kicad_mod create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/Tracks.kicad_mod create mode 100644 qa/data/plugins/altium/pcblib/TracksTest.pretty/WIDTHS.kicad_mod create mode 100644 qa/pcbnew/plugins/altium/test_altium_pcblib_import.cpp diff --git a/pcbnew/plugins/altium/altium_designer_plugin.cpp b/pcbnew/plugins/altium/altium_designer_plugin.cpp index 95a6fc6237..c5eced658f 100644 --- a/pcbnew/plugins/altium/altium_designer_plugin.cpp +++ b/pcbnew/plugins/altium/altium_designer_plugin.cpp @@ -84,6 +84,7 @@ BOARD* ALTIUM_DESIGNER_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendTo { ALTIUM_PCB_DIR::COMPONENTS6, "Components6\\" }, { ALTIUM_PCB_DIR::COMPONENTBODIES6, "ComponentBodies6\\" }, { ALTIUM_PCB_DIR::DIMENSIONS6, "Dimensions6\\" }, + { ALTIUM_PCB_DIR::EXTENDPRIMITIVEINFORMATION, "ExtendedPrimitiveInformation\\" }, { ALTIUM_PCB_DIR::FILLS6, "Fills6\\" }, { ALTIUM_PCB_DIR::MODELS, "Models\\" }, { ALTIUM_PCB_DIR::NETS6, "Nets6\\" }, diff --git a/qa/data/plugins/altium/pcblib/TracksTest.PcbLib b/qa/data/plugins/altium/pcblib/TracksTest.PcbLib new file mode 100644 index 0000000000000000000000000000000000000000..d482197461c904dc3c11145f487a5076db8fae2e GIT binary patch literal 115200 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 +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + + +#define CHECK_ENUM_CLASS_EQUAL( L, R ) \ + BOOST_CHECK_EQUAL( static_cast( L ), static_cast( R ) ) + + +struct ALTIUM_PCBLIB_IMPORT_FIXTURE +{ + ALTIUM_PCBLIB_IMPORT_FIXTURE() {} + + ALTIUM_DESIGNER_PLUGIN altiumPlugin; + PCB_PLUGIN kicadPlugin; + + void CompareFootprints( const FOOTPRINT* fp1, const FOOTPRINT* fp2 ) + { + BOOST_CHECK_EQUAL( fp1->GetPosition(), fp2->GetPosition() ); + BOOST_CHECK_EQUAL( fp1->GetOrientation(), fp2->GetOrientation() ); + + BOOST_CHECK_EQUAL( fp1->GetReference(), fp2->GetReference() ); + BOOST_CHECK_EQUAL( fp1->GetValue(), fp2->GetValue() ); + BOOST_CHECK_EQUAL( fp1->GetDescription(), fp2->GetDescription() ); + BOOST_CHECK_EQUAL( fp1->GetKeywords(), fp2->GetKeywords() ); + BOOST_CHECK_EQUAL( fp1->GetAttributes(), fp2->GetAttributes() ); + BOOST_CHECK_EQUAL( fp1->GetFlag(), fp2->GetFlag() ); + //BOOST_CHECK_EQUAL( fp1->GetProperties(), fp2->GetProperties() ); + BOOST_CHECK_EQUAL( fp1->GetTypeName(), fp2->GetTypeName() ); + + BOOST_CHECK_EQUAL( fp1->Pads().size(), fp2->Pads().size() ); + BOOST_CHECK_EQUAL( fp1->GraphicalItems().size(), fp2->GraphicalItems().size() ); + BOOST_CHECK_EQUAL( fp1->Zones().size(), fp2->Zones().size() ); + BOOST_CHECK_EQUAL( fp1->Groups().size(), fp2->Groups().size() ); + BOOST_CHECK_EQUAL( fp1->Models().size(), fp2->Models().size() ); + + std::set fp1Pads( fp1->Pads().begin(), fp1->Pads().end() ); + std::set fp2Pads( fp2->Pads().begin(), fp2->Pads().end() ); + for( auto it1 = fp1Pads.begin(), it2 = fp2Pads.begin(); + it1 != fp1Pads.end() && it2 != fp2Pads.end(); it1++, it2++ ) + { + BOOST_CHECK( PAD::Compare( *it1, *it2 ) == 0 ); + } + + std::set fp1GraphicalItems( + fp1->GraphicalItems().begin(), fp1->GraphicalItems().end() ); + std::set fp2GraphicalItems( + fp2->GraphicalItems().begin(), fp2->GraphicalItems().end() ); + for( auto it1 = fp1GraphicalItems.begin(), it2 = fp2GraphicalItems.begin(); + it1 != fp1GraphicalItems.end() && it2 != fp2GraphicalItems.end(); it1++, it2++ ) + { + BOOST_CHECK_EQUAL( ( *it1 )->GetLayer(), ( *it2 )->GetLayer() ); + BOOST_CHECK_EQUAL( ( *it1 )->GetLayerSet(), ( *it2 )->GetLayerSet() ); + BOOST_CHECK_EQUAL( ( *it2 )->GetCenter(), ( *it2 )->GetCenter() ); + + BOOST_CHECK_EQUAL( ( *it1 )->Type(), ( *it2 )->Type() ); + switch( ( *it1 )->Type() ) + { + case PCB_FP_TEXT_T: + { + const FP_TEXT* text1 = static_cast( *it1 ); + const FP_TEXT* text2 = static_cast( *it2 ); + + // TODO: text is not sorted the same way! + /*CHECK_ENUM_CLASS_EQUAL( text1->GetType(), text2->GetType() ); + + BOOST_CHECK_EQUAL( text1->GetText(), text2->GetText() ); + BOOST_CHECK_EQUAL( text1->GetPosition(), text2->GetPosition() ); + BOOST_CHECK_EQUAL( text1->GetTextAngle(), text2->GetTextAngle() ); + BOOST_CHECK_EQUAL( text1->GetTextThickness(), text2->GetTextThickness() ); + + BOOST_CHECK( text1->Compare( text2 ) == 0 );*/ + } + break; + case PCB_FP_SHAPE_T: + { + const FP_SHAPE* shape1 = static_cast( *it1 ); + const FP_SHAPE* shape2 = static_cast( *it2 ); + + CHECK_ENUM_CLASS_EQUAL( shape1->GetShape(), shape2->GetShape() ); + + BOOST_CHECK_EQUAL( shape1->GetStroke().GetWidth(), shape2->GetStroke().GetWidth() ); + CHECK_ENUM_CLASS_EQUAL( shape1->GetStroke().GetPlotStyle(), + shape2->GetStroke().GetPlotStyle() ); + + BOOST_CHECK_EQUAL( shape1->GetPosition(), shape2->GetPosition() ); + BOOST_CHECK_EQUAL( shape1->GetStart(), shape2->GetStart() ); + BOOST_CHECK_EQUAL( shape1->GetEnd(), shape2->GetEnd() ); + + CHECK_ENUM_CLASS_EQUAL( shape1->GetFillMode(), shape2->GetFillMode() ); + } + break; + /*case PCB_FP_DIM_ALIGNED_T: break; + case PCB_FP_DIM_LEADER_T: break; + case PCB_FP_DIM_CENTER_T: break; + case PCB_FP_DIM_RADIAL_T: break; + case PCB_FP_DIM_ORTHOGONAL_T: break;*/ + default: BOOST_ERROR( "KICAD_T not known" ); break; + } + } + + std::set fp1Zones( fp1->Zones().begin(), + fp1->Zones().end() ); + std::set fp2Zones( fp2->Zones().begin(), + fp2->Zones().end() ); + for( auto it1 = fp1Zones.begin(), it2 = fp2Zones.begin(); + it1 != fp1Zones.end() && it2 != fp2Zones.end(); it1++, it2++ ) + { + // TODO: BOOST_CHECK( (*it1)->IsSame( **it2 ) ); + } + + // TODO: Groups + } +}; + + +// TODO: see https://gitlab.com/kicad/code/kicad/-/blob/master/qa/pcbnew/test_save_load.cpp + +/** + * Declares the struct as the Boost test fixture. + */ +BOOST_FIXTURE_TEST_SUITE( AltiumPcbLibImport, ALTIUM_PCBLIB_IMPORT_FIXTURE ) + + +/** + * Compare all footprints declared in a *.PcbLib file with their KiCad reference footprint + */ +BOOST_AUTO_TEST_CASE( AltiumPcbLibImport ) +{ + std::vector> tests = { { "TracksTest.PcbLib", + "TracksTest.pretty" } }; + + std::string dataPath = KI_TEST::GetPcbnewTestDataDir() + "plugins/altium/pcblib/"; + + for( const std::pair& libName : tests ) + { + wxString altiumLibraryPath = dataPath + libName.first; + wxString kicadLibraryPath = dataPath + libName.second; + + wxArrayString altiumFootprintNames; + altiumPlugin.FootprintEnumerate( altiumFootprintNames, altiumLibraryPath, true, nullptr ); + wxArrayString kicadFootprintNames; + kicadPlugin.FootprintEnumerate( kicadFootprintNames, kicadLibraryPath, true, nullptr ); + BOOST_CHECK_EQUAL( altiumFootprintNames.GetCount(), kicadFootprintNames.GetCount() ); + + for( size_t i = 0; i < altiumFootprintNames.GetCount(); i++ ) + { + wxString footprintName = altiumFootprintNames[i]; + + BOOST_TEST_CONTEXT( wxString::Format( wxT( "Import '%s' from '%s'" ), footprintName, + libName.first ) ) + { + FOOTPRINT* altiumFp = altiumPlugin.FootprintLoad( altiumLibraryPath, footprintName, + false, nullptr ); + BOOST_CHECK( altiumFp ); + + BOOST_CHECK_EQUAL( wxT( "REF**" ), altiumFp->GetReference() ); + BOOST_CHECK_EQUAL( footprintName, altiumFp->GetValue() ); + + FOOTPRINT* kicadFp = kicadPlugin.FootprintLoad( kicadLibraryPath, footprintName, + false, nullptr ); + BOOST_CHECK( kicadFp ); + + CompareFootprints( altiumFp, kicadFp ); + } + } + } +} + + +BOOST_AUTO_TEST_SUITE_END()