16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2001-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************************
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File custrtrn.C
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*        Name                     Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*        Ram                      String transformations test
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*********************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/****************************************************************************/
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustr_imp.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cwchar.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUCharTransformTest(TestNode** root);
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToUTF32(void);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToUTF32_surrogates(void);
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromUTF32(void);
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromUTF32_surrogates(void);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_UChar_UTF8_API(void);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_FromUTF8(void);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_FromUTF8Lenient(void);
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_UChar_WCHART_API(void);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_widestrs(void);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_WCHART_LongString(void);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToJavaModifiedUTF8(void);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromJavaModifiedUTF8(void);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNullEmptySource(void);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddUCharTransformTest(TestNode** root)
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32");
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogates");
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32");
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surrogates");
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API");
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8");
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient");
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_UChar_WCHART_API,  "custrtrn/Test_UChar_WCHART_API");
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_widestrs,  "custrtrn/Test_widestrs");
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString");
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strToJavaModifiedUTF8,  "custrtrn/Test_strToJavaModifiedUTF8");
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &Test_strFromJavaModifiedUTF8,  "custrtrn/Test_strFromJavaModifiedUTF8");
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   addTest(root, &TestNullEmptySource,  "custrtrn/TestNullEmptySource");
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar32 src32[]={
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test non-BMP code points */
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A699,
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x0002A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB,
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x0002A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7,
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x0002A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1,
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x0002A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0,
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5,
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar src16[] = {
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test non-BMP code points */
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F,
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6,
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB,
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0,
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8,
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF,
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4,
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xD869, 0xDED5,
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToUTF32(void){
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 u32Target[400];
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t u32DestLen;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i= 0;
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* first with length */
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u32DestLen = -2;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, 0, &u32DestLen, src16, LENGTHOF(src16),&err);
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)) {
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(preflight with length): "
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err));
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u32DestLen = -2;
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, LENGTHOF(src32)+1, &u32DestLen, src16, LENGTHOF(src16),&err);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)) {
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(with length): "
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_ZERO_ERROR\n",
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err));
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*for(i=0; i< u32DestLen; i++){
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("0x%08X, ",uTarget[i]);
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i%10==0){
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("\n");
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }*/
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i< LENGTHOF(src32); i++){
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u32Target[i] != src32[i]){
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src32[i], u32Target[i],i);
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u32Target[i] != 0){
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0, u32Target[i],i);
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* now NUL-terminated */
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u32DestLen = -2;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err);
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)-1) {
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(preflight with NUL-termination): "
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err));
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u32DestLen = -2;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, LENGTHOF(src32), &u32DestLen, src16, -1,&err);
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)-1) {
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(with NUL-termination): "
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_ZERO_ERROR\n",
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err));
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i< LENGTHOF(src32); i++){
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u32Target[i] != src32[i]){
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got: %04X \n", src32[i], u32Target[i]);
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test unpaired surrogates */
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToUTF32_surrogates() {
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 u32Target[400];
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len16, u32DestLen;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numSubstitutions;
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 };
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0 };
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a, 0x50000, 0x7a, 0 };
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len16 = LENGTHOF(surr16);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i < 4; ++i) {
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err);
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, len16-i, &err);
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err);
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, -1, &err);
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err);
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, len16-4-1, &err);
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) {
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err);
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) {
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, -1, &err);
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* with substitution character */
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    numSubstitutions = -1;
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err);
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) {
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err);
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_FFFD, 8*4)) {
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err);
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) {
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_12345, 8*4)) {
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromUTF32(void){
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uTarget[400];
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uDestLen;
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i= 0;
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* first with length */
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uDestLen = -2;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget,0,&uDestLen,src32,LENGTHOF(src32),&err);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)) {
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(preflight with length): "
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err));
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uDestLen = -2;
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget, LENGTHOF(src16)+1,&uDestLen,src32,LENGTHOF(src32),&err);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)) {
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(with length): "
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_ZERO_ERROR\n",
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err));
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*for(i=0; i< uDestLen; i++){
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("0x%04X, ",uTarget[i]);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i%10==0){
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("\n");
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }*/
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i< uDestLen; i++){
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(uTarget[i] != src16[i]){
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src16[i] ,uTarget[i],i);
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uTarget[i] != 0){
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0,uTarget[i],i);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* now NUL-terminated */
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uDestLen = -2;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err);
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)-1) {
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(preflight with NUL-termination): "
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err));
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uDestLen = -2;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget, LENGTHOF(src16),&uDestLen,src32,-1,&err);
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)-1) {
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(with NUL-termination): "
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "length %ld != %ld and %s != U_ZERO_ERROR\n",
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err));
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i< uDestLen; i++){
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(uTarget[i] != src16[i]){
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %04X got: %04X \n", src16[i] ,uTarget[i]);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test surrogate code points */
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromUTF32_surrogates() {
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uTarget[400];
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len32, uDestLen;
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numSubstitutions;
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 0 };
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808, 0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45,
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            0x5a, 0xd900, 0xdc00, 0x7a, 0 };
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len32 = LENGTHOF(surr32);
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i < 6; ++i) {
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err);
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, len32-i, &err);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err);
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, -1, &err);
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err != U_INVALID_CHAR_FOUND) {
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (long)i, u_errorName(err));
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err);
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) {
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6-1, &err);
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) {
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err);
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) {
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &err);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) {
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* with substitution character */
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    numSubstitutions = -1;
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4) {
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err);
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcmp(uTarget, expected_FFFD, 11)) {
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err);
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4) {
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    err = U_ZERO_ERROR;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err);
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcmp(uTarget, expected_12345, 15)) {
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(err));
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_UChar_UTF8_API(void){
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uTemp[1];
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char u8Temp[1];
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* uTarget=uTemp;
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* u8Src;
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t u8SrcLen = 0;
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uTargetLength = 0;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uDestLen=0;
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* uSrc = src16;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uSrcLen   = sizeof(src16)/2;
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char* u8Target = u8Temp;
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t u8TargetLength =0;
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t u8DestLen =0;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool failed = FALSE;
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i= 0;
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numSubstitutions;
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight */
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8Temp[0] = 0x12;
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err = U_ZERO_ERROR;
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1));
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8TargetLength = u8DestLen;
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8Target[u8TargetLength] = (char)0xfe;
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8DestLen = -1;
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8TargetLength] != (char)0xfe){
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_errorName(err));
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failed = FALSE;
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< u8DestLen; i++){
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("0x%04X, ",u8Target[i]);
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(i%10==0){
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("\n");
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< u8DestLen; i++){
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u8Target[i] != src8[i]){
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]);
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF8() failed \n");
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8Src = u8Target;
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8SrcLen = u8DestLen;
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight */
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uTemp[0] = 0x1234;
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err = U_ZERO_ERROR;
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1));
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uTargetLength =  uDestLen;
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uTarget[uTargetLength] = 0xfff0;
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDestLen = -1;
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER_OVERFLOW_ERROR\n");
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< uDestLen; i++){
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("0x%04X, ",uTarget[i]);
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(i%10==0){
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("\n");
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength] != 0xfff0) {
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failed = TRUE;
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i< uSrcLen; i++){
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uTarget[i] != src16[i]){
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i);
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8(after preflighting) failed\n");
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(u8Target);
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(uTarget);
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8SrcLen = -1;
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uTargetLength = 0;
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uSrcLen =-1;
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8TargetLength=0;
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failed = FALSE;
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight */
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err = U_ZERO_ERROR;
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1));
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u8TargetLength = u8DestLen;
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failed = FALSE;
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< u8DestLen; i++){
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("0x%04X, ",u8Target[i]);
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(i%10==0){
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("\n");
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< u8DestLen; i++){
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u8Target[i] != src8[i]){
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]);
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF8() failed \n");
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8Src = u8Target;
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8SrcLen = u8DestLen;
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight */
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err = U_ZERO_ERROR;
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1));
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uTargetLength =  uDestLen;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*for(i=0; i< uDestLen; i++){
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("0x%04X, ",uTarget[i]);
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(i%10==0){
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("\n");
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }*/
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i< uSrcLen; i++){
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uTarget[i] != src16[i]){
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i);
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToUTF8() failed \n");
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(u8Target);
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(uTarget);
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withLead16[]={ 0x1800, 0xd89a, 0x0061 },
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 },
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD */
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub==U+50005 */
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const uint8_t
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 },
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 },
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001A */
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 }; /* sub==U+FFFD */
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar out16[10];
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char out8[10];
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withLead16, LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) ||
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withTrail16, -1, &err), err!=U_INVALID_CHAR_FOUND) ||
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withLead8, LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FOUND) ||
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND)
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strTo/FromUTF8(string with single surrogate) fails to report error\n");
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test error handling with substitution characters */
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* from UTF-8 with length */
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out16[0]=0x55aa;
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen=0;
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (const char *)withTrail8, uprv_strlen((const char *)withTrail8),
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0x50005, &numSubstitutions,
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &err);
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) ||
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1) ||
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=1) {
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8WithSub(length) failed\n");
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* from UTF-8 with NUL termination */
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out16[0]=0x55aa;
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen=0;
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (const char *)withTrail8, -1,
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0xfffd, &numSubstitutions,
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &err);
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) ||
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1) ||
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=1) {
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n");
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight from UTF-8 with NUL termination */
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out16[0]=0x55aa;
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen=0;
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8WithSub(out16, 1, &uDestLen,
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (const char *)withTrail8, -1,
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0x50005, &numSubstitutions,
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &err);
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub50005) || numSubstitutions!=1) {
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) failed\n");
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* to UTF-8 with length */
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out8[0]=(char)0xf5;
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8DestLen=0;
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           withTrail16, u_strlen(withTrail16),
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           0xfffd, &numSubstitutions,
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           &err);
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen+1) ||
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=1) {
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strToUTF8WithSub(length) failed\n");
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* to UTF-8 with NUL termination */
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out8[0]=(char)0xf5;
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8DestLen=0;
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           withTrail16, -1,
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           0x1a, &numSubstitutions,
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           &err);
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1A) ||
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=uprv_memcmp((const char *)withTrail8Sub1A, out8, u8DestLen+1) ||
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=1) {
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strToUTF8WithSub(NUL termination) failed\n");
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflight to UTF-8 with NUL termination */
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out8[0]=(char)0xf5;
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8DestLen=0;
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8WithSub(out8, 1, &u8DestLen,
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           withTrail16, -1,
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           0xfffd, &numSubstitutions,
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           &err);
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           numSubstitutions!=1) {
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n");
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test that numSubstitutions==0 if there are no substitutions */
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* from UTF-8 with length (just first 3 bytes which are valid) */
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out16[0]=0x55aa;
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen=0;
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (const char *)withTrail8, 3,
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0x50005, &numSubstitutions,
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &err);
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || uDestLen!=1 ||
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) ||
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=0) {
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8WithSub(no subs) failed\n");
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* to UTF-8 with length (just first UChar which is valid) */
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out8[0]=(char)0xf5;
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8DestLen=0;
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           withTrail16, 1,
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           0xfffd, &numSubstitutions,
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           &err);
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || u8DestLen!=3 ||
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) ||
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=0) {
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strToUTF8WithSub(no subs) failed\n");
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* from UTF-8 with length (just first 3 bytes which are valid) */
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out16[0]=0x55aa;
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen=0;
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (const char *)withTrail8, 3,
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             U_SENTINEL, &numSubstitutions,
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &err);
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || uDestLen!=1 ||
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) ||
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=0) {
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8WithSub(no subchar) failed\n");
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* to UTF-8 with length (just first UChar which is valid) */
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions=-1;
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        out8[0]=(char)0xf5;
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u8DestLen=0;
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           withTrail16, 1,
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           U_SENTINEL, &numSubstitutions,
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           &err);
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err) || u8DestLen!=3 ||
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) ||
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             numSubstitutions!=0) {
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strToUTF8WithSub(no subchar) failed\n");
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Test with an illegal lead byte that would be followed by more than 3 trail bytes.
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * See ticket #10371.
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const char src[1]={ 0xf8 };
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar out16[10];
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromUTF8(out16, LENGTHOF(out16), NULL, src, 1, &err);
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_INVALID_CHAR_FOUND) {
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error: u_strFromUTF8(5-byte lead byte) failed\n");
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* compare if two strings are equal, but match 0xfffd in the second string with anything in the first */
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgequalAnyFFFD(const UChar *s, const UChar *t, int32_t length) {
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar c1, c2;
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while(length>0) {
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c1=*s++;
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c2=*t++;
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(c1!=c2 && c2!=0xfffd) {
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        --length;
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test u_strFromUTF8Lenient() */
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTest_FromUTF8(void) {
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVALID_CHAR_FOUND(10)"
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 };
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[64];
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *destPointer;
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t destLength;
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 3 bytes input, one UChar output (U+095C) */
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-99;
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &errorCode);
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) {
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%ld - %s\n",
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)destLength, u_errorName(errorCode));
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 4 bytes input, two UChars output (U+095C U+0000) */
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-99;
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &errorCode);
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2) {
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%ld - %s\n",
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)destLength, u_errorName(errorCode));
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* NUL-terminated 3 bytes input, one UChar output (U+095C) */
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-99;
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &errorCode);
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) {
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=%ld - %s\n",
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)destLength, u_errorName(errorCode));
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* 3 bytes input, one UChar output (U+095C), transform not just preflight */
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest[0]=dest[1]=99;
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-99;
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destPointer=u_strFromUTF8(dest, LENGTHOF(dest), &destLength, (const char *)bytes, 3, &errorCode);
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x95c || dest[1]!=0) {
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%ld - %s\n",
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (long)destLength, u_errorName(errorCode));
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test u_strFromUTF8Lenient() */
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTest_FromUTF8Lenient(void) {
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Multiple input strings, each NUL-terminated.
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Terminate with a string starting with 0xff.
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t bytes[]={
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* well-formed UTF-8 */
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61,  0xc3, 0x9f,  0xe0, 0xa0, 0x80,  0xf0, 0xa0, 0x80, 0x80,
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x62,  0xc3, 0xa0,  0xe0, 0xa0, 0x81,  0xf0, 0xa0, 0x80, 0x81, 0,
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* various malformed sequences */
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xc3, 0xc3, 0x9f,  0xc3, 0xa0,  0xe0, 0x80, 0x8a,  0xf0, 0x41, 0x42, 0x43, 0,
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* truncated input */
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xc3, 0,
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0,
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xa0, 0,
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf0, 0,
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf0, 0x90, 0,
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf0, 0x90, 0x80, 0,
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* non-ASCII characters in the last few bytes */
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61,  0xc3, 0x9f,  0xe0, 0xa0, 0x80, 0,
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61,  0xe0, 0xa0, 0x80,  0xc3, 0x9f, 0,
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* empty string */
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0,
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* finish */
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xff, 0
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar uchars[]={
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0xdf, 0x800,  0xd840, 0xdc00,
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x62, 0xe0, 0x801,  0xd840, 0xdc01,  0,
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0x9f, 0xe0, 0xa,  0xfffd, 0xfffd,  0,
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0,
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0xdf, 0x800,  0,
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x800, 0xdf,  0,
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0,
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[64];
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *pb;
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *pu, *pDest;
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLength, destLength0, destLength;
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int number;
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* verify checking for some illegal arguments */
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest[0]=0x1234;
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-1;
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode);
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) {
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8Lenient(src=NULL) failed\n");
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest[0]=0x1234;
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-1;
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &errorCode);
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n");
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest[0]=0x1234;
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-1;
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_MEMORY_ALLOCATION_ERROR;
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &errorCode);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) {
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n");
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest[0]=0x1234;
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLength=-1;
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_MEMORY_ALLOCATION_ERROR;
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NULL);
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dest[0]!=0x1234) {
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n");
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test normal behavior */
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    number=0; /* string number for log_err() */
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(pb=(const char *)bytes, pu=uchars;
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pb!=(char)0xff;
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pb+=srcLength+1, pu+=destLength0+1, ++number
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        srcLength=uprv_strlen(pb);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength0=u_strlen(pu);
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflighting with NUL-termination */
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=0x1234;
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode);
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) ||
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination) failed\n", number);
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflighting/some capacity with NUL-termination */
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(srcLength>0) {
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dest[destLength0-1]=0x1234;
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destLength=-1;
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ZERO_ERROR;
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1, &errorCode);
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (errorCode!=U_BUFFER_OVERFLOW_ERROR ||
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dest[destLength0-1]!=0x1234 || destLength!=destLength0
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with NUL-termination) failed\n", number);
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* conversion with NUL-termination, much capacity */
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=dest[destLength0]=0x1234;
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, -1, &errorCode);
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (errorCode!=U_ZERO_ERROR ||
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest!=dest || dest[destLength0]!=0 ||
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, much capacity) failed\n", number);
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* conversion with NUL-termination, exact capacity */
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=dest[destLength0]=0x1234;
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &errorCode);
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest!=dest || dest[destLength0]!=0x1234 ||
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, exact capacity) failed\n", number);
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflighting with length */
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=0x1234;
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCode);
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) ||
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n", number);
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* preflighting/some capacity with length */
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(srcLength>0) {
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dest[srcLength-1]=0x1234;
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destLength=-1;
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ZERO_ERROR;
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLength, &errorCode);
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (errorCode!=U_BUFFER_OVERFLOW_ERROR ||
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dest[srcLength-1]!=0x1234 || destLength!=srcLength
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with length) failed\n", number);
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* conversion with length, much capacity */
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=dest[destLength0]=0x1234;
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, srcLength, &errorCode);
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (errorCode!=U_ZERO_ERROR ||
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pDest!=dest || dest[destLength0]!=0 ||
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromUTF8Lenient(%d conversion with length, much capacity) failed\n", number);
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* conversion with length, srcLength capacity */
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[0]=dest[srcLength]=dest[destLength0]=0x1234;
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLength=-1;
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength, &errorCode);
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(srcLength==destLength0) {
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                pDest!=dest || dest[destLength0]!=0x1234 ||
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/not terminated) failed\n", number);
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (errorCode!=U_ZERO_ERROR ||
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                pDest!=dest || dest[destLength0]!=0 ||
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/terminated) failed\n", number);
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint16_t src16j[] = {
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0000,
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test only ASCII */
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint16_t src16WithNulls[] = {
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000,
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000,
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000,
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000,
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test only ASCII */
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD,
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB,
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9,
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x0054, 0x0000 */
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_UChar_WCHART_API(void){
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode err = U_ZERO_ERROR;
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* uSrc = src16j;
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uSrcLen = sizeof(src16j)/2;
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    wchar_t* wDest = NULL;
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t wDestLen = 0;
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t reqLen= 0 ;
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool failed = FALSE;
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* uDest = NULL;
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uDestLen = 0;
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i =0;
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and that Purify doesn't complain. */
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) {
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromWCS() should return NULL with a bad argument\n");
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) {
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS() should return NULL with a bad argument\n");
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* NULL source & destination. */
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromWCS(NULL,0,NULL,NULL,0,&err);
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_STRING_NOT_TERMINATED_WARNING) {
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromWCS(NULL, NULL) failed. Error: %s \n", u_errorName(err));
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToWCS(NULL,0,NULL,NULL,0,&err);
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err != U_STRING_NOT_TERMINATED_WARNING) {
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS(NULL, NULL) failed. Error: %s \n", u_errorName(err));
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight*/
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err=U_ZERO_ERROR;
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDestLen = reqLen+1;
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight */
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err =U_ZERO_ERROR;
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDestLen = reqLen + 1;
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(U_FAILURE(err)){
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err));
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i< uSrcLen; i++){
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uDest[i] != src16j[i]){
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_str*WCS() failed for unterminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i);
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err)){
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failed = TRUE;
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS() failed \n");
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(wDest);
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(uDest);
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test with embeded nulls */
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uSrc = src16WithNulls;
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uSrcLen = sizeof(src16WithNulls)/2;
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen =0;
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen =0;
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDest = NULL;
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDest = NULL;
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight*/
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err=U_ZERO_ERROR;
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDestLen = reqLen+1;
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight */
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err =U_ZERO_ERROR;
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDestLen = reqLen + 1;
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!U_FAILURE(err)) {
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         for(i=0; i< uSrcLen; i++){
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uDest[i] != src16WithNulls[i]){
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_str*WCS() failed for string with nulls expected: \\u%04X got: \\u%04X at index: %i \n", src16WithNulls[i] ,uDest[i],i);
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err)){
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failed = TRUE;
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS() failed \n");
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(wDest);
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(uDest);
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uSrc = src16j;
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uSrcLen = sizeof(src16j)/2;
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen =0;
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen =0;
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDest = NULL;
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDest = NULL;
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen = 0;
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight*/
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err);
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err=U_ZERO_ERROR;
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            wDestLen = reqLen+1;
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err);
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen = 0;
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* pre-flight */
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err);
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err == U_BUFFER_OVERFLOW_ERROR){
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err =U_ZERO_ERROR;
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uDestLen = reqLen + 1;
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err);
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!U_FAILURE(err)) {
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         for(i=0; i< uSrcLen; i++){
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(uDest[i] != src16j[i]){
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i);
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                failed =TRUE;
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(err)){
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failed = TRUE;
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(failed){
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS() failed \n");
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(wDest);
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(uDest);
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Test u_terminateWChars().
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * All u_terminateXYZ() use the same implementation macro;
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * we test this function to improve API coverage.
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wchar_t buffer[10];
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[3]=0x20ac;
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err);
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) {
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %d [3]==U+%04x\n",
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(err), wDestLen, buffer[3]);
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[3]=0x20ac;
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen=u_terminateWChars(buffer, 3, 3, &err);
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x20ac) {
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d [3]==U+%04x\n",
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(err), wDestLen, buffer[3]);
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_STRING_NOT_TERMINATED_WARNING;
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[3]=0x20ac;
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err);
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) {
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %s length %d [3]==U+%04x\n",
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(err), wDestLen, buffer[3]);
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err=U_ZERO_ERROR;
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[3]=0x20ac;
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen=u_terminateWChars(buffer, 2, 3, &err);
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) {
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d [3]==U+%04x\n",
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(err), wDestLen, buffer[3]);
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_widestrs()
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wchar_t ws[100];
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar rts[100];
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t wcap = sizeof(ws) / sizeof(*ws);
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t wl;
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t rtcap = sizeof(rts) / sizeof(*rts);
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t rtl;
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wchar_t *wcs;
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar *cp;
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *errname;
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0};
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t ul = sizeof(ustr)/sizeof(*ustr) -1;
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char astr[100];
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode err;
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err);
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(err)) {
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errname = u_errorName(err);
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("test_widestrs: u_strToWCS error: %s!\n",errname);
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ul!=wl){
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr, ustr), ul, ws, wl);
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        err = U_ZERO_ERROR;
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wl = (int32_t)uprv_wcslen(wcs);
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err);
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (void)cp;    /* Suppress set but not used warning. */
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(err)) {
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errname = u_errorName(err);
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errname);
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(wl != rtl){
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs, wl, u_austrcpy(astr, rts), rtl);
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTest_WCHART_LongString(){
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* testdatapath=loadTestData(&status);
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status);
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t strLen =0;
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&status);
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* uSrc = str;
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uSrcLen = strLen;
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t wDestLen =0, reqLen=0, i=0;
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t uDestLen =0;
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    wchar_t* wDest = NULL;
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* uDest = NULL;
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool failed = FALSE;
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Loaded string of %d UChars\n", uSrcLen);
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status));
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* pre-flight*/
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status);
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_BUFFER_OVERFLOW_ERROR){
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wDestLen = reqLen+1;
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status);
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("To %d*%d-byte wchar_ts\n", reqLen,sizeof(wchar_t));
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int j;
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      for(j=0;j>=0&&j<reqLen;j++) {
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(wDest[j]!=uSrc[j]) {
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_verbose("Diff %04X vs %04X @ %d\n", wDest[j],uSrc[j],j);
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          break;
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uDestLen = 0;
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* pre-flight */
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status);
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_BUFFER_OVERFLOW_ERROR){
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status =U_ZERO_ERROR;
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_memset(uDest,0xFFFF,reqLen+1);
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uDestLen = reqLen + 1;
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status);
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Back to %d UChars\n", reqLen);
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(U_WCHAR_IS_UTF16)
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("U_WCHAR_IS_UTF16\n");
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif defined(U_WCHAR_IS_UTF32)
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("U_WCHAR_IS_UTF32\n");
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("U_WCHAR_IS_idunno (not UTF)\n");
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(reqLen!=uSrcLen) {
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: dest len is %d but expected src len %d\n", reqLen, uSrcLen);
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i< uSrcLen; i++){
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(uDest[i] != str[i]){
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", str[i], uDest[i],i);
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failed =TRUE;
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failed = TRUE;
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(failed){
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToWCS() failed \n");
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(wDest);
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(uDest);
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* close the bundle */
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(theBundle);
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strToJavaModifiedUTF8() {
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar src[]={
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3,
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003,
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd800, 0xdc00, 0xdc00, 0xd800, 0,
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdbff, 0xdfff,
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xed, 0xe0e, 0x6f
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t expected[]={
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3,
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83,
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83,
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80, 0xc0, 0x80,
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf,
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xc3, 0xad, 0xe0, 0xb8, 0x8e, 0x6f
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar shortSrc[]={
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe01, 0xe1, 0x61
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t shortExpected[]={
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar asciiNul[]={
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t asciiNulExpected[]={
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char dest[200];
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *p;
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length, expectedTerminatedLength;
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedTerminatedLength=(int32_t)(strstr((const char *)expected, "\xc0\x80")-
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)expected);
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length,
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) ||
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(normal) failed - %s\n", u_errorName(errorCode));
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL,
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0!=memcmp(dest, expected, LENGTHOF(expected)) ||
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[LENGTHOF(expected)]!=0
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(normal, pLength=NULL) failed - %s\n", u_errorName(errorCode));
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected), &length,
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest ||
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) ||
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=(char)0xff
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(tight) failed - %s\n", u_errorName(errorCode));
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, src, -1, &errorCode);
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) ||
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(NUL-terminated) failed - %s\n", u_errorName(errorCode));
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, src, -1, &errorCode);
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0!=memcmp(dest, expected, expectedTerminatedLength) ||
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[expectedTerminatedLength]!=0
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(NUL-terminated, pLength=NULL) failed - %s\n", u_errorName(errorCode));
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected)/2, &length,
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=(char)0xff
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(overflow) failed - %s\n", u_errorName(errorCode));
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(NULL, 0, &length,
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || dest[0]!=(char)0xff
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(pure preflighting) failed - %s\n", u_errorName(errorCode));
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length,
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              shortSrc, LENGTHOF(shortSrc), &errorCode);
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length) ||
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(short) failed - %s\n", u_errorName(errorCode));
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length,
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              asciiNul, -1, &errorCode);
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected, length) ||
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(asciiNul) failed - %s\n", u_errorName(errorCode));
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length,
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              NULL, 0, &errorCode);
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=0 || dest[0]!=0
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(empty) failed - %s\n", u_errorName(errorCode));
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* illegal arguments */
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(NULL, sizeof(dest), &length,
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) {
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(dest=NULL) failed - %s\n", u_errorName(errorCode));
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, -1, &length,
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              src, LENGTHOF(src), &errorCode);
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) {
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(destCapacity<0) failed - %s\n", u_errorName(errorCode));
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length,
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              NULL, LENGTHOF(src), &errorCode);
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) {
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(src=NULL) failed - %s\n", u_errorName(errorCode));
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=-5;
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length,
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              NULL, -1, &errorCode);
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) {
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(src=NULL, srcLength<0) failed - %s\n", u_errorName(errorCode));
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_strFromJavaModifiedUTF8() {
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t src[]={
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3,
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83,
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83,
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80, 0,
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf,
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80,  /* invalid sequences */
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0x81, 0xac, 0xe0, 0x83, 0xad,  /* non-shortest forms are allowed */
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xb8, 0x8e, 0x6f
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected[]={
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3,
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003,
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd800, 0xdc00, 0xdc00, 0xd800, 0,
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdbff, 0xdfff,
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0xfffd, 0xfffd, 0xfffd,
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x6c, 0xed,
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0e, 0x6f
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t shortSrc[]={
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar shortExpected[]={
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xe01, 0xe1, 0x61
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t asciiNul[]={
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63, 0
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar asciiNulExpected[]={
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0x63
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t invalid[]={
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar invalidExpectedFFFD[]={
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0xfffd, 0xfffd, 0xfffd
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar invalidExpected50000[]={
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[200];
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *p;
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length, expectedTerminatedLength;
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numSubstitutions;
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedTerminatedLength=(int32_t)(u_strchr(expected, 0)-expected);
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) ||
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=LENGTHOF(invalidExpectedFFFD)
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(normal) failed - %s\n", u_errorName(errorCode));
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL,
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0!=memcmp(dest, expected, LENGTHOF(expected)) ||
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[LENGTHOF(expected)]!=0 ||
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=LENGTHOF(invalidExpectedFFFD)
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(normal, pLength=NULL) failed - %s\n", u_errorName(errorCode));
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, NULL, &errorCode);
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) ||
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(normal, pNumSubstitutions=NULL) failed - %s\n", u_errorName(errorCode));
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected), &length,
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest ||
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) ||
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0xffff ||
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=LENGTHOF(invalidExpectedFFFD)
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(tight) failed - %s\n", u_errorName(errorCode));
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, -1,
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) ||
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated) failed - %s\n", u_errorName(errorCode));
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL,
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, -1,
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0!=memcmp(dest, expected, expectedTerminatedLength) ||
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[expectedTerminatedLength]!=0 ||
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pLength=NULL) failed - %s\n", u_errorName(errorCode));
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, -1,
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, NULL, &errorCode);
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) ||
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pNumSubstitutions=NULL) failed - %s\n", u_errorName(errorCode));
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected)/2, &length,
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=0xffff
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(overflow) failed - %s\n", u_errorName(errorCode));
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(NULL, 0, &length,
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(expected) || dest[0]!=0xffff
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(pure preflighting) failed - %s\n", u_errorName(errorCode));
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)shortSrc, LENGTHOF(shortSrc),
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length) ||
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(short) failed - %s\n", u_errorName(errorCode));
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)asciiNul, -1,
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected, length) ||
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(asciiNul) failed - %s\n", u_errorName(errorCode));
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, 0, 0xfffd, &numSubstitutions, &errorCode);
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=0 || dest[0]!=0 ||
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(empty) failed - %s\n", u_errorName(errorCode));
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)invalid, LENGTHOF(invalid),
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(invalidExpectedFFFD) || 0!=memcmp(dest, invalidExpectedFFFD, length) ||
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=LENGTHOF(invalidExpectedFFFD)
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(invalid->fffd) failed - %s\n", u_errorName(errorCode));
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)invalid, LENGTHOF(invalid),
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0x50000, &numSubstitutions, &errorCode);
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( U_FAILURE(errorCode) || p!=dest ||
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length!=LENGTHOF(invalidExpected50000) || 0!=memcmp(dest, invalidExpected50000, length) ||
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dest[length]!=0 ||
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=LENGTHOF(invalidExpectedFFFD)  /* not ...50000 */
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(invalid->50000) failed - %s\n", u_errorName(errorCode));
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)invalid, LENGTHOF(invalid),
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       U_SENTINEL, &numSubstitutions, &errorCode);
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_INVALID_CHAR_FOUND || dest[0]!=0xffff || numSubstitutions!=0) {
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(invalid->error) failed - %s\n", u_errorName(errorCode));
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length,
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       U_SENTINEL, &numSubstitutions, &errorCode);
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( errorCode!=U_INVALID_CHAR_FOUND ||
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length>=LENGTHOF(expected) || dest[LENGTHOF(expected)-1]!=0xffff ||
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numSubstitutions!=0
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(normal->error) failed - %s\n", u_errorName(errorCode));
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* illegal arguments */
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(NULL, sizeof(dest), &length,
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(dest=NULL) failed - %s\n", u_errorName(errorCode));
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, -1, &length,
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(destCapacity<0) failed - %s\n", u_errorName(errorCode));
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length,
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, LENGTHOF(src),
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xfffd, &numSubstitutions, &errorCode);
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL) failed - %s\n", u_errorName(errorCode));
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length,
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, -1, 0xfffd, &numSubstitutions, &errorCode);
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL, srcLength<0) failed - %s\n", u_errorName(errorCode));
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length,
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0x110000, &numSubstitutions, &errorCode);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(subchar=U_SENTINEL) failed - %s\n", u_errorName(errorCode));
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(dest, 0xff, sizeof(dest));
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=numSubstitutions=-5;
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length,
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       (const char *)src, LENGTHOF(src),
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0xdfff, &numSubstitutions, &errorCode);
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) {
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(subchar is surrogate) failed - %s\n", u_errorName(errorCode));
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test that string transformation functions permit NULL source pointer when source length==0 */
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNullEmptySource() {
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char dest8[4]={ 3, 3, 3, 3 };
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest16[4]={ 3, 3, 3, 3 };
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 dest32[4]={ 3, 3, 3, 3 };
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    wchar_t destW[4]={ 3, 3, 3, 3 };
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* u_strFromXyz() */
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF8(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode);
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8(source=NULL, sourceLength=0) failed\n");
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode);
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8WithSub(source=NULL, sourceLength=0) failed\n");
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF8Lenient(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode);
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF8Lenient(source=NULL, sourceLength=0) failed\n");
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode);
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32(source=NULL, sourceLength=0) failed\n");
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromUTF32WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode);
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromUTF32WithSub(source=NULL, sourceLength=0) failed\n");
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromJavaModifiedUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode);
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromJavaModifiedUTF8WithSub(source=NULL, sourceLength=0) failed\n");
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* u_strToXyz() */
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest8[0]=3;
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode);
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) {
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n");
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest8[0]=3;
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF8WithSub(dest8, LENGTHOF(dest8), &length, NULL, 0, 0xfffd, NULL, &errorCode);
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) {
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n");
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest32[0]=3;
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32(dest32, LENGTHOF(dest32), &length, NULL, 0, &errorCode);
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) {
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32(source=NULL, sourceLength=0) failed\n");
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest32[0]=3;
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToUTF32WithSub(dest32, LENGTHOF(dest32), &length, NULL, 0, 0xfffd, NULL, &errorCode);
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) {
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToUTF32WithSub(source=NULL, sourceLength=0) failed\n");
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest8[0]=3;
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToJavaModifiedUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode);
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) {
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToJavaModifiedUTF8(source=NULL, sourceLength=0) failed\n");
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest16[0]=3;
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strFromWCS(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode);
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) {
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strFromWCS(source=NULL, sourceLength=0) failed\n");
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destW[0]=3;
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=3;
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strToWCS(destW, LENGTHOF(destW), &length, NULL, 0, &errorCode);
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ZERO_ERROR || length!=0 || destW[0]!=0 || destW[1]!=3) {
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("u_strToWCS(source=NULL, sourceLength=0) failed\n");
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2124