1
0
Fork 0
libreoffice/vcl/qa/cppunit/GraphicFormatDetectorTest.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

531 lines
18 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <sal/config.h>
#include <string_view>
#include <cppunit/TestAssert.h>
#include <cppunit/extensions/HelperMacros.h>
#include <unotest/bootstrapfixturebase.hxx>
#include <graphic/GraphicFormatDetector.hxx>
#include <graphic/DetectorTools.hxx>
#include <tools/stream.hxx>
#include <o3tl/string_view.hxx>
using namespace css;
namespace
{
class GraphicFormatDetectorTest : public test::BootstrapFixtureBase
{
OUString getFullUrl(std::u16string_view sFileName)
{
return m_directories.getURLFromSrc(u"/vcl/qa/cppunit/data/") + sFileName;
}
void testDetectMET();
void testDetectBMP();
void testDetectWMF();
void testDetectWMZ();
void testDetectPCX();
void testDetectJPG();
void testDetectPNG();
void testDetectAPNG();
void testDetectGIF();
void testDetectGIFMetadata();
void testDetectPSD();
void testDetectTGA();
void testDetectTIF();
void testDetectXBM();
void testDetectXPM();
void testDetectSVG();
void testDetectSVGZ();
void testDetectPDF();
void testDetectEPS();
void testDetectWEBP();
void testDetectEMF();
void testDetectEMZ();
void testMatchArray();
void testCheckArrayForMatchingStrings();
CPPUNIT_TEST_SUITE(GraphicFormatDetectorTest);
CPPUNIT_TEST(testDetectMET);
CPPUNIT_TEST(testDetectBMP);
CPPUNIT_TEST(testDetectWMF);
CPPUNIT_TEST(testDetectWMZ);
CPPUNIT_TEST(testDetectPCX);
CPPUNIT_TEST(testDetectJPG);
CPPUNIT_TEST(testDetectPNG);
CPPUNIT_TEST(testDetectAPNG);
CPPUNIT_TEST(testDetectGIF);
CPPUNIT_TEST(testDetectGIFMetadata);
CPPUNIT_TEST(testDetectPSD);
CPPUNIT_TEST(testDetectTGA);
CPPUNIT_TEST(testDetectTIF);
CPPUNIT_TEST(testDetectXBM);
CPPUNIT_TEST(testDetectXPM);
CPPUNIT_TEST(testDetectSVG);
CPPUNIT_TEST(testDetectSVGZ);
CPPUNIT_TEST(testDetectPDF);
CPPUNIT_TEST(testDetectEPS);
CPPUNIT_TEST(testDetectWEBP);
CPPUNIT_TEST(testDetectEMF);
CPPUNIT_TEST(testDetectEMZ);
CPPUNIT_TEST(testMatchArray);
CPPUNIT_TEST(testCheckArrayForMatchingStrings);
CPPUNIT_TEST_SUITE_END();
};
void GraphicFormatDetectorTest::testDetectMET()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.met"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"MET"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkMET());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"MET"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectBMP()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.bmp"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"BMP"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkBMP());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"BMP"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectWMF()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.wmf"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"WMF"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkWMF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"WMF"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectWMZ()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.wmz"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"WMZ"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkWMF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"WMZ"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectPCX()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.pcx"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"PCX"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkPCX());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"PCX"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectJPG()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.jpg"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"JPG"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkJPG());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"JPG"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectPNG()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.png"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"PNG"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkPNG());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"PNG"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectAPNG()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.apng"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"APNG"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkAPNG());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"APNG"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectGIF()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.gif"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"GIF"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkGIF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"GIF"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectGIFMetadata()
{
SvFileStream aFileStream(getFullUrl(u"123_Numbers.gif"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, "GIF", true);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkGIF());
auto const& rMetadata = aDetector.getMetadata();
CPPUNIT_ASSERT_EQUAL(Size(124, 146), rMetadata.maPixSize);
CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), rMetadata.mnBitsPerPixel);
CPPUNIT_ASSERT_EQUAL(Size(), rMetadata.maLogSize);
CPPUNIT_ASSERT_EQUAL(true, rMetadata.mbIsAnimated);
}
void GraphicFormatDetectorTest::testDetectPSD()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.psd"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"PSD"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkPSD());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"PSD"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectTGA()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.tga"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"TGA"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkTGA());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension(u"TGA"_ustr); // detection is based on extension only
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"TGA"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectTIF()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.tif"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"TIF"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkTIF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"TIF"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectXBM()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.xbm"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"XBM"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkXBM());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"XBM"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectXPM()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.xpm"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"XPM"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkXPM());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"XPM"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectSVG()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.svg"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"SVG"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkSVG());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"SVG"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectSVGZ()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.svgz"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"SVGZ"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkSVG());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"SVGZ"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectPDF()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.pdf"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"PDF"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkPDF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"PDF"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectEPS()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.eps"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"EPS"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkEPS());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"EPS"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectWEBP()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.webp"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"WEBP"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkWEBP());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"WEBP"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectEMF()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.emf"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"EMF"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkEMF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"EMF"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testDetectEMZ()
{
SvFileStream aFileStream(getFullUrl(u"TypeDetectionExample.emz"), StreamMode::READ);
vcl::GraphicFormatDetector aDetector(aFileStream, u"EMZ"_ustr);
CPPUNIT_ASSERT(aDetector.detect());
CPPUNIT_ASSERT(aDetector.checkEMF());
aFileStream.Seek(aDetector.mnStreamPosition);
OUString rFormatExtension;
CPPUNIT_ASSERT(vcl::peekGraphicFormat(aFileStream, rFormatExtension, false));
CPPUNIT_ASSERT_EQUAL(u"EMZ"_ustr, rFormatExtension);
}
void GraphicFormatDetectorTest::testMatchArray()
{
std::string aString("<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<svg width=\"5cm\" height=\"4cm\" version=\"1.1\"\n"
"xmlns=\"http://www.w3.org/2000/svg\">\n"
"</svg>");
const char* pCompleteStringPointer = aString.c_str();
const char* pMatchPointer;
int nCheckSize = aString.size();
// Check beginning of the input string
pMatchPointer = vcl::matchArrayWithString(pCompleteStringPointer, nCheckSize, "<?xml"_ostr);
CPPUNIT_ASSERT(pMatchPointer != nullptr);
CPPUNIT_ASSERT_EQUAL(0, int(pMatchPointer - pCompleteStringPointer));
CPPUNIT_ASSERT_EQUAL(true, o3tl::starts_with(pMatchPointer, "<?xml"));
// Check middle of the input string
pMatchPointer = vcl::matchArrayWithString(aString.c_str(), nCheckSize, "version"_ostr);
CPPUNIT_ASSERT(pMatchPointer != nullptr);
CPPUNIT_ASSERT_EQUAL(6, int(pMatchPointer - pCompleteStringPointer));
CPPUNIT_ASSERT_EQUAL(true, o3tl::starts_with(pMatchPointer, "version"));
pMatchPointer = vcl::matchArrayWithString(aString.c_str(), nCheckSize, "<svg"_ostr);
CPPUNIT_ASSERT(pMatchPointer != nullptr);
CPPUNIT_ASSERT_EQUAL(38, int(pMatchPointer - pCompleteStringPointer));
CPPUNIT_ASSERT_EQUAL(true, o3tl::starts_with(pMatchPointer, "<svg"));
// Check end of the input string
pMatchPointer = vcl::matchArrayWithString(aString.c_str(), nCheckSize, "/svg>"_ostr);
CPPUNIT_ASSERT(pMatchPointer != nullptr);
CPPUNIT_ASSERT_EQUAL(119, int(pMatchPointer - pCompleteStringPointer));
CPPUNIT_ASSERT_EQUAL(true, o3tl::starts_with(pMatchPointer, "/svg>"));
// Check that non-existing search string
pMatchPointer = vcl::matchArrayWithString(aString.c_str(), nCheckSize, "none"_ostr);
CPPUNIT_ASSERT(pMatchPointer == nullptr);
}
void GraphicFormatDetectorTest::testCheckArrayForMatchingStrings()
{
std::string aString("<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<svg width=\"5cm\" height=\"4cm\" version=\"1.1\"\n"
"xmlns=\"http://www.w3.org/2000/svg\">\n"
"</svg>");
const char* pCompleteStringPointer = aString.c_str();
int nCheckSize = aString.size();
bool bResult;
// check beginning string
bResult
= vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize, { "<?xml"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check ending string
bResult
= vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize, { "/svg>"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check middle string
bResult
= vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize, { "version"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check beginning and then ending string
bResult = vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize,
{ "<?xml"_ostr, "/svg>"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check ending and then beginning string
bResult = vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize,
{ "/svg>"_ostr, "<?xml"_ostr });
CPPUNIT_ASSERT_EQUAL(false, bResult);
// check middle strings
bResult = vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize,
{ "version"_ostr, "<svg"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check beginning, middle and ending strings
bResult = vcl::checkArrayForMatchingStrings(
pCompleteStringPointer, nCheckSize,
{ "<?xml"_ostr, "version"_ostr, "<svg"_ostr, "/svg>"_ostr });
CPPUNIT_ASSERT_EQUAL(true, bResult);
// check non-existing
bResult
= vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize, { "none"_ostr });
CPPUNIT_ASSERT_EQUAL(false, bResult);
// check non-existing on the beginning
bResult = vcl::checkArrayForMatchingStrings(
pCompleteStringPointer, nCheckSize,
{ "none"_ostr, "version"_ostr, "<svg"_ostr, "/svg>"_ostr });
CPPUNIT_ASSERT_EQUAL(false, bResult);
// check non-existing on the end
bResult = vcl::checkArrayForMatchingStrings(
pCompleteStringPointer, nCheckSize,
{ "<?xml"_ostr, "version"_ostr, "<svg"_ostr, "none"_ostr });
CPPUNIT_ASSERT_EQUAL(false, bResult);
// check non-existing after the end
bResult = vcl::checkArrayForMatchingStrings(pCompleteStringPointer, nCheckSize,
{ "<?xml"_ostr, "/svg>"_ostr, "none"_ostr });
CPPUNIT_ASSERT_EQUAL(false, bResult);
}
} // namespace
CPPUNIT_TEST_SUITE_REGISTRATION(GraphicFormatDetectorTest);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */