21#include <boost/test/data/test_case.hpp>
43struct REFERENCE_IMAGE_LOAD_TEST_FIXTURE
45 REFERENCE_IMAGE_LOAD_TEST_FIXTURE() {}
49struct REFERENCE_IMAGE_LOAD_TEST_CASE
54 bool m_expectedLocked;
56 double m_expectedScale;
65 std::vector<REFERENCE_IMAGE_LOAD_TEST_CASE> m_imageCases;
68const std::vector<REFERENCE_IMAGE_LOAD_BOARD_TEST_CASE> ReferenceImageLoading_testCases{
70 "reference_images_load_save",
75 "7dde345e-020a-4fdd-af77-588b452be5e0",
82 "e4fd52dd-1d89-4c43-b621-aebfc9788d5c",
89 "d402397e-bce0-4cae-a398-b5aeef397e87",
102const std::vector<unsigned char> png_3780_ppm = {
103 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
104 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53,
105 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC4, 0x00, 0x00, 0x0E,
106 0xC4, 0x01, 0x95, 0x2B, 0x0E, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA,
107 0x63, 0xF8, 0xCF, 0xC0, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0xF7, 0x03, 0x41, 0x43, 0x00, 0x00,
108 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
112std::unique_ptr<BOARD> parseBoardString(
const std::string& aData )
117 return std::unique_ptr<BOARD>(
dynamic_cast<BOARD*
>( parser.Parse() ) );
121double firstImageScale(
const BOARD& aBoard )
136 boost::unit_test::data::make( ReferenceImageLoading_testCases ), testCase )
138 const auto doBoardTest = [&](
const BOARD& aBoard )
140 for(
const REFERENCE_IMAGE_LOAD_TEST_CASE& imageTestCase : testCase.m_imageCases )
143 "Checking for image with UUID: " << imageTestCase.m_imageUuid.
AsString() );
152 BOOST_CHECK_CLOSE( refImage.
GetImageScale(), imageTestCase.m_expectedScale, 1e-6 );
161 testCase.m_ExpectedBoardVersion );
171 const auto doBoardTest = [&](
const BOARD& aBoard )
173 KIID targetUuid(
"7dde345e-020a-4fdd-af77-588b452be5e0" );
223 auto image = std::make_unique<PCB_REFERENCE_IMAGE>( &board );
225 wxMemoryBuffer buffer;
226 buffer.AppendData( png_3780_ppm.data(), png_3780_ppm.size() );
229 BOOST_REQUIRE_EQUAL(
image->GetReferenceImage().GetImage().GetPPI(), 96 );
230 BOOST_REQUIRE_EQUAL(
image->GetReferenceImage().GetImage().GetLegacyPPI(), 94 );
232 image->GetReferenceImage().SetImageScale( 2.0 );
236 const std::string
path = ( std::filesystem::temp_directory_path()
237 /
"issue23575_ppi_migration.kicad_pcb" ).
string();
240 std::ifstream in(
path );
241 std::stringstream ss;
243 const std::string current = ss.str();
246 std::unique_ptr<BOARD> reloaded = parseBoardString( current );
248 BOOST_CHECK_CLOSE( firstImageScale( *reloaded ), 2.0, 1e-6 );
252 std::string legacy = current;
254 const size_t pos = legacy.find( version );
256 legacy.replace( pos, version.size(),
"20260512" );
258 std::unique_ptr<BOARD> migrated = parseBoardString( legacy );
260 BOOST_CHECK_CLOSE( firstImageScale( *migrated ), 2.0 * 96.0 / 94.0, 1e-3 );
General utilities for PCB file IO for QA programs.
This class handle bitmap images in KiCad.
VECTOR2I GetSizePixels() const
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.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayer) const
const DRAWINGS & Drawings() const
wxString AsString() const
Read a Pcbnew s-expression formatted LINE_READER object and returns the appropriate BOARD_ITEM object...
Object to handle a bitmap image that can be inserted in a PCB.
double GetImageScale() const
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
const BITMAP_BASE & GetImage() const
Get the underlying image.
double GetImageScale() const
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
PCB_LAYER_ID
A quick note on layer IDs:
@ LEFT_RIGHT
Flip left to right (around the Y axis)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
void DumpBoardToFile(BOARD &board, const std::string &aFilename)
Utility function to simply write a Board out to a file.
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...
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.
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
Pcbnew s-expression file format parser definition.
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_FIXTURE_TEST_CASE(ReferenceImageFlipLayer, REFERENCE_IMAGE_LOAD_TEST_FIXTURE)
Test that flipping a reference image changes its associated layer, matching the behavior of all other...
BOOST_DATA_TEST_CASE_F(REFERENCE_IMAGE_LOAD_TEST_FIXTURE, ReferenceImageLoading, boost::unit_test::data::make(ReferenceImageLoading_testCases), testCase)
BOOST_TEST_MESSAGE("Polyline has "<< chain.PointCount()<< " points")
BOOST_CHECK_EQUAL(result, "25.4")
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
VECTOR2< int32_t > VECTOR2I