Files
loongoffice/sal/qa/rtl/oustringbuffer/test_oustringbuffer_assign.cxx
Stephan Bergmann ca832495ac A string_view is not necessarily NUL-terminated
Regression introduced into LIBO_INTERNAL_ONLY code with
1da69081732c8a429840edaaf10cfb789ea68df8 "add string_view variants of methods to
O[U]StringBuffer".

And add some tests.  Assigning an OStringChar to an OStringBuffer also uses the
std::string_view assignment operator, so also test that with testOStringChar,
even though there it is relatively likely that the OStringChar temporary is
followed by null bytes, which could make the test happen to erroneously succeed.
But at least tools like ASan or Valgrind could catch that.  On the other hand,
assigning an OUStringChar to an OUStringBuffer does not use the
std::u16string_view assignment operator (and rather uses a
ConstCharArrayDetector-based one, which was similarly broken and has been fixed
in b66387574ef9c83cbfff622468496b6f0ac4d571 "Fix -Werror=array-bounds"), so
there's no test for that here.

Change-Id: I7cf10ee5ce0e4280a91d116cd82d4871a0f44af6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132363
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2022-03-31 18:52:48 +02:00

93 lines
3.3 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/TestFixture.h>
#include <cppunit/TestAssert.h>
#include <cppunit/extensions/HelperMacros.h>
#include <o3tl/cppunittraitshelper.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/ustring.hxx>
namespace
{
class Test : public CppUnit::TestFixture
{
private:
void test()
{
OUStringBuffer b1;
OUString s1("123456789012345");
b1 = s1;
CPPUNIT_ASSERT_EQUAL(s1, b1.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b1.getCapacity());
OUString s2("abc");
b1 = s2;
CPPUNIT_ASSERT_EQUAL(s2, b1.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b1.getCapacity());
OUString s3("1234567890123456");
b1 = s3;
CPPUNIT_ASSERT_EQUAL(s3, b1.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(32), b1.getCapacity());
OUStringBuffer b2;
b2 = "123456789012345";
CPPUNIT_ASSERT_EQUAL(s1, b2.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b2.getCapacity());
b2 = "abc";
CPPUNIT_ASSERT_EQUAL(s2, b2.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b2.getCapacity());
b2 = "1234567890123456";
CPPUNIT_ASSERT_EQUAL(s3, b2.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(32), b2.getCapacity());
OUStringBuffer b3;
b3 = u"123456789012345";
CPPUNIT_ASSERT_EQUAL(s1, b3.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b3.getCapacity());
b3 = u"abc";
CPPUNIT_ASSERT_EQUAL(s2, b3.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b3.getCapacity());
b3 = u"1234567890123456";
CPPUNIT_ASSERT_EQUAL(s3, b3.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(32), b3.getCapacity());
OUStringBuffer b4;
b4 = OUStringLiteral(u"1") + "23456789012345";
CPPUNIT_ASSERT_EQUAL(s1, b4.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b4.getCapacity());
b4 = OUStringLiteral(u"a") + "bc";
CPPUNIT_ASSERT_EQUAL(s2, b4.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(16), b4.getCapacity());
b4 = OUStringLiteral(u"1") + "234567890123456";
CPPUNIT_ASSERT_EQUAL(s3, b4.toString());
CPPUNIT_ASSERT_EQUAL(sal_Int32(32), b4.getCapacity());
b4 = OUStringChar('a');
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), b4.getLength());
CPPUNIT_ASSERT_EQUAL(u'a', b4.getStr()[0]);
CPPUNIT_ASSERT_EQUAL(u'\0', b4.getStr()[1]);
b4 = std::u16string_view(u"abc").substr(
0, 2); // avoid the string_view accidentally being NUL-terminated
CPPUNIT_ASSERT_EQUAL(sal_Int32(2), b4.getLength());
CPPUNIT_ASSERT_EQUAL(u'a', b4.getStr()[0]);
CPPUNIT_ASSERT_EQUAL(u'b', b4.getStr()[1]);
CPPUNIT_ASSERT_EQUAL(u'\0', b4.getStr()[2]);
}
CPPUNIT_TEST_SUITE(Test);
CPPUNIT_TEST(test);
CPPUNIT_TEST_SUITE_END();
};
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */