1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
3f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius* Copyright (C) 1998-2014, International Business Machines Corporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File cstrtest.c
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   07/13/2000  Madhu         created
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uinvchar.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAPI(void);
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCStringTest(TestNode** root);
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestInvariant(void);
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestCompareInvEbcdicAsAscii(void);
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCStringTest(TestNode** root) {
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestAPI,   "tsutil/cstrtest/TestAPI");
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestInvariant,   "tsutil/cstrtest/TestInvariant");
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCompareInvEbcdicAsAscii, "tsutil/cstrtest/TestCompareInvEbcdicAsAscii");
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAPI(void)
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t intValue=0;
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char src[30]="HELLO THERE", dest[30];
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *const abc="abcdefghijklmnopqrstuvwxyz", *const ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *temp;
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing uprv_tolower() and uprv_toupper()\n");
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<=26; ++i) {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[i]=uprv_tolower(abc[i]);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(abc, dest)) {
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_tolower(abc) failed\n");
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<=26; ++i) {
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[i]=uprv_tolower(ABC[i]);
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(abc, dest)) {
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_tolower(ABC) failed\n");
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<=26; ++i) {
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[i]=uprv_toupper(abc[i]);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(ABC, dest)) {
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_toupper(abc) failed\n");
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<=26; ++i) {
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dest[i]=uprv_toupper(ABC[i]);
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(ABC, dest)) {
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_toupper(ABC) failed\n");
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing the API in cstring\n");
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    T_CString_toLowerCase(src);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strcmp(src, "hello there") != 0){
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: *** T_CString_toLowerCase() failed. Expected: \"hello there\", Got: \"%s\"\n", src);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    T_CString_toUpperCase(src);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strcmp(src, "HELLO THERE") != 0){
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: *** T_CString_toUpperCase() failed. Expected: \"HELLO THERE\", Got: \"%s\"\n", src);
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    intValue=T_CString_stringToInteger("34556", 10);
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(intValue != 34556){
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****T_CString_stringToInteger(\"34556\", 10) failed. Expected: 34556, Got: %d\n", intValue);
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    intValue=T_CString_stringToInteger("100", 16);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(intValue != 256){
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****T_CString_stringToInteger(\"100\", 16) failed. Expected: 256, Got: %d\n", intValue);
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = T_CString_integerToString(src, 34556, 10);
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strcmp(src, "34556") != 0 || i != 5){
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****integerToString(src, 34566, 10); failed. Expected: \"34556\", Got: %s\n", src);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = T_CString_integerToString(src, 431, 16);
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_stricmp(src, "1AF") != 0 || i != 3){
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****integerToString(src, 431, 16); failed. Expected: \"1AF\", Got: %s\n", src);
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = T_CString_int64ToString(src, U_INT64_MAX, 10);
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strcmp(src,  "9223372036854775807") != 0 || i != 19){
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****integerToString(src, 9223372036854775807, 10); failed. Got: %s\n", src);
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = T_CString_int64ToString(src, U_INT64_MAX, 16);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_stricmp(src, "7FFFFFFFFFFFFFFF") != 0 || i != 16){
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ****integerToString(src, 7FFFFFFFFFFFFFFF, 16); failed. Got: %s\n", src);
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_strcpy(src, "this is lower case");
10883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if(uprv_stricmp(src, "THIS is lower CASE") != 0){
10983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: *****uprv_stricmp() failed.");
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
11183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp(NULL, "first string is null") )!= -1){
11283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp() where the first string is null failed. Expected: -1, returned %d\n", intValue);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
11483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp("second string is null", NULL)) != 1){
11583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue);
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
11783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp(NULL, NULL)) != 0){
11883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp(NULL, NULL) failed.  Expected:  0, returned %d\n", intValue);;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
12083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp("", "")) != 0){
12183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp(\"\", \"\") failed.  Expected:  0, returned %d\n", intValue);;
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
12383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp("", "abc")) != -1){
12483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp(\"\", \"abc\") failed.  Expected: -1, returned %d\n", intValue);
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
12683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_stricmp("abc", "")) != 1){
12783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp(\"abc\", \"\") failed.  Expected: 1, returned %d\n", intValue);
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp=uprv_strdup("strdup");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strcmp(temp, "strdup") !=0 ){
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: uprv_strdup() failed. Expected: \"strdup\", Got: %s\n", temp);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_free((char *)temp);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_strcpy(src, "this is lower case");
13783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if(uprv_strnicmp(src, "THIS", 4 ) != 0){
13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: *****uprv_strnicmp() failed.");
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp(NULL, "first string is null", 10) )!= -1){
14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_strnicmp() where the first string is null failed. Expected: -1, returned %d\n", intValue);
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp("second string is null", NULL, 10)) != 1){
14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue);
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp(NULL, NULL, 10)) != 0){
14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_strnicmp(NULL, NULL, 10) failed.  Expected:  0, returned %d\n", intValue);;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp("", "", 10)) != 0){
15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_strnicmp(\"\", \"\") failed.  Expected:  0, returned %d\n", intValue);;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
15283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp("", "abc", 10)) != -1){
15383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_stricmp(\"\", \"abc\", 10) failed.  Expected: -1, returned %d\n", intValue);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
15583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if((intValue=uprv_strnicmp("abc", "", 10)) != 1){
15683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        log_err("FAIL: uprv_strnicmp(\"abc\", \"\", 10) failed.  Expected: 1, returned %d\n", intValue);
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test invariant-character handling */
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestInvariant() {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* all invariant graphic chars and some control codes (not \n!) */
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char invariantChars[]=
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "\t\r \"%&'()*+,-./"
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0123456789:;<=>?"
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "abcdefghijklmnopqrstuvwxyz";
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar invariantUChars[]={
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        9, 0xd, 0x20, 0x22, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5f,
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char variantChars[]="\n!#$@[\\]^`{|}~";
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar variantUChars[]={
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0a, 0x21, 0x23, 0x24, 0x40, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar nonASCIIUChars[]={ 0x80, 0xa0, 0x900, 0xff51 };
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar us[120];
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char cs[120];
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* make sure that all invariant characters convert both ways */
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=sizeof(invariantChars);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_charsToUChars(invariantChars, us, length);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(us, invariantUChars)!=0) {
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_charsToUChars(invariantChars) failed\n");
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_UCharsToChars(invariantUChars, cs, length);
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(strcmp(cs, invariantChars)!=0) {
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_UCharsToChars(invariantUChars) failed\n");
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * make sure that variant characters convert from source code literals to Unicode
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * but not back to char *
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=sizeof(variantChars);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_charsToUChars(variantChars, us, length);
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(us, variantUChars)!=0) {
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_charsToUChars(variantChars) failed\n");
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef NDEBUG
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Test u_UCharsToChars(variantUChars) only in release mode because it will
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * cause an assertion failure in debug builds.
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_UCharsToChars(variantUChars, cs, length);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(cs[i]!=0) {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_UCharsToChars(variantUChars) converted the %d-th character to %02x instead of 00\n", i, cs[i]);
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Verify that invariant characters roundtrip from Unicode to the
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * default converter and back.
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UConverter *cnv;
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode errorCode;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cnv=ucnv_open(NULL, &errorCode);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unable to open the default converter\n");
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length=ucnv_fromUChars(cnv, cs, sizeof(cs), invariantUChars, -1, &errorCode);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(errorCode)) {
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_fromUChars(invariantUChars) failed - %s\n", u_errorName(errorCode));
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(length!=sizeof(invariantChars)-1 || strcmp(cs, invariantChars)!=0) {
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_fromUChars(invariantUChars) failed\n");
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errorCode=U_ZERO_ERROR;
250f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            length=ucnv_toUChars(cnv, us, UPRV_LENGTHOF(us), invariantChars, -1, &errorCode);
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(errorCode)) {
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_toUChars(invariantChars) failed - %s\n", u_errorName(errorCode));
253f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            } else if(length!=UPRV_LENGTHOF(invariantUChars)-1 || u_strcmp(us, invariantUChars)!=0) {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_toUChars(invariantChars) failed\n");
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* API tests */
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!uprv_isInvariantString(invariantChars, -1)) {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_isInvariantString(invariantChars) failed\n");
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!uprv_isInvariantUString(invariantUChars, -1)) {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_isInvariantUString(invariantUChars) failed\n");
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!uprv_isInvariantString(invariantChars+strlen(invariantChars), 1)) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("uprv_isInvariantString(\"\\0\") failed\n");
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<(sizeof(variantChars)-1); ++i) {
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_isInvariantString(variantChars+i, 1)) {
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uprv_isInvariantString(variantChars[%d]) failed\n", i);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_isInvariantUString(variantUChars+i, 1)) {
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uprv_isInvariantUString(variantUChars[%d]) failed\n", i);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for(i=0; i<UPRV_LENGTHOF(nonASCIIUChars); ++i) {
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uprv_isInvariantUString(nonASCIIUChars+i, 1)) {
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uprv_isInvariantUString(nonASCIIUChars[%d]) failed\n", i);
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
28750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t getSign(int32_t n) {
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(n<0) {
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return -1;
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if(n==0) {
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 1;
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoTestCompareInvEbcdicAsAscii() {
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const char *const invStrings[][2]={
30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* invariant-character strings in ascending ASCII order */
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* EBCDIC       native */
30327f654740f2a26ad62a5c155af9199af9e69b889claireho        { "",             "" },
30427f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x6c",         "%" },
30527f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xf0",         "0" },
30627f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xf0\xf0",     "00" },
30727f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xf0\xf0\x81", "00a" },
30827f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x7e",         "=" },
30927f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xc1",         "A" },
31027f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xc1\xf0\xf0", "A00" },
31127f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xc1\xf0\xf0", "A00" },
31227f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xc1\xc1",     "AA" },
31327f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\xc1\xc1\xf0", "AA0" },
31427f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x6d",         "_" },
31527f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81",         "a" },
31627f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\xf0\xf0", "a00" },
31727f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\xf0\xf0", "a00" },
31827f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\x81",     "aa" },
31927f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\x81\xf0", "aa0" },
32027f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\x81\x81", "aaa" },
32127f654740f2a26ad62a5c155af9199af9e69b889claireho        { "\x81\x81\x82", "aab" }
32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t i;
324f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    for(i=1; i<UPRV_LENGTHOF(invStrings); ++i) {
32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t diff1, diff2;
32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* compare previous vs. current */
32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        diff1=getSign(uprv_compareInvEbcdicAsAscii(invStrings[i-1][0], invStrings[i][0]));
32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(diff1>0 || (diff1==0 && 0!=uprv_strcmp(invStrings[i-1][0], invStrings[i][0]))) {
32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n",
33050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    invStrings[i-1][1], invStrings[i][1], (short)diff1);
33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
33250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* compare current vs. previous, should be inverse diff */
33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        diff2=getSign(uprv_compareInvEbcdicAsAscii(invStrings[i][0], invStrings[i-1][0]));
33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(diff2!=-diff1) {
33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n",
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    invStrings[i][1], invStrings[i-1][1], (short)diff2);
33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
340