2000-05-15 18:39:17 +00:00
/********************************************************************
* COPYRIGHT :
* Copyright ( c ) 1997 - 1999 , International Business Machines Corporation and
* others . All Rights Reserved .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/********************************************************************************
*
* File CRESTST . C
*
* Modification History :
2000-05-24 23:42:34 +00:00
* Name Date Description
* Madhu Katragadda 05 / 09 / 2000 Ported Tests for New ResourceBundle API
* Madhu Katragadda 05 / 24 / 2000 Added new tests to test RES_BINARY for collationElements
2000-05-15 18:39:17 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
2000-08-28 21:43:03 +00:00
# include <stdlib.h>
# include <stdio.h>
# include <time.h>
2000-05-15 18:39:17 +00:00
# include "unicode/utypes.h"
# include "cintltst.h"
# include "unicode/utypes.h"
# include "unicode/ustring.h"
# include "string.h"
# include "cstring.h"
# define RESTEST_HEAP_CHECK 0
# include "unicode/uloc.h"
# include "unicode/ures.h"
# include "creststn.h"
# include "unicode/ctest.h"
/*****************************************************************************/
/**
* Return a random unsigned long l where 0 N < = l < = ULONG_MAX .
*/
static uint32_t
randul ( )
{
2000-08-14 17:13:09 +00:00
uint32_t l = 0 ;
2000-08-09 23:34:41 +00:00
int32_t i ;
2000-05-18 22:08:39 +00:00
static UBool initialized = FALSE ;
2000-05-15 18:39:17 +00:00
if ( ! initialized )
{
srand ( ( unsigned ) time ( NULL ) ) ;
initialized = TRUE ;
}
2000-05-15 22:22:48 +00:00
/* Assume rand has at least 12 bits of precision */
2000-05-15 18:39:17 +00:00
2000-08-21 22:28:56 +00:00
for ( i = 0 ; i < sizeof ( l ) ; + + i )
( ( char * ) & l ) [ i ] = ( char ) ( ( rand ( ) & 0x0FF0 ) > > 4 ) ;
2000-05-15 18:39:17 +00:00
return l ;
}
/**
* Return a random double x where 0.0 < = x < 1.0 .
*/
static double
randd ( )
{
return ( ( double ) randul ( ) ) / ULONG_MAX ;
}
/**
* Return a random integer i where 0 < = i < n .
*/
static int32_t randi ( int32_t n )
{
return ( int32_t ) ( randd ( ) * n ) ;
}
2000-05-15 22:22:48 +00:00
/***************************************************************************************/
2000-05-15 18:39:17 +00:00
/**
* Convert an integer , positive or negative , to a character string radix 10.
*/
static char *
itoa1 ( int32_t i , char * buf )
{
char * p = 0 ;
char * result = buf ;
/* Handle negative */
if ( i < 0 ) {
* buf + + = ' - ' ;
i = - i ;
}
/* Output digits in reverse order */
p = buf ;
do {
2000-08-09 23:34:41 +00:00
* p + + = ( char ) ( ' 0 ' + ( i % 10 ) ) ;
2000-05-15 18:39:17 +00:00
i / = 10 ;
}
while ( i ) ;
* p - - = 0 ;
/* Reverse the string */
while ( buf < p ) {
char c = * buf ;
* buf + + = * p ;
* p - - = c ;
}
return result ;
}
static const int32_t kERROR_COUNT = - 1234567 ;
static const UChar kERROR [ ] = { 0x0045 /*E*/ , 0x0052 /*'R'*/ , 0x0052 /*'R'*/ ,
0x004F /*'O'*/ , 0x0052 /*'R'*/ , 0x0000 /*'\0'*/ } ;
/*****************************************************************************/
enum E_Where
{
e_Root ,
e_te ,
e_te_IN ,
e_Where_count
} ;
typedef enum E_Where E_Where ;
/*****************************************************************************/
# define CONFIRM_EQ(actual,expected) if (u_strcmp(expected,actual)==0){ record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, austrdup(actual), austrdup(expected)); pass=FALSE; }
# define CONFIRM_INT_EQ(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of %d\n", action, actual, expected); pass=FALSE; }
# define CONFIRM_INT_GE(actual,expected) if ((actual)>=(expected)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of x >= %d\n", action, actual, expected); pass=FALSE; }
# define CONFIRM_INT_NE(actual,expected) if ((expected)!=(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %d instead of x != %d\n", action, actual, expected); pass=FALSE; }
# define CONFIRM_ErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); log_err("%s returned %s instead of %s\n", action, myErrorName(actual), myErrorName(expected)); pass=FALSE; }
/* Array of our test objects */
static struct
{
const char * name ;
UErrorCode expected_constructor_status ;
E_Where where ;
2000-05-18 22:08:39 +00:00
UBool like [ e_Where_count ] ;
UBool inherits [ e_Where_count ] ;
2000-05-15 18:39:17 +00:00
}
param [ ] =
{
/* "te" means test */
/* "IN" means inherits */
/* "NE" or "ne" means "does not exist" */
{ " root " , U_ZERO_ERROR , e_Root , { TRUE , FALSE , FALSE } , { TRUE , FALSE , FALSE } } ,
{ " te " , U_ZERO_ERROR , e_te , { FALSE , TRUE , FALSE } , { TRUE , TRUE , FALSE } } ,
{ " te_IN " , U_ZERO_ERROR , e_te_IN , { FALSE , FALSE , TRUE } , { TRUE , TRUE , TRUE } } ,
{ " te_NE " , U_USING_FALLBACK_ERROR , e_te , { FALSE , TRUE , FALSE } , { TRUE , TRUE , FALSE } } ,
{ " te_IN_NE " , U_USING_FALLBACK_ERROR , e_te_IN , { FALSE , FALSE , TRUE } , { TRUE , TRUE , TRUE } } ,
{ " ne " , U_USING_DEFAULT_ERROR , e_Root , { TRUE , FALSE , FALSE } , { TRUE , FALSE , FALSE } }
} ;
static int32_t bundles_count = sizeof ( param ) / sizeof ( param [ 0 ] ) ;
static void printUChars ( UChar * ) ;
/***************************************************************************************/
/* Array of our test objects */
void addNEWResourceBundleTest ( TestNode * * root )
{
2000-08-28 21:43:03 +00:00
addTest ( root , & TestConstruction1 , " tsutil/creststn/TestConstruction1 " ) ;
addTest ( root , & TestConstruction2 , " tsutil/creststn/TestConstruction2 " ) ;
addTest ( root , & TestResourceBundles , " tsutil/creststn/TestResourceBundle " ) ;
addTest ( root , & TestFallback , " tsutil/creststn/TestFallback " ) ;
addTest ( root , & TestAliasConflict , " tsutil/creststn/TestAlias " ) ;
addTest ( root , & TestNewTypes , " tsutil/creststn/TestNewTypes " ) ;
addTest ( root , & TestBinaryCollationData , " tsutil/creststn/TestBinaryCollationData " ) ;
addTest ( root , & TestAPI , " tsutil/creststn/TestAPI " ) ;
addTest ( root , & TestErrorConditions , " tsutil/creststn/TestErrorConditions " ) ;
2000-05-15 18:39:17 +00:00
}
/***************************************************************************************/
2000-11-21 04:05:39 +00:00
static void TestAliasConflict ( void ) {
2000-05-15 18:39:17 +00:00
UErrorCode status = U_ZERO_ERROR ;
UResourceBundle * he = NULL ;
UResourceBundle * iw = NULL ;
const UChar * result = NULL ;
2000-08-28 21:43:03 +00:00
2000-05-15 18:39:17 +00:00
he = ures_open ( NULL , " he " , & status ) ;
iw = ures_open ( NULL , " iw " , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " Failed to get resource with %s " , myErrorName ( status ) ) ;
}
ures_close ( iw ) ;
result = ures_get ( he , " ShortLanguage " , & status ) ;
if ( U_FAILURE ( status ) | | result = = NULL ) {
log_err ( " Failed to get resource with %s " , myErrorName ( status ) ) ;
}
ures_close ( he ) ;
}
2000-11-21 04:05:39 +00:00
static void TestNewTypes ( ) {
2000-08-28 21:43:03 +00:00
UResourceBundle * theBundle = NULL ;
char action [ 256 ] ;
char testdatapath [ 256 ] ;
2000-12-03 04:07:13 +00:00
const char * directory = u_getDataDirectory ( ) ;
2000-08-28 21:43:03 +00:00
UErrorCode status = U_ZERO_ERROR ;
UResourceBundle * res = NULL ;
uint8_t * binResult = NULL ;
int32_t len = 0 ;
int32_t i = 0 ;
int32_t intResult = 0 ;
strcpy ( action , " Construction of testtypes bundle " ) ;
strcpy ( testdatapath , directory ) ;
strcat ( testdatapath , " testdata " ) ;
theBundle = ures_open ( testdatapath , " testtypes " , & status ) ;
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_NE ( theBundle , NULL ) ;
strcpy ( action , " getting and testing of binary type " ) ;
res = ures_getByKey ( theBundle , " binarytest " , res , & status ) ;
2000-07-11 23:27:11 +00:00
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
2000-08-28 21:43:03 +00:00
CONFIRM_INT_EQ ( ures_getType ( res ) , RES_BINARY ) ;
binResult = ( uint8_t * ) ures_getBinary ( res , & len , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_EQ ( len , 15 ) ;
for ( i = 0 ; i < 15 ; i + + ) {
CONFIRM_INT_EQ ( binResult [ i ] , i ) ;
}
2000-07-11 23:27:11 +00:00
}
2000-08-28 21:43:03 +00:00
strcpy ( action , " getting and testing of imported binary type " ) ;
res = ures_getByKey ( theBundle , " importtest " , res , & status ) ;
2000-07-11 23:27:11 +00:00
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
2000-08-28 21:43:03 +00:00
CONFIRM_INT_EQ ( ures_getType ( res ) , RES_BINARY ) ;
binResult = ( uint8_t * ) ures_getBinary ( res , & len , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_EQ ( len , 15 ) ;
for ( i = 0 ; i < 15 ; i + + ) {
CONFIRM_INT_EQ ( binResult [ i ] , i ) ;
}
2000-07-11 23:27:11 +00:00
}
2000-08-28 21:43:03 +00:00
strcpy ( action , " getting and testing of integer types " ) ;
res = ures_getByKey ( theBundle , " one " , res , & status ) ;
2000-07-11 23:27:11 +00:00
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
2000-08-28 21:43:03 +00:00
CONFIRM_INT_EQ ( ures_getType ( res ) , RES_INT ) ;
intResult = ures_getInt ( res , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_EQ ( intResult , 1 ) ;
}
2000-07-11 23:27:11 +00:00
2000-08-28 21:43:03 +00:00
res = ures_getByKey ( theBundle , " onehundredtwentythree " , res , & status ) ;
2000-07-11 23:27:11 +00:00
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
2000-08-28 21:43:03 +00:00
CONFIRM_INT_EQ ( ures_getType ( res ) , RES_INT ) ;
intResult = ures_getInt ( res , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_EQ ( intResult , 123 ) ;
}
2000-07-11 23:27:11 +00:00
2000-08-28 21:43:03 +00:00
ures_close ( res ) ;
ures_close ( theBundle ) ;
2000-07-11 23:27:11 +00:00
}
2000-11-21 04:05:39 +00:00
static void TestBinaryCollationData ( ) {
2000-08-28 21:43:03 +00:00
UErrorCode status = U_ZERO_ERROR ;
2000-05-24 23:42:34 +00:00
const char * directory = NULL ;
const char * locale = " te " ;
char testdatapath [ 256 ] ;
2000-08-28 21:43:03 +00:00
UResourceBundle * teRes = NULL ;
UResourceBundle * coll = NULL ;
UResourceBundle * binColl = NULL ;
uint8_t * binResult = NULL ;
int32_t len = 0 ;
char * action = " testing the binary collaton data " ;
2000-05-24 23:42:34 +00:00
2000-12-03 04:07:13 +00:00
directory = u_getDataDirectory ( ) ;
2000-05-24 23:42:34 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
log_verbose ( " Testing binary collation data resource...... \n " ) ;
2000-08-28 21:43:03 +00:00
teRes = ures_open ( testdatapath , locale , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: Failed to get resource for \" te \" with %s " , myErrorName ( status ) ) ;
return ;
}
status = U_ZERO_ERROR ;
2000-05-24 23:42:34 +00:00
coll = ures_getByKey ( teRes , " CollationElements " , coll , & status ) ;
2000-08-28 21:43:03 +00:00
if ( U_SUCCESS ( status ) ) {
2000-05-24 23:42:34 +00:00
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
2000-07-14 22:31:35 +00:00
CONFIRM_INT_EQ ( ures_getType ( coll ) , RES_TABLE ) ;
2000-05-24 23:42:34 +00:00
binColl = ures_getByKey ( teRes , " %%Collation " , binColl , & status ) ;
2000-08-28 21:43:03 +00:00
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_EQ ( ures_getType ( binColl ) , RES_BINARY ) ;
binResult = ( uint8_t * ) ures_getBinary ( binColl , & len , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_ErrorCode ( status , U_ZERO_ERROR ) ;
CONFIRM_INT_GE ( len , 1 ) ;
}
} else {
log_err ( " ERROR: ures_getByKey(locale(te), %%Collation) failed " ) ;
}
}
else {
log_err ( " ERROR: ures_getByKey(locale(te), CollationElements) failed " ) ;
return ;
}
2000-07-12 22:59:57 +00:00
ures_close ( binColl ) ;
ures_close ( coll ) ;
ures_close ( teRes ) ;
2000-05-24 23:42:34 +00:00
}
2000-11-21 04:05:39 +00:00
static void TestAPI ( ) {
2000-07-12 01:09:23 +00:00
UErrorCode status = U_ZERO_ERROR ;
const char * directory = NULL ;
int32_t len = 0 ;
const char * key = NULL ;
const UChar * value = NULL ;
char testdatapath [ 256 ] ;
UChar utestdatapath [ 256 ] ;
2000-08-28 21:43:03 +00:00
UResourceBundle * teRes = NULL ;
2000-07-12 01:09:23 +00:00
UResourceBundle * teFillin = NULL ;
UResourceBundle * teFillin2 = NULL ;
2000-12-03 04:07:13 +00:00
directory = u_getDataDirectory ( ) ;
2000-07-12 01:09:23 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
2000-08-02 19:06:18 +00:00
u_charsToUChars ( testdatapath , utestdatapath , strlen ( testdatapath ) + 1 ) ;
/*u_uastrcpy(utestdatapath, testdatapath);*/
2000-07-12 01:09:23 +00:00
/*Test ures_openU */
log_verbose ( " Testing ures_openU()...... \n " ) ;
2000-08-28 21:43:03 +00:00
teRes = ures_openU ( utestdatapath , " te " , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: ures_openU() failed path =%s with %s " , austrdup ( utestdatapath ) , myErrorName ( status ) ) ;
return ;
}
2000-07-12 01:09:23 +00:00
/*Test ures_getLocale() */
log_verbose ( " Testing ures_getLocale() ..... \n " ) ;
if ( strcmp ( ures_getLocale ( teRes , & status ) , " te " ) ! = 0 ) {
log_err ( " ERROR: ures_getLocale() failed. Expected = te_TE Got = %s \n " , ures_getLocale ( teRes , & status ) ) ;
}
/*Test ures_getNextString() */
teFillin = ures_getByKey ( teRes , " tagged_array_in_te_te_IN " , teFillin , & status ) ;
key = ures_getKey ( teFillin ) ;
value = ( UChar * ) ures_getNextString ( teFillin , & len , & key , & status ) ;
ures_resetIterator ( NULL ) ;
value = ( UChar * ) ures_getNextString ( teFillin , & len , & key , & status ) ;
if ( status ! = U_INDEX_OUTOFBOUNDS_ERROR ) {
log_err ( " ERROR: calling getNextString where index out of bounds should return U_INDEX_OUTOFBOUNDS_ERROR, Got : %s \n " ,
myErrorName ( status ) ) ;
}
ures_resetIterator ( teRes ) ;
/*Test ures_getNextResource() where resource is table*/
status = U_ZERO_ERROR ;
teFillin = ures_getNextResource ( teRes , teFillin , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: ures_getNextResource() failed \n " ) ;
}
key = ures_getKey ( teFillin ) ;
if ( strcmp ( key , " %%Collation " ) ! = 0 ) {
log_err ( " ERROR: ures_getNextResource() failed \n " ) ;
}
/*Test ures_getByIndex on string Resource*/
teFillin = ures_getByKey ( teRes , " string_only_in_te " , teFillin , & status ) ;
teFillin2 = ures_getByIndex ( teFillin , 0 , teFillin2 , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: ures_getByIndex on string resource failed \n " ) ;
}
if ( strcmp ( austrdup ( ures_getString ( teFillin2 , & len , & status ) ) , " TE " ) ! = 0 ) {
status = U_ZERO_ERROR ;
log_err ( " ERROR: ures_getByIndex on string resource fetched the key=%s, expected \" TE \" \n " , austrdup ( ures_getString ( teFillin2 , & len , & status ) ) ) ;
}
2000-08-28 21:43:03 +00:00
2000-07-12 22:59:57 +00:00
/*ures_close(teRes);*/
2000-08-28 21:43:03 +00:00
2000-07-12 01:09:23 +00:00
/*Test ures_openFillIn*/
log_verbose ( " Testing ures_openFillIn...... \n " ) ;
status = U_ZERO_ERROR ;
ures_openFillIn ( teRes , testdatapath , " te " , & status ) ;
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: ures_openFillIn failed \n " ) ;
return ;
}
if ( strcmp ( ures_getLocale ( teRes , & status ) , " te " ) ! = 0 ) {
log_err ( " ERROR: ures_openFillIn did not open the ResourceBundle correctly \n " ) ;
}
ures_getByKey ( teRes , " string_only_in_te " , teFillin , & status ) ;
teFillin2 = ures_getNextResource ( teFillin , teFillin2 , & status ) ;
if ( ures_getType ( teFillin2 ) ! = RES_STRING ) {
log_err ( " ERROR: getType for getNextResource after ures_openFillIn failed \n " ) ;
}
teFillin2 = ures_getNextResource ( teFillin , teFillin2 , & status ) ;
if ( status ! = U_INDEX_OUTOFBOUNDS_ERROR ) {
log_err ( " ERROR: calling getNextResource where index out of bounds should return U_INDEX_OUTOFBOUNDS_ERROR, Got : %s \n " ,
myErrorName ( status ) ) ;
}
2000-08-28 21:43:03 +00:00
2000-07-12 22:59:57 +00:00
ures_close ( teFillin ) ;
ures_close ( teFillin2 ) ;
2000-07-12 01:09:23 +00:00
ures_close ( teRes ) ;
2000-08-28 21:43:03 +00:00
2000-07-12 01:09:23 +00:00
}
2000-11-21 04:05:39 +00:00
static void TestErrorConditions ( ) {
2000-07-12 01:09:23 +00:00
UErrorCode status ;
const char * directory = NULL ;
const char * key = NULL ;
const UChar * value = NULL ;
char testdatapath [ 256 ] ;
UChar utestdatapath [ 256 ] ;
int32_t len = 0 ;
2000-08-28 21:43:03 +00:00
UResourceBundle * teRes = NULL ;
2000-07-12 01:09:23 +00:00
UResourceBundle * coll = NULL ;
2000-08-28 21:43:03 +00:00
UResourceBundle * binColl = NULL ;
2000-07-12 01:09:23 +00:00
UResourceBundle * teFillin = NULL ;
UResourceBundle * teFillin2 = NULL ;
2000-08-28 21:43:03 +00:00
uint8_t * binResult = NULL ;
2000-05-24 23:42:34 +00:00
2000-12-03 04:07:13 +00:00
directory = u_getDataDirectory ( ) ;
2000-07-12 01:09:23 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
u_uastrcpy ( utestdatapath , testdatapath ) ;
/*Test ures_openU with status != U_ZERO_ERROR*/
log_verbose ( " Testing ures_openU() with status != U_ZERO_ERROR..... \n " ) ;
status = U_ILLEGAL_ARGUMENT_ERROR ;
2000-08-28 21:43:03 +00:00
teRes = ures_openU ( utestdatapath , " te " , & status ) ;
if ( U_FAILURE ( status ) ) {
log_verbose ( " ERROR: ures_openU() failed as expected path =%s with status != U_ZERO_ERROR " , austrdup ( utestdatapath ) ) ;
2000-07-12 01:09:23 +00:00
} else {
log_err ( " ERROR: ures_openU() is supposed to fail path =%s with status != U_ZERO_ERROR " , austrdup ( utestdatapath ) ) ;
ures_close ( teRes ) ;
}
/*Test ures_openFillIn with UResourceBundle = NULL*/
log_verbose ( " Testing ures_openFillIn with UResourceBundle = NULL..... \n " ) ;
status = U_ZERO_ERROR ;
ures_openFillIn ( NULL , testdatapath , " te " , & status ) ;
if ( status ! = U_INTERNAL_PROGRAM_ERROR ) {
log_err ( " ERROR: ures_openFillIn with UResourceBundle= NULL should fail. Expected U_INTERNAL_PROGRAM_ERROR, Got: %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getLocale() with status != U_ZERO_ERROR*/
status = U_ZERO_ERROR ;
teRes = ures_openU ( utestdatapath , " te " , & status ) ;
2000-08-28 21:43:03 +00:00
if ( U_FAILURE ( status ) ) {
log_err ( " ERROR: ures_openU() failed path =%s with %s " , austrdup ( utestdatapath ) , myErrorName ( status ) ) ;
return ;
}
2000-07-12 01:09:23 +00:00
status = U_ILLEGAL_ARGUMENT_ERROR ;
if ( ures_getLocale ( teRes , & status ) ! = NULL ) {
log_err ( " ERROR: ures_getLocale is supposed to fail with errorCode != U_ZERO_ERROR \n " ) ;
}
/*Test ures_getLocale() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_getLocale ( NULL , & status ) ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getLocale is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getSize() with UResourceBundle = NULL */
status = U_ZERO_ERROR ;
if ( ures_getSize ( NULL ) ! = 0 ) {
log_err ( " ERROR: ures_getSize() should return 0 when UResourceBundle=NULL. Got =%d \n " , ures_getSize ( NULL ) ) ;
}
/*Test ures_getType() with UResourceBundle = NULL should return RES_BOGUS or -1*/
status = U_ZERO_ERROR ;
2000-08-16 20:45:23 +00:00
if ( ures_getType ( NULL ) ! = RES_NONE ) {
log_err ( " ERROR: ures_getType() should return RES_NONE when UResourceBundle=NULL. Got =%d \n " , ures_getType ( NULL ) ) ;
2000-07-12 01:09:23 +00:00
}
/*Test ures_getKey() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_getKey ( NULL ) ! = NULL ) {
log_err ( " ERROR: ures_getKey() should return NULL when UResourceBundle=NULL. Got =%d \n " , ures_getKey ( NULL ) ) ;
}
/*Test ures_hasNext() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_hasNext ( NULL ) ! = FALSE ) {
log_err ( " ERROR: ures_hasNext() should return FALSE when UResourceBundle=NULL. Got =%d \n " , ures_hasNext ( NULL ) ) ;
}
/*Test ures_get() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_get ( NULL , " string_only_in_te " , & status ) ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_get is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getByKey() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
teFillin = ures_getByKey ( NULL , " string_only_in_te " , teFillin , & status ) ;
if ( teFillin ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getByKey is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getByKey() with status != U_ZERO_ERROR*/
teFillin = ures_getByKey ( NULL , " string_only_in_te " , teFillin , & status ) ;
if ( teFillin ! = NULL ) {
log_err ( " ERROR: ures_getByKey is supposed to fail when errorCode != U_ZERO_ERROR \n " ) ;
}
/*Test ures_getStringByKey() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_getStringByKey ( NULL , " string_only_in_te " , & len , & status ) ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getStringByKey is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getStringByKey() with status != U_ZERO_ERROR*/
if ( ures_getStringByKey ( teRes , " string_only_in_te " , & len , & status ) ! = NULL ) {
log_err ( " ERROR: ures_getStringByKey is supposed to fail when status != U_ZERO_ERROR. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getString() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_getString ( NULL , & len , & status ) ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getString is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getString() with status != U_ZERO_ERROR*/
if ( ures_getString ( teRes , & len , & status ) ! = NULL ) {
log_err ( " ERROR: ures_getString is supposed to fail when status != U_ZERO_ERROR. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getBinary() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
if ( ures_getBinary ( NULL , & len , & status ) ! = NULL & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getBinary is supposed to fail when UResourceBundle = NULL. Expected: errorCode = U_ILLEGAL_ARGUMENT_ERROR, Got: errorCode=%s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getBinary(0 status != U_ILLEGAL_ARGUMENT_ERROR*/
status = U_ZERO_ERROR ;
coll = ures_getByKey ( teRes , " CollationElements " , coll , & status ) ;
2000-08-28 21:43:03 +00:00
binColl = ures_getByKey ( teRes , " %%Collation " , binColl , & status ) ;
2000-07-12 01:09:23 +00:00
status = U_ILLEGAL_ARGUMENT_ERROR ;
2000-08-28 21:43:03 +00:00
binResult = ( uint8_t * ) ures_getBinary ( binColl , & len , & status ) ;
2000-07-12 01:09:23 +00:00
if ( binResult ! = NULL ) {
log_err ( " ERROR: ures_getBinary() with status != U_ZERO_ERROR is supposed to fail \n " ) ;
}
/*Test ures_getNextResource() with status != U_ZERO_ERROR*/
teFillin = ures_getNextResource ( teRes , teFillin , & status ) ;
if ( teFillin ! = NULL ) {
log_err ( " ERROR: ures_getNextResource() with errorCode != U_ZERO_ERROR is supposed to fail \n " ) ;
}
/*Test ures_getNextResource() with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
teFillin = ures_getNextResource ( NULL , teFillin , & status ) ;
if ( teFillin ! = NULL | | status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getNextResource() with UResourceBundle = NULL is supposed to fail. Expected : U_IILEGAL_ARGUMENT_ERROR, Got : %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getNextString with errorCode != U_ZERO_ERROR*/
teFillin = ures_getByKey ( teRes , " tagged_array_in_te_te_IN " , teFillin , & status ) ;
key = ures_getKey ( teFillin ) ;
status = U_ILLEGAL_ARGUMENT_ERROR ;
value = ( UChar * ) ures_getNextString ( teFillin , & len , & key , & status ) ;
if ( value ! = NULL ) {
log_err ( " ERROR: ures_getNextString() with errorCode != U_ZERO_ERROR is supposed to fail \n " ) ;
}
/*Test ures_getNextString with UResourceBundle = NULL*/
status = U_ZERO_ERROR ;
value = ( UChar * ) ures_getNextString ( NULL , & len , & key , & status ) ;
if ( value ! = NULL | | status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getNextString() with UResourceBundle=NULL is supposed to fail \n Expected: U_ILLEGAL_ARGUMENT_ERROR, Got: %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getByIndex with errorCode != U_ZERO_ERROR*/
status = U_ZERO_ERROR ;
teFillin = ures_getByKey ( teRes , " array_only_in_te " , teFillin , & status ) ;
status = U_ILLEGAL_ARGUMENT_ERROR ;
teFillin2 = ures_getByIndex ( teFillin , 0 , teFillin2 , & status ) ;
if ( teFillin2 ! = NULL ) {
log_err ( " ERROR: ures_getByIndex() with errorCode != U_ZERO_ERROR is supposed to fail \n " ) ;
}
/*Test ures_getByIndex with UResourceBundle = NULL */
status = U_ZERO_ERROR ;
teFillin2 = ures_getByIndex ( NULL , 0 , teFillin2 , & status ) ;
if ( status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getByIndex() with UResourceBundle=NULL is supposed to fail \n Expected: U_ILLEGAL_ARGUMENT_ERROR, Got: %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getStringByIndex with errorCode != U_ZERO_ERROR*/
status = U_ZERO_ERROR ;
teFillin = ures_getByKey ( teRes , " array_only_in_te " , teFillin , & status ) ;
status = U_ILLEGAL_ARGUMENT_ERROR ;
value = ( UChar * ) ures_getStringByIndex ( teFillin , 0 , & len , & status ) ;
if ( value ! = NULL ) {
log_err ( " ERROR: ures_getSringByIndex() with errorCode != U_ZERO_ERROR is supposed to fail \n " ) ;
}
/*Test ures_getStringByIndex with UResourceBundle = NULL */
status = U_ZERO_ERROR ;
value = ( UChar * ) ures_getStringByIndex ( NULL , 0 , & len , & status ) ;
if ( value ! = NULL | | status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getStringByIndex() with UResourceBundle=NULL is supposed to fail \n Expected: U_ILLEGAL_ARGUMENT_ERROR, Got: %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getInt() where UResourceBundle = NULL */
status = U_ZERO_ERROR ;
if ( ures_getInt ( NULL , & status ) ! = - 1 & & status ! = U_ILLEGAL_ARGUMENT_ERROR ) {
log_err ( " ERROR: ures_getInt() with UResourceBundle = NULL should fail. Expected: U_IILEGAL_ARGUMENT_ERROR, Got: %s \n " ,
myErrorName ( status ) ) ;
}
/*Test ures_getInt() where status != U_ZERO_ERROR */
if ( ures_getInt ( teRes , & status ) ! = - 1 ) {
log_err ( " ERROR: ures_getInt() with errorCode != U_ZERO_ERROR should fail \n " ) ;
}
2000-07-12 22:59:57 +00:00
ures_close ( teFillin ) ;
ures_close ( teFillin2 ) ;
ures_close ( coll ) ;
ures_close ( binColl ) ;
2000-07-12 01:09:23 +00:00
ures_close ( teRes ) ;
}
2000-05-15 18:39:17 +00:00
2000-11-21 04:05:39 +00:00
static void TestResourceBundles ( )
2000-05-15 18:39:17 +00:00
{
testTag ( " only_in_Root " , TRUE , FALSE , FALSE ) ;
testTag ( " in_Root_te " , TRUE , TRUE , FALSE ) ;
testTag ( " in_Root_te_te_IN " , TRUE , TRUE , TRUE ) ;
testTag ( " in_Root_te_IN " , TRUE , FALSE , TRUE ) ;
testTag ( " only_in_te " , FALSE , TRUE , FALSE ) ;
testTag ( " only_in_te_IN " , FALSE , FALSE , TRUE ) ;
testTag ( " in_te_te_IN " , FALSE , TRUE , TRUE ) ;
testTag ( " nonexistent " , FALSE , FALSE , FALSE ) ;
log_verbose ( " Passed:= %d Failed= %d \n " , pass , fail ) ;
}
2000-11-21 04:05:39 +00:00
static void TestConstruction1 ( )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
UResourceBundle * test1 = 0 , * test2 = 0 ;
const UChar * result1 , * result2 ;
UErrorCode status = U_ZERO_ERROR ;
UErrorCode err = U_ZERO_ERROR ;
const char * directory = NULL ;
const char * locale = " te_IN " ;
char testdatapath [ 256 ] ;
int32_t len1 = 0 ;
int32_t len2 = 0 ;
UVersionInfo versionInfo ;
char versionString [ 256 ] ;
U_STRING_DECL ( rootVal , " ROOT " , 4 ) ;
U_STRING_DECL ( te_inVal , " TE_IN " , 5 ) ;
U_STRING_INIT ( rootVal , " ROOT " , 4 ) ;
U_STRING_INIT ( te_inVal , " TE_IN " , 5 ) ;
2000-12-03 04:07:13 +00:00
directory = u_getDataDirectory ( ) ;
2000-08-28 21:43:03 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
log_verbose ( " Testing ures_open()...... \n " ) ;
test1 = ures_open ( testdatapath , NULL , & err ) ;
test2 = ures_open ( testdatapath , locale , & err ) ;
if ( U_FAILURE ( err ) )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
log_err ( " construction did not succeed : %s \n " , myErrorName ( status ) ) ;
return ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
result1 = ures_getStringByKey ( test1 , " string_in_Root_te_te_IN " , & len1 , & err ) ;
result2 = ures_getStringByKey ( test2 , " string_in_Root_te_te_IN " , & len2 , & err ) ;
if ( U_FAILURE ( err ) | | len1 = = 0 | | len2 = = 0 ) {
log_err ( " Something threw an error in TestConstruction(): %s \n " , myErrorName ( status ) ) ;
return ;
}
log_verbose ( " for string_in_Root_te_te_IN, default.txt had %s \n " , austrdup ( result1 ) ) ;
log_verbose ( " for string_in_Root_te_te_IN, te_IN.txt had %s \n " , austrdup ( result2 ) ) ;
if ( u_strcmp ( result1 , rootVal ) ! = 0 | | u_strcmp ( result2 , te_inVal ) ! = 0 ) {
log_err ( " construction test failed. Run Verbose for more information " ) ;
}
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
/* Test getVersionNumber*/
log_verbose ( " Testing version number \n " ) ;
log_verbose ( " for getVersionNumber : %s \n " , ures_getVersionNumber ( test1 ) ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
log_verbose ( " Testing version \n " ) ;
ures_getVersion ( test1 , versionInfo ) ;
u_versionToString ( versionInfo , versionString ) ;
2000-08-10 20:20:10 +00:00
2000-08-28 21:43:03 +00:00
log_verbose ( " for getVersion : %s \n " , versionString ) ;
2000-08-10 20:20:10 +00:00
2000-08-28 21:43:03 +00:00
if ( strcmp ( versionString , ures_getVersionNumber ( test1 ) ) ! = 0 ) {
log_err ( " Versions differ: %s vs %s \n " , versionString , ures_getVersionNumber ( test1 ) ) ;
}
2000-08-10 20:20:10 +00:00
2000-08-28 21:43:03 +00:00
ures_close ( test1 ) ;
ures_close ( test2 ) ;
2000-05-15 18:39:17 +00:00
}
2000-11-21 04:05:39 +00:00
static void TestConstruction2 ( )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
UChar temp [ 7 ] ;
UResourceBundle * test4 = 0 ;
const UChar * result4 ;
UErrorCode err = U_ZERO_ERROR ;
const char * directory ;
const char * locale = " te_IN " ;
wchar_t widedirectory [ 256 ] ;
char testdatapath [ 256 ] ;
int32_t len = 0 ;
2000-05-15 18:39:17 +00:00
2000-12-03 04:07:13 +00:00
directory = u_getDataDirectory ( ) ;
2000-08-28 21:43:03 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
mbstowcs ( widedirectory , testdatapath , 256 ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
log_verbose ( " Testing ures_openW()....... \n " ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
test4 = ures_openW ( widedirectory , locale , & err ) ;
if ( U_FAILURE ( err ) ) {
log_err ( " Error in the construction using ures_openW(): %s \n " , myErrorName ( err ) ) ;
return ;
}
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
result4 = ures_getStringByKey ( test4 , " string_in_Root_te_te_IN " , & len , & err ) ;
if ( U_FAILURE ( err ) | | len = = 0 ) {
log_err ( " Something threw an error in TestConstruction() %s \n " , myErrorName ( err ) ) ;
return ;
}
log_verbose ( " for string_in_Root_te_te_IN, te_IN.txt had %s \n " , austrdup ( result4 ) ) ;
u_uastrcpy ( temp , " TE_IN " ) ;
if ( u_strcmp ( result4 , temp ) ! = 0 )
{
log_err ( " Construction test failed for ures_openW(); \n " ) ;
if ( ! VERBOSITY )
log_info ( " (run verbose for more information) \n " ) ;
log_verbose ( " \n Got-> " ) ;
printUChars ( ( UChar * ) result4 ) ;
log_verbose ( " Want-> " ) ;
printUChars ( temp ) ;
log_verbose ( " \n " ) ;
}
ures_close ( test4 ) ;
2000-05-15 18:39:17 +00:00
}
/*****************************************************************************/
/*****************************************************************************/
2000-11-21 04:05:39 +00:00
static UBool testTag ( const char * frag ,
2000-05-18 22:08:39 +00:00
UBool in_Root ,
UBool in_te ,
UBool in_te_IN )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
UBool pass = TRUE ;
/* Make array from input params */
UBool is_in [ 3 ] ;
const char * NAME [ ] = { " ROOT " , " TE " , " TE_IN " } ;
/* Now try to load the desired items */
UResourceBundle * theBundle = NULL ;
char tag [ 99 ] ;
char action [ 256 ] ;
UErrorCode expected_status , status = U_ZERO_ERROR , expected_resource_status = U_ZERO_ERROR ;
UChar * base = NULL ;
UChar * expected_string = NULL ;
const UChar * string = NULL ;
char buf [ 5 ] ;
char item_tag [ 10 ] ;
int32_t i , j , row , col , len ;
int32_t actual_bundle ;
int32_t count = 0 ;
int32_t row_count = 0 ;
int32_t column_count = 0 ;
int32_t index = 0 ;
int32_t tag_count = 0 ;
char testdatapath [ 256 ] ;
UResourceBundle * array = NULL ;
UResourceBundle * array2d = NULL ;
UResourceBundle * tags = NULL ;
UResourceBundle * arrayItem1 = NULL ;
2000-12-03 04:07:13 +00:00
const char * directory = u_getDataDirectory ( ) ;
2000-08-28 21:43:03 +00:00
uprv_strcpy ( testdatapath , directory ) ;
uprv_strcat ( testdatapath , " testdata " ) ;
is_in [ 0 ] = in_Root ;
is_in [ 1 ] = in_te ;
is_in [ 2 ] = in_te_IN ;
strcpy ( item_tag , " tag " ) ;
for ( i = 0 ; i < bundles_count ; + + i )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
strcpy ( action , " construction for " ) ;
strcat ( action , param [ i ] . name ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
status = U_ZERO_ERROR ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
theBundle = ures_open ( testdatapath , param [ i ] . name , & status ) ;
CONFIRM_ErrorCode ( status , param [ i ] . expected_constructor_status ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
if ( i = = 5 )
actual_bundle = 0 ; /* ne -> default */
else if ( i = = 3 )
actual_bundle = 1 ; /* te_NE -> te */
else if ( i = = 4 )
actual_bundle = 2 ; /* te_IN_NE -> te_IN */
else
actual_bundle = i ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
expected_resource_status = U_MISSING_RESOURCE_ERROR ;
for ( j = e_te_IN ; j > = e_Root ; - - j )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
if ( is_in [ j ] & & param [ i ] . inherits [ j ] )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
if ( j = = actual_bundle ) /* it's in the same bundle OR it's a nonexistent=default bundle (5) */
expected_resource_status = U_ZERO_ERROR ;
else if ( j = = 0 )
expected_resource_status = U_USING_DEFAULT_ERROR ;
else
expected_resource_status = U_USING_FALLBACK_ERROR ;
log_verbose ( " %s[%d]::%s: in<%d:%s> inherits<%d:%s>. actual_bundle=%s \n " ,
param [ i ] . name ,
i ,
frag ,
j ,
is_in [ j ] ? " Yes " : " No " ,
j ,
param [ i ] . inherits [ j ] ? " Yes " : " No " ,
param [ actual_bundle ] . name ) ;
break ;
2000-05-15 18:39:17 +00:00
}
}
2000-08-28 21:43:03 +00:00
for ( j = param [ i ] . where ; j > = 0 ; - - j )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
if ( is_in [ j ] )
{
if ( base ! = NULL ) {
free ( base ) ;
base = NULL ;
}
base = ( UChar * ) malloc ( sizeof ( UChar ) * ( strlen ( NAME [ j ] ) + 1 ) ) ;
u_uastrcpy ( base , NAME [ j ] ) ;
break ;
}
else {
if ( base ! = NULL ) {
free ( base ) ;
base = NULL ;
}
base = ( UChar * ) malloc ( sizeof ( UChar ) * 1 ) ;
* base = 0x0000 ;
2000-05-15 18:39:17 +00:00
}
}
2000-08-28 21:43:03 +00:00
/*----string---------------------------------------------------------------- */
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
strcpy ( tag , " string_ " ) ;
strcat ( tag , frag ) ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
strcpy ( action , param [ i ] . name ) ;
strcat ( action , " .ures_getStringByKey( " ) ;
strcat ( action , tag ) ;
strcat ( action , " ) " ) ;
status = U_ZERO_ERROR ;
len = 0 ;
string = ures_getStringByKey ( theBundle , tag , & len , & status ) ;
if ( U_SUCCESS ( status ) ) {
expected_string = ( UChar * ) malloc ( sizeof ( UChar ) * ( u_strlen ( base ) + 4 ) ) ;
u_strcpy ( expected_string , base ) ;
CONFIRM_INT_EQ ( len , u_strlen ( expected_string ) ) ;
} else {
expected_string = ( UChar * ) malloc ( sizeof ( UChar ) * ( u_strlen ( kERROR ) + 1 ) ) ;
u_strcpy ( expected_string , kERROR ) ;
string = kERROR ;
}
log_verbose ( " %s got %d, expected %d \n " , action , status , expected_resource_status ) ;
CONFIRM_ErrorCode ( status , expected_resource_status ) ;
CONFIRM_EQ ( string , expected_string ) ;
/*--------------array------------------------------------------------- */
strcpy ( tag , " array_ " ) ;
strcat ( tag , frag ) ;
strcpy ( action , param [ i ] . name ) ;
strcat ( action , " .ures_getByKey( " ) ;
strcat ( action , tag ) ;
strcat ( action , " ) " ) ;
len = 0 ;
count = kERROR_COUNT ;
status = U_ZERO_ERROR ;
array = ures_getByKey ( theBundle , tag , array , & status ) ;
CONFIRM_ErrorCode ( status , expected_resource_status ) ;
if ( U_SUCCESS ( status ) ) {
/*confirm the resource type is an array*/
CONFIRM_INT_EQ ( ures_getType ( array ) , RES_ARRAY ) ;
/*confirm the size*/
count = ures_getSize ( array ) ;
2000-05-15 18:39:17 +00:00
CONFIRM_INT_GE ( count , 1 ) ;
for ( j = 0 ; j < count ; + + j ) {
2000-08-28 21:43:03 +00:00
UChar element [ 3 ] ;
2000-05-15 18:39:17 +00:00
u_strcpy ( expected_string , base ) ;
u_uastrcpy ( element , itoa1 ( j , buf ) ) ;
2000-08-28 21:43:03 +00:00
u_strcat ( expected_string , element ) ;
arrayItem1 = ures_getNextResource ( array , arrayItem1 , & status ) ;
if ( U_SUCCESS ( status ) ) {
CONFIRM_EQ ( ures_getString ( arrayItem1 , & len , & status ) , expected_string ) ;
}
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
}
else {
2000-05-15 18:39:17 +00:00
CONFIRM_INT_EQ ( count , kERROR_COUNT ) ;
2000-07-06 23:01:50 +00:00
CONFIRM_ErrorCode ( status , U_MISSING_RESOURCE_ERROR ) ;
2000-08-28 21:43:03 +00:00
/*CONFIRM_INT_EQ((int32_t)(unsigned long)array,(int32_t)0);*/
2000-05-15 18:39:17 +00:00
count = 0 ;
2000-08-28 21:43:03 +00:00
}
/*--------------arrayItem------------------------------------------------- */
strcpy ( tag , " array_ " ) ;
strcat ( tag , frag ) ;
strcpy ( action , param [ i ] . name ) ;
strcat ( action , " .ures_getStringByIndex( " ) ;
strcat ( action , tag ) ;
strcat ( action , " ) " ) ;
for ( j = 0 ; j < 10 ; + + j ) {
index = count ? ( randi ( count * 3 ) - count ) : ( randi ( 200 ) - 100 ) ;
status = U_ZERO_ERROR ;
string = kERROR ;
array = ures_getByKey ( theBundle , tag , array , & status ) ;
if ( ! U_FAILURE ( status ) ) {
UChar * t = NULL ;
t = ( UChar * ) ures_getStringByIndex ( array , index , & len , & status ) ;
if ( ! U_FAILURE ( status ) ) {
UChar element [ 3 ] ;
string = t ;
u_strcpy ( expected_string , base ) ;
u_uastrcpy ( element , itoa1 ( index , buf ) ) ;
u_strcat ( expected_string , element ) ;
} else {
u_strcpy ( expected_string , kERROR ) ;
}
}
expected_status = ( index > = 0 & & index < count ) ? expected_resource_status : U_MISSING_RESOURCE_ERROR ;
CONFIRM_ErrorCode ( status , expected_status ) ;
CONFIRM_EQ ( string , expected_string ) ;
}
/*--------------2dArray------------------------------------------------- */
strcpy ( tag , " array_2d_ " ) ;
2000-05-15 18:39:17 +00:00
strcat ( tag , frag ) ;
strcpy ( action , param [ i ] . name ) ;
strcat ( action , " .ures_getByKey( " ) ;
strcat ( action , tag ) ;
strcat ( action , " ) " ) ;
row_count = kERROR_COUNT , column_count = kERROR_COUNT ;
status = U_ZERO_ERROR ;
2000-08-28 21:43:03 +00:00
array2d = ures_getByKey ( theBundle , tag , array2d , & status ) ;
2000-05-15 18:39:17 +00:00
CONFIRM_ErrorCode ( status , expected_resource_status ) ;
if ( U_SUCCESS ( status ) )
{
2000-08-28 21:43:03 +00:00
/*confirm the resource type is an 2darray*/
2000-05-15 18:39:17 +00:00
CONFIRM_INT_EQ ( ures_getType ( array2d ) , RES_ARRAY ) ;
2000-08-28 21:43:03 +00:00
row_count = ures_getSize ( array2d ) ;
CONFIRM_INT_GE ( row_count , 1 ) ;
for ( row = 0 ; row < row_count ; + + row ) {
UResourceBundle * tableRow = NULL ;
tableRow = ures_getByIndex ( array2d , row , tableRow , & status ) ;
CONFIRM_ErrorCode ( status , expected_resource_status ) ;
2000-05-15 18:39:17 +00:00
if ( U_SUCCESS ( status ) ) {
2000-08-28 21:43:03 +00:00
/*confirm the resourcetype of each table row is an array*/
CONFIRM_INT_EQ ( ures_getType ( tableRow ) , RES_ARRAY ) ;
column_count = ures_getSize ( tableRow ) ;
2000-05-15 18:39:17 +00:00
CONFIRM_INT_GE ( column_count , 1 ) ;
2000-08-28 21:43:03 +00:00
2000-05-15 18:39:17 +00:00
for ( col = 0 ; j < column_count ; + + j ) {
2000-08-28 21:43:03 +00:00
UChar element [ 3 ] ;
u_strcpy ( expected_string , base ) ;
u_uastrcpy ( element , itoa1 ( row , buf ) ) ;
u_strcat ( expected_string , element ) ;
u_uastrcpy ( element , itoa1 ( col , buf ) ) ;
u_strcat ( expected_string , element ) ;
arrayItem1 = ures_getNextResource ( tableRow , arrayItem1 , & status ) ;
if ( U_SUCCESS ( status ) ) {
const UChar * stringValue = ures_getString ( arrayItem1 , & len , & status ) ;
CONFIRM_EQ ( stringValue , expected_string ) ;
}
}
}
2000-07-06 23:01:50 +00:00
ures_close ( tableRow ) ;
2000-08-28 21:43:03 +00:00
}
} else {
CONFIRM_INT_EQ ( row_count , kERROR_COUNT ) ;
2000-05-15 18:39:17 +00:00
CONFIRM_INT_EQ ( column_count , kERROR_COUNT ) ;
row_count = column_count = 0 ;
2000-08-28 21:43:03 +00:00
}
/*------2dArrayItem-------------------------------------------------------------- */
/* 2dArrayItem*/
for ( j = 0 ; j < 10 ; + + j )
{
row = row_count ? ( randi ( row_count * 3 ) - row_count ) : ( randi ( 200 ) - 100 ) ;
col = column_count ? ( randi ( column_count * 3 ) - column_count ) : ( randi ( 200 ) - 100 ) ;
status = U_ZERO_ERROR ;
string = kERROR ;
len = 0 ;
array2d = ures_getByKey ( theBundle , tag , array2d , & status ) ;
if ( U_SUCCESS ( status ) ) {
2000-05-15 18:39:17 +00:00
UResourceBundle * tableRow = NULL ;
2000-08-28 21:43:03 +00:00
tableRow = ures_getByIndex ( array2d , row , tableRow , & status ) ;
2000-05-15 18:39:17 +00:00
if ( U_SUCCESS ( status ) ) {
UChar * t = NULL ;
2000-08-28 21:43:03 +00:00
t = ( UChar * ) ures_getStringByIndex ( tableRow , col , & len , & status ) ;
if ( U_SUCCESS ( status ) ) {
string = t ;
}
}
2000-07-06 23:01:50 +00:00
ures_close ( tableRow ) ;
2000-08-28 21:43:03 +00:00
}
expected_status = ( row > = 0 & & row < row_count & & col > = 0 & & col < column_count ) ?
expected_resource_status : U_MISSING_RESOURCE_ERROR ;
CONFIRM_ErrorCode ( status , expected_status ) ;
if ( U_SUCCESS ( status ) ) {
UChar element [ 3 ] ;
u_strcpy ( expected_string , base ) ;
u_uastrcpy ( element , itoa1 ( row , buf ) ) ;
u_strcat ( expected_string , element ) ;
u_uastrcpy ( element , itoa1 ( col , buf ) ) ;
u_strcat ( expected_string , element ) ;
} else {
2000-05-15 18:39:17 +00:00
u_strcpy ( expected_string , kERROR ) ;
2000-08-28 21:43:03 +00:00
}
CONFIRM_EQ ( string , expected_string ) ;
2000-05-15 18:39:17 +00:00
}
2000-07-06 23:01:50 +00:00
2000-08-28 21:43:03 +00:00
/*--------------taggedArray----------------------------------------------- */
strcpy ( tag , " tagged_array_ " ) ;
strcat ( tag , frag ) ;
strcpy ( action , param [ i ] . name ) ;
strcat ( action , " .ures_getByKey( " ) ;
strcat ( action , tag ) ;
strcat ( action , " ) " ) ;
status = U_ZERO_ERROR ;
tag_count = 0 ;
tags = ures_getByKey ( theBundle , tag , tags , & status ) ;
CONFIRM_ErrorCode ( status , expected_resource_status ) ;
if ( U_SUCCESS ( status ) ) {
2000-05-15 18:39:17 +00:00
UResType bundleType = ures_getType ( tags ) ;
2000-08-28 21:43:03 +00:00
CONFIRM_INT_EQ ( bundleType , RES_TABLE ) ;
tag_count = ures_getSize ( tags ) ;
2000-05-15 18:39:17 +00:00
CONFIRM_INT_GE ( ( int32_t ) tag_count , ( int32_t ) 0 ) ;
2000-08-28 21:43:03 +00:00
for ( index = 0 ; index < tag_count ; index + + ) {
UResourceBundle * tagelement = NULL ;
const char * key = NULL ;
UChar * value = NULL ;
tagelement = ures_getByIndex ( tags , index , tagelement , & status ) ;
key = ures_getKey ( tagelement ) ;
value = ( UChar * ) ures_getNextString ( tagelement , & len , & key , & status ) ;
log_verbose ( " tag = %s, value = %s \n " , key , austrdup ( value ) ) ;
if ( strncmp ( key , " tag " , 3 ) = = 0 & & u_strncmp ( value , base , u_strlen ( base ) ) = = 0 ) {
record_pass ( ) ;
} else {
record_fail ( ) ;
}
ures_close ( tagelement ) ;
}
} else {
tag_count = 0 ;
}
/*---------taggedArrayItem----------------------------------------------*/
count = 0 ;
2000-05-15 18:39:17 +00:00
for ( index = - 20 ; index < 20 ; + + index )
{
2000-08-28 21:43:03 +00:00
status = U_ZERO_ERROR ;
2000-05-15 18:39:17 +00:00
string = kERROR ;
2000-08-28 21:43:03 +00:00
strcpy ( item_tag , " tag " ) ;
2000-05-15 18:39:17 +00:00
strcat ( item_tag , itoa1 ( index , buf ) ) ;
2000-08-28 21:43:03 +00:00
tags = ures_getByKey ( theBundle , tag , tags , & status ) ;
if ( U_SUCCESS ( status ) ) {
UResourceBundle * tagelement = NULL ;
UChar * t = NULL ;
tagelement = ures_getByKey ( tags , item_tag , tagelement , & status ) ;
if ( ! U_FAILURE ( status ) ) {
UResType elementType = ures_getType ( tagelement ) ;
CONFIRM_INT_EQ ( elementType , RES_STRING ) ;
if ( strcmp ( ures_getKey ( tagelement ) , item_tag ) = = 0 ) {
record_pass ( ) ;
} else {
record_fail ( ) ;
}
t = ( UChar * ) ures_getString ( tagelement , & len , & status ) ;
if ( ! U_FAILURE ( status ) ) {
string = t ;
}
}
if ( index < 0 ) {
CONFIRM_ErrorCode ( status , U_MISSING_RESOURCE_ERROR ) ;
}
2000-05-15 18:39:17 +00:00
else {
2000-08-28 21:43:03 +00:00
if ( status ! = U_MISSING_RESOURCE_ERROR ) {
UChar element [ 3 ] ;
u_strcpy ( expected_string , base ) ;
u_uastrcpy ( element , itoa1 ( index , buf ) ) ;
u_strcat ( expected_string , element ) ;
CONFIRM_EQ ( string , expected_string ) ;
count + + ;
}
}
2000-07-06 23:01:50 +00:00
ures_close ( tagelement ) ;
2000-08-28 21:43:03 +00:00
}
}
CONFIRM_INT_EQ ( count , tag_count ) ;
free ( expected_string ) ;
ures_close ( theBundle ) ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
ures_close ( array ) ;
ures_close ( array2d ) ;
ures_close ( tags ) ;
ures_close ( arrayItem1 ) ;
free ( base ) ;
return pass ;
2000-05-15 18:39:17 +00:00
}
2000-11-21 04:05:39 +00:00
static void record_pass ( )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
+ + pass ;
2000-05-15 18:39:17 +00:00
}
2000-11-21 04:05:39 +00:00
static void record_fail ( )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
+ + fail ;
2000-05-15 18:39:17 +00:00
}
/**
* Test to make sure that the U_USING_FALLBACK_ERROR and U_USING_DEFAULT_ERROR
* are set correctly
*/
2000-11-21 04:05:39 +00:00
static void TestFallback ( )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
UErrorCode status = U_ZERO_ERROR ;
UResourceBundle * fr_FR = NULL ;
const UChar * junk ; /* ignored */
log_verbose ( " Opening fr_FR.. " ) ;
fr_FR = ures_open ( NULL , " fr_FR " , & status ) ;
if ( U_FAILURE ( status ) )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
log_err ( " Couldn't open fr_FR - %d \n " , status ) ;
return ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
status = U_ZERO_ERROR ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
/* clear it out.. just do some calls to get the gears turning */
junk = ures_get ( fr_FR , " LocaleID " , & status ) ;
status = U_ZERO_ERROR ;
junk = ures_get ( fr_FR , " LocaleString " , & status ) ;
status = U_ZERO_ERROR ;
junk = ures_get ( fr_FR , " LocaleID " , & status ) ;
status = U_ZERO_ERROR ;
2000-05-15 18:39:17 +00:00
2000-08-28 21:43:03 +00:00
/* OK first one. This should be a Default value. */
junk = ures_get ( fr_FR , " Version " , & status ) ;
if ( status ! = U_USING_DEFAULT_ERROR )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
log_err ( " Expected U_USING_DEFAULT_ERROR when trying to get Version from fr_FR, got %d \n " ,
status ) ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
status = U_ZERO_ERROR ;
/* and this is a Fallback, to fr */
junk = ures_get ( fr_FR , " ShortLanguage " , & status ) ;
if ( status ! = U_USING_FALLBACK_ERROR )
2000-05-15 18:39:17 +00:00
{
2000-08-28 21:43:03 +00:00
log_err ( " Expected U_USING_FALLBACK_ERROR when trying to get ShortLanguage from fr_FR, got %d \n " ,
status ) ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
status = U_ZERO_ERROR ;
ures_close ( fr_FR ) ;
2000-05-15 18:39:17 +00:00
}
2000-08-28 21:43:03 +00:00
2000-11-21 04:05:39 +00:00
static void printUChars ( UChar * uchars ) {
2000-08-28 21:43:03 +00:00
int16_t i = 0 ;
for ( i = 0 ; i < u_strlen ( uchars ) ; i + + ) {
printf ( " %04X " , * ( uchars + i ) ) ;
}
2000-05-15 18:39:17 +00:00
}