vcl/qa/cppunit/BitmapTest.cxx |   60 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

New commits:
commit 072f5090e57ddbc2954efafa38b57056a5e52abb
Author: Michael Meeks <michael.me...@collabora.com>
Date:   Mon Jul 13 15:38:09 2015 +0100

    tdf#93532 -  Bitmap CRC unit tests.
    
    Change-Id: Ic75801d7ad941ba802ffe418d5c666b1e7b0e94f
    Reviewed-on: https://gerrit.libreoffice.org/18202
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>

diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx
index 306b0df..2c94e0e 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,60 @@ 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->SetBackground(Wallpaper(COL_WHITE));
+    aVDev->SetOutputSizePixel(Size(1023, 759));
+
+#if 0 // disabled for now - it breaks on OS/X and Windows
+    Bitmap aWhiteCheck = getAsBitmap(aVDev);
+    CPPUNIT_ASSERT(aCRCs.find(aWhiteCheck.GetChecksum()) != aCRCs.end());
+#endif
+
+    // 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);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to