/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-1999, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/********************************************************************************
*
* File CFORMTST.C
*
* Modification History:
*        Name                     Description            
*     Madhu Katragadda               Creation
*********************************************************************************
*/

/* FormatTest is a medium top level test for everything in the  C FORMAT API */

#include "cintltst.h"
#include "cformtst.h"

void addCalTest(TestNode**);
void addDateForTest(TestNode**);
void addNumForTest(TestNode**);
void addMsgForTest(TestNode**);
void addDateForRgrTest(TestNode**);
void addNumFrDepTest(TestNode**);
void addDtFrDepTest(TestNode**);


void checkHeap()
{
  int i;
  void *n[2048];

  log_info("checkHeap...");

  
  for(i=0;i<1;i++)
    {
            n[i]= malloc(i+15); 
    }
  
  /*  for(i=0;i<2048;i++)
    {
      free(n[i]);
      }*/
}

void addFormatTest(TestNode** root)
{
    addCalTest(root);

    /*    addTest(root, &checkHeap, "/tsformat/mallocTest2" ); */

    addDateForTest(root);

    /*    addTest(root, &checkHeap, "/tsformat/mallocTest3" ); */

    addNumForTest(root);

    /*    addTest(root, &checkHeap, "/tsformat/mallocTest4" );  */

    addNumFrDepTest(root);

    /* addTest(root, &checkHeap, "/tsformat/mallocTest5" );  */

    addMsgForTest(root);
    addDateForRgrTest(root);
    addDtFrDepTest(root);
    
    
}
/*INternal functions used*/

UChar* myDateFormat(UDateFormat* dat, UDate d1)
{
    UChar *result1=NULL;
    int32_t resultlength, resultlengthneeded;
    UFieldPosition pos;
    UErrorCode status = U_ZERO_ERROR;
    

    resultlength=0;
    resultlengthneeded=udat_format(dat, d1, NULL, resultlength, &pos, &status);
    if(status==U_BUFFER_OVERFLOW_ERROR)
    {
        status=U_ZERO_ERROR;
        resultlength=resultlengthneeded+1;
        /*result1=(UChar*)malloc(sizeof(UChar) * resultlength);  *//* this leaks for now */
        result1=(UChar*)ctst_malloc(sizeof(UChar) * resultlength);
        udat_format(dat, d1, result1, resultlength, &pos, &status);    
    }
    if(U_FAILURE(status))
    {
        log_err("Error in formatting using udat_format(.....): %s\n", myErrorName(status));
        return 0;
    }
    return result1;

}
