/*
**********************************************************************
* Copyright (C) 1998-2000, International Business Machines Corporation 
* and others.  All Rights Reserved.
**********************************************************************
*
* File date.c
*
* Modification History:
*
*   Date        Name        Description
*   4/26/2000  srl         created
*******************************************************************************
*/

#include <stdio.h>
#include <string.h>
#include "unicode/udata.h"
#include "unicode/ucnv.h"

#ifdef UDATA_MAP_DLL
extern const uint8_t U_IMPORT icudata_dat[]; 
#endif

int
main(int argc,
     char **argv)
{
  UConverter *c;

  int32_t month = -1, year = -1;
  UErrorCode status = U_ZERO_ERROR;
  UErrorCode status2 = U_ZERO_ERROR;

#ifdef UDATA_MAP_DLL
  printf("MAPPED DLL, memory mapped code path present.\n");

  udata_setCommonData(icudata_dat, &status);  

  printf("setCommonData(%p) -> %s\n", icudata_dat, u_errorName(status));

  if(U_FAILURE(status))
  {
    printf("*** FAIL: should have returned U_ZERO_ERROR\n");
    return 1;
  }

#else

#ifdef UDATA_MAP
  printf("memory mapped code path present. Mapped DLL not built.\n"); 
  udata_setCommonData(NULL, &status);
  printf("setCommonData(NULL) -> %s [should fail]\n",  u_errorName(status));

  if(status != U_ILLEGAL_ARGUMENT_ERROR)
  {
    printf("*** FAIL: should have returned U_ILLEGAL_ARGUMENT_ERROR\n");
    return 1;
  }

# else /* non map .. DLL ? */
  
  printf("Mapped DLL not built. Memory mapped code path NOT present.\n");
# ifdef UDATA_DLL
  printf("DLL code path present!\n");
# endif

  udata_setCommonData(NULL, &status);
  printf("setCommonData(NULL) -> %s [should fail]\n",  u_errorName(status));

  if(status != U_UNSUPPORTED_ERROR)
  {
    printf("\n*** FAIL: should have returned U_UNSUPPORTED_ERROR\n");
    return 1;
  }

#endif
  
#endif

  c = ucnv_open("shift_jis", &status);
	  
  printf("ucnv_open(shift_jis)-> %p, err = %s, name=%s\n", c, u_errorName(status), (!c)?"?":ucnv_getName(c,&status2)  );

#ifdef UDATA_MAP_DLL
  if(status != U_ZERO_ERROR)
  {
    printf("\n*** FAIL: should have returned U_ZERO_ERROR;\n");
    return 1;
  }

  udata_setCommonData(icudata_dat, &status);
  printf("setCommonData(%p) -> %s [should fail]\n", icudata_dat, u_errorName(status));
  
  if ( status != U_USING_DEFAULT_ERROR )
  {
    printf("\n*** FAIL: should have returned U_USING_DEFAULT_ERROR\n");
    return 1;
  }

#else  
  if(status == U_ZERO_ERROR)
  {
    printf("\n*** FAIL: should have failed.\n");
    return 1;
  }
#endif


  printf("\n*** PASS PASS PASS, test PASSED!!!!!!!!\n");

  return 0;
}
