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