diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-07-13 15:38:09 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-09-01 16:28:50 +0100 |
commit | 07254e701fe8cbb7babbfaaf1f096b1afbd5eaf2 (patch) | |
tree | 0241deb52108545cbd98ebf284be58aeb146cfde /vcl/qa/cppunit/BitmapTest.cxx | |
parent | d3dbbf0944785e5dcd5d8c735c7360cc51a3b0d0 (diff) |
tdf#93532 - Bitmap CRC unit tests.
Change-Id: Ic75801d7ad941ba802ffe418d5c666b1e7b0e94f
Diffstat (limited to 'vcl/qa/cppunit/BitmapTest.cxx')
-rw-r--r-- | vcl/qa/cppunit/BitmapTest.cxx | 56 |
1 files changed, 56 insertions, 0 deletions
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 <cppunit/extensions/HelperMacros.h> #include <cppunit/plugin/TestPlugIn.h> +#include <unordered_map> + #include <vcl/bitmap.hxx> #include <vcl/bmpacc.hxx> +#include <vcl/virdev.hxx> +#include <rtl/strbuf.hxx> #include <tools/stream.hxx> #include <vcl/graphicfilter.hxx> @@ -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<sal_uInt64, const char *> 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<OutputDevice> 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<VirtualDevice> 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); |