From 45997fea99a77063ba25f00d44b8ceefc71305e2 Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Mon, 13 Jul 2015 15:38:09 +0100 Subject: tdf#93532 - Bitmap CRC unit tests. Change-Id: Ic75801d7ad941ba802ffe418d5c666b1e7b0e94f --- vcl/qa/cppunit/BitmapTest.cxx | 56 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx index 306b0dfdbc2d..b5c121ac8f34 100644 --- a/vcl/qa/cppunit/BitmapTest.cxx +++ b/vcl/qa/cppunit/BitmapTest.cxx @@ -12,9 +12,13 @@ #include #include +#include + #include #include +#include +#include #include #include @@ -27,10 +31,12 @@ class BitmapTest : public CppUnit::TestFixture { void testConvert(); void testScale(); + void testCRC(); CPPUNIT_TEST_SUITE(BitmapTest); CPPUNIT_TEST(testConvert); CPPUNIT_TEST(testScale); + CPPUNIT_TEST(testCRC); CPPUNIT_TEST_SUITE_END(); }; @@ -129,6 +135,56 @@ void BitmapTest::testScale() } } +typedef std::unordered_map CRCHash; + +void checkAndInsert(CRCHash &rHash, sal_uInt64 nCRC, const char *pLocation) +{ + auto it = rHash.find(nCRC); + if (it != rHash.end()) { + OStringBuffer aBuf("CRC collision between "); + aBuf.append(pLocation); + aBuf.append(" and "); + aBuf.append(it->second); + aBuf.append(" hash is 0x"); + aBuf.append((sal_Int64)nCRC, 16); + CPPUNIT_FAIL(aBuf.toString().getStr()); + } + rHash[nCRC] = pLocation; +} + +void checkAndInsert(CRCHash &rHash, Bitmap rBmp, const char *pLocation) +{ + checkAndInsert(rHash, rBmp.GetChecksum(), pLocation); +} + +Bitmap getAsBitmap(VclPtr pOut) +{ + return pOut->GetBitmap(Point(), pOut->GetOutputSizePixel()); +} + +void BitmapTest::testCRC() +{ + CRCHash aCRCs; + + Bitmap aBitmap(Size(1023,759), 24, 0); + aBitmap.Erase(COL_BLACK); + checkAndInsert(aCRCs, aBitmap, "black bitmap"); + aBitmap.Invert(); + checkAndInsert(aCRCs, aBitmap, "white bitmap"); + + ScopedVclPtrInstance aVDev; + aVDev->SetOutputSizePixel(Size(1023, 759)); + Bitmap aWhiteCheck = getAsBitmap(aVDev); + CPPUNIT_ASSERT(aCRCs.find(aWhiteCheck.GetChecksum()) != aCRCs.end()); + + // a 1x1 black & white checkerboard + aVDev->DrawCheckered(Point(), aVDev->GetOutputSizePixel(), 1, 1); + Bitmap aChecker = getAsBitmap(aVDev); + checkAndInsert(aCRCs, aChecker, "checkerboard"); + aChecker.Invert(); + checkAndInsert(aCRCs, aChecker, "inverted checkerboard"); +} + } // namespace CPPUNIT_TEST_SUITE_REGISTRATION(BitmapTest); -- cgit