21#include <boost/test/data/test_case.hpp>
42struct REFERENCE_IMAGE_LOAD_TEST_FIXTURE
44 REFERENCE_IMAGE_LOAD_TEST_FIXTURE() {}
48struct REFERENCE_IMAGE_LOAD_TEST_CASE
53 bool m_expectedLocked;
55 double m_expectedScale;
64 std::vector<REFERENCE_IMAGE_LOAD_TEST_CASE> m_imageCases;
67const std::vector<REFERENCE_IMAGE_LOAD_BOARD_TEST_CASE> ReferenceImageLoading_testCases{
69 "reference_images_load_save",
74 "7dde345e-020a-4fdd-af77-588b452be5e0",
81 "e4fd52dd-1d89-4c43-b621-aebfc9788d5c",
88 "d402397e-bce0-4cae-a398-b5aeef397e87",
101const std::vector<unsigned char> png_3780_ppm = {
102 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
103 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53,
104 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC4, 0x00, 0x00, 0x0E,
105 0xC4, 0x01, 0x95, 0x2B, 0x0E, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA,
106 0x63, 0xF8, 0xCF, 0xC0, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0xF7, 0x03, 0x41, 0x43, 0x00, 0x00,
107 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
111std::unique_ptr<BOARD> parseBoardString(
const std::string& aData )
116 return std::unique_ptr<BOARD>(
dynamic_cast<BOARD*
>( parser.Parse() ) );
120double firstImageScale(
const BOARD& aBoard )
135 boost::unit_test::data::make( ReferenceImageLoading_testCases ), testCase )
137 const auto doBoardTest = [&](
const BOARD& aBoard )
139 for(
const REFERENCE_IMAGE_LOAD_TEST_CASE& imageTestCase : testCase.m_imageCases )
142 "Checking for image with UUID: " << imageTestCase.m_imageUuid.
AsString() );
151 BOOST_CHECK_CLOSE( refImage.
GetImageScale(), imageTestCase.m_expectedScale, 1e-6 );
160 testCase.m_ExpectedBoardVersion );
170 const auto doBoardTest = [&](
const BOARD& aBoard )
172 KIID targetUuid(
"7dde345e-020a-4fdd-af77-588b452be5e0" );
222 auto image = std::make_unique<PCB_REFERENCE_IMAGE>( &board );
224 wxMemoryBuffer buffer;
225 buffer.AppendData( png_3780_ppm.data(), png_3780_ppm.size() );
228 BOOST_REQUIRE_EQUAL(
image->GetReferenceImage().GetImage().GetPPI(), 96 );
229 BOOST_REQUIRE_EQUAL(
image->GetReferenceImage().GetImage().GetLegacyPPI(), 94 );
231 image->GetReferenceImage().SetImageScale( 2.0 );
235 const std::string
path = ( std::filesystem::temp_directory_path()
236 /
"issue23575_ppi_migration.kicad_pcb" ).
string();
239 std::ifstream in(
path );
240 std::stringstream ss;
242 const std::string current = ss.str();
245 std::unique_ptr<BOARD> reloaded = parseBoardString( current );
247 BOOST_CHECK_CLOSE( firstImageScale( *reloaded ), 2.0, 1e-6 );
250 std::string legacy = current;
251 const size_t pos = legacy.find(
"20260623" );
253 legacy.replace( pos, 8,
"20260512" );
255 std::unique_ptr<BOARD> migrated = parseBoardString( legacy );
257 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.
Pcbnew s-expression file format parser definition.
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_TEST_MESSAGE("\n=== Real-World Polygon PIP Benchmark ===\n"<< formatTable(table))
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_CHECK_EQUAL(result, "25.4")
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
VECTOR2< int32_t > VECTOR2I