1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 1998-2012, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File putiltst.c (Tests the API in putil)
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date          Name        Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   07/12/2000    Madhu       Creation
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/icudataver.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "putilimp.h"
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "toolutil.h"
2527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "uinvchar.h"
2627f654740f2a26ad62a5c155af9199af9e69b889claireho#include <stdio.h>
2727f654740f2a26ad62a5c155af9199af9e69b889claireho
28103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* See the comments on U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC. */
2954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestSignedRightShiftIsArithmetic(void) {
30103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t x=0xfff5fff3;
31103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t m=-1;
32103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t x4=x>>4;
33103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t m1=m>>1;
34103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UBool signedRightShiftIsArithmetic= x4==0xffff5fff && m1==-1;
35103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(signedRightShiftIsArithmetic==U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC) {
36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_info("signed right shift is Arithmetic Shift Right: %d\n",
37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                 signedRightShiftIsArithmetic);
38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
39103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("error: unexpected signed right shift is Arithmetic Shift Right: %d\n"
40103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                "       You need to change the value of U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC "
41103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                "for your platform.\n",
42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                signedRightShiftIsArithmetic);
43103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
44103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UBool compareWithNAN(double x, double y);
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void doAssert(double expect, double got, const char *message);
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestPUtilAPI(void){
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double  n1=0.0, y1=0.0, expn1, expy1;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double  value1 = 0.021;
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *str=0;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isTrue=FALSE;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_modf()\n");
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    y1 = uprv_modf(value1, &n1);
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=0;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expy1=0.021;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(y1 != expy1   || n1 != expn1){
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error in uprv_modf.  Expected IntegralValue=%f, Got=%f, \n Expected FractionalValue=%f, Got=%f\n",
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             expn1, n1, expy1, y1);
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
6427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(getTestOption(VERBOSITY_OPTION)){
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("[float]  x = %f  n = %f y = %f\n", value1, n1, y1);
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fmod()\n");
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_fmod(30.50, 15.00);
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, 0.5, "uprv_fmod(30.50, 15.00) failed.");
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_ceil()\n");
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_ceil(value1);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, 1, "uprv_ceil(0.021) failed.");
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_floor()\n");
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_floor(value1);
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, 0, "uprv_floor(0.021) failed.");
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fabs()\n");
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_fabs((2.02-1.345));
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, 0.675, "uprv_fabs(2.02-1.345) failed.");
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fmax()\n");
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_fmax(2.4, 1.2), 2.4, "uprv_fmax(2.4, 1.2) failed.");
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fmax() with x value= NaN\n");
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_fmax(uprv_getNaN(), 1.2);
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, uprv_getNaN(), "uprv_fmax(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fmin()\n");
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_fmin(2.4, 1.2), 1.2, "uprv_fmin(2.4, 1.2) failed.");
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_fmin() with x value= NaN\n");
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    expn1=uprv_fmin(uprv_getNaN(), 1.2);
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(expn1, uprv_getNaN(), "uprv_fmin(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_max()\n");
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_max(4, 2), 4, "uprv_max(4, 2) failed.");
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_min()\n");
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_min(-4, 2), -4, "uprv_min(-4, 2) failed.");
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_trunc()\n");
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_trunc(12.3456), 12, "uprv_trunc(12.3456) failed.");
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_trunc(12.234E2), 1223, "uprv_trunc(12.234E2) failed.");
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_trunc(uprv_getNaN()), uprv_getNaN(), "uprv_trunc(uprv_getNaN()) failed. with parameter=NaN");
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_trunc(uprv_getInfinity()), uprv_getInfinity(), "uprv_trunc(uprv_getInfinity()) failed. with parameter=Infinity");
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_pow10()\n");
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_pow10(4), 10000, "uprv_pow10(4) failed.");
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_isNegativeInfinity()\n");
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    isTrue=uprv_isNegativeInfinity(uprv_getInfinity() * -1);
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(isTrue != TRUE){
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: uprv_isNegativeInfinity failed.\n");
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_isPositiveInfinity()\n");
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    isTrue=uprv_isPositiveInfinity(uprv_getInfinity());
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(isTrue != TRUE){
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: uprv_isPositiveInfinity failed.\n");
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_isInfinite()\n");
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    isTrue=uprv_isInfinite(uprv_getInfinity());
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(isTrue != TRUE){
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: uprv_isInfinite failed.\n");
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API uprv_digitsAfterDecimal()....\n");
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(value1), 3, "uprv_digitsAfterDecimal() failed.");
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2345E-2) failed.");
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(-1.2345E-20), 24, "uprv_digitsAfterDecimal(1.2345E-20) failed.");
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(1.2345E20), 0, "uprv_digitsAfterDecimal(1.2345E20) failed.");
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed.");
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed.");
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed.");
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing the API u_errorName()...\n");
14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    str=(char*)u_errorName((UErrorCode)0);
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(strcmp(str, "U_ZERO_ERROR") != 0){
14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ERROR: u_getVersion() failed. Expected: U_ZERO_ERROR Got=%s\n",  str);
14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing the API u_errorName()...\n");
14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    str=(char*)u_errorName((UErrorCode)-127);
14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(strcmp(str, "U_USING_DEFAULT_WARNING") != 0){
15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ERROR: u_getVersion() failed. Expected: U_USING_DEFAULT_WARNING Got=%s\n",  str);
15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing the API u_errorName().. with BOGUS ERRORCODE...\n");
15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    str=(char*)u_errorName((UErrorCode)200);
15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(strcmp(str, "[BOGUS UErrorCode]") != 0){
15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("ERROR: u_getVersion() failed. Expected: [BOGUS UErrorCode] Got=%s\n",  str);
15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        const char* dataDirectory;
16085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        int32_t dataDirectoryLen;
16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar *udataDir=0;
16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar temp[100];
16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        char *charvalue=0;
16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Testing chars to UChars\n");
16585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
16685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         /* This cannot really work on a japanese system. u_uastrcpy will have different results than */
16785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* u_charsToUChars when there is a backslash in the string! */
16885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*dataDirectory=u_getDataDirectory();*/
16985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
17085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        dataDirectory="directory1";  /*no backslashes*/
17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        dataDirectoryLen=(int32_t)strlen(dataDirectory);
17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        udataDir=(UChar*)malloc(sizeof(UChar) * (dataDirectoryLen + 1));
17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        u_charsToUChars(dataDirectory, udataDir, (dataDirectoryLen + 1));
17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        u_uastrcpy(temp, dataDirectory);
17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(u_strcmp(temp, udataDir) != 0){
17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("ERROR: u_charsToUChars failed. Expected %s, Got %s\n", austrdup(temp), austrdup(udataDir));
17885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Testing UChars to chars\n");
18085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        charvalue=(char*)malloc(sizeof(char) * (u_strlen(udataDir) + 1));
18185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
18285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        u_UCharsToChars(udataDir, charvalue, (u_strlen(udataDir)+1));
18385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(strcmp(charvalue, dataDirectory) != 0){
18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_err("ERROR: u_UCharsToChars failed. Expected %s, Got %s\n", charvalue, dataDirectory);
18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        free(charvalue);
18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        free(udataDir);
18885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing uprv_timezone()....\n");
19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        int32_t tzoffset = uprv_timezone();
19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("Value returned from uprv_timezone = %d\n",  tzoffset);
19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (tzoffset != 28800) {
19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_verbose("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****");
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if ((tzoffset % 1800 != 0)) {
19827f654740f2a26ad62a5c155af9199af9e69b889claireho            log_info("Note: t_timezone offset of %ld (for %s : %s) is not a multiple of 30min.", tzoffset, uprv_tzname(0), uprv_tzname(1));
19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*tzoffset=uprv_getUTCtime();*/
20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestVersion(void)
20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UVersionInfo versionArray = {0x01, 0x00, 0x02, 0x02};
20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UVersionInfo versionArray2 = {0x01, 0x00, 0x02, 0x02};
20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    char versionString[17]; /* xxx.xxx.xxx.xxx\0 */
21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar versionUString[] = { 0x0031, 0x002E, 0x0030, 0x002E,
21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                               0x0032, 0x002E, 0x0038, 0x0000 }; /* 1.0.2.8 */
21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UVersionInfo version;
21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionToString().....\n");
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "1.0.2.2") != 0){
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. Expected: 1.0.2.2, Got=%s\n", versionString);
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(NULL, versionString);
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "") != 0){
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. with versionArray=NULL. It should just return\n");
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(NULL, versionString);
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "") != 0){
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed . It should just return\n");
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionToString().....with versionString=NULL\n");
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, NULL);
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "") != 0){
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. with versionArray=NULL  It should just return\n");
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[0] = 0x0a;
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionToString().....\n");
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "10.0.2.2") != 0){
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. Expected: 10.0.2.2, Got=%s\n", versionString);
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[0] = 0xa0;
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "160.0.2.2") != 0){
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. Expected: 160.0.2.2, Got=%s\n", versionString);
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[0] = 0xa0;
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[1] = 0xa0;
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "160.160.2.2") != 0){
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[0] = 0x01;
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    versionArray[1] = 0x0a;
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "1.10.2.2") != 0){
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionFromString() ....\n");
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionFromString(versionArray, "1.3.5.6");
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "1.3.5.6") != 0){
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_versionFromString() where versionArray=NULL....\n");
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionFromString(NULL, "1.3.5.6");
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, "1.3.5.6") != 0){
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing the API u_getVersion().....\n");
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_getVersion(versionArray);
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_versionToString(versionArray, versionString);
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(strcmp(versionString, U_ICU_VERSION) != 0){
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ERROR: u_getVersion() failed. Got=%s, expected %s\n",  versionString, U_ICU_VERSION);
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* test unicode */
27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    log_verbose("Testing u_versionFromUString...\n");
28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_versionFromString(versionArray,"1.0.2.8");
28185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_versionFromUString(versionArray2, versionUString);
28285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_versionToString(versionArray2, versionString);
28385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(memcmp(versionArray, versionArray2, sizeof(UVersionInfo))) {
28485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       log_err("FAIL: u_versionFromUString produced a different result - not 1.0.2.8 but %s [%x.%x.%x.%x]\n",
28585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho          versionString,
28685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (int)versionArray2[0],
28785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (int)versionArray2[1],
28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (int)versionArray2[2],
28985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        (int)versionArray2[3]);
29085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
29185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    else {
29285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       log_verbose(" from UString: %s\n", versionString);
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Test the data version API for better code coverage */
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    u_getDataVersion(version, &status);
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("ERROR: Unable to get data version. %s\n", u_errorName(status));
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
30085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestCompareVersions(void)
30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{
30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   /* use a 1d array to be palatable to java */
30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   const char *testCases[] = {
30685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      /*  v1          <|=|>       v2  */
30785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "0.0.0.0",    "=",        "0.0.0.0",
30885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "3.1.2.0",    ">",        "3.0.9.0",
30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "3.2.8.6",    "<",        "3.4",
31085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    "4.0",        ">",        "3.2",
31185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    NULL,        NULL,        NULL
31285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   };
31385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   const char *v1str;
31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   const char *opstr;
31585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   const char *v2str;
31685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   int32_t op, invop, got, invgot;
31785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   UVersionInfo v1, v2;
31885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   int32_t j;
31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   log_verbose("Testing memcmp()\n");
32085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   for(j=0;testCases[j]!=NULL;j+=3) {
32185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    v1str = testCases[j+0];
32285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    opstr = testCases[j+1];
32385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    v2str = testCases[j+2];
32485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    switch(opstr[0]) {
32585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '-':
32685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '<': op = -1; break;
32785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '0':
32885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '=': op = 0; break;
32985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '+':
33085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        case '>': op = 1; break;
33185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        default:  log_err("Bad operator at j/3=%d\n", (j/3)); return;
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
33385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    invop = 0-op; /* inverse operation: with v1 and v2 switched */
33485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_versionFromString(v1, v1str);
33585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    u_versionFromString(v2, v2str);
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    got = memcmp(v1, v2, sizeof(UVersionInfo));
33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    invgot = memcmp(v2, v1, sizeof(UVersionInfo)); /* Opposite */
33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if((got <= 0 && op <= 0) || (got >= 0 && op >= 0)) {
33985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("%d: %s %s %s, OK\n", (j/3), v1str, opstr, v2str);
34085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("%d: %s %s %s: wanted values of the same sign, %d got %d\n", (j/3), v1str, opstr, v2str, op, got);
34285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if((invgot >= 0 && invop >= 0) || (invgot <= 0 && invop <= 0)) {
34485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_verbose("%d: %s (%d) %s, OK (inverse)\n", (j/3), v2str, invop, v1str);
34585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    } else {
34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("%d: %s (%d) %s: wanted values of the same sign, %d got %d\n", (j/3), v2str, invop, v1str, invop, invgot);
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
34885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   }
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
35285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void testIEEEremainder()
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double    pinf        = uprv_getInfinity();
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double    ninf        = -uprv_getInfinity();
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double    nan         = uprv_getNaN();
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    double    pzero       = 0.0;*/
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    double    nzero       = 0.0;
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nzero *= -1;*/
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* simple remainder checks*/
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(7.0, 2.5, -0.5);
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(7.0, -2.5, -0.5);
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* this should work
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     remainderTest(43.7, 2.5, 1.2);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* infinity and real*/
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(1.0, pinf, 1.0);
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(1.0, ninf, 1.0);
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*test infinity and real*/
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(nan, 1.0, nan);
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(1.0, nan, nan);
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*test infinity and nan*/
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(ninf, nan, nan);
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(pinf, nan, nan);
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test infinity and zero */
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    remainderTest(pinf, pzero, 1.25);
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(pinf, nzero, 1.25);
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(ninf, pzero, 1.25);
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    remainderTest(ninf, nzero, 1.25); */
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void remainderTest(double x, double y, double exp)
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double result = uprv_IEEEremainder(x,y);
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(        uprv_isNaN(result) &&
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ! ( uprv_isNaN(x) || uprv_isNaN(y))) {
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: got NaN as result without NaN as argument");
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("      IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else if(!compareWithNAN(result, exp)) {
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL:  IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else{
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("OK: IEEEremainder(%f, %f) is %f\n", x, y, result);
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UBool compareWithNAN(double x, double y)
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if( uprv_isNaN(x) || uprv_isNaN(y) ) {
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(!uprv_isNaN(x) || !uprv_isNaN(y) ) {
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return FALSE;
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  else if (y != x) { /* no NaN's involved */
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return FALSE;
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  return TRUE;
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void doAssert(double got, double expect, const char *message)
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(! compareWithNAN(expect, got) ) {
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_err("ERROR :  %s. Expected : %lf, Got: %lf\n", message, expect, got);
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _CODE_ARR_LEN 8
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UErrorCode errorCode[_CODE_ARR_LEN] = {
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_USING_FALLBACK_WARNING,
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_STRING_NOT_TERMINATED_WARNING,
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_ILLEGAL_ARGUMENT_ERROR,
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_STATE_TOO_OLD_ERROR,
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_BAD_VARIABLE_DEFINITION,
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_RULE_MASK_ERROR,
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_UNEXPECTED_TOKEN,
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_UNSUPPORTED_ATTRIBUTE
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* str[] = {
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_USING_FALLBACK_WARNING",
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_STRING_NOT_TERMINATED_WARNING",
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_ILLEGAL_ARGUMENT_ERROR",
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_STATE_TOO_OLD_ERROR",
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_BAD_VARIABLE_DEFINITION",
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_RULE_MASK_ERROR",
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_UNEXPECTED_TOKEN",
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "U_UNSUPPORTED_ATTRIBUTE"
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestErrorName(void){
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t code=0;
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* errorName ;
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;code<U_ERROR_LIMIT;code++){
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorName = u_errorName((UErrorCode)code);
45650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(!errorName || errorName[0] == 0) {
45750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          log_err("Error:  u_errorName(0x%X) failed.\n",code);
45850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(code=0;code<_CODE_ARR_LEN; code++){
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errorName = u_errorName(errorCode[code]);
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(uprv_strcmp(str[code],errorName )!=0){
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Error : u_errorName failed. Expected: %s Got: %s \n",str[code],errorName);
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
46927f654740f2a26ad62a5c155af9199af9e69b889claireho#define AESTRNCPY_SIZE 13
47027f654740f2a26ad62a5c155af9199af9e69b889claireho
47127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char * dump_binline(uint8_t *bytes) {
47227f654740f2a26ad62a5c155af9199af9e69b889claireho  static char buf[512];
47327f654740f2a26ad62a5c155af9199af9e69b889claireho  int32_t i;
47427f654740f2a26ad62a5c155af9199af9e69b889claireho  for(i=0;i<13;i++) {
47527f654740f2a26ad62a5c155af9199af9e69b889claireho    sprintf(buf+(i*3), "%02x ", bytes[i]);
47627f654740f2a26ad62a5c155af9199af9e69b889claireho  }
47727f654740f2a26ad62a5c155af9199af9e69b889claireho  return buf;
47827f654740f2a26ad62a5c155af9199af9e69b889claireho}
47927f654740f2a26ad62a5c155af9199af9e69b889claireho
48027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void Test_aestrncpy(int32_t line, const uint8_t *expect, const uint8_t *src, int32_t len)
48127f654740f2a26ad62a5c155af9199af9e69b889claireho{
48227f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t str_buf[AESTRNCPY_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
48327f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t *ret;
48427f654740f2a26ad62a5c155af9199af9e69b889claireho
48527f654740f2a26ad62a5c155af9199af9e69b889claireho  log_verbose("\n%s:%d: Beginning test of uprv_aestrncpy(dst, src, %d)\n", __FILE__, line, len);
48627f654740f2a26ad62a5c155af9199af9e69b889claireho  ret = uprv_aestrncpy(str_buf, src, len);
48727f654740f2a26ad62a5c155af9199af9e69b889claireho  if(ret != str_buf) {
48827f654740f2a26ad62a5c155af9199af9e69b889claireho    log_err("\n%s:%d: FAIL: uprv_aestrncpy returned %p expected %p\n", __FILE__, line, (void*)ret, (void*)str_buf);
48927f654740f2a26ad62a5c155af9199af9e69b889claireho  }
49027f654740f2a26ad62a5c155af9199af9e69b889claireho  if(!uprv_memcmp(str_buf, expect, AESTRNCPY_SIZE)) {
49127f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("\n%s:%d: OK - compared OK.", __FILE__, line);
49227f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
49327f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
49427f654740f2a26ad62a5c155af9199af9e69b889claireho  } else {
49527f654740f2a26ad62a5c155af9199af9e69b889claireho    log_err    ("\n%s:%d: FAIL: uprv_aestrncpy output differs", __FILE__, line);
49627f654740f2a26ad62a5c155af9199af9e69b889claireho    log_err    ("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
49727f654740f2a26ad62a5c155af9199af9e69b889claireho    log_err    ("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
49827f654740f2a26ad62a5c155af9199af9e69b889claireho  }
49927f654740f2a26ad62a5c155af9199af9e69b889claireho}
50027f654740f2a26ad62a5c155af9199af9e69b889claireho
50127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestString(void)
50227f654740f2a26ad62a5c155af9199af9e69b889claireho{
50327f654740f2a26ad62a5c155af9199af9e69b889claireho
50427f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t str_tst[AESTRNCPY_SIZE] = { 0x81, 0x4b, 0x5c, 0x82, 0x25, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f };
50527f654740f2a26ad62a5c155af9199af9e69b889claireho
50627f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t str_exp1[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
50727f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t str_exp2[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
50827f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t str_exp3[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff };
50927f654740f2a26ad62a5c155af9199af9e69b889claireho
51027f654740f2a26ad62a5c155af9199af9e69b889claireho
51127f654740f2a26ad62a5c155af9199af9e69b889claireho
51227f654740f2a26ad62a5c155af9199af9e69b889claireho  /* test #1- copy with -1 length */
51327f654740f2a26ad62a5c155af9199af9e69b889claireho  Test_aestrncpy(__LINE__, str_exp1, str_tst, -1);
51427f654740f2a26ad62a5c155af9199af9e69b889claireho  Test_aestrncpy(__LINE__, str_exp1, str_tst, 6);
51527f654740f2a26ad62a5c155af9199af9e69b889claireho  Test_aestrncpy(__LINE__, str_exp2, str_tst, 5);
51627f654740f2a26ad62a5c155af9199af9e69b889claireho  Test_aestrncpy(__LINE__, str_exp3, str_tst, 8);
51727f654740f2a26ad62a5c155af9199af9e69b889claireho}
51827f654740f2a26ad62a5c155af9199af9e69b889claireho
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addPUtilTest(TestNode** root);
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void addToolUtilTests(TestNode** root);
52250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruaddPUtilTest(TestNode** root)
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
52685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    addTest(root, &TestVersion,       "putiltst/TestVersion");
52785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    addTest(root, &TestCompareVersions,       "putiltst/TestCompareVersions");
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    addTest(root, &testIEEEremainder,  "putiltst/testIEEEremainder"); */
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    addTest(root, &TestErrorName, "putiltst/TestErrorName");
53050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestPUtilAPI,       "putiltst/TestPUtilAPI");
53127f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestString,    "putiltst/TestString");
53250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addToolUtilTests(root);
53350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
53450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
53550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Tool Util Tests ================ */
53650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define TOOLUTIL_TESTBUF_SIZE 2048
53750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic char toolutil_testBuf[TOOLUTIL_TESTBUF_SIZE];
53850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char *NULLSTR="NULL";
53950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
54050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
54150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Normalize NULL to 'NULL'  for testing
54250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
54350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define STRNULL(x) ((x)?(x):NULLSTR)
54450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
54550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void toolutil_findBasename(void)
54650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  struct {
54850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *inBuf;
54950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expectResult;
55050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  } testCases[] = {
55150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
55350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      "pkgdata"
55450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
55550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING,
55750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ""
55850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
55950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
56050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
56150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      "pkgdata"
56250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
56350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING,
56550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ""
56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
56750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  };
56850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
56950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t i;
57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
57150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
57250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  log_verbose("Testing findBaseName()\n");
57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  for(i=0;i<count;i++) {
57450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *result;
57550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *input = STRNULL(testCases[i].inBuf);
57650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expect = STRNULL(testCases[i].expectResult);
57750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
57850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result = STRNULL(findBasename(testCases[i].inBuf));
57950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(result==expect||!strcmp(result,expect)) {
58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_verbose(" -> %s PASS\n", result);
58150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
58250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
58350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
58550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
58650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
58750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
58850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void toolutil_findDirname(void)
58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int i;
59150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  struct {
59250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *inBuf;
59350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t outBufLen;
59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode expectStatus;
59550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expectResult;
59650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  } testCases[] = {
59750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
59850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
59950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin",
60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
60450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      2,
60650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_BUFFER_OVERFLOW_ERROR,
60750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      NULL
60850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
60950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
61050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
61150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
61250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
61450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
61550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
61650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
61750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      2,
61850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_BUFFER_OVERFLOW_ERROR,
61950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      NULL
62050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
62150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
62250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
62350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
62450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
62550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
62650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
62750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
62850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
62950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
63150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin"
63250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
63550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      2,
63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_BUFFER_OVERFLOW_ERROR,
63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      NULL
63850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
63950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
64050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING "vmlinuz",
64150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
64250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
64350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_ALT_SEP_STRING
64450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
64550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
64650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING "vmlinux",
64750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      200,
64850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
64950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_FILE_SEP_STRING
65050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
65150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
65250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      "pkgdata",
65350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      0,
65450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_BUFFER_OVERFLOW_ERROR,
65550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      NULL
65650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    },
65750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
65850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      "pkgdata",
65950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      2,
66050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      U_ZERO_ERROR,
661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      ""
66250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
66350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  };
66450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
66550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
66650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  log_verbose("Testing findDirname()\n");
66750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  for(i=0;i<count;i++) {
66850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *result;
66950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *input = STRNULL(testCases[i].inBuf);
67050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expect = STRNULL(testCases[i].expectResult);
67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
67250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uprv_memset(toolutil_testBuf, 0x55, TOOLUTIL_TESTBUF_SIZE);
67350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
67450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result = STRNULL(findDirname(testCases[i].inBuf, toolutil_testBuf, testCases[i].outBufLen, &status));
67650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose(" -> %s, \n", u_errorName(status));
67750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(status != testCases[i].expectStatus) {
67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_verbose("FAIL: Test case [%d/%d]: %s got error code %s but expected %s\n", i, count-1, input, u_errorName(status), u_errorName(testCases[i].expectStatus));
67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
68050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(result==expect||!strcmp(result,expect)) {
68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_verbose(" = -> %s \n", result);
68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
69050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void addToolUtilTests(TestNode** root) {
69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &toolutil_findBasename,       "putiltst/toolutil/findBasename");
69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &toolutil_findDirname,       "putiltst/toolutil/findDirname");
693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    addTest(root, &TestSignedRightShiftIsArithmetic, "putiltst/toolutil/TestSignedRightShiftIsArithmetic");
69450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  /*
69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Not yet tested:
69650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
69750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &toolutil_getLongPathname,       "putiltst/toolutil/getLongPathname");
69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &toolutil_getCurrentYear,       "putiltst/toolutil/getCurrentYear");
69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &toolutil_UToolMemory,       "putiltst/toolutil/UToolMemory");
70050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  */
70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
702