Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2010, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 
      7 #include "unicode/ucnv.h"
      8 #include "unicode/ucnv_err.h"
      9 
     10 #include "cintltst.h"
     11 #include "ustr_cnv.h"
     12 #include <string.h>
     13 void TestDefaultConverterError(void); /* keep gcc happy */
     14 void TestDefaultConverterSet(void); /* keep gcc happy */
     15 
     16 
     17 /* This makes sure that a converter isn't leaked when an error is passed to
     18     u_getDefaultConverter */
     19 void TestDefaultConverterError(void) {
     20     UErrorCode          err                 =   U_ZERO_ERROR;
     21 
     22     /* Remove the default converter */
     23     ucnv_close(u_getDefaultConverter(&err));
     24 
     25     if (U_FAILURE(err)) {
     26         log_err("Didn't expect a failure yet %s\n", myErrorName(err));
     27         return;
     28     }
     29 
     30     /* Set to any radom error state */
     31     err = U_FILE_ACCESS_ERROR;
     32     if (u_getDefaultConverter(&err) != NULL) {
     33         log_err("Didn't expect to get a converter on a failure\n");
     34     }
     35 }
     36 
     37 /* Get the default converter. Copy its name. Put it back. */
     38 static void copyDefaultConverterName(char *out, UErrorCode *status) {
     39     UConverter *defConv;
     40     const char *itsName;
     41     out[0]=0;
     42     if(U_FAILURE(*status)) return;
     43     defConv = u_getDefaultConverter(status);
     44     /* get its name */
     45     itsName = ucnv_getName(defConv, status);
     46     if(U_FAILURE(*status)) return;
     47     strcpy(out, itsName);
     48     /* put it back. */
     49     u_releaseDefaultConverter(defConv);
     50 }
     51 
     52 /*
     53   Changing the default name may not affect the actual name from u_getDefaultConverter
     54    ( for example, if UTF-8 is the fixed converter ).
     55   But, if it does cause a change, that change should be reflected when the converter is
     56   set back.
     57 */
     58 void TestDefaultConverterSet(void) {
     59     UErrorCode status = U_ZERO_ERROR;
     60     static char defaultName[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
     61     static char nameBeforeSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
     62     static char nameAfterSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
     63     static char nameAfterRestore[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
     64     static const char SET_TO[]="iso-8859-3";
     65     strcpy(defaultName, ucnv_getDefaultName());
     66 
     67     log_verbose("getDefaultName returned %s\n", defaultName);
     68 
     69    /* first, flush any extant converter */
     70    u_flushDefaultConverter();
     71    copyDefaultConverterName(nameBeforeSet, &status);
     72    log_verbose("name from u_getDefaultConverter() = %s\n", nameBeforeSet);
     73    u_flushDefaultConverter();
     74    ucnv_setDefaultName(SET_TO);
     75    copyDefaultConverterName(nameAfterSet, &status);
     76    log_verbose("name from u_getDefaultConverter() after set to %s (%s) = %s\n", SET_TO, ucnv_getDefaultName(), nameAfterSet);
     77    ucnv_setDefaultName(defaultName);
     78    copyDefaultConverterName(nameAfterRestore, &status);
     79    log_verbose("name from u_getDefaultConverter() after restore = %s\n", nameAfterRestore);
     80    u_flushDefaultConverter();
     81 
     82    if(U_FAILURE(status)) {
     83       log_err("Error in test: %s\n", u_errorName(status));
     84    } else {
     85       if(!strcmp(nameBeforeSet, nameAfterSet)) { /* changing the default didn't affect. */
     86           log_info("Skipping test: ucnv_setDefaultName() did not affect actual name of %s\n", nameBeforeSet);
     87       } else {
     88           if(strcmp(nameBeforeSet, nameAfterRestore)) {
     89                log_err("Error: u_getDefaultConverter() is still returning %s (expected %s) even though default converter was set back to %s (was %s)\n", nameAfterRestore, nameBeforeSet, defaultName , SET_TO);
     90           } else {
     91               log_verbose("Test passed. \n");
     92           }
     93       }
     94    }
     95 }
     96 
     97 
     98