/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-2006, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/

#ifndef _DATEFORMATROUNDTRIPTEST_
#define _DATEFORMATROUNDTRIPTEST_
 
#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING

#include "unicode/unistr.h"
#include "unicode/datefmt.h"
#include "unicode/smpdtfmt.h"
#include "unicode/calendar.h"
#include "intltest.h"

/** 
 * Performs round-trip tests for DateFormat
 **/
class DateFormatRoundTripTest : public IntlTest {    
    
    // IntlTest override
    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );

public:
    DateFormatRoundTripTest();
    virtual ~DateFormatRoundTripTest();
    
    void TestDateFormatRoundTrip(void);
    void TestCentury(void);
    void test(const Locale& loc);
    void test(DateFormat *fmt, const Locale &origLocale, UBool timeOnly = FALSE );
    int32_t getField(UDate d, int32_t f);
    UnicodeString& escape(const UnicodeString& src, UnicodeString& dst);
    UDate generateDate(void); 
    UDate generateDate(UDate minDate); 


//============================================================
// statics
//============================================================

/**
 * Return a random uint32_t
 **/
static uint32_t randLong() {
    // The portable IntlTest::random() function has sufficient
    // resolution for a 16-bit value, but not for 32 bits.
    return ((uint32_t) (IntlTest::random() * (1<<16))) |
          (((uint32_t) (IntlTest::random() * (1<<16))) << 16);
}

/**
 * Return a random double 0 <= x <= 1.0
 **/
static double randFraction()
{
    return (double)randLong() / (double)0xFFFFFFFF;
}

/**
 * Return a random value from -range..+range (closed).
 **/
static double randDouble(double range)
{
    double a = randFraction();
    //while(TPlatformUtilities::isInfinite(a) || TPlatformUtilities::isNaN(a))
    //    a = randFraction();
    return (2.0 * range * a) - range;
}

protected:
    UBool failure(UErrorCode status, const char* msg);
    UBool failure(UErrorCode status, const char* msg, const UnicodeString& str);

    const UnicodeString& fullFormat(UDate d);

private:

    static int32_t SPARSENESS;
    static int32_t TRIALS;
    static int32_t DEPTH;

    UBool optionv; // TRUE if @v option is given on command line
    SimpleDateFormat *dateFormat;
    UnicodeString fgStr;
    Calendar *getFieldCal;
};

#endif /* #if !UCONFIG_NO_FORMATTING */
 
#endif // _DATEFORMATROUNDTRIPTEST_
//eof
