16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1998-2012, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File putiltst.c (Tests the API in putil)
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date          Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   07/12/2000    Madhu       Creation
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/icudataver.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "toolutil.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uinvchar.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* See the comments on U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC. */
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSignedRightShiftIsArithmetic(void) {
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t x=0xfff5fff3;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t m=-1;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t x4=x>>4;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t m1=m>>1;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool signedRightShiftIsArithmetic= x4==0xffff5fff && m1==-1;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(signedRightShiftIsArithmetic==U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC) {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_info("signed right shift is Arithmetic Shift Right: %d\n",
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 signedRightShiftIsArithmetic);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error: unexpected signed right shift is Arithmetic Shift Right: %d\n"
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "       You need to change the value of U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC "
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "for your platform.\n",
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                signedRightShiftIsArithmetic);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool compareWithNAN(double x, double y);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doAssert(double expect, double got, const char *message);
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPUtilAPI(void){
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double  n1=0.0, y1=0.0, expn1, expy1;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double  value1 = 0.021;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *str=0;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isTrue=FALSE;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_modf()\n");
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y1 = uprv_modf(value1, &n1);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=0;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expy1=0.021;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(y1 != expy1   || n1 != expn1){
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in uprv_modf.  Expected IntegralValue=%f, Got=%f, \n Expected FractionalValue=%f, Got=%f\n",
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             expn1, n1, expy1, y1);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(getTestOption(VERBOSITY_OPTION)){
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("[float]  x = %f  n = %f y = %f\n", value1, n1, y1);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fmod()\n");
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_fmod(30.50, 15.00);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, 0.5, "uprv_fmod(30.50, 15.00) failed.");
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_ceil()\n");
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_ceil(value1);
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, 1, "uprv_ceil(0.021) failed.");
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_floor()\n");
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_floor(value1);
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, 0, "uprv_floor(0.021) failed.");
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fabs()\n");
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_fabs((2.02-1.345));
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, 0.675, "uprv_fabs(2.02-1.345) failed.");
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fmax()\n");
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_fmax(2.4, 1.2), 2.4, "uprv_fmax(2.4, 1.2) failed.");
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fmax() with x value= NaN\n");
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_fmax(uprv_getNaN(), 1.2);
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, uprv_getNaN(), "uprv_fmax(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fmin()\n");
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_fmin(2.4, 1.2), 1.2, "uprv_fmin(2.4, 1.2) failed.");
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_fmin() with x value= NaN\n");
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expn1=uprv_fmin(uprv_getNaN(), 1.2);
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(expn1, uprv_getNaN(), "uprv_fmin(uprv_getNaN(), 1.2) failed. when one parameter is NaN");
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_max()\n");
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_max(4, 2), 4, "uprv_max(4, 2) failed.");
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_min()\n");
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_min(-4, 2), -4, "uprv_min(-4, 2) failed.");
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_trunc()\n");
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_trunc(12.3456), 12, "uprv_trunc(12.3456) failed.");
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_trunc(12.234E2), 1223, "uprv_trunc(12.234E2) failed.");
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_trunc(uprv_getNaN()), uprv_getNaN(), "uprv_trunc(uprv_getNaN()) failed. with parameter=NaN");
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_trunc(uprv_getInfinity()), uprv_getInfinity(), "uprv_trunc(uprv_getInfinity()) failed. with parameter=Infinity");
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_pow10()\n");
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_pow10(4), 10000, "uprv_pow10(4) failed.");
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_isNegativeInfinity()\n");
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    isTrue=uprv_isNegativeInfinity(uprv_getInfinity() * -1);
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(isTrue != TRUE){
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: uprv_isNegativeInfinity failed.\n");
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_isPositiveInfinity()\n");
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    isTrue=uprv_isPositiveInfinity(uprv_getInfinity());
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(isTrue != TRUE){
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: uprv_isPositiveInfinity failed.\n");
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_isInfinite()\n");
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    isTrue=uprv_isInfinite(uprv_getInfinity());
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(isTrue != TRUE){
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: uprv_isInfinite failed.\n");
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API uprv_digitsAfterDecimal()....\n");
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(value1), 3, "uprv_digitsAfterDecimal() failed.");
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(1.2345E-2), 6, "uprv_digitsAfterDecimal(1.2345E-2) failed.");
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed.");
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(-1.2345E-20), 24, "uprv_digitsAfterDecimal(1.2345E-20) failed.");
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(1.2345E20), 0, "uprv_digitsAfterDecimal(1.2345E20) failed.");
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed.");
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed.");
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed.");
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_errorName()...\n");
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str=(char*)u_errorName((UErrorCode)0);
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(str, "U_ZERO_ERROR") != 0){
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Expected: U_ZERO_ERROR Got=%s\n",  str);
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_errorName()...\n");
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str=(char*)u_errorName((UErrorCode)-127);
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(str, "U_USING_DEFAULT_WARNING") != 0){
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Expected: U_USING_DEFAULT_WARNING Got=%s\n",  str);
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_errorName().. with BOGUS ERRORCODE...\n");
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str=(char*)u_errorName((UErrorCode)200);
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(str, "[BOGUS UErrorCode]") != 0){
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Expected: [BOGUS UErrorCode] Got=%s\n",  str);
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* dataDirectory;
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t dataDirectoryLen;
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar *udataDir=0;
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar temp[100];
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char *charvalue=0;
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing chars to UChars\n");
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         /* This cannot really work on a japanese system. u_uastrcpy will have different results than */
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* u_charsToUChars when there is a backslash in the string! */
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*dataDirectory=u_getDataDirectory();*/
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataDirectory="directory1";  /*no backslashes*/
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataDirectoryLen=(int32_t)strlen(dataDirectory);
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udataDir=(UChar*)malloc(sizeof(UChar) * (dataDirectoryLen + 1));
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_charsToUChars(dataDirectory, udataDir, (dataDirectoryLen + 1));
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrcpy(temp, dataDirectory);
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u_strcmp(temp, udataDir) != 0){
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ERROR: u_charsToUChars failed. Expected %s, Got %s\n", austrdup(temp), austrdup(udataDir));
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing UChars to chars\n");
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        charvalue=(char*)malloc(sizeof(char) * (u_strlen(udataDir) + 1));
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_UCharsToChars(udataDir, charvalue, (u_strlen(udataDir)+1));
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strcmp(charvalue, dataDirectory) != 0){
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ERROR: u_UCharsToChars failed. Expected %s, Got %s\n", charvalue, dataDirectory);
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(charvalue);
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(udataDir);
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing uprv_timezone()....\n");
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t tzoffset = uprv_timezone();
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Value returned from uprv_timezone = %d\n",  tzoffset);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (tzoffset != 28800) {
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****");
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ((tzoffset % 1800 != 0)) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_info("Note: t_timezone offset of %ld (for %s : %s) is not a multiple of 30min.", tzoffset, uprv_tzname(0), uprv_tzname(1));
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*tzoffset=uprv_getUTCtime();*/
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestVersion(void)
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo versionArray = {0x01, 0x00, 0x02, 0x02};
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo versionArray2 = {0x01, 0x00, 0x02, 0x02};
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char versionString[17]; /* xxx.xxx.xxx.xxx\0 */
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar versionUString[] = { 0x0031, 0x002E, 0x0030, 0x002E,
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               0x0032, 0x002E, 0x0038, 0x0000 }; /* 1.0.2.8 */
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVersionInfo version;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionToString().....\n");
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "1.0.2.2") != 0){
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. Expected: 1.0.2.2, Got=%s\n", versionString);
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(NULL, versionString);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "") != 0){
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. with versionArray=NULL. It should just return\n");
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionToString().....with versionArray=NULL\n");
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(NULL, versionString);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "") != 0){
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed . It should just return\n");
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionToString().....with versionString=NULL\n");
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, NULL);
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "") != 0){
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. with versionArray=NULL  It should just return\n");
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[0] = 0x0a;
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionToString().....\n");
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "10.0.2.2") != 0){
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. Expected: 10.0.2.2, Got=%s\n", versionString);
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[0] = 0xa0;
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "160.0.2.2") != 0){
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. Expected: 160.0.2.2, Got=%s\n", versionString);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[0] = 0xa0;
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[1] = 0xa0;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "160.160.2.2") != 0){
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[0] = 0x01;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    versionArray[1] = 0x0a;
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "1.10.2.2") != 0){
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_versionToString() failed. Expected: 160.160.2.2, Got=%s\n", versionString);
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionFromString() ....\n");
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(versionArray, "1.3.5.6");
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "1.3.5.6") != 0){
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_versionFromString() where versionArray=NULL....\n");
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(NULL, "1.3.5.6");
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, "1.3.5.6") != 0){
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Expected: 1.3.5.6, Got=%s\n",  versionString);
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing the API u_getVersion().....\n");
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getVersion(versionArray);
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray, versionString);
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strcmp(versionString, U_ICU_VERSION) != 0){
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ERROR: u_getVersion() failed. Got=%s, expected %s\n",  versionString, U_ICU_VERSION);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test unicode */
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing u_versionFromUString...\n");
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(versionArray,"1.0.2.8");
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromUString(versionArray2, versionUString);
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionToString(versionArray2, versionString);
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(memcmp(versionArray, versionArray2, sizeof(UVersionInfo))) {
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("FAIL: u_versionFromUString produced a different result - not 1.0.2.8 but %s [%x.%x.%x.%x]\n",
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          versionString,
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (int)versionArray2[0],
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (int)versionArray2[1],
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (int)versionArray2[2],
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (int)versionArray2[3]);
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_verbose(" from UString: %s\n", versionString);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test the data version API for better code coverage */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getDataVersion(version, &status);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ERROR: Unable to get data version. %s\n", u_errorName(status));
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCompareVersions(void)
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   /* use a 1d array to be palatable to java */
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   const char *testCases[] = {
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /*  v1          <|=|>       v2  */
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "0.0.0.0",    "=",        "0.0.0.0",
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "3.1.2.0",    ">",        "3.0.9.0",
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "3.2.8.6",    "<",        "3.4",
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "4.0",        ">",        "3.2",
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    NULL,        NULL,        NULL
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   };
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   const char *v1str;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   const char *opstr;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   const char *v2str;
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   int32_t op, invop, got, invgot;
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   UVersionInfo v1, v2;
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   int32_t j;
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   log_verbose("Testing memcmp()\n");
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   for(j=0;testCases[j]!=NULL;j+=3) {
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    v1str = testCases[j+0];
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    opstr = testCases[j+1];
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    v2str = testCases[j+2];
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(opstr[0]) {
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '-':
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '<': op = -1; break;
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '0':
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '=': op = 0; break;
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '+':
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case '>': op = 1; break;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:  log_err("Bad operator at j/3=%d\n", (j/3)); return;
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    invop = 0-op; /* inverse operation: with v1 and v2 switched */
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(v1, v1str);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_versionFromString(v2, v2str);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    got = memcmp(v1, v2, sizeof(UVersionInfo));
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    invgot = memcmp(v2, v1, sizeof(UVersionInfo)); /* Opposite */
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((got <= 0 && op <= 0) || (got >= 0 && op >= 0)) {
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%d: %s %s %s, OK\n", (j/3), v1str, opstr, v2str);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%d: %s %s %s: wanted values of the same sign, %d got %d\n", (j/3), v1str, opstr, v2str, op, got);
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((invgot >= 0 && invop >= 0) || (invgot <= 0 && invop <= 0)) {
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%d: %s (%d) %s, OK (inverse)\n", (j/3), v2str, invop, v1str);
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%d: %s (%d) %s: wanted values of the same sign, %d got %d\n", (j/3), v2str, invop, v1str, invop, invgot);
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testIEEEremainder()
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double    pinf        = uprv_getInfinity();
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double    ninf        = -uprv_getInfinity();
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double    nan         = uprv_getNaN();
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    double    pzero       = 0.0;*/
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    double    nzero       = 0.0;
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    nzero *= -1;*/
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /* simple remainder checks*/
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(7.0, 2.5, -0.5);
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(7.0, -2.5, -0.5);
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /* this should work
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     remainderTest(43.7, 2.5, 1.2);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* infinity and real*/
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(1.0, pinf, 1.0);
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(1.0, ninf, 1.0);
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*test infinity and real*/
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(nan, 1.0, nan);
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(1.0, nan, nan);
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*test infinity and nan*/
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(ninf, nan, nan);
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(pinf, nan, nan);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test infinity and zero */
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    remainderTest(pinf, pzero, 1.25);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(pinf, nzero, 1.25);
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(ninf, pzero, 1.25);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    remainderTest(ninf, nzero, 1.25); */
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void remainderTest(double x, double y, double exp)
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double result = uprv_IEEEremainder(x,y);
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(        uprv_isNaN(result) &&
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ! ( uprv_isNaN(x) || uprv_isNaN(y))) {
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: got NaN as result without NaN as argument");
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("      IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if(!compareWithNAN(result, exp)) {
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL:  IEEEremainder(%f, %f) is %f, expected %f\n", x, y, result, exp);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else{
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("OK: IEEEremainder(%f, %f) is %f\n", x, y, result);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool compareWithNAN(double x, double y)
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if( uprv_isNaN(x) || uprv_isNaN(y) ) {
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!uprv_isNaN(x) || !uprv_isNaN(y) ) {
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return FALSE;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  else if (y != x) { /* no NaN's involved */
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return TRUE;
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doAssert(double got, double expect, const char *message)
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(! compareWithNAN(expect, got) ) {
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("ERROR :  %s. Expected : %lf, Got: %lf\n", message, expect, got);
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _CODE_ARR_LEN 8
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UErrorCode errorCode[_CODE_ARR_LEN] = {
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_USING_FALLBACK_WARNING,
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_NOT_TERMINATED_WARNING,
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_ILLEGAL_ARGUMENT_ERROR,
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STATE_TOO_OLD_ERROR,
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_BAD_VARIABLE_DEFINITION,
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_RULE_MASK_ERROR,
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_UNEXPECTED_TOKEN,
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_UNSUPPORTED_ATTRIBUTE
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* str[] = {
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_USING_FALLBACK_WARNING",
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_STRING_NOT_TERMINATED_WARNING",
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_ILLEGAL_ARGUMENT_ERROR",
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_STATE_TOO_OLD_ERROR",
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_BAD_VARIABLE_DEFINITION",
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_RULE_MASK_ERROR",
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_UNEXPECTED_TOKEN",
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "U_UNSUPPORTED_ATTRIBUTE"
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestErrorName(void){
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t code=0;
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* errorName ;
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;code<U_ERROR_LIMIT;code++){
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorName = u_errorName((UErrorCode)code);
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!errorName || errorName[0] == 0) {
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_err("Error:  u_errorName(0x%X) failed.\n",code);
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(code=0;code<_CODE_ARR_LEN; code++){
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorName = u_errorName(errorCode[code]);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(uprv_strcmp(str[code],errorName )!=0){
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error : u_errorName failed. Expected: %s Got: %s \n",str[code],errorName);
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define AESTRNCPY_SIZE 13
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char * dump_binline(uint8_t *bytes) {
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static char buf[512];
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<13;i++) {
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(buf+(i*3), "%02x ", bytes[i]);
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return buf;
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void Test_aestrncpy(int32_t line, const uint8_t *expect, const uint8_t *src, int32_t len)
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t str_buf[AESTRNCPY_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t *ret;
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("\n%s:%d: Beginning test of uprv_aestrncpy(dst, src, %d)\n", __FILE__, line, len);
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ret = uprv_aestrncpy(str_buf, src, len);
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(ret != str_buf) {
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("\n%s:%d: FAIL: uprv_aestrncpy returned %p expected %p\n", __FILE__, line, (void*)ret, (void*)str_buf);
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!uprv_memcmp(str_buf, expect, AESTRNCPY_SIZE)) {
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n%s:%d: OK - compared OK.", __FILE__, line);
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err    ("\n%s:%d: FAIL: uprv_aestrncpy output differs", __FILE__, line);
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err    ("\n%s:%d:         expected: %s", __FILE__, line, dump_binline((uint8_t *)expect));
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err    ("\n%s:%d:         got     : %s\n", __FILE__, line, dump_binline(str_buf));
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestString(void)
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t str_tst[AESTRNCPY_SIZE] = { 0x81, 0x4b, 0x5c, 0x82, 0x25, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f };
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t str_exp1[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t str_exp2[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t str_exp3[AESTRNCPY_SIZE] = { 0x61, 0x2e, 0x2a, 0x62, 0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff };
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* test #1- copy with -1 length */
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Test_aestrncpy(__LINE__, str_exp1, str_tst, -1);
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Test_aestrncpy(__LINE__, str_exp1, str_tst, 6);
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Test_aestrncpy(__LINE__, str_exp2, str_tst, 5);
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Test_aestrncpy(__LINE__, str_exp3, str_tst, 8);
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addPUtilTest(TestNode** root);
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void addToolUtilTests(TestNode** root);
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddPUtilTest(TestNode** root)
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestVersion,       "putiltst/TestVersion");
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCompareVersions,       "putiltst/TestCompareVersions");
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*    addTest(root, &testIEEEremainder,  "putiltst/testIEEEremainder"); */
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestErrorName, "putiltst/TestErrorName");
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPUtilAPI,       "putiltst/TestPUtilAPI");
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestString,    "putiltst/TestString");
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addToolUtilTests(root);
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Tool Util Tests ================ */
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TOOLUTIL_TESTBUF_SIZE 2048
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char toolutil_testBuf[TOOLUTIL_TESTBUF_SIZE];
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *NULLSTR="NULL";
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Normalize NULL to 'NULL'  for testing
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STRNULL(x) ((x)?(x):NULLSTR)
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void toolutil_findBasename(void)
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  struct {
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *inBuf;
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expectResult;
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } testCases[] = {
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "pkgdata"
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING,
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ""
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "pkgdata"
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING,
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ""
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  };
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("Testing findBaseName()\n");
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<count;i++) {
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *result;
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *input = STRNULL(testCases[i].inBuf);
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expect = STRNULL(testCases[i].expectResult);
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = STRNULL(findBasename(testCases[i].inBuf));
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(result==expect||!strcmp(result,expect)) {
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_verbose(" -> %s PASS\n", result);
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void toolutil_findDirname(void)
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int i;
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  struct {
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *inBuf;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t outBufLen;
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode expectStatus;
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expectResult;
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } testCases[] = {
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin",
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      2,
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_BUFFER_OVERFLOW_ERROR,
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      NULL
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      2,
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_BUFFER_OVERFLOW_ERROR,
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      NULL
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_SEP_STRING "pkgdata",
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin"
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_SEP_STRING "bin"
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "usr" U_FILE_ALT_SEP_STRING "bin" U_FILE_ALT_SEP_STRING "pkgdata",
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      2,
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_BUFFER_OVERFLOW_ERROR,
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      NULL
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING "vmlinuz",
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_ALT_SEP_STRING
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING "vmlinux",
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      200,
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_FILE_SEP_STRING
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "pkgdata",
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      0,
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_BUFFER_OVERFLOW_ERROR,
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      NULL
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      "pkgdata",
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      2,
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      U_ZERO_ERROR,
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ""
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  };
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t count=(sizeof(testCases)/sizeof(testCases[0]));
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("Testing findDirname()\n");
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<count;i++) {
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *result;
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *input = STRNULL(testCases[i].inBuf);
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expect = STRNULL(testCases[i].expectResult);
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_memset(toolutil_testBuf, 0x55, TOOLUTIL_TESTBUF_SIZE);
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Test case [%d/%d]: %s\n", i, count-1, input);
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = STRNULL(findDirname(testCases[i].inBuf, toolutil_testBuf, testCases[i].outBufLen, &status));
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose(" -> %s, \n", u_errorName(status));
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status != testCases[i].expectStatus) {
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      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));
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(result==expect||!strcmp(result,expect)) {
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_verbose(" = -> %s \n", result);
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("FAIL: Test case [%d/%d]: %s -> %s but expected %s\n", i, count-1, input, result, expect);
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void addToolUtilTests(TestNode** root) {
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &toolutil_findBasename,       "putiltst/toolutil/findBasename");
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &toolutil_findDirname,       "putiltst/toolutil/findDirname");
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestSignedRightShiftIsArithmetic, "putiltst/toolutil/TestSignedRightShiftIsArithmetic");
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Not yet tested:
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &toolutil_getLongPathname,       "putiltst/toolutil/getLongPathname");
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &toolutil_getCurrentYear,       "putiltst/toolutil/getCurrentYear");
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &toolutil_UToolMemory,       "putiltst/toolutil/UToolMemory");
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  */
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
702