C++程序  |  100行  |  3.68 KB

// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-2010, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/

#include "unicode/ucnv.h"
#include "unicode/ucnv_err.h"

#include "cintltst.h"
#include "ustr_cnv.h"
#include <string.h>
void TestDefaultConverterError(void); /* keep gcc happy */
void TestDefaultConverterSet(void); /* keep gcc happy */


/* This makes sure that a converter isn't leaked when an error is passed to 
    u_getDefaultConverter */
void TestDefaultConverterError(void) {
    UErrorCode          err                 =   U_ZERO_ERROR;

    /* Remove the default converter */
    ucnv_close(u_getDefaultConverter(&err));

    if (U_FAILURE(err)) {
        log_err("Didn't expect a failure yet %s\n", myErrorName(err));
        return;
    }

    /* Set to any radom error state */
    err = U_FILE_ACCESS_ERROR;
    if (u_getDefaultConverter(&err) != NULL) {
        log_err("Didn't expect to get a converter on a failure\n");
    }
}

/* Get the default converter. Copy its name. Put it back. */
static void copyDefaultConverterName(char *out, UErrorCode *status) {
    UConverter *defConv;
    const char *itsName;
    out[0]=0;
    if(U_FAILURE(*status)) return;
    defConv = u_getDefaultConverter(status);
    /* get its name */
    itsName = ucnv_getName(defConv, status);
    if(U_FAILURE(*status)) return;
    strcpy(out, itsName); 
    /* put it back. */
    u_releaseDefaultConverter(defConv); 
}

/* 
  Changing the default name may not affect the actual name from u_getDefaultConverter
   ( for example, if UTF-8 is the fixed converter ).
  But, if it does cause a change, that change should be reflected when the converter is
  set back.
*/
void TestDefaultConverterSet(void) {
    UErrorCode status = U_ZERO_ERROR;
    static char defaultName[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
    static char nameBeforeSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
    static char nameAfterSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
    static char nameAfterRestore[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
    static const char SET_TO[]="iso-8859-3";
    strcpy(defaultName, ucnv_getDefaultName());

    log_verbose("getDefaultName returned %s\n", defaultName);

   /* first, flush any extant converter */
   u_flushDefaultConverter();
   copyDefaultConverterName(nameBeforeSet, &status);
   log_verbose("name from u_getDefaultConverter() = %s\n", nameBeforeSet);
   u_flushDefaultConverter();
   ucnv_setDefaultName(SET_TO);
   copyDefaultConverterName(nameAfterSet, &status);
   log_verbose("name from u_getDefaultConverter() after set to %s (%s) = %s\n", SET_TO, ucnv_getDefaultName(), nameAfterSet);
   ucnv_setDefaultName(defaultName);
   copyDefaultConverterName(nameAfterRestore, &status);
   log_verbose("name from u_getDefaultConverter() after restore = %s\n", nameAfterRestore);
   u_flushDefaultConverter();

   if(U_FAILURE(status)) {
      log_err("Error in test: %s\n", u_errorName(status));
   } else {
      if(!strcmp(nameBeforeSet, nameAfterSet)) { /* changing the default didn't affect. */
          log_info("Skipping test: ucnv_setDefaultName() did not affect actual name of %s\n", nameBeforeSet);
      } else {
          if(strcmp(nameBeforeSet, nameAfterRestore)) {
               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);
          } else {
              log_verbose("Test passed. \n");
          }
      }
   }
}