/* -*- 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&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&b\"/>" _ostr, aString);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Messung V0.5 in Prozent C=94 H=100 G=96
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland