1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sal.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "testshl/simpleheader.hxx"
28*b1cdbd2cSJim Jagielski #include "rtl/ustrbuf.hxx"
29*b1cdbd2cSJim Jagielski #include "rtl/ustring.h"
30*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace test { namespace oustringbuffer {
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski class Utf32: public CppUnit::TestFixture {
35*b1cdbd2cSJim Jagielski private:
36*b1cdbd2cSJim Jagielski     void appendUtf32();
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski     void insertUtf32();
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE(Utf32);
41*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(appendUtf32);
42*b1cdbd2cSJim Jagielski     CPPUNIT_TEST(insertUtf32);
43*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_END();
44*b1cdbd2cSJim Jagielski };
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski } }
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test::oustringbuffer::Utf32, "alltest");
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski namespace {
51*b1cdbd2cSJim Jagielski 
appendString(rtl::OUStringBuffer & buffer,rtl::OUString const & string)52*b1cdbd2cSJim Jagielski void appendString(rtl::OUStringBuffer & buffer, rtl::OUString const & string) {
53*b1cdbd2cSJim Jagielski     buffer.append(static_cast< sal_Unicode >('"'));
54*b1cdbd2cSJim Jagielski     for (int i = 0; i < string.getLength(); ++i) {
55*b1cdbd2cSJim Jagielski         buffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("\\u"));
56*b1cdbd2cSJim Jagielski         sal_Unicode c = string[i];
57*b1cdbd2cSJim Jagielski         if (c < 0x1000) {
58*b1cdbd2cSJim Jagielski             buffer.append(static_cast< sal_Unicode >('0'));
59*b1cdbd2cSJim Jagielski             if (c < 0x100) {
60*b1cdbd2cSJim Jagielski                 buffer.append(static_cast< sal_Unicode >('0'));
61*b1cdbd2cSJim Jagielski                 if (c < 0x10) {
62*b1cdbd2cSJim Jagielski                     buffer.append(static_cast< sal_Unicode >('0'));
63*b1cdbd2cSJim Jagielski                 }
64*b1cdbd2cSJim Jagielski             }
65*b1cdbd2cSJim Jagielski         }
66*b1cdbd2cSJim Jagielski         buffer.append(
67*b1cdbd2cSJim Jagielski             static_cast< sal_Int32 >(c), static_cast< sal_Int16 >(16));
68*b1cdbd2cSJim Jagielski     }
69*b1cdbd2cSJim Jagielski     buffer.append(static_cast< sal_Unicode >('"'));
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
createMessage(rtl::OUStringBuffer & message,rtl::OUString const & string1,rtl::OUString const & string2)72*b1cdbd2cSJim Jagielski void createMessage(
73*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer & message, rtl::OUString const & string1,
74*b1cdbd2cSJim Jagielski     rtl::OUString const & string2)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski     message.setLength(0);
77*b1cdbd2cSJim Jagielski     appendString(message, string1);
78*b1cdbd2cSJim Jagielski     message.appendAscii(RTL_CONSTASCII_STRINGPARAM(" vs. "));
79*b1cdbd2cSJim Jagielski     appendString(message, string2);
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
appendUtf32()84*b1cdbd2cSJim Jagielski void test::oustringbuffer::Utf32::appendUtf32() {
85*b1cdbd2cSJim Jagielski     int const str1Len = 3;
86*b1cdbd2cSJim Jagielski     sal_Unicode const str1[str1Len] = { 'a', 'b', 'c' };
87*b1cdbd2cSJim Jagielski     int const str2Len = 4;
88*b1cdbd2cSJim Jagielski     sal_Unicode const str2[str2Len] = { 'a', 'b', 'c', 'd' };
89*b1cdbd2cSJim Jagielski     int const str3Len = 6;
90*b1cdbd2cSJim Jagielski     sal_Unicode const str3[str3Len] = { 'a', 'b', 'c', 'd', 0xD800, 0xDC00 };
91*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer message;
92*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer buf1(rtl::OUString(str1, str1Len));
93*b1cdbd2cSJim Jagielski     buf1.appendUtf32('d');
94*b1cdbd2cSJim Jagielski     rtl::OUString res1(buf1.makeStringAndClear());
95*b1cdbd2cSJim Jagielski     createMessage(message, res1, rtl::OUString(str2, str2Len));
96*b1cdbd2cSJim Jagielski     CPPUNIT_ASSERT_MESSAGE(
97*b1cdbd2cSJim Jagielski         message.getStr(), res1 == rtl::OUString(str2, str2Len));
98*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer buf2(rtl::OUString(str2, str2Len));
99*b1cdbd2cSJim Jagielski     buf2.appendUtf32(0x10000);
100*b1cdbd2cSJim Jagielski     rtl::OUString res2(buf2.makeStringAndClear());
101*b1cdbd2cSJim Jagielski     createMessage(message, res2, rtl::OUString(str3, str3Len));
102*b1cdbd2cSJim Jagielski     CPPUNIT_ASSERT_MESSAGE(
103*b1cdbd2cSJim Jagielski         message.getStr(), res2 == rtl::OUString(str3, str3Len));
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
insertUtf32()106*b1cdbd2cSJim Jagielski void test::oustringbuffer::Utf32::insertUtf32() {
107*b1cdbd2cSJim Jagielski     int const str1Len = 3;
108*b1cdbd2cSJim Jagielski     sal_Unicode const str1[str1Len] = { 'a', 'b', 'c' };
109*b1cdbd2cSJim Jagielski     int const str2Len = 4;
110*b1cdbd2cSJim Jagielski     sal_Unicode const str2[str2Len] = { 'a', 'b', 'd', 'c' };
111*b1cdbd2cSJim Jagielski     int const str3Len = 6;
112*b1cdbd2cSJim Jagielski     sal_Unicode const str3[str3Len] = { 'a', 'b', 0xDBFF, 0xDFFF, 'd', 'c' };
113*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer message;
114*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer buf1(rtl::OUString(str1, str1Len));
115*b1cdbd2cSJim Jagielski     buf1.insertUtf32(2, 'd');
116*b1cdbd2cSJim Jagielski     rtl::OUString res1(buf1.makeStringAndClear());
117*b1cdbd2cSJim Jagielski     createMessage(message, res1, rtl::OUString(str2, str2Len));
118*b1cdbd2cSJim Jagielski     CPPUNIT_ASSERT_MESSAGE(
119*b1cdbd2cSJim Jagielski         message.getStr(), res1 == rtl::OUString(str2, str2Len));
120*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer buf2(rtl::OUString(str2, str2Len));
121*b1cdbd2cSJim Jagielski     buf2.insertUtf32(2, 0x10FFFF);
122*b1cdbd2cSJim Jagielski     rtl::OUString res2(buf2.makeStringAndClear());
123*b1cdbd2cSJim Jagielski     createMessage(message, res2, rtl::OUString(str3, str3Len));
124*b1cdbd2cSJim Jagielski     CPPUNIT_ASSERT_MESSAGE(
125*b1cdbd2cSJim Jagielski         message.getStr(), res2 == rtl::OUString(str3, str3Len));
126*b1cdbd2cSJim Jagielski }
127