1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 // activate the extra needed ctor
11 #define RTL_STRING_UNITTEST
13 #include <sal/config.h>
16 #include <string_view>
19 #include <o3tl/cppunittraitshelper.hxx>
20 #include <sal/types.h>
21 #include <cppunit/TestFixture.h>
22 #include <cppunit/extensions/HelperMacros.h>
23 #include <rtl/ustring.hxx>
24 #include <rtl/ustrbuf.hxx>
26 extern bool rtl_string_unittest_const_literal
;
27 bool rtl_string_unittest_invalid_conversion
;
29 namespace test::oustring
{
31 class StringLiterals
: public CppUnit::TestFixture
35 void checkConstexprCtor();
38 void checkOUStringLiteral();
39 void checkOUStringChar();
41 void checkEmbeddedNul();
44 void testcall( const char str
[] );
46 // Check that OUStringLiteral ctor is actually constexpr:
47 static constexpr rtlunittest::OUStringLiteral dummy
{u
"dummy"};
49 CPPUNIT_TEST_SUITE(StringLiterals
);
50 CPPUNIT_TEST(checkCtors
);
51 CPPUNIT_TEST(checkConstexprCtor
);
52 CPPUNIT_TEST(checkUsage
);
53 CPPUNIT_TEST(checkBuffer
);
54 CPPUNIT_TEST(checkOUStringLiteral
);
55 CPPUNIT_TEST(checkOUStringChar
);
56 CPPUNIT_TEST(checkUtf16
);
57 CPPUNIT_TEST(checkEmbeddedNul
);
58 CPPUNIT_TEST(checkOstr
);
59 CPPUNIT_TEST_SUITE_END();
62 // reset the flag, evaluate the expression and return
63 // whether the string literal ctor was used (i.e. whether the conversion was valid)
64 template<typename T
> static bool VALID_CONVERSION( T
&& expression
)
66 rtl_string_unittest_invalid_conversion
= false;
67 // OK to std::forward expression twice; what is relevant in both ctor calls
68 // is not the content of the passed argument (which is ignored anyway by the
69 // special RTL_STRING_UNITTEST ctors) but only its type:
70 ( void ) rtl::OUString( std::forward
<T
>(expression
) );
71 ( void ) rtl::OUStringBuffer( std::forward
<T
>(expression
) );
72 return !rtl_string_unittest_invalid_conversion
;
74 template<typename T
> static bool VALID_CONVERSION_CALL( T f
)
76 rtl_string_unittest_invalid_conversion
= false;
77 ( void ) rtl::OUString( f() );
78 ( void ) rtl::OUStringBuffer( f() );
79 return !rtl_string_unittest_invalid_conversion
;
82 void test::oustring::StringLiterals::checkCtors()
84 CPPUNIT_ASSERT( VALID_CONVERSION( "test" ));
85 const char good1
[] = "test";
86 CPPUNIT_ASSERT( VALID_CONVERSION( good1
));
88 CPPUNIT_ASSERT( !VALID_CONVERSION( static_cast<const char*>("test") ));
89 const char* bad1
= good1
;
90 CPPUNIT_ASSERT( !VALID_CONVERSION( bad1
));
92 CPPUNIT_ASSERT( !VALID_CONVERSION( bad2
));
94 CPPUNIT_ASSERT( !VALID_CONVERSION( bad3
));
95 const char* bad4
[] = { "test1" };
96 CPPUNIT_ASSERT( !VALID_CONVERSION( bad4
[ 0 ] ));
99 // This one is technically broken, since the first element is 6 characters test\0\0,
100 // but there does not appear a way to detect this by compile time (runtime will assert()).
101 // RTL_CONSTASCII_USTRINGPARAM() has the same flaw.
102 const char bad5
[][ 6 ] = { "test", "test2" };
103 // CPPUNIT_ASSERT( VALID_CONVERSION( bad5[ 0 ] ));
104 CPPUNIT_ASSERT( VALID_CONVERSION( bad5
[ 1 ] ));
106 // Check that contents are correct and equal to the case when RTL_CONSTASCII_USTRINGPARAM is used.
107 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "" ), rtl::OUString( "" ));
108 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "ab" ), rtl::OUString( "ab" ));
110 // Also check that embedded \0 is included.
111 // In fact, allowing this is probably just trouble, so this now asserts.
112 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "\0" ), rtl::OUString( "\0" ));
113 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "a\0b" ), rtl::OUString( "a\0b" ));
117 void test::oustring::StringLiterals::testcall( const char str
[] )
120 !VALID_CONVERSION_CALL([&str
]() { return rtl::OUString(str
); }));
123 void test::oustring::StringLiterals::checkConstexprCtor()
125 static constinit
rtl::OUString
s(dummy
);
126 CPPUNIT_ASSERT_EQUAL(oslInterlockedCount(0x40000000), s
.pData
->refCount
);
127 // SAL_STRING_STATIC_FLAG (sal/rtl/strimp.hxx)
128 CPPUNIT_ASSERT_EQUAL(sal_Int32(5), s
.getLength());
129 CPPUNIT_ASSERT_EQUAL(rtl::OUString("dummy"), s
);
130 CPPUNIT_ASSERT_EQUAL(
131 static_cast<void const *>(dummy
.getStr()), static_cast<void const *>(s
.getStr()));
134 void test::oustring::StringLiterals::checkUsage()
136 // simply check that all string literal based calls work as expected
137 // also check that they really use string literal overload and do not convert to OUString
138 rtl::OUString
foo( "foo" );
139 rtl::OUString
FoO( "FoO" );
140 rtl::OUString
foobarfoo( "foobarfoo" );
141 rtl::OUString
foobar( "foobar" );
142 rtl::OUString
FooBaRfoo( "FooBaRfoo" );
143 rtl::OUString
FooBaR( "FooBaR" );
144 rtl::OUString
bar( "bar" );
145 rtl::OUString
test( "test" );
147 rtl_string_unittest_const_literal
= false; // start checking for OUString conversions
148 CPPUNIT_ASSERT_EQUAL( foo
, rtl::OUString() = "foo" );
149 CPPUNIT_ASSERT( FoO
.equalsIgnoreAsciiCase( "fOo" ));
150 CPPUNIT_ASSERT( foobarfoo
.match( "bar", 3 ));
151 CPPUNIT_ASSERT( foobar
.match( "foo" ));
152 CPPUNIT_ASSERT( FooBaRfoo
.matchIgnoreAsciiCase( "bAr", 3 ));
153 CPPUNIT_ASSERT( FooBaR
.matchIgnoreAsciiCase( "fOo" ));
154 CPPUNIT_ASSERT( foobar
.startsWith( "foo" ));
155 CPPUNIT_ASSERT( FooBaR
.startsWithIgnoreAsciiCase( "foo" ));
156 CPPUNIT_ASSERT( foobar
.endsWith( "bar" ));
157 CPPUNIT_ASSERT( FooBaR
.endsWithIgnoreAsciiCase( "bar" ));
158 CPPUNIT_ASSERT( bool(foo
== "foo") );
159 CPPUNIT_ASSERT( bool("foo" == foo
) );
160 CPPUNIT_ASSERT( foo
!= "bar" );
161 CPPUNIT_ASSERT( "foo" != bar
);
162 CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32
>(6), foobarfoo
.indexOf( "foo", 1 ) );
163 CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32
>(6), foobarfoo
.lastIndexOf( "foo" ) );
164 CPPUNIT_ASSERT( bool(foobarfoo
.replaceFirst( "foo", test
) == "testbarfoo") );
165 CPPUNIT_ASSERT( bool(foobarfoo
.replaceFirst( "foo", "test" ) == "testbarfoo") );
166 CPPUNIT_ASSERT( bool(foobarfoo
.replaceAll( "foo", test
) == "testbartest") );
167 CPPUNIT_ASSERT( bool(foobarfoo
.replaceAll( "foo", "test" ) == "testbartest") );
168 CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32
>(0), foo
.reverseCompareTo( "foo" ) );
169 // if this is not true, some of the calls above converted to OUString
170 CPPUNIT_ASSERT( !rtl_string_unittest_const_literal
);
173 void test::oustring::StringLiterals::checkBuffer()
175 rtl::OUStringBuffer buf
;
177 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "foo" ), buf
.toString());
179 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "foobar" ), buf
.toString());
180 buf
.insert( 3, "baz" );
181 CPPUNIT_ASSERT_EQUAL( rtl::OUString( "foobazbar" ), buf
.toString());
183 CPPUNIT_ASSERT( !VALID_CONVERSION( buf
.append( rtl::OUString( d
))));
184 CPPUNIT_ASSERT( !VALID_CONVERSION( buf
.append( rtl::OUStringBuffer( d
))));
189 rtl::OUString
conditional(bool flag
) {
190 return rtl::OUString::Concat(flag
? std::u16string_view(u
"a") : std::u16string_view(u
"bb"))
196 void test::oustring::StringLiterals::checkOUStringLiteral()
198 CPPUNIT_ASSERT(bool(conditional(true) == "ac"));
199 CPPUNIT_ASSERT(bool(conditional(false) == "bbc"));
201 static constexpr rtlunittest::OUStringLiteral
s1lit(u
"abc");
202 rtl::OUString
s1(s1lit
);
203 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abc"), s1
);
204 static constexpr rtlunittest::OUStringLiteral
de(u
"de");
206 CPPUNIT_ASSERT_EQUAL(rtl::OUString("de"), s1
);
207 s1
+= rtlunittest::OUStringLiteral(u
"fde");
208 CPPUNIT_ASSERT_EQUAL(rtl::OUString("defde"), s1
);
209 CPPUNIT_ASSERT_EQUAL(
211 s1
.reverseCompareTo(rtlunittest::OUStringLiteral(u
"defde")));
213 s1
.equalsIgnoreAsciiCase(rtlunittest::OUStringLiteral(u
"DEFDE")));
214 CPPUNIT_ASSERT(s1
.match(rtlunittest::OUStringLiteral(u
"fde"), 2));
216 s1
.matchIgnoreAsciiCase(rtlunittest::OUStringLiteral(u
"FDE"), 2));
218 CPPUNIT_ASSERT(s1
.startsWith(rtlunittest::OUStringLiteral(u
"de"), &s2
));
219 CPPUNIT_ASSERT_EQUAL(rtl::OUString("fde"), s2
);
221 s1
.startsWithIgnoreAsciiCase(
222 rtlunittest::OUStringLiteral(u
"DEFD"), &s2
));
223 CPPUNIT_ASSERT_EQUAL(rtl::OUString("e"), s2
);
224 CPPUNIT_ASSERT(s1
.endsWith(rtlunittest::OUStringLiteral(u
"de"), &s2
));
225 CPPUNIT_ASSERT_EQUAL(rtl::OUString("def"), s2
);
227 s1
.endsWithIgnoreAsciiCase(rtlunittest::OUStringLiteral(u
"EFDE"), &s2
));
228 CPPUNIT_ASSERT_EQUAL(rtl::OUString("d"), s2
);
229 static constexpr rtlunittest::OUStringLiteral
defde(u
"defde");
230 CPPUNIT_ASSERT(bool(s1
== defde
));
231 CPPUNIT_ASSERT(bool(defde
== s1
));
232 static constexpr rtlunittest::OUStringLiteral
abc(u
"abc");
233 CPPUNIT_ASSERT(s1
!= abc
);
234 CPPUNIT_ASSERT(abc
!= s1
);
235 CPPUNIT_ASSERT_EQUAL(
236 sal_Int32(3), s1
.indexOf(rtlunittest::OUStringLiteral(u
"de"), 1));
237 CPPUNIT_ASSERT_EQUAL(
238 sal_Int32(3), s1
.lastIndexOf(rtlunittest::OUStringLiteral(u
"de")));
240 CPPUNIT_ASSERT_EQUAL(
241 rtl::OUString("abcfde"),
243 rtlunittest::OUStringLiteral(u
"de"), rtl::OUString("abc"), &i
));
244 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
245 CPPUNIT_ASSERT_EQUAL(
246 rtl::OUString("abcfde"),
248 rtl::OUString("de"), rtlunittest::OUStringLiteral(u
"abc"), &i
));
249 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
250 CPPUNIT_ASSERT_EQUAL(
251 rtl::OUString("abcfde"),
253 rtlunittest::OUStringLiteral(u
"de"),
254 rtlunittest::OUStringLiteral(u
"abc"), &i
));
255 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
256 CPPUNIT_ASSERT_EQUAL(
257 rtl::OUString("abcfde"),
258 s1
.replaceFirst(rtlunittest::OUStringLiteral(u
"de"), "abc", &i
));
259 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
260 CPPUNIT_ASSERT_EQUAL(
261 rtl::OUString("abcfde"),
262 s1
.replaceFirst("de", rtlunittest::OUStringLiteral(u
"abc"), &i
));
263 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
264 CPPUNIT_ASSERT_EQUAL(
265 rtl::OUString("abcfabc"),
267 rtlunittest::OUStringLiteral(u
"de"), rtl::OUString("abc")));
268 CPPUNIT_ASSERT_EQUAL(
269 rtl::OUString("abcfabc"),
271 rtl::OUString("de"), rtlunittest::OUStringLiteral(u
"abc")));
272 CPPUNIT_ASSERT_EQUAL(
273 rtl::OUString("abcfabc"),
275 rtlunittest::OUStringLiteral(u
"de"),
276 rtlunittest::OUStringLiteral(u
"abc")));
277 CPPUNIT_ASSERT_EQUAL(
278 rtl::OUString("abcfabc"),
279 s1
.replaceAll(rtlunittest::OUStringLiteral(u
"de"), "abc"));
280 CPPUNIT_ASSERT_EQUAL(
281 rtl::OUString("abcfabc"),
282 s1
.replaceAll("de", rtlunittest::OUStringLiteral(u
"abc")));
283 CPPUNIT_ASSERT_EQUAL(
284 rtl::OUString("abcdef"),
286 rtl::OUString("abc") + rtlunittest::OUStringLiteral(u
"def")));
287 CPPUNIT_ASSERT_EQUAL(
288 rtl::OUString("abcdef"),
290 rtlunittest::OUStringLiteral(u
"abc") + rtl::OUString("def")));
291 rtl::OUStringBuffer
b(rtlunittest::OUStringLiteral(u
"abc"));
292 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abc"), b
.toString());
293 b
.append(rtlunittest::OUStringLiteral(u
"def"));
294 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abcdef"), b
.toString());
295 b
.insert(2, rtlunittest::OUStringLiteral(u
"gabab"));
296 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abgababcdef"), b
.toString());
297 CPPUNIT_ASSERT_EQUAL(
298 sal_Int32(3), b
.indexOf(rtlunittest::OUStringLiteral(u
"ab"), 1));
299 CPPUNIT_ASSERT_EQUAL(
300 sal_Int32(5), b
.lastIndexOf(rtlunittest::OUStringLiteral(u
"ab")));
303 void test::oustring::StringLiterals::checkOUStringChar()
305 auto l1
= rtlunittest::OUStringChar('A');
306 CPPUNIT_ASSERT_EQUAL(u
'A', l1
.c
);
309 auto l2
= rtlunittest::OUStringChar(c2
);
310 CPPUNIT_ASSERT_EQUAL(u
'A', l2
.c
);
312 char c3
= 'A'; auto l3
= rtlunittest::OUStringChar(c3
);
313 CPPUNIT_ASSERT_EQUAL(u
'A', l3
.c
);
315 auto l4
= rtlunittest::OUStringChar(u
'A');
316 CPPUNIT_ASSERT_EQUAL(u
'A', l4
.c
);
318 sal_Unicode
const c5
= 0x100;
319 auto l5
= rtlunittest::OUStringChar(c5
);
320 CPPUNIT_ASSERT_EQUAL(c5
, l5
.c
);
322 rtl::OUString s1
{rtlunittest::OUStringChar('A')};
323 CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s1
.getLength());
324 CPPUNIT_ASSERT_EQUAL(u
'A', s1
[0]);
326 CPPUNIT_ASSERT_EQUAL(
327 true, rtl::OUString("A") == rtlunittest::OUStringChar('A'));
328 CPPUNIT_ASSERT_EQUAL(
329 false, rtl::OUString("AB") == rtlunittest::OUStringChar('A'));
330 CPPUNIT_ASSERT_EQUAL(
331 false, rtl::OUString("A") != rtlunittest::OUStringChar('A'));
332 CPPUNIT_ASSERT_EQUAL(
333 true, rtl::OUString("AB") != rtlunittest::OUStringChar('A'));
335 rtl::OUString
s2("A" + rtlunittest::OUStringChar('b'));
336 CPPUNIT_ASSERT_EQUAL(sal_Int32(2), s2
.getLength());
337 CPPUNIT_ASSERT_EQUAL(u
'A', s2
[0]);
338 CPPUNIT_ASSERT_EQUAL(u
'b', s2
[1]);
341 void test::oustring::StringLiterals::checkUtf16() {
342 rtl::OUString
s1(u
"abc"_ustr
);
343 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abc"), s1
);
345 CPPUNIT_ASSERT_EQUAL(rtl::OUString("de"), s1
);
347 CPPUNIT_ASSERT_EQUAL(rtl::OUString("defde"), s1
);
348 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), s1
.reverseCompareTo(u
"defde"));
349 CPPUNIT_ASSERT(s1
.equalsIgnoreAsciiCase(u
"DEFDE"));
350 CPPUNIT_ASSERT(s1
.match(u
"fde", 2));
351 CPPUNIT_ASSERT(s1
.matchIgnoreAsciiCase(u
"FDE", 2));
353 CPPUNIT_ASSERT(s1
.startsWith(u
"de", &s2
));
354 CPPUNIT_ASSERT_EQUAL(u
"fde"_ustr
, s2
);
355 CPPUNIT_ASSERT(s1
.startsWithIgnoreAsciiCase(u
"DEFD", &s2
));
356 CPPUNIT_ASSERT_EQUAL(u
"e"_ustr
, s2
);
357 CPPUNIT_ASSERT(s1
.endsWith(u
"de", &s2
));
358 CPPUNIT_ASSERT_EQUAL(u
"def"_ustr
, s2
);
359 CPPUNIT_ASSERT(s1
.endsWithIgnoreAsciiCase(u
"EFDE", &s2
));
360 CPPUNIT_ASSERT_EQUAL(u
"d"_ustr
, s2
);
361 CPPUNIT_ASSERT(bool(s1
== u
"defde"));
362 CPPUNIT_ASSERT(bool(u
"defde" == s1
));
363 CPPUNIT_ASSERT(s1
!= u
"abc");
364 CPPUNIT_ASSERT(u
"abc" != s1
);
365 CPPUNIT_ASSERT_EQUAL(sal_Int32(3), s1
.indexOf(u
"de", 1));
366 CPPUNIT_ASSERT_EQUAL(sal_Int32(3), s1
.lastIndexOf(u
"de"));
368 CPPUNIT_ASSERT_EQUAL(
370 s1
.replaceFirst(u
"de", rtl::OUString("abc"), &i
));
371 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
372 CPPUNIT_ASSERT_EQUAL(
374 s1
.replaceFirst(rtl::OUString("de"), u
"abc", &i
));
375 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
376 CPPUNIT_ASSERT_EQUAL(
377 u
"abcfde"_ustr
, s1
.replaceFirst(u
"de", u
"abc", &i
));
378 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
379 CPPUNIT_ASSERT_EQUAL(
380 u
"abcfde"_ustr
, s1
.replaceFirst(u
"de", "abc", &i
));
381 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
382 CPPUNIT_ASSERT_EQUAL(
383 u
"abcfde"_ustr
, s1
.replaceFirst("de", u
"abc", &i
));
384 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i
);
385 CPPUNIT_ASSERT_EQUAL(
386 u
"abcfabc"_ustr
, s1
.replaceAll(u
"de", rtl::OUString("abc")));
387 CPPUNIT_ASSERT_EQUAL(
388 u
"abcfabc"_ustr
, s1
.replaceAll(rtl::OUString("de"), u
"abc"));
389 CPPUNIT_ASSERT_EQUAL(
390 u
"abcfabc"_ustr
, s1
.replaceAll(u
"de", u
"abc"));
391 CPPUNIT_ASSERT_EQUAL(
392 u
"abcfabc"_ustr
, s1
.replaceAll(u
"de", "abc"));
393 CPPUNIT_ASSERT_EQUAL(
394 u
"abcfabc"_ustr
, s1
.replaceAll("de", u
"abc"));
395 CPPUNIT_ASSERT_EQUAL(
396 rtl::OUString("abcdef"), rtl::OUString(rtl::OUString("abc") + u
"def"));
397 CPPUNIT_ASSERT_EQUAL(
398 rtl::OUString("abcdef"), rtl::OUString(u
"abc" + rtl::OUString("def")));
399 rtl::OUStringBuffer
b(u
"abc");
400 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abc"), b
.toString());
402 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abcdef"), b
.toString());
403 b
.insert(2, u
"gabab");
404 CPPUNIT_ASSERT_EQUAL(rtl::OUString("abgababcdef"), b
.toString());
405 CPPUNIT_ASSERT_EQUAL(sal_Int32(3), b
.indexOf(u
"ab", 1));
406 CPPUNIT_ASSERT_EQUAL(sal_Int32(5), b
.lastIndexOf(u
"ab"));
409 void test::oustring::StringLiterals::checkEmbeddedNul() {
410 using namespace std::literals
;
411 rtl::OUString
const s("foobar");
412 static constexpr char16_t
const a
[] = u
"foo\0hidden";
413 char16_t
const * const p
= a
;
414 CPPUNIT_ASSERT(s
.startsWith(a
));
415 CPPUNIT_ASSERT(s
.startsWith(p
));
416 CPPUNIT_ASSERT(s
.startsWith(u
"foo\0hidden"));
417 // For Clang against libstdc++, this would hit not-yet-fixed
418 // <https://github.com/llvm/llvm-project/issues/24502> "eagerly-instantiated entities whose
419 // templates are defined after the first point of instantiation don't get instantiated at all"
420 // (see the mailing list thread starting at
421 // <https://gcc.gnu.org/pipermail/libstdc++/2021-November/053548.html> "std::basic_string<_Tp>
422 // constructor point of instantiation woes?"):
423 #if !(defined __clang__ && defined __GLIBCXX__)
424 CPPUNIT_ASSERT(!s
.startsWith(u
"foo\0hidden"s
));
426 CPPUNIT_ASSERT(!s
.startsWith(u
"foo\0hidden"sv
));
428 CPPUNIT_ASSERT(!s
.startsWith(rtlunittest::OUStringLiteral(a
)));
429 CPPUNIT_ASSERT(!s
.startsWith(rtlunittest::OUStringLiteral(u
"foo\0hidden")));
433 void test::oustring::StringLiterals::checkOstr() {
434 CPPUNIT_ASSERT_EQUAL(sal_Int32(0), u
""_ustr
.getLength());
435 CPPUNIT_ASSERT_EQUAL(sal_Int32(6), u
"foobar"_ustr
.getLength());
436 CPPUNIT_ASSERT_EQUAL(sal_Int32(7), u
"foo\0bar"_ustr
.getLength());
437 CPPUNIT_ASSERT_EQUAL(u
""_ustr
, rtl::OUString(""_tstr
));
438 CPPUNIT_ASSERT_EQUAL(u
"foobar"_ustr
, rtl::OUString("foobar"_tstr
));
439 // Unlike in a OString context, the below "foo\0bar"_tstr in a OUString context would trigger
440 // the assert(c!='\0') in Copy in sal/rtl/strtmpl.hxx:
441 // CPPUNIT_ASSERT_EQUAL(u"foo\0bar"_ustr, rtl::OUString("foo\0bar"_tstr));
446 CPPUNIT_TEST_SUITE_REGISTRATION(test::oustring::StringLiterals
);
448 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */