]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/cintltst/utf16tst.c
1 /********************************************************************
3 * Copyright (c) 1998-2012, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
9 * Modification History:
11 * Date Name Description
12 * 05/01/2000 Madhu Creation
13 *******************************************************************************
16 #include "unicode/utypes.h"
17 #include "unicode/utf16.h"
18 #include "unicode/ustring.h"
24 #define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
26 static void printUChars ( const UChar
* uchars
);
28 static void TestCodeUnitValues ( void );
29 static void TestCharLength ( void );
30 static void TestGetChar ( void );
31 static void TestNextPrevChar ( void );
32 static void TestNulTerminated ( void );
33 static void TestFwdBack ( void );
34 static void TestSetChar ( void );
35 static void TestAppendChar ( void );
36 static void TestAppend ( void );
37 static void TestSurrogate ( void );
39 void addUTF16Test ( TestNode
** root
);
42 addUTF16Test ( TestNode
** root
)
44 addTest ( root
, & TestCodeUnitValues
, "utf16tst/TestCodeUnitValues" );
45 addTest ( root
, & TestCharLength
, "utf16tst/TestCharLength" );
46 addTest ( root
, & TestGetChar
, "utf16tst/TestGetChar" );
47 addTest ( root
, & TestNextPrevChar
, "utf16tst/TestNextPrevChar" );
48 addTest ( root
, & TestNulTerminated
, "utf16tst/TestNulTerminated" );
49 addTest ( root
, & TestFwdBack
, "utf16tst/TestFwdBack" );
50 addTest ( root
, & TestSetChar
, "utf16tst/TestSetChar" );
51 addTest ( root
, & TestAppendChar
, "utf16tst/TestAppendChar" );
52 addTest ( root
, & TestAppend
, "utf16tst/TestAppend" );
53 addTest ( root
, & TestSurrogate
, "utf16tst/TestSurrogate" );
56 static void TestCodeUnitValues ()
58 static uint16_t codeunit
[]={ 0x0000 , 0xe065 , 0x20ac , 0xd7ff , 0xd800 , 0xd841 , 0xd905 , 0xdbff , 0xdc00 , 0xdc02 , 0xddee , 0xdfff , 0 };
61 for ( i
= 0 ; i
< sizeof ( codeunit
)/ sizeof ( codeunit
[ 0 ]); i
++){
63 log_verbose ( "Testing code unit value of %x \n " , c
);
65 if (! UTF16_IS_SINGLE ( c
) || UTF16_IS_LEAD ( c
) || UTF16_IS_TRAIL ( c
) || ! U16_IS_SINGLE ( c
) || U16_IS_LEAD ( c
) || U16_IS_TRAIL ( c
)){
66 log_err ( "ERROR: %x is a single character \n " , c
);
70 if (! UTF16_IS_LEAD ( c
) || UTF16_IS_SINGLE ( c
) || UTF16_IS_TRAIL ( c
) || ! U16_IS_LEAD ( c
) || U16_IS_SINGLE ( c
) || U16_IS_TRAIL ( c
)){
71 log_err ( "ERROR: %x is a first surrogate \n " , c
);
75 if (! UTF16_IS_TRAIL ( c
) || UTF16_IS_SINGLE ( c
) || UTF16_IS_LEAD ( c
) || ! U16_IS_TRAIL ( c
) || U16_IS_SINGLE ( c
) || U16_IS_LEAD ( c
)){
76 log_err ( "ERROR: %x is a second surrogate \n " , c
);
82 static void TestCharLength ()
84 static uint32_t codepoint
[]={
99 for ( i
= 0 ; i
< sizeof ( codepoint
)/ sizeof ( codepoint
[ 0 ]); i
=( int16_t )( i
+ 2 )){
100 UChar32 c
= codepoint
[ i
+ 1 ];
101 if ( UTF16_CHAR_LENGTH ( c
) != ( uint16_t ) codepoint
[ i
] || U16_LENGTH ( c
) != ( uint16_t ) codepoint
[ i
]){
102 log_err ( "The no: of code units for %l x:- Expected: %d Got: %d \n " , c
, codepoint
[ i
], UTF16_CHAR_LENGTH ( c
));
104 log_verbose ( "The no: of code units for %l x is %d \n " , c
, UTF16_CHAR_LENGTH ( c
) );
106 multiple
=( UBool
)( codepoint
[ i
] == 1 ? FALSE
: TRUE
);
107 if ( UTF16_NEED_MULTIPLE_UCHAR ( c
) != multiple
){
108 log_err ( "ERROR: UTF16_NEED_MULTIPLE_UCHAR failed for %l x \n " , c
);
113 static void TestGetChar ()
115 static UChar input
[]={
132 static UChar32 result
[]={
133 /*codepoint-unsafe, codepoint-safe(not strict) codepoint-safe(strict)*/
134 ( UChar32
) 0xfca10000 , 0xdc00 , UTF_ERROR_VALUE
,
135 0x20ac , 0x20ac , 0x20ac ,
136 0x12861 , 0xd841 , UTF_ERROR_VALUE
,
138 0x20402 , 0x20402 , 0x20402 ,
139 0x20402 , 0x20402 , 0x20402 ,
140 0x20806 , 0x20806 , 0x20806 ,
141 0x20806 , 0x20806 , 0x20806 ,
143 0x203ff , 0xd842 , UTF_ERROR_VALUE
,
144 0xd7ff , 0xd7ff , 0xd7ff ,
145 0xfc41 , 0xdc41 , UTF_ERROR_VALUE
,
146 0xe000 , 0xe000 , 0xe000 ,
147 0x11734 , 0xd800 , UTF_ERROR_VALUE
152 for ( offset
= 0 ; offset
< sizeof ( input
)/ U_SIZEOF_UCHAR
; offset
++) {
153 if ( 0 < offset
&& offset
< sizeof ( input
)/ U_SIZEOF_UCHAR
- 1 ){
154 UTF16_GET_CHAR_UNSAFE ( input
, offset
, c
);
156 log_err ( "ERROR: UTF16_GET_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
], c
);
159 U16_GET_UNSAFE ( input
, offset
, c
);
161 log_err ( "ERROR: U16_GET_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
], c
);
165 UTF16_GET_CHAR_SAFE ( input
, 0 , offset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
, FALSE
);
166 if ( c
!= result
[ i
+ 1 ]){
167 log_err ( "ERROR: UTF16_GET_CHAR_SAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 1 ], c
);
170 U16_GET ( input
, 0 , offset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
);
171 if ( c
!= result
[ i
+ 1 ]){
172 log_err ( "ERROR: U16_GET failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 1 ], c
);
175 UTF16_GET_CHAR_SAFE ( input
, 0 , offset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
, TRUE
);
176 if ( c
!= result
[ i
+ 2 ]){
177 log_err ( "ERROR: UTF16_GET_CHAR_SAFE(strict) failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 2 ], c
);
184 static void TestNextPrevChar (){
186 static UChar input
[]={ 0x0061 , 0xd800 , 0xdc00 , 0xdbff , 0xdfff , 0x0062 , 0xd841 , 0xd7ff , 0xd841 , 0xdc41 , 0xdc00 , 0x0000 };
187 static UChar32 result
[]={
188 /*next_unsafe next_safe_ns next_safe_s prev_unsafe prev_safe_ns prev_safe_s*/
189 0x0061 , 0x0061 , 0x0061 , 0x0000 , 0x0000 , 0x0000 ,
190 0x10000 , 0x10000 , 0x10000 , 0x120400 , 0xdc00 , UTF_ERROR_VALUE
,
191 0xdc00 , 0xdc00 , UTF_ERROR_VALUE
, 0x20441 , 0x20441 , 0x20441 ,
192 0x10ffff , 0x10ffff , 0x10ffff , 0xd841 , 0xd841 , UTF_ERROR_VALUE
,
193 0xdfff , 0xdfff , UTF_ERROR_VALUE
, 0xd7ff , 0xd7ff , 0xd7ff ,
194 0x0062 , 0x0062 , 0x0062 , 0xd841 , 0xd841 , UTF_ERROR_VALUE
,
195 0x1ffff , 0xd841 , UTF_ERROR_VALUE
, 0x0062 , 0x0062 , 0x0062 ,
196 0xd7ff , 0xd7ff , 0xd7ff , 0x10ffff , 0x10ffff , 0x10ffff ,
197 0x20441 , 0x20441 , 0x20441 , 0xdbff , 0xdbff , UTF_ERROR_VALUE
,
198 0xdc41 , 0xdc41 , UTF_ERROR_VALUE
, 0x10000 , 0x10000 , 0x10000 ,
199 0xdc00 , 0xdc00 , UTF_ERROR_VALUE
, 0xd800 , 0xd800 , UTF_ERROR_VALUE
,
200 0x0000 , 0x0000 , 0x0000 , 0x0061 , 0x0061 , 0x0061
202 static uint16_t movedOffset
[]={
203 /*next_unsafe next_safe_ns next_safe_s prev_unsafe prev_safe_ns prev_safe_s*/
221 uint16_t offset
= 0 , setOffset
= 0 ;
222 for ( offset
= 0 ; offset
< sizeof ( input
)/ U_SIZEOF_UCHAR
; offset
++){
224 UTF16_NEXT_CHAR_UNSAFE ( input
, setOffset
, c
);
225 if ( setOffset
!= movedOffset
[ i
]){
226 log_err ( "ERROR: UTF16_NEXT_CHAR_UNSAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
227 offset
, movedOffset
[ i
], setOffset
);
230 log_err ( "ERROR: UTF16_NEXT_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
], c
);
234 U16_NEXT_UNSAFE ( input
, setOffset
, c
);
235 if ( setOffset
!= movedOffset
[ i
]){
236 log_err ( "ERROR: U16_NEXT_CHAR_UNSAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
237 offset
, movedOffset
[ i
], setOffset
);
240 log_err ( "ERROR: U16_NEXT_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
], c
);
244 UTF16_NEXT_CHAR_SAFE ( input
, setOffset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
, FALSE
);
245 if ( setOffset
!= movedOffset
[ i
+ 1 ]){
246 log_err ( "ERROR: UTF16_NEXT_CHAR_SAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
247 offset
, movedOffset
[ i
+ 1 ], setOffset
);
249 if ( c
!= result
[ i
+ 1 ]){
250 log_err ( "ERROR: UTF16_NEXT_CHAR_SAFE failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 1 ], c
);
254 U16_NEXT ( input
, setOffset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
);
255 if ( setOffset
!= movedOffset
[ i
+ 1 ]){
256 log_err ( "ERROR: U16_NEXT failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
257 offset
, movedOffset
[ i
+ 1 ], setOffset
);
259 if ( c
!= result
[ i
+ 1 ]){
260 log_err ( "ERROR: U16_NEXT failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 1 ], c
);
264 UTF16_NEXT_CHAR_SAFE ( input
, setOffset
, sizeof ( input
)/ U_SIZEOF_UCHAR
, c
, TRUE
);
265 if ( setOffset
!= movedOffset
[ i
+ 1 ]){
266 log_err ( "ERROR: UTF16_NEXT_CHAR_SAFE(strict) failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
267 offset
, movedOffset
[ i
+ 2 ], setOffset
);
269 if ( c
!= result
[ i
+ 2 ]){
270 log_err ( "ERROR: UTF16_NEXT_CHAR_SAFE(strict) failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 2 ], c
);
276 for ( offset
=( uint16_t ) sizeof ( input
)/ U_SIZEOF_UCHAR
; offset
> 0 ; -- offset
){
278 UTF16_PREV_CHAR_UNSAFE ( input
, setOffset
, c
);
279 if ( setOffset
!= movedOffset
[ i
+ 3 ]){
280 log_err ( "ERROR: UTF16_PREV_CHAR_UNSAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
281 offset
, movedOffset
[ i
+ 3 ], setOffset
);
283 if ( c
!= result
[ i
+ 3 ]){
284 log_err ( "ERROR: UTF16_PREV_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 3 ], c
);
288 U16_PREV_UNSAFE ( input
, setOffset
, c
);
289 if ( setOffset
!= movedOffset
[ i
+ 3 ]){
290 log_err ( "ERROR: U16_PREV_CHAR_UNSAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
291 offset
, movedOffset
[ i
+ 3 ], setOffset
);
293 if ( c
!= result
[ i
+ 3 ]){
294 log_err ( "ERROR: U16_PREV_CHAR_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 3 ], c
);
298 UTF16_PREV_CHAR_SAFE ( input
, 0 , setOffset
, c
, FALSE
);
299 if ( setOffset
!= movedOffset
[ i
+ 4 ]){
300 log_err ( "ERROR: UTF16_PREV_CHAR_SAFE failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
301 offset
, movedOffset
[ i
+ 4 ], setOffset
);
303 if ( c
!= result
[ i
+ 4 ]){
304 log_err ( "ERROR: UTF16_PREV_CHAR_SAFE failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 4 ], c
);
308 U16_PREV ( input
, 0 , setOffset
, c
);
309 if ( setOffset
!= movedOffset
[ i
+ 4 ]){
310 log_err ( "ERROR: U16_PREV failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
311 offset
, movedOffset
[ i
+ 4 ], setOffset
);
313 if ( c
!= result
[ i
+ 4 ]){
314 log_err ( "ERROR: U16_PREV failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 4 ], c
);
318 UTF16_PREV_CHAR_SAFE ( input
, 0 , setOffset
, c
, TRUE
);
319 if ( setOffset
!= movedOffset
[ i
+ 5 ]){
320 log_err ( "ERROR: UTF16_PREV_CHAR_SAFE(strict) failed to move the offset correctly at %d \n ExpectedOffset: %d Got %d \n " ,
321 offset
, movedOffset
[ i
+ 5 ], setOffset
);
323 if ( c
!= result
[ i
+ 5 ]){
324 log_err ( "ERROR: UTF16_PREV_CHAR_SAFE(strict) failed for input= %l d. Expected: %l x Got: %l x \n " , offset
, result
[ i
+ 5 ], c
);
332 /* keep this in sync with utf8tst.c's TestNulTerminated() */
333 static void TestNulTerminated () {
334 static const UChar input
[]={
336 /* 1 */ 0xd801 , 0xdc01 ,
343 static const UChar32 result
[]={
353 int32_t i0
, i
= 0 , j
, k
, expectedIndex
;
357 U16_NEXT ( input
, i
, - 1 , c
);
358 if ( c
!= result
[ cpIndex
]) {
359 log_err ( "U16_NEXT(from %d )=U+ %0 4x != U+ %0 4x \n " , i0
, c
, result
[ cpIndex
]);
362 U16_FWD_1 ( input
, j
, - 1 );
364 log_err ( "U16_FWD_1() moved to index %d but U16_NEXT() moved to %d \n " , j
, i
);
368 * Move by this many code points from the start.
369 * U16_FWD_N() stops at the end of the string, that is, at the NUL if necessary.
371 expectedIndex
= ( c
== 0 ) ? i
- 1 : i
;
373 U16_FWD_N ( input
, k
, - 1 , cpIndex
);
374 if ( k
!= expectedIndex
) {
375 log_err ( "U16_FWD_N(code points from 0) moved to index %d but expected %d \n " , k
, expectedIndex
);
382 U16_NEXT ( input
, i
, - 1 , c
);
384 U16_GET ( input
, 0 , j
, - 1 , c2
);
386 log_err ( "U16_NEXT(from %d )=U+ %0 4x != U+ %0 4x=U16_GET(at %d ) \n " , i0
, c
, c2
, j
);
388 /* U16_SET_CP_LIMIT moves from a non-lead byte to the limit of the code point */
390 U16_SET_CP_LIMIT ( input
, 0 , k
, - 1 );
392 log_err ( "U16_NEXT() moved to %d but U16_SET_CP_LIMIT( %d ) moved to %d \n " , i
, j
+ 1 , k
);
398 static void TestFwdBack (){
399 static UChar input
[]={ 0x0061 , 0xd800 , 0xdc00 , 0xdbff , 0xdfff , 0x0062 , 0xd841 , 0xd7ff , 0xd841 , 0xdc41 , 0xdc00 , 0x0000 };
400 static uint16_t fwd_unsafe
[] ={ 1 , 3 , 5 , 6 , 8 , 10 , 11 , 12 };
401 static uint16_t fwd_safe
[] ={ 1 , 3 , 5 , 6 , 7 , 8 , 10 , 11 , 12 };
402 static uint16_t back_unsafe
[]={ 11 , 9 , 8 , 7 , 6 , 5 , 3 , 1 , 0 };
403 static uint16_t back_safe
[] ={ 11 , 10 , 8 , 7 , 6 , 5 , 3 , 1 , 0 };
405 static uint16_t Nvalue
[]= { 0 , 1 , 2 , 3 , 1 , 2 , 1 };
406 static uint16_t fwd_N_unsafe
[] ={ 0 , 1 , 5 , 10 , 11 };
407 static uint16_t fwd_N_safe
[] ={ 0 , 1 , 5 , 8 , 10 , 12 , 12 }; /*safe macro keeps it at the end of the string */
408 static uint16_t back_N_unsafe
[]={ 12 , 11 , 8 , 5 , 3 };
409 static uint16_t back_N_safe
[] ={ 12 , 11 , 8 , 5 , 3 , 0 , 0 };
411 uint16_t offunsafe
= 0 , offsafe
= 0 ;
413 while ( offunsafe
< sizeof ( input
)/ U_SIZEOF_UCHAR
){
414 UTF16_FWD_1_UNSAFE ( input
, offunsafe
);
415 if ( offunsafe
!= fwd_unsafe
[ i
]){
416 log_err ( "ERROR: Forward_unsafe offset expected: %d , Got: %d \n " , fwd_unsafe
[ i
], offunsafe
);
421 offunsafe
= 0 , offsafe
= 0 ;
423 while ( offunsafe
< sizeof ( input
)/ U_SIZEOF_UCHAR
){
424 U16_FWD_1_UNSAFE ( input
, offunsafe
);
425 if ( offunsafe
!= fwd_unsafe
[ i
]){
426 log_err ( "ERROR: U16_FWD_1_UNSAFE offset expected: %d , Got: %d \n " , fwd_unsafe
[ i
], offunsafe
);
432 while ( offsafe
< sizeof ( input
)/ U_SIZEOF_UCHAR
){
433 UTF16_FWD_1_SAFE ( input
, offsafe
, sizeof ( input
)/ U_SIZEOF_UCHAR
);
434 if ( offsafe
!= fwd_safe
[ i
]){
435 log_err ( "ERROR: Forward_safe offset expected: %d , Got: %d \n " , fwd_safe
[ i
], offsafe
);
441 while ( offsafe
< sizeof ( input
)/ U_SIZEOF_UCHAR
){
442 U16_FWD_1 ( input
, offsafe
, sizeof ( input
)/ U_SIZEOF_UCHAR
);
443 if ( offsafe
!= fwd_safe
[ i
]){
444 log_err ( "ERROR: U16_FWD_1 offset expected: %d , Got: %d \n " , fwd_safe
[ i
], offsafe
);
449 offunsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
450 offsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
452 while ( offunsafe
> 0 ){
453 UTF16_BACK_1_UNSAFE ( input
, offunsafe
);
454 if ( offunsafe
!= back_unsafe
[ i
]){
455 log_err ( "ERROR: Backward_unsafe offset expected: %d , Got: %d \n " , back_unsafe
[ i
], offunsafe
);
460 offunsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
461 offsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
463 while ( offunsafe
> 0 ){
464 U16_BACK_1_UNSAFE ( input
, offunsafe
);
465 if ( offunsafe
!= back_unsafe
[ i
]){
466 log_err ( "ERROR: U16_BACK_1_UNSAFE offset expected: %d , Got: %d \n " , back_unsafe
[ i
], offunsafe
);
473 UTF16_BACK_1_SAFE ( input
, 0 , offsafe
);
474 if ( offsafe
!= back_safe
[ i
]){
475 log_err ( "ERROR: Backward_safe offset expected: %d , Got: %d \n " , back_unsafe
[ i
], offsafe
);
482 U16_BACK_1 ( input
, 0 , offsafe
);
483 if ( offsafe
!= back_safe
[ i
]){
484 log_err ( "ERROR: U16_BACK_1 offset expected: %d , Got: %d \n " , back_unsafe
[ i
], offsafe
);
491 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ])- 2 ; i
++){ /*didn't want it to fail(we assume 0<i<length)*/
492 UTF16_FWD_N_UNSAFE ( input
, offunsafe
, Nvalue
[ i
]);
493 if ( offunsafe
!= fwd_N_unsafe
[ i
]){
494 log_err ( "ERROR: Forward_N_unsafe offset expected: %d , Got: %d \n " , fwd_N_unsafe
[ i
], offunsafe
);
499 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ])- 2 ; i
++){ /*didn't want it to fail(we assume 0<i<length)*/
500 U16_FWD_N_UNSAFE ( input
, offunsafe
, Nvalue
[ i
]);
501 if ( offunsafe
!= fwd_N_unsafe
[ i
]){
502 log_err ( "ERROR: U16_FWD_N_UNSAFE offset expected: %d , Got: %d \n " , fwd_N_unsafe
[ i
], offunsafe
);
507 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ]); i
++){
508 UTF16_FWD_N_SAFE ( input
, offsafe
, sizeof ( input
)/ U_SIZEOF_UCHAR
, Nvalue
[ i
]);
509 if ( offsafe
!= fwd_N_safe
[ i
]){
510 log_err ( "ERROR: Forward_N_safe offset expected: %d , Got: %d \n " , fwd_N_safe
[ i
], offsafe
);
516 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ]); i
++){
517 U16_FWD_N ( input
, offsafe
, sizeof ( input
)/ U_SIZEOF_UCHAR
, Nvalue
[ i
]);
518 if ( offsafe
!= fwd_N_safe
[ i
]){
519 log_err ( "ERROR: U16_FWD_N offset expected: %d , Got: %d \n " , fwd_N_safe
[ i
], offsafe
);
524 offunsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
525 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ])- 2 ; i
++){
526 UTF16_BACK_N_UNSAFE ( input
, offunsafe
, Nvalue
[ i
]);
527 if ( offunsafe
!= back_N_unsafe
[ i
]){
528 log_err ( "ERROR: backward_N_unsafe offset expected: %d , Got: %d \n " , back_N_unsafe
[ i
], offunsafe
);
532 offunsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
533 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ])- 2 ; i
++){
534 U16_BACK_N_UNSAFE ( input
, offunsafe
, Nvalue
[ i
]);
535 if ( offunsafe
!= back_N_unsafe
[ i
]){
536 log_err ( "ERROR: U16_BACK_N_UNSAFE offset expected: %d , Got: %d \n " , back_N_unsafe
[ i
], offunsafe
);
540 offsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
541 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ]); i
++){
542 UTF16_BACK_N_SAFE ( input
, 0 , offsafe
, Nvalue
[ i
]);
543 if ( offsafe
!= back_N_safe
[ i
]){
544 log_err ( "ERROR: backward_N_safe offset expected: %d , Got: %d \n " , back_N_safe
[ i
], offsafe
);
548 offsafe
= sizeof ( input
)/ U_SIZEOF_UCHAR
;
549 for ( i
= 0 ; i
< sizeof ( Nvalue
)/ sizeof ( Nvalue
[ 0 ]); i
++){
550 U16_BACK_N ( input
, 0 , offsafe
, Nvalue
[ i
]);
551 if ( offsafe
!= back_N_safe
[ i
]){
552 log_err ( "ERROR: U16_BACK_N offset expected: %d , Got: %d \n " , back_N_safe
[ i
], offsafe
);
557 static void TestSetChar (){
558 static UChar input
[]={ 0x0061 , 0xd800 , 0xdc00 , 0xdbff , 0xdfff , 0x0062 , 0xd841 , 0xd7ff , 0xd841 , 0xdc41 , 0xdc00 , 0x0000 };
559 static uint16_t start_unsafe
[]={ 0 , 1 , 1 , 3 , 3 , 5 , 6 , 7 , 8 , 8 , 9 , 11 };
560 static uint16_t start_safe
[] ={ 0 , 1 , 1 , 3 , 3 , 5 , 6 , 7 , 8 , 8 , 10 , 11 };
561 static uint16_t limit_unsafe
[]={ 0 , 1 , 3 , 3 , 5 , 5 , 6 , 8 , 8 , 10 , 10 , 11 };
562 static uint16_t limit_safe
[] ={ 0 , 1 , 3 , 3 , 5 , 5 , 6 , 7 , 8 , 10 , 10 , 11 };
565 uint16_t offset
= 0 , setOffset
= 0 ;
566 for ( offset
= 0 ; offset
< sizeof ( input
)/ U_SIZEOF_UCHAR
; offset
++){
568 UTF16_SET_CHAR_START_UNSAFE ( input
, setOffset
);
569 if ( setOffset
!= start_unsafe
[ i
]){
570 log_err ( "ERROR: UTF16_SET_CHAR_START_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, start_unsafe
[ i
], setOffset
);
574 U16_SET_CP_START_UNSAFE ( input
, setOffset
);
575 if ( setOffset
!= start_unsafe
[ i
]){
576 log_err ( "ERROR: U16_SET_CHAR_START_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, start_unsafe
[ i
], setOffset
);
580 UTF16_SET_CHAR_START_SAFE ( input
, 0 , setOffset
);
581 if ( setOffset
!= start_safe
[ i
]){
582 log_err ( "ERROR: UTF16_SET_CHAR_START_SAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, start_safe
[ i
], setOffset
);
586 U16_SET_CP_START ( input
, 0 , setOffset
);
587 if ( setOffset
!= start_safe
[ i
]){
588 log_err ( "ERROR: U16_SET_CHAR_START failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, start_safe
[ i
], setOffset
);
593 UTF16_SET_CHAR_LIMIT_UNSAFE ( input
, setOffset
);
594 if ( setOffset
!= limit_unsafe
[ i
]){
595 log_err ( "ERROR: UTF16_SET_CHAR_LIMIT_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, limit_unsafe
[ i
], setOffset
);
599 U16_SET_CP_LIMIT_UNSAFE ( input
, setOffset
);
600 if ( setOffset
!= limit_unsafe
[ i
]){
601 log_err ( "ERROR: U16_SET_CHAR_LIMIT_UNSAFE failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, limit_unsafe
[ i
], setOffset
);
606 U16_SET_CP_LIMIT ( input
, 0 , setOffset
, sizeof ( input
)/ U_SIZEOF_UCHAR
);
607 if ( setOffset
!= limit_safe
[ i
]){
608 log_err ( "ERROR: U16_SET_CHAR_LIMIT failed for offset= %l d. Expected: %l x Got: %l x \n " , offset
, limit_safe
[ i
], setOffset
);
615 static void TestAppendChar (){
616 static UChar s
[ 5 ]={ 0x0061 , 0x0062 , 0x0063 , 0x0064 , 0x0000 };
617 static uint32_t test
[]={
618 /*append-position(unsafe), CHAR to be appended */
625 /*append-position(safe), CHAR to be appended */
635 static uint16_t movedOffset
[]={
636 /*offset-moved-to(unsafe)*/
637 2 , /*for append-pos: 0 , CHAR 0x20441*/
642 /*offse-moved-to(safe)*/
643 2 , /*for append-pos: 0, CHAR 0x20441*/
652 static UChar result
[][ 5 ]={
654 { 0xd841 , 0xdc41 , 0x0063 , 0x0064 , 0x0000 },
655 { 0x0061 , 0x0062 , 0x0028 , 0x0064 , 0x0000 },
656 { 0x0061 , 0x0062 , 0xdc00 , 0x0064 , 0x0000 },
657 { 0x0061 , 0x0062 , 0x0063 , 0xd800 , 0x0000 },
658 { 0x0061 , 0xd841 , 0xdc02 , 0x0064 , 0x0000 },
661 { 0xd841 , 0xdc41 , 0x0063 , 0x0064 , 0x0000 },
662 { 0x0061 , 0x0062 , 0xdc00 , 0x0064 , 0x0000 },
663 { 0x0061 , 0x0062 , 0x0063 , 0xd800 , 0x0000 },
664 { 0x0061 , 0xd841 , 0xdc02 , 0x0064 , 0x0000 },
665 { 0x0061 , 0x0062 , 0x0063 , UTF_ERROR_VALUE
, 0x0000 },
666 { 0x0061 , 0x0062 , 0x0063 , UTF_ERROR_VALUE
, 0x0000 },
667 { 0x0061 , 0x0062 , 0xd801 , 0xdc02 , 0x0000 },
672 UChar
* str
=( UChar
*) malloc ( sizeof ( UChar
) * ( u_strlen ( s
)+ 1 ));
674 for ( i
= 0 ; i
< sizeof ( test
)/ sizeof ( test
[ 0 ]); i
=( uint16_t )( i
+ 2 )){
677 offset
=( uint16_t ) test
[ i
];
678 UTF16_APPEND_CHAR_UNSAFE ( str
, offset
, test
[ i
+ 1 ]);
679 if ( offset
!= movedOffset
[ count
]){
680 log_err ( "ERROR: UTF16_APPEND_CHAR_UNSAFE failed to move the offset correctly for count= %d . \n ExpectedOffset= %d currentOffset= %d \n " ,
681 count
, movedOffset
[ count
], offset
);
684 if ( u_strcmp ( str
, result
[ count
]) != 0 ){
685 log_err ( "ERROR: UTF16_APPEND_CHAR_UNSAFE failed for count= %d . Expected:" , count
);
686 printUChars ( result
[ count
]);
693 offset
=( uint16_t ) test
[ i
];
694 UTF16_APPEND_CHAR_SAFE ( str
, offset
, ( uint16_t ) u_strlen ( str
), test
[ i
+ 1 ]);
695 if ( offset
!= movedOffset
[ count
]){
696 log_err ( "ERROR: UTF16_APPEND_CHAR_SAFE failed to move the offset correctly for count= %d . \n ExpectedOffset= %d currentOffset= %d \n " ,
697 count
, movedOffset
[ count
], offset
);
700 if ( u_strcmp ( str
, result
[ count
]) != 0 ){
701 log_err ( "ERROR: UTF16_APPEND_CHAR_SAFE failed for count= %d . Expected:" , count
);
702 printUChars ( result
[ count
]);
714 static void TestAppend () {
715 static const UChar32 codePoints
[]={
716 0x61 , 0xdf , 0x901 , 0x3040 ,
717 0xac00 , 0xd800 , 0xdbff , 0xdcde ,
718 0xdffd , 0xe000 , 0xffff , 0x10000 ,
719 0x12345 , 0xe0021 , 0x10ffff , 0x110000 ,
720 0x234567 , 0x7fffffff , - 1 , - 1000 ,
723 static const UChar expectUnsafe
[]={
724 0x61 , 0xdf , 0x901 , 0x3040 ,
725 0xac00 , 0xd800 , 0xdbff , 0xdcde ,
726 0xdffd , 0xe000 , 0xffff , 0xd800 , 0xdc00 ,
727 0xd808 , 0xdf45 , 0xdb40 , 0xdc21 , 0xdbff , 0xdfff , /* not 0x110000 */
728 /* none from this line */
731 0x61 , 0xdf , 0x901 , 0x3040 ,
732 0xac00 , 0xd800 , 0xdbff , 0xdcde ,
733 0xdffd , 0xe000 , 0xffff , 0xd800 , 0xdc00 ,
734 0xd808 , 0xdf45 , 0xdb40 , 0xdc21 , 0xdbff , 0xdfff , /* not 0x110000 */
735 /* none from this line */
742 UBool isError
, expectIsError
, wrongIsError
;
745 for ( i
= 0 ; i
< LENGTHOF ( codePoints
); ++ i
) {
747 if ( c
< 0 || 0x10ffff < c
) {
748 continue ; /* skip non-code points for U16_APPEND_UNSAFE */
751 U16_APPEND_UNSAFE ( buffer
, length
, c
);
753 if ( length
!= LENGTHOF ( expectUnsafe
) || 0 != memcmp ( buffer
, expectUnsafe
, length
* U_SIZEOF_UCHAR
)) {
754 log_err ( "U16_APPEND_UNSAFE did not generate the expected output \n " );
759 for ( i
= 0 ; i
< LENGTHOF ( codePoints
); ++ i
) {
761 expectIsError
= c
< 0 || 0x10ffff < c
; /* || U_IS_SURROGATE(c); */ /* surrogates in UTF-32 shouldn't be used, but it's okay to pass them around internally. */
764 U16_APPEND ( buffer
, length
, LENGTHOF ( buffer
), c
, isError
);
765 wrongIsError
|= isError
!= expectIsError
;
768 log_err ( "U16_APPEND did not set isError correctly \n " );
770 if ( length
!= LENGTHOF ( expectSafe
) || 0 != memcmp ( buffer
, expectSafe
, length
* U_SIZEOF_UCHAR
)) {
771 log_err ( "U16_APPEND did not generate the expected output \n " );
775 static void TestSurrogate (){
776 static UChar32 s
[] = { 0x10000 , 0x10ffff , 0x50000 , 0x100000 , 0x1abcd };
779 UChar first
= UTF_FIRST_SURROGATE ( s
[ i
]);
780 UChar second
= UTF_SECOND_SURROGATE ( s
[ i
]);
781 /* algorithm from the Unicode consortium */
782 UChar firstresult
= ( UChar
)((( s
[ i
] - 0x10000 ) / 0x400 ) + 0xD800 );
783 UChar secondresult
= ( UChar
)((( s
[ i
] - 0x10000 ) % 0x400 ) + 0xDC00 );
785 if ( first
!= UTF16_LEAD ( s
[ i
]) || first
!= U16_LEAD ( s
[ i
]) || first
!= firstresult
) {
786 log_err ( "Failure in first surrogate in 0x %x expected to be 0x %x \n " ,
789 if ( second
!= UTF16_TRAIL ( s
[ i
]) || second
!= U16_TRAIL ( s
[ i
]) || second
!= secondresult
) {
790 log_err ( "Failure in second surrogate in 0x %x expected to be 0x %x \n " ,
797 static void printUChars ( const UChar
* uchars
){
799 for ( i
= 0 ; i
< u_strlen ( uchars
); i
++){
800 printf ( " %x " , *( uchars
+ i
));