/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1999, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
#include "unicode/utypes.h"
#include "unicode/ustring.h"
#include "unicode/ctest.h"
#include "unicode/ucnv.h"
#include <stdio.h>

void TestEuroRegression(void);
void addTestEuroRegression(TestNode** root)
{
    addTest(root, &TestEuroRegression, "tsconv/eurocreg/TestEuroRegression");
}

char convertersToCheck[][15] = { 
  "cp1250",
  "cp1251",
  "cp1252",
  "cp1254",
  "cp1255",
  "cp1256",
  "cp1257",
  "cp1258",
  "ibm1140",
  "ibm1142",
  "ibm1143",
  "ibm1144",
  "ibm1145",
  "ibm1146",
  "ibm1147",
  "ibm1148",
  "ibm1149",
  "ibm1153",
  "ibm12712",
  "ibm16804",
  "cp850",
  "cp850",
  "cp1026",
  "cp857",
  "cp1025",
  "cp1123",
  "cp1122",
  "cp1112",
  "cp424",
  "cp803",
  "cp862",
  "cp9030",
  "cp1130",
  "cp1258",
  "cp950",
  "cp1253",
  /*  "cp819",
      "cp13488",*/
  "cp875",
  "cp869",
  "cp813",
  "cp852",
  "cp855",
  "cp866",
  "cp1131",
  "cp1125",
  "cp922",
  "cp921",
  "cp864",
  "cp1008",
  "cp1046",
  /*  "cp9066",
      "cp1129",*/
  "cp1027",
  "cp300",
  /*  "cp4930",
      "cp1364",*/
  "cp1362",
  "cp1363",
  "cp1114",
  "cp947",
  "cp28709",
  ""};

UBool isEuroAware(const UConverter*);

void TestEuroRegression()
{
  int32_t i=0;
  
  do 
    {
      UErrorCode err = U_ZERO_ERROR;
      UConverter* myConv =  ucnv_open(convertersToCheck[i], &err);
      if (U_FAILURE(err)&&convertersToCheck[i][0]) log_err("%s  \tMISSING [%s]\n", convertersToCheck[i], u_errorName(err));
      else 
	{
	  if (isEuroAware(myConv)) log_verbose("%s  \tsupports euro\n", convertersToCheck[i]);
	  else log_err("%s  \tDOES NOT support euro\n", convertersToCheck[i]);
	  ucnv_close(myConv);
	}
    } while (convertersToCheck[++i][0]);
}

UBool isEuroAware(const UConverter* myConv)
{
  static const UChar euroString[2] = { 0x20AC, 0x0000 };
  char target[2];
  UChar euroBack[2];
  int32_t targetSize, euroBackSize;
  UErrorCode err = U_ZERO_ERROR;
  /*const char* myName =   ucnv_getName(myConv, &err);*/

  targetSize = ucnv_fromUChars(myConv,
	  target,
			       2,
			       euroString,
                   -1,
			       &err);
  if (U_FAILURE(err))
    {
      log_err("Failure Occured in ucnv_fromUChars euro roundtrip test\n");
      return FALSE;
    }
  euroBackSize = ucnv_toUChars(myConv,
			       euroBack,
			       2,
			       target,
			       targetSize,
			       &err);
  if (U_FAILURE(err))
    {
      log_err("Failure Occured in ucnv_toUChars euro roundtrip test\n");
      return FALSE;
    }
  if (u_strcmp(euroString, euroBack)) 
    {
      /*      log_err("%s FAILED Euro rountrip\n", myName);*/
      return FALSE;
    }
  else 
    {
      /*      log_verbose("%s PASSED Euro rountrip\n", myName);*/
      return TRUE;
    }
		
}
