custrtrn.c revision b0ac937921a2c196d8b9da665135bf6ba01a1ccf
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Copyright (c) 2001-2009, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File custrtrn.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                     Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Ram                      String transformations test
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/****************************************************************************/
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_imp.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cwchar.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addUCharTransformTest(TestNode** root);
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void);
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates(void);
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void);
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates(void);
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void);
38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void Test_FromUTF8(void);
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_FromUTF8Lenient(void);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void);
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs(void);
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_WCHART_LongString(void);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruaddUCharTransformTest(TestNode** root)
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32");
48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogates");
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32");
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surrogates");
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API");
52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru   addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8");
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient");
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   addTest(root, &Test_UChar_WCHART_API,  "custrtrn/Test_UChar_WCHART_API");
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   addTest(root, &Test_widestrs,  "custrtrn/Test_widestrs");
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString");
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar32 src32[]={
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test non-BMP code points */
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A699,
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x0002A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB,
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x0002A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7,
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x0002A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1,
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x0002A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0,
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5,
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar src16[] = {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test non-BMP code points */
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F,
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8,
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF,
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6,
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB,
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0,
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8,
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF,
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4,
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xD869, 0xDED5,
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void){
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar32 u32Target[400];
138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t u32DestLen;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i= 0;
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* first with length */
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u32DestLen = -2;
143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, 0, &u32DestLen, src16, LENGTHOF(src16),&err);
144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)) {
145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(preflight with length): "
146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err));
148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u32DestLen = -2;
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, LENGTHOF(src32)+1, &u32DestLen, src16, LENGTHOF(src16),&err);
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)) {
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(with length): "
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_ZERO_ERROR\n",
156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err));
157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /*for(i=0; i< u32DestLen; i++){
160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printf("0x%08X, ",uTarget[i]);
161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(i%10==0){
162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            printf("\n");
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }*/
165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i=0; i< LENGTHOF(src32); i++){
166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(u32Target[i] != src32[i]){
167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src32[i], u32Target[i],i);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(u32Target[i] != 0){
171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0, u32Target[i],i);
172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* now NUL-terminated */
175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u32DestLen = -2;
176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err);
177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)-1) {
178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(preflight with NUL-termination): "
179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err));
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u32DestLen = -2;
185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, LENGTHOF(src32), &u32DestLen, src16, -1,&err);
186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)-1) {
187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(with NUL-termination): "
188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_ZERO_ERROR\n",
189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err));
190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i=0; i< LENGTHOF(src32); i++){
194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(u32Target[i] != src32[i]){
195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got: %04X \n", src32[i], u32Target[i]);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test unpaired surrogates */
201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates() {
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar32 u32Target[400];
204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t len16, u32DestLen;
205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t numSubstitutions;
206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int i;
207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 };
210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0 };
211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a, 0x50000, 0x7a, 0 };
212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len16 = LENGTHOF(surr16);
213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i = 0; i < 4; ++i) {
214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err);
216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, len16-i, &err);
224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err);
232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, -1, &err);
240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err);
249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) {
250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, len16-4-1, &err);
257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) {
258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err);
265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) {
266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, -1, &err);
273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) {
274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* with substitution character */
280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numSubstitutions = -1;
281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err);
283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) {
284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err);
291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_FFFD, 8*4)) {
292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err);
299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) {
300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err);
307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_12345, 8*4)) {
308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void){
315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar uTarget[400];
317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t uDestLen;
318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int i= 0;
319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* first with length */
321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uDestLen = -2;
322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget,0,&uDestLen,src32,LENGTHOF(src32),&err);
323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)) {
324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(preflight with length): "
325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err));
327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uDestLen = -2;
331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget, LENGTHOF(src16)+1,&uDestLen,src32,LENGTHOF(src32),&err);
332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)) {
333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(with length): "
334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_ZERO_ERROR\n",
335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err));
336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /*for(i=0; i< uDestLen; i++){
339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printf("0x%04X, ",uTarget[i]);
340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(i%10==0){
341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            printf("\n");
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }*/
344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i=0; i< uDestLen; i++){
346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(uTarget[i] != src16[i]){
347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src16[i] ,uTarget[i],i);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(uTarget[i] != 0){
351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0,uTarget[i],i);
352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* now NUL-terminated */
355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uDestLen = -2;
356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err);
357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)-1) {
358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(preflight with NUL-termination): "
359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n",
360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err));
361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uDestLen = -2;
365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget, LENGTHOF(src16),&uDestLen,src32,-1,&err);
366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)-1) {
367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(with NUL-termination): "
368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                "length %ld != %ld and %s != U_ZERO_ERROR\n",
369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err));
370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i=0; i< uDestLen; i++){
374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(uTarget[i] != src16[i]){
375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %04X got: %04X \n", src16[i] ,uTarget[i]);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test surrogate code points */
381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates() {
382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar uTarget[400];
384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t len32, uDestLen;
385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t numSubstitutions;
386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int i;
387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 0 };
389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 };
391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808, 0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45,
392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                            0x5a, 0xd900, 0xdc00, 0x7a, 0 };
393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len32 = LENGTHOF(surr32);
394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i = 0; i < 6; ++i) {
395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err);
397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, len32-i, &err);
405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n",
407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err);
413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        err = U_ZERO_ERROR;
420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, -1, &err);
421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(err != U_INVALID_CHAR_FOUND) {
422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n",
423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    (long)i, u_errorName(err));
424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err);
430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) {
431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6-1, &err);
438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) {
439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err);
446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) {
447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &err);
454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) {
455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* with substitution character */
461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numSubstitutions = -1;
462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err);
464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4) {
465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err);
472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcmp(uTarget, expected_FFFD, 11)) {
473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err);
480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4) {
481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n",
482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    err = U_ZERO_ERROR;
487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err);
488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcmp(uTarget, expected_12345, 15)) {
489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n",
490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_errorName(err));
491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void){
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uTemp[1];
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char u8Temp[1];
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uTarget=uTemp;
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* u8Src;
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t u8SrcLen = 0;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uTargetLength = 0;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uDestLen=0;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* uSrc = src16;
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uSrcLen   = sizeof(src16)/2;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* u8Target = u8Temp;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t u8TargetLength =0;
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t u8DestLen =0;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool failed = FALSE;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i= 0;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t numSubstitutions;
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight */
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8Temp[0] = 0x12;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1));
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8TargetLength = u8DestLen;
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8Target[u8TargetLength] = (char)0xfe;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8DestLen = -1;
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8TargetLength] != (char)0xfe){
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_errorName(err));
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failed = FALSE;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< u8DestLen; i++){
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printf("0x%04X, ",u8Target[i]);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i%10==0){
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                printf("\n");
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< u8DestLen; i++){
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u8Target[i] != src8[i]){
544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]);
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToUTF8() failed \n");
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8Src = u8Target;
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8SrcLen = u8DestLen;
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight */
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uTemp[0] = 0x1234;
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1));
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uTargetLength =  uDestLen;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uTarget[uTargetLength] = 0xfff0;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDestLen = -1;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER_OVERFLOW_ERROR\n");
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< uDestLen; i++){
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printf("0x%04X, ",uTarget[i]);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i%10==0){
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                printf("\n");
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength] != 0xfff0) {
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failed = TRUE;
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i< uSrcLen; i++){
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uTarget[i] != src16[i]){
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8(after preflighting) failed\n");
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(u8Target);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(uTarget);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8SrcLen = -1;
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uTargetLength = 0;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uSrcLen =-1;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8TargetLength=0;
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failed = FALSE;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight */
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1));
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u8TargetLength = u8DestLen;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err);
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failed = FALSE;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< u8DestLen; i++){
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printf("0x%04X, ",u8Target[i]);
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i%10==0){
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                printf("\n");
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< u8DestLen; i++){
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u8Target[i] != src8[i]){
620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]);
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToUTF8() failed \n");
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8Src = u8Target;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8SrcLen = u8DestLen;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight */
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1));
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uTargetLength =  uDestLen;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err);
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*for(i=0; i< uDestLen; i++){
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printf("0x%04X, ",uTarget[i]);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i%10==0){
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                printf("\n");
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i< uSrcLen; i++){
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uTarget[i] != src16[i]){
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToUTF8() failed \n");
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(u8Target);
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(uTarget);
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withLead16[]={ 0x1800, 0xd89a, 0x0061 },
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 },
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD */
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub==U+50005 */
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const uint8_t
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 },
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 },
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001A */
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 }; /* sub==U+FFFD */
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar out16[10];
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char out8[10];
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withLead16, LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) ||
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withTrail16, -1, &err), err!=U_INVALID_CHAR_FOUND) ||
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withLead8, LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FOUND) ||
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND)
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strTo/FromUTF8(string with single surrogate) fails to report error\n");
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test error handling with substitution characters */
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* from UTF-8 with length */
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out16[0]=0x55aa;
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen=0;
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             (const char *)withTrail8, uprv_strlen((const char *)withTrail8),
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0x50005, &numSubstitutions,
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &err);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) ||
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1) ||
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=1) {
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8WithSub(length) failed\n");
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* from UTF-8 with NUL termination */
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out16[0]=0x55aa;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen=0;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             (const char *)withTrail8, -1,
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0xfffd, &numSubstitutions,
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &err);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) ||
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1) ||
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=1) {
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n");
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight from UTF-8 with NUL termination */
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out16[0]=0x55aa;
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen=0;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8WithSub(out16, 1, &uDestLen,
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             (const char *)withTrail8, -1,
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0x50005, &numSubstitutions,
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &err);
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub50005) || numSubstitutions!=1) {
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) failed\n");
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* to UTF-8 with length */
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out8[0]=(char)0xf5;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8DestLen=0;
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           withTrail16, u_strlen(withTrail16),
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0xfffd, &numSubstitutions,
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen+1) ||
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=1) {
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strToUTF8WithSub(length) failed\n");
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* to UTF-8 with NUL termination */
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out8[0]=(char)0xf5;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8DestLen=0;
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           withTrail16, -1,
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0x1a, &numSubstitutions,
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1A) ||
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=uprv_memcmp((const char *)withTrail8Sub1A, out8, u8DestLen+1) ||
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=1) {
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strToUTF8WithSub(NUL termination) failed\n");
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflight to UTF-8 with NUL termination */
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out8[0]=(char)0xf5;
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8DestLen=0;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8WithSub(out8, 1, &u8DestLen,
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           withTrail16, -1,
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0xfffd, &numSubstitutions,
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err);
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) ||
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           numSubstitutions!=1) {
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n");
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test that numSubstitutions==0 if there are no substitutions */
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* from UTF-8 with length (just first 3 bytes which are valid) */
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out16[0]=0x55aa;
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen=0;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             (const char *)withTrail8, 3,
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0x50005, &numSubstitutions,
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &err);
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || uDestLen!=1 ||
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) ||
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=0) {
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8WithSub(no subs) failed\n");
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* to UTF-8 with length (just first UChar which is valid) */
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out8[0]=(char)0xf5;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8DestLen=0;
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           withTrail16, 1,
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0xfffd, &numSubstitutions,
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err);
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || u8DestLen!=3 ||
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) ||
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=0) {
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strToUTF8WithSub(no subs) failed\n");
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* from UTF-8 with length (just first 3 bytes which are valid) */
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out16[0]=0x55aa;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen=0;
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen,
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             (const char *)withTrail8, 3,
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             U_SENTINEL, &numSubstitutions,
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &err);
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || uDestLen!=1 ||
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) ||
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=0) {
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strFromUTF8WithSub(no subchar) failed\n");
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* to UTF-8 with length (just first UChar which is valid) */
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numSubstitutions=-1;
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out8[0]=(char)0xf5;
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u8DestLen=0;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen,
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           withTrail16, 1,
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           U_SENTINEL, &numSubstitutions,
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err);
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err) || u8DestLen!=3 ||
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) ||
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             numSubstitutions!=0) {
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_strToUTF8WithSub(no subchar) failed\n");
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare if two strings are equal, but match 0xfffd in the second string with anything in the first */
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruequalAnyFFFD(const UChar *s, const UChar *t, int32_t length) {
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar c1, c2;
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(length>0) {
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c1=*s++;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2=*t++;
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c1!=c2 && c2!=0xfffd) {
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --length;
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruTest_FromUTF8(void) {
861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*
862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVALID_CHAR_FOUND(10)"
863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     */
864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 };
865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar dest[64];
866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar *destPointer;
867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t destLength;
868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode errorCode;
869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* 3 bytes input, one UChar output (U+095C) */
871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destLength=-99;
873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &errorCode);
874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) {
875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%ld - %s\n",
876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                (long)destLength, u_errorName(errorCode));
877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* 4 bytes input, two UChars output (U+095C U+0000) */
880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destLength=-99;
882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &errorCode);
883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2) {
884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%ld - %s\n",
885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                (long)destLength, u_errorName(errorCode));
886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* NUL-terminated 3 bytes input, one UChar output (U+095C) */
889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destLength=-99;
891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &errorCode);
892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) {
893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=%ld - %s\n",
894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                (long)destLength, u_errorName(errorCode));
895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* 3 bytes input, one UChar output (U+095C), transform not just preflight */
898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    dest[0]=dest[1]=99;
900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destLength=-99;
901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    destPointer=u_strFromUTF8(dest, LENGTHOF(dest), &destLength, (const char *)bytes, 3, &errorCode);
902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x95c || dest[1]!=0) {
903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%ld - %s\n",
904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                (long)destLength, u_errorName(errorCode));
905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */
909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_FromUTF8Lenient(void) {
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Multiple input strings, each NUL-terminated.
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Terminate with a string starting with 0xff.
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const uint8_t bytes[]={
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* well-formed UTF-8 */
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61,  0xc3, 0x9f,  0xe0, 0xa0, 0x80,  0xf0, 0xa0, 0x80, 0x80,
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x62,  0xc3, 0xa0,  0xe0, 0xa0, 0x81,  0xf0, 0xa0, 0x80, 0x81, 0,
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* various malformed sequences */
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xc3, 0xc3, 0x9f,  0xc3, 0xa0,  0xe0, 0x80, 0x8a,  0xf0, 0x41, 0x42, 0x43, 0,
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* truncated input */
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xc3, 0,
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xe0, 0,
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xe0, 0xa0, 0,
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xf0, 0,
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xf0, 0x90, 0,
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xf0, 0x90, 0x80, 0,
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* non-ASCII characters in the last few bytes */
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61,  0xc3, 0x9f,  0xe0, 0xa0, 0x80, 0,
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61,  0xe0, 0xa0, 0x80,  0xc3, 0x9f, 0,
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* empty string */
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0,
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* finish */
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xff, 0
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar uchars[]={
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61, 0xdf, 0x800,  0xd840, 0xdc00,
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x62, 0xe0, 0x801,  0xd840, 0xdc01,  0,
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0x9f, 0xe0, 0xa,  0xfffd, 0xfffd,  0,
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfffd, 0,
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61, 0xdf, 0x800,  0,
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61, 0x800, 0xdf,  0,
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0,
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[64];
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *pb;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *pu, *pDest;
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLength, destLength0, destLength;
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int number;
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* verify checking for some illegal arguments */
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest[0]=0x1234;
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLength=-1;
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode);
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) {
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_strFromUTF8Lenient(src=NULL) failed\n");
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest[0]=0x1234;
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLength=-1;
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &errorCode);
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n");
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest[0]=0x1234;
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLength=-1;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MEMORY_ALLOCATION_ERROR;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &errorCode);
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) {
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n");
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest[0]=0x1234;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLength=-1;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MEMORY_ALLOCATION_ERROR;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NULL);
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(dest[0]!=0x1234) {
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n");
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test normal behavior */
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    number=0; /* string number for log_err() */
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(pb=(const char *)bytes, pu=uchars;
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pb!=(char)0xff;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pb+=srcLength+1, pu+=destLength0+1, ++number
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        srcLength=uprv_strlen(pb);
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength0=u_strlen(pu);
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflighting with NUL-termination */
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=0x1234;
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) ||
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination) failed\n", number);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflighting/some capacity with NUL-termination */
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(srcLength>0) {
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dest[destLength0-1]=0x1234;
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destLength=-1;
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errorCode=U_ZERO_ERROR;
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1, &errorCode);
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (errorCode!=U_BUFFER_OVERFLOW_ERROR ||
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dest[destLength0-1]!=0x1234 || destLength!=destLength0
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ) {
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with NUL-termination) failed\n", number);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* conversion with NUL-termination, much capacity */
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=dest[destLength0]=0x1234;
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, -1, &errorCode);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (errorCode!=U_ZERO_ERROR ||
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest!=dest || dest[destLength0]!=0 ||
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, much capacity) failed\n", number);
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* conversion with NUL-termination, exact capacity */
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=dest[destLength0]=0x1234;
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &errorCode);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest!=dest || dest[destLength0]!=0x1234 ||
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, exact capacity) failed\n", number);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflighting with length */
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=0x1234;
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCode);
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) ||
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n", number);
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* preflighting/some capacity with length */
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(srcLength>0) {
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dest[srcLength-1]=0x1234;
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destLength=-1;
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errorCode=U_ZERO_ERROR;
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLength, &errorCode);
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (errorCode!=U_BUFFER_OVERFLOW_ERROR ||
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dest[srcLength-1]!=0x1234 || destLength!=srcLength
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ) {
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with length) failed\n", number);
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* conversion with length, much capacity */
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=dest[destLength0]=0x1234;
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, srcLength, &errorCode);
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (errorCode!=U_ZERO_ERROR ||
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pDest!=dest || dest[destLength0]!=0 ||
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromUTF8Lenient(%d conversion with length, much capacity) failed\n", number);
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* conversion with length, srcLength capacity */
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[0]=dest[srcLength]=dest[destLength0]=0x1234;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destLength=-1;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength, &errorCode);
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(srcLength==destLength0) {
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pDest!=dest || dest[destLength0]!=0x1234 ||
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ) {
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/not terminated) failed\n", number);
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (errorCode!=U_ZERO_ERROR ||
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pDest!=dest || dest[destLength0]!=0 ||
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength)
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ) {
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/terminated) failed\n", number);
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16j[] = {
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0000,
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test only ASCII */
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16WithNulls[] = {
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000,
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000,
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000,
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000,
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test only ASCII */
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD,
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB,
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9,
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x0054, 0x0000 */
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void){
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* uSrc = src16j;
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uSrcLen = sizeof(src16j)/2;
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wchar_t* wDest = NULL;
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t wDestLen = 0;
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t reqLen= 0 ;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool failed = FALSE;
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uDest = NULL;
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uDestLen = 0;
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i =0;
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and that Purify doesn't complain. */
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) {
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromWCS() should return NULL with a bad argument\n");
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) {
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS() should return NULL with a bad argument\n");
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Bad UErrorCode arguments. */
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromWCS(NULL,0,NULL,NULL,0,&err);
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err));
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToWCS(NULL,0,NULL,NULL,0,&err);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (err != U_ILLEGAL_ARGUMENT_ERROR) {
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err));
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight*/
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDestLen = reqLen+1;
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight */
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err =U_ZERO_ERROR;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDestLen = reqLen + 1;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(U_FAILURE(err)){
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err));
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i< uSrcLen; i++){
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uDest[i] != src16j[i]){
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("u_str*WCS() failed for unterminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failed = TRUE;
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS() failed \n");
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(wDest);
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(uDest);
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* test with embeded nulls */
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uSrc = src16WithNulls;
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uSrcLen = sizeof(src16WithNulls)/2;
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen =0;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen =0;
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDest = NULL;
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDest = NULL;
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight*/
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDestLen = reqLen+1;
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight */
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err =U_ZERO_ERROR;
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDestLen = reqLen + 1;
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err);
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(!U_FAILURE(err)) {
1255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         for(i=0; i< uSrcLen; i++){
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uDest[i] != src16WithNulls[i]){
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                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);
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         }
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failed = TRUE;
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS() failed \n");
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(wDest);
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(uDest);
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uSrc = src16j;
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uSrcLen = sizeof(src16j)/2;
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen =0;
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen =0;
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDest = NULL;
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDest = NULL;
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen = 0;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight*/
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err);
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            wDestLen = reqLen+1;
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err);
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen = 0;
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* pre-flight */
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err);
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err =U_ZERO_ERROR;
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uDestLen = reqLen + 1;
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err);
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(!U_FAILURE(err)) {
1305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         for(i=0; i< uSrcLen; i++){
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(uDest[i] != src16j[i]){
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                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);
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failed =TRUE;
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         }
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failed = TRUE;
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(failed){
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS() failed \n");
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(wDest);
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(uDest);
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Test u_terminateWChars().
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * All u_terminateXYZ() use the same implementation macro;
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * we test this function to improve API coverage.
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wchar_t buffer[10];
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[3]=0x20ac;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) {
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %d [3]==U+%04x\n",
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err), wDestLen, buffer[3]);
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[3]=0x20ac;
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen=u_terminateWChars(buffer, 3, 3, &err);
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x20ac) {
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d [3]==U+%04x\n",
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err), wDestLen, buffer[3]);
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_STRING_NOT_TERMINATED_WARNING;
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[3]=0x20ac;
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err);
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) {
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %s length %d [3]==U+%04x\n",
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err), wDestLen, buffer[3]);
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[3]=0x20ac;
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen=u_terminateWChars(buffer, 2, 3, &err);
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) {
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d [3]==U+%04x\n",
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err), wDestLen, buffer[3]);
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs()
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wchar_t ws[100];
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar rts[100];
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t wcap = sizeof(ws) / sizeof(*ws);
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t wl;
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t rtcap = sizeof(rts) / sizeof(*rts);
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t rtl;
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wchar_t *wcs;
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *cp;
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *errname;
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0};
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t ul = sizeof(ustr)/sizeof(*ustr) -1;
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char astr[100];
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode err;
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err);
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err)) {
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errname = u_errorName(err);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("test_widestrs: u_strToWCS error: %s!\n",errname);
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ul!=wl){
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr, ustr), ul, ws, wl);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wl = (int32_t)uprv_wcslen(wcs);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err);
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err)) {
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errname = u_errorName(err);
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errname);
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(wl != rtl){
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs, wl, u_austrcpy(astr, rts), rtl);
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_WCHART_LongString(){
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* testdatapath=loadTestData(&status);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status);
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t strLen =0;
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&status);
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* uSrc = str;
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uSrcLen = strLen;
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t wDestLen =0, reqLen=0, i=0;
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t uDestLen =0;
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wchar_t* wDest = NULL;
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uDest = NULL;
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool failed = FALSE;
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_data_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status));
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* pre-flight*/
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status);
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_BUFFER_OVERFLOW_ERROR){
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1));
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wDestLen = reqLen+1;
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status);
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uDestLen = 0;
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* pre-flight */
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status);
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_BUFFER_OVERFLOW_ERROR){
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status =U_ZERO_ERROR;
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1));
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uDestLen = reqLen + 1;
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status);
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i< uSrcLen; i++){
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uDest[i] != str[i]){
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            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);
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failed =TRUE;
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failed = TRUE;
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(failed){
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_strToWCS() failed \n");
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(wDest);
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(uDest);
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* close the bundle */
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(theBundle);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1474