1
0
Fork 0
libreoffice/svtools/qa/unit/testHtmlWriter.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

228 lines
5.7 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 <cppunit/TestFixture.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <unotest/bootstrapfixturebase.hxx>
#include <tools/stream.hxx>
#include <svtools/HtmlWriter.hxx>
namespace
{
OString extractFromStream(SvMemoryStream& rStream)
{
rStream.WriteChar('\0');
rStream.FlushBuffer();
rStream.Seek(STREAM_SEEK_TO_BEGIN);
return static_cast<const char*>(rStream.GetData());
}
}
class Test : public CppUnit::TestFixture
{
};
CPPUNIT_TEST_FIXTURE(Test, testSingleElement)
{
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc/>"_ostr, aString);
}
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.single("abc"_ostr);
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc/>"_ostr, aString);
}
}
CPPUNIT_TEST_FIXTURE(Test, testSingleElementWithAttributes)
{
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.attribute("x", "y");
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc x=\"y\"/>"_ostr, aString);
}
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.attribute("x", "y");
aHtml.attribute("q", "w");
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc x=\"y\" q=\"w\"/>"_ostr, aString);
}
}
CPPUNIT_TEST_FIXTURE(Test, testSingleElementWithContent)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc/>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testSingleElementWithContentAndAttributes)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.attribute("x", "y");
aHtml.attribute("q", "w");
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc x=\"y\" q=\"w\"/>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testNested)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.start("xyz"_ostr);
aHtml.end();
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc><xyz/></abc>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testNamespace)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream, "reqif-xhtml");
aHtml.prettyPrint(false);
aHtml.single("br"_ostr);
OString aString = extractFromStream(aStream);
// This was <br/>, namespace request was ignored.
CPPUNIT_ASSERT_EQUAL("<reqif-xhtml:br/>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testAttributeValues)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.attribute("one", "one");
aHtml.attribute("two", u"two"_ustr);
aHtml.attribute("three", sal_Int32(12));
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc one=\"one\" two=\"two\" three=\"12\"/>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testCharacters)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("abc"_ostr);
aHtml.characters("hello");
aHtml.end();
aHtml.characters(" "); // Should not try to close a not opened tag
aHtml.start("abc"_ostr);
aHtml.characters("world"); // Should close opening tag
aHtml.end();
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<abc>hello</abc> <abc>world</abc>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testExactElementEnd)
{
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
aHtml.start("start"_ostr);
aHtml.start("a"_ostr);
CPPUNIT_ASSERT(aHtml.end("a"_ostr));
aHtml.start("b"_ostr);
CPPUNIT_ASSERT(!aHtml.end("c"_ostr));
CPPUNIT_ASSERT(aHtml.end("start"_ostr));
OString aString = extractFromStream(aStream);
CPPUNIT_ASSERT_EQUAL("<start><a/><b/></start>"_ostr, aString);
}
CPPUNIT_TEST_FIXTURE(Test, testAttributeValueEncode)
{
// Given a HTML writer:
SvMemoryStream aStream;
HtmlWriter aHtml(aStream);
aHtml.prettyPrint(false);
// When writing an attribute with a value that needs encoding:
aHtml.start("element"_ostr);
aHtml.attribute("attribute", "a&b");
aHtml.end();
// Then make sure that the encoding is performed:
OString aString = extractFromStream(aStream);
// Without the accompanying fix in place, this test would have failed with:
// - Expected: <element attribute="a&amp;b"/>
// - Actual : <element attribute="a&b"/>
// i.e. attribute value was not encoded in HTML, but it was in e.g. XML.
CPPUNIT_ASSERT_EQUAL("<element attribute=\"a&amp;b\"/>"_ostr, aString);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */